我有时会看到这样的 Perl 代码:
my ( $variable ) = blah....
在单个变量周围加上括号有什么意义?我认为括号仅在声明多个变量时使用,例如:
my ( $var1, $var2, $var3 ) = blah...
我有时会看到这样的 Perl 代码:
my ( $variable ) = blah....
在单个变量周围加上括号有什么意义?我认为括号仅在声明多个变量时使用,例如:
my ( $var1, $var2, $var3 ) = blah...
有几种情况存在差异:
当数组在右侧时
my @array = ('a', 'b', 'c');
my $variable = @array; # 3 size of @array
my ($variable) = @array; # 'a' $array[0]
当列表在右侧时
my $variable = qw/ a b c d /; # 'd' last item of the list
my ($variable) = qw/ a b c d /; # 'a' first item of the list
具有变量(数组/标量)返回值的子程序
sub myFunction {
...
return (wantarray() ? @array : $scalar);
}
my $variable = myFunction(...); # $scalar from the subroutine
my ($variable) = myFunction(...); # $array[0] from the subroutine
括号创建了一个列表上下文,它影响赋值右侧的评估方式。
比较
my $x = grep { /s/ } qw(apples bananas cherries);
print $x;
和
my ($x) = grep { /s/ } qw(apples bananas cherries);
print $x;
当您只想获取列表的第一个元素并丢弃其余元素时,您通常会使用这种结构。
我不是 Perl 专业人士(无论如何,我不是),但 AFAIK 它与列表有关。Perl 有不同的上下文(标量、列表)。使用($var)
开关列出上下文,$var
是标量上下文。
my $var = (1, 2, 4); # $var = 4 (last element)
my ($var) = (1, 2, 4); # $var = 1
请否决这个答案,如果它完全错误:)
你混淆了两个不同的东西。首先,使用my
声明多个变量时,需要使用括号:
my $foo, $bar;
不起作用,因为它被认为是两个不同的语句:
my $foo;
$bar;
因此,您需要括号将参数组合到函数 my
的参数列表中:
my($foo, $bar);
其次,您有明确的分组以调用列表上下文:
$foo, $bar = "a", "b"; # wrong!
将被视为三个单独的语句:
$foo;
$bar = "a";
"b";
但是,如果您使用括号将其分组$foo
并$bar
放入列表中,则赋值运算符将使用列表上下文:
($foo, $bar) = ("a", "b");
奇怪的是,如果你去掉 RHS 括号,你也会遇到一个小问题:
($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context
但这是因为=
运算符的优先级高于逗号,
,您可以在perlop中看到这一点。如果你试试:
my @array = ("a", "b");
($foo, $bar) = @array;
您将获得不带括号的所需行为。
现在完成循环,让我们删除上面的列表上下文,看看会发生什么:
my @array = ("a", "b");
$foo = @array;
print $foo;
这会打印2
,因为数组是在标量上下文中计算的,而标量上下文中的数组返回它们包含的元素数。在这种情况下,它是2
。
因此,诸如此类的语句使用列表上下文:
my ($foo) = @array; # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
这是一种覆盖标量分配中隐含的标量上下文的方法。为了比较,这些分配在标量上下文中:
my $foo = @array; # $foo is set to the number of elements in the array
my $bar = ("a", "b", "c"); # $bar is set to "c", last list element
我已经在另一个网站上发布了关于这个主题的深入解释。
【这里不能发。StackOverflow 不支持表格。并不是说任何人通常对非现场链接到文档有问题。]