30

而不是写:

@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 ")["
4

3 回答 3

74

你应该试试你的直觉。这就是如何做到这一点。

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 文档print解释了。

注意不要在 print 关键字后面加上左括号,除非您希望相应的右括号终止 print 的参数;在所有参数周围加上括号(或插入 a +,但这看起来不太好)。

在上面的案例中,我发现这个案例+更容易编写和阅读。YMMV。

于 2012-05-29T12:42:16.920 回答
4

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

my $string = 'hello.world';

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

但我相信正则表达式更好地描述了你想要做什么,并完全避免了这个问题。

任何一个

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

或者

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

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

于 2012-05-29T17:34:40.260 回答
3

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

不,如果您按照应有的方式启用了警告,您会得到:

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

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

于 2012-05-29T13:00:04.670 回答