包含私有变量的圆括号。为什么在这种情况下使用?

时间:2014-10-18 09:36:03

标签: perl

我正在阅读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?

这种情况有什么不同吗?

2 个答案:

答案 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 ) = ( $_ * $_ );

这也会产生相同的结果。所以 - 在这种情况下,并不重要。但一般来说不是很好的编码风格。