今天,我在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
已全局声明)。
答案 0 :(得分:8)
调查行为记录在Foreach Loops in perlsyn
中
foreach
循环遍历正常列表值,并将标量变量VAR依次设置为列表的每个元素。如果变量前面带有关键字my
,则它是词法范围的,因此仅在循环内可见。
继续解释
否则,该变量隐含在循环的本地,并在退出循环时重新获得其前一个值。如果先前使用
my
声明变量,则它使用该变量而不是全局变量,但它仍然本地化为循环。
因此,将其与my
本地化或将其留给foreach
之间应该没有区别。
有点好奇是
这种隐式本地化仅在
foreach
循环中 。
所有这些都在Private Variables via my()
from perlsub
foreach
循环默认以local
的方式动态调整其索引变量的范围。但是,如果索引变量以关键字my
作为前缀,或者在作用域中已经存在该名称的词法,则会创建新的词法。
由于在两种情况下都在里面创建了新的词汇 ,因此没有任何实际差异。
我绝对支持并建议在那里放my
。