在Perl中直接索引到返回的数组

在Perl中直接索引到返回的数组,perl,Perl,这个问题是关于PHP和的,我对Perl也有同样的问题。给定一个返回列表的函数,有没有任何方法(或者最好的方法是什么)可以在不使用临时变量的情况下立即对其进行索引 例如: my $comma_separated = "a,b,c"; my $a = split (/,/, $comma_separated)[0]; #not valid syntax 我明白为什么第二行中的语法是无效的,所以我想知道是否有一种方法可以获得相同的效果,而不必首先将返回值赋给列表并从中进行索引。只需使用括号定义列表,

这个问题是关于PHP和的,我对Perl也有同样的问题。给定一个返回列表的函数,有没有任何方法(或者最好的方法是什么)可以在不使用临时变量的情况下立即对其进行索引

例如:

my $comma_separated = "a,b,c";
my $a = split (/,/, $comma_separated)[0]; #not valid syntax

我明白为什么第二行中的语法是无效的,所以我想知道是否有一种方法可以获得相同的效果,而不必首先将返回值赋给列表并从中进行索引。

只需使用括号定义列表,然后对其进行索引以提取所需的元素即可:


就像你可以这样做:

($a, $b, $c) = @array;
my($a) = split /,/, $comma_separated;
您可以这样做:

($a, $b, $c) = @array;
my($a) = split /,/, $comma_separated;
LHS(左侧)上的my$a被视为标量上下文<代码>我的($a)是列表上下文。它是一个单一元素列表,因此它只获取从
split
返回的第一个元素


它还具有自动限制拆分的附加好处,因此如果
$comma_separated
很大,就不会浪费工作。

因为在许多情况下,括号在函数CAL上是可选的,我通常会将其写为
my$x=(split/,/=>$str)[0]
@Carl,您可能会想到
split(…)
括号仅用于处理调用->您希望使用这些参数调用split。把
[0]
钉在上面没有什么意义。但是,
(split…
处理返回的值,这确实是您想要索引的值。这很有用。但出乎意料的是,当我试图直接打印结果而不是分配给变量时,就像这样:
print(split/,/,$逗号分隔)[0]
,我得到:
语法错误在test.pl第3行,靠近“)[”
@jdhildeb,这是因为在您的例子中,左括号被解释为包含print函数的参数。您可以将整个表达式包装在另一层括号中(即
print(…)[0])print+(…)
)。@Sean:感谢您的解释,这是有意义的。Perl已经自动执行此优化。从“perldoc-f split”:在为列表赋值时,如果省略了LIMIT或为零,Perl会提供一个比列表中变量数大一的LIMIT,以避免不必要的工作