perl中$ name和($ name)变量之间的区别

时间:2015-10-29 12:14:08

标签: perl

我想知道是否有人可以解释$name($name)之间的区别。

例如:

my @objects = ('specs','books','apple');
my ($fruit) = grep { $_ eq 'apple'} @objects;

这给出了$fruit = 'apple'的结果。但是,如果第二个语句被修改为:

$fruit = grep { $_ eq 'apple'} @objects;

水果的价值评估为1。这与grep

相关/具体相关吗?

3 个答案:

答案 0 :(得分:9)

my $fruit =指定标量上下文。

my ($fruit) =分配到列表上下文中(与my @fruit =一样)。

grep documentation说:

  

返回由表达式求值为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;