为什么我的Perl循环变量是本地的,即使不使用`my`?

时间:2015-12-14 09:36:23

标签: perl

我注意到在Perl中创建循环时,循环变量似乎始终是循环的局部变量,即使在循环外的范围内声明时也是如此。这是为什么?

E.g。运行以下脚本时。 (请注意myforeach之间没有$x!)

#!/usr/bin/perl

use strict;
use warnings;

my $x = 42;
foreach $x (0, 1) {
    print "inside: $x\n";
}
print "outside: $x\n"

我原本期望以下输出:

inside: 0
inside: 1
outside: 1

但我得到了:

inside: 0
inside: 1
outside: 42
这是故意的吗?或者它是Perl中的错误?

(在Perl 5.10.1和5.18.2上测试。)

1 个答案:

答案 0 :(得分:11)

perldocs中的清除说明:

  

foreach循环遍历正常列表值并设置标量   变量VAR依次是列表的每个元素。如果变量   之前是关键字my,然后它是词法范围的,并且是   因此仅在循环内可见。否则,变量是   隐含地循环本地并在退出时重新获得其原值   循环。如果先前使用my声明了变量,则使用   该变量而不是全局变量,但它仍然是本地化的   循环。 此隐式本地化仅在foreach循环中发生