我正在阅读Learning Perl 6th edition,子程序章节中有这段代码:
foreach (1..10) {
my($square) = $_ * $_; # private variable in this loop
print "$_ squared is $square.\n";
}
现在我明白列表语法,即括号,用于区分列表上下文和标量上下文,如:
my($num) = @_; # list context, same as ($num) = @_;
my $num = @_; # scalar context, same as $num = @_;
但是在foreach循环的情况下,我无法看到列表上下文是如何合适的。
我可以将代码更改为:
foreach (1..10) {
my $square = $_ * $_; # private variable in this loop
print "$_ squared is $square.\n";
}
它的工作方式完全相同。那么为什么作者使用我的($ square)时可以使用简单的$ square?
这种情况有什么不同吗?
答案 0 :(得分:5)
当然,在这种情况下,括号不是必需的。从某种意义上讲,他们并非严格错误,因为他们确实做了作者的意图。和Perl一样,there's more than one way to do it。
所以有一个潜在的问题:作者为什么选择这样做?我一开始想知道这是作者的首选风格:也许他总是选择将他的新变量列表简单地放在括号中,以便类似:
my ($count) = 4;
其中括号没有做任何有用的事情,至少看起来与以下内容一致:
my ($min, $max) = (2, 3);
但是看一下整本书,除了你引用的部分之外,我找不到一个使用括号的单个例子的例子。作为众多例子中的一个例子,第9章中的 m //在列表上下文中部分包含my
与赋值的各种不同用法,但不使用包含任何单个值的括号。 / p>
我得出的结论是,由于作者在my
子例程中引入了my($m, $n);
,他试图在下次使用时尽可能少地改变语法,最后以{{结尾1}}然后尝试解释标量和列表上下文,如上所述。我不确定这是非常有用的。
TL; DR没有必要,虽然它实际错误。在你的代码中避免这种风格可能是一个好主意。
答案 1 :(得分:3)
你很正确。这是多余的。在这种情况下,它没有任何区别,因为您有效强制列表上下文列出上下文操作。
E.g。
my ( $square ) = ( $_ * $_ );
这也会产生相同的结果。所以 - 在这种情况下,并不重要。但一般来说不是很好的编码风格。