是否有一个单线来获得分裂的第一个元素?

时间:2012-05-29 12:39:38

标签: perl

而不是写作:

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

是否可以只做一个单行来获得分割的第一个元素?类似的东西:

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

当我尝试第二个例子时,我收到以下错误:

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

3 个答案:

答案 0 :(得分:62)

你应该试试你的预感。这是怎么做的。

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

您可以使用仅抓取第一个字段的列表上下文分配。

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

要打印它,请使用

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

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

加号是因为语法模糊。它表示以下所有内容都是print的参数。 perlfunc documentation on print解释说。

  

小心不要使用左括号跟随print关键字,除非您希望相应的右括号终止print的参数;将括号括在所有参数周围(或插入一个+,但这看起来不太好。)

在上面的例子中,我发现+的情况更易于编写和阅读。 YMMV。

答案 1 :(得分:4)

如果您坚持使用split,那么您可能会将长字符串拆分为多个字段,但只丢弃除第一个字符串以外的所有字符串。 split的第三个参数应该用于限制分割字符串的字段数。

my $string = 'hello.world';

print((split(/\./, $string, 2))[0]);

但我相信正则表达式能够更好地描述您想要做的事情,并完全避免这个问题。

无论

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

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

将为您提取第一个非点字符串。

答案 2 :(得分:3)

  

尝试第二个示例时出现以下错误:          “test.pl第3行的语法错误,附近”)[“

不,如果你已经启用了警告,你会得到:

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

这应该是你问题的一个重要线索。