为什么Perl的foreach不要求我的变量声明?

时间:2017-02-15 07:51:29

标签: perl variables foreach local-variables

今天,我在Perl中偶然发现了一些我不知道的事情:它“本地化”了迭代列表元素的变量。

当然,这在Perl文档中有记录 - 但是我没记住或读过它。

以下脚本演示了我的意思:

use warnings;
use strict;

my $g = 99;

foreach $g (1..5) {
  p($g);
}

sub p {
  my $l = shift;
  printf ("%2d %2d\n", $g, $l);
}

脚本打印

99  1
99  2
99  3
99  4
99  5

因为$g已“定位”到foreach循环。

据我所知,如果我在foreach循环中将my添加到$g,则没有区别:

foreach my $g (1..5) {

实际上,我最终做到了这一点,因为我觉得这个变量是循环的本地变量更清楚。

我现在的问题是:是否存在使用my确实有所作为的情况(假设$g已全局声明)。

1 个答案:

答案 0 :(得分:8)

调查行为记录在Foreach Loops in perlsyn

  

foreach循环遍历正常列表值,并将标量变量VAR依次设置为列表的每个元素。如果变量前面带有关键字my,则它是词法范围的,因此仅在循环内可见。

继续解释

  

否则,该变量隐含在循环的本地,并在退出循环时重新获得其前一个值。如果先前使用my声明变量,则它使用该变量而不是全局变量,但它仍然本地化为循环。

因此,将其与my本地化或将其留给foreach之间应该没有区别。

有点好奇是

  

这种隐式本地化仅在foreach循环中

所有这些都在Private Variables via my() from perlsub

的这个片段中进一步阐明
  

foreach循环默认以local的方式动态调整其索引变量的范围。但是,如果索引变量以关键字my作为前缀,或者在作用域中已经存在该名称的词法,则会创建新的词法。

由于在两种情况下都在里面创建了新的词汇 ,因此没有任何实际差异。

我绝对支持并建议在那里放my