而不是写作:
@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 ")["
答案 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 ")["
这应该是你问题的一个重要线索。