我想知道是否有人可以解释$name
和($name)
之间的区别。
例如:
my @objects = ('specs','books','apple');
my ($fruit) = grep { $_ eq 'apple'} @objects;
这给出了$fruit = 'apple'
的结果。但是,如果第二个语句被修改为:
$fruit = grep { $_ eq 'apple'} @objects;
水果的价值评估为1
。这与grep
答案 0 :(得分:9)
my $fruit =
指定标量上下文。
my ($fruit) =
分配到列表上下文中(与my @fruit =
一样)。
返回由表达式求值为true的元素组成的列表值。在标量上下文中,返回表达式为真的次数。
它在内部有效地使用wantarray来确定它应该给出的返回值的类型。您可以在自己的子例程中使用它来获得类似的效果,但you might not want to。
答案 1 :(得分:2)
这与Perl中的不同接收cotexts有关。如果使用标量变量,则返回列表的函数(因为它是grep
)将返回列表的长度。
使用第二种形式(my ($fruit)
)强制列表上下文包含一个元素,这就是为什么$fruit
具有列表唯一结果的值的原因。请注意,您只强制执行单元素列表,因此$fruit
只会获得第一个元素。列表的其余元素(如果有的话)将会无声地丢失。
答案 2 :(得分:1)
这些parens间接影响评估分配右侧的上下文。
my ($x) = LIST;
(my $x) = LIST;
my $x = SCALAR;
我在Mini-Tutorial: Scalar vs List Assignment Operator中详细介绍了这一点。
在这种情况下,
# grep in list context returns all the matches,
# the first of which is assigned to $fruit.
my ($fruit) = grep { $_ eq 'apple' } @objects;
# grep in scalar context returns the number of matches,
# which is assigned to `$num_fruits`.
my $num_fruits = grep { $_ eq 'apple' } @objects;