Ren*_*ger 12 variables perl 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);
}
Run Code Online (Sandbox Code Playgroud)
脚本打印
99 1
99 2
99 3
99 4
99 5
Run Code Online (Sandbox Code Playgroud)
因为$g是"本地化"到foreach循环.
据我所知,如果我在foreach循环中添加my了没有区别$g:
foreach my $g (1..5) {
Run Code Online (Sandbox Code Playgroud)
实际上,我最终这样做是因为我觉得它变得更清楚,变量是循环的局部变量.
我现在的问题是:是否存在我的使用my确实有所作为的情况(鉴于$g已经全局声明).
调查的行为记录在perlsyn的Foreach循环中
在
foreach超过正常的列表值循环迭代,并设置标量变量VAR是反过来的列表的每个元素.如果变量前面带有关键字my,那么它是词法范围的,因此仅在循环中可见.
继续解释
否则,该变量隐含在循环的本地,并在退出循环时重新获得其前一个值.如果先前声明了变量
my,则它使用该变量而不是全局变量,但它仍然本地化为循环.
因此,将其本地化my或将其留下来之间应该没有区别foreach.
有点好奇就是这样
这种隐式定位仅在
foreach循环中发生.
所有这一切都在私人变量来自perlsub的片段中进一步阐明my()
的
foreach循环的默认值来动态地确定范围其索引变量的方式local.但是,如果索引变量以关键字为前缀my,或者如果范围中已存在该名称的词法,则会创建新的词法.
由于在两种情况下都在内部创建了一个新的词汇,因此没有任何实际差异.
我绝对支持并建议放一个my.