【发布时间】:2019-06-06 16:32:27
【问题描述】:
今天,我在 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 已在全球范围内声明)。
【问题讨论】:
-
如果你有全局声明,foreach 不需要 my 声明。然而奇怪的是它不会抱怨你再次声明它。例如,如果您删除范围,它会抱怨您已经声明了
$g,我会去研究一下。 -
如果该变量以前用 my 声明过,它会使用该变量而不是全局变量,但它仍被本地化到循环中。此隐式本地化仅发生在 foreach 循环中。 perldoc.perl.org/perlsyn.html#Foreach-Loops
-
@user3606329 这是正确的,但是如果您使用该代码并删除范围,则会产生错误。该变量尚未进入循环,它是 foreach 语句的一部分。
标签: perl variables foreach local-variables