Is there a one-liner to get the first element of a split?

前端 未结 3 394
梦如初夏
梦如初夏 2021-01-01 09:54

Instead of writing:

@holder = split /\\./,\"hello.world\"; 
print @holder[0];

is it possible to just do a one-liner to just get the first e

相关标签:
3条回答
  • 2021-01-01 10:16

    I get the following error when I try the second example: "syntax error at test.pl line 3, near ")["

    No, if you have warnings enabled as you should, you get:

    print (...) interpreted as function at test.pl line 3.
    syntax error at test.pl line 3, near ")["
    

    which should be a big clue as to your problem.

    0 讨论(0)
  • 2021-01-01 10:25

    You should have tried your hunch. That’s how to do it.

    my $first = (split /\./, "hello.world")[0];
    

    You could use a list-context assignment that grabs the first field only.

    my($first) = split /\./, "hello.world";
    

    To print it, use

    print +(split /\./, "hello.world")[0], "\n";
    

    or

    print ((split(/\./, "hello.world"))[0], "\n");
    

    The plus sign is there because of a syntactic ambiguity. It signals that everything following are arguments to print. The perlfunc documentation on print explains.

    Be careful not to follow the print keyword with a left parenthesis unless you want the corresponding right parenthesis to terminate the arguments to the print; put parentheses around all arguments (or interpose a +, but that doesn't look as good).

    In the case above, I find the case with + much easier to write and read. YMMV.

    0 讨论(0)
  • 2021-01-01 10:37

    If you insist on using split for this then you could potentially be splitting a long string into multiple fields, only to discard all but the first. The third parameter to split should be used to limit the number of fields into which to divide the string.

    my $string = 'hello.world';
    
    print((split(/\./, $string, 2))[0]);
    

    But I believe a regular expression better describes what you want to do, and avoids this problem completely.

    Either

    my $string = 'hello.world';
    my ($first) = $string =~ /([^.]+)/;
    

    or

    my $string = 'hello.world';
    print $string =~ /([^.]+)/;
    

    will extract the first string of non-dot characters for you.

    0 讨论(0)
提交回复
热议问题