我注意到在Perl中创建循环时,循环变量似乎始终是循环的局部变量,即使在循环外的范围内声明时也是如此.为什么是这样?
例如,运行以下脚本时.(请注意,是不存在my
之间foreach
和$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上测试过.)
perldocs中的清楚说明 :
foreach循环遍历正常列表值,并将标量变量VAR依次设置为列表的每个元素.如果变量前面带有关键字my,则它是词法范围的,因此仅在循环中可见.否则,该变量隐含在循环的本地,并在退出循环时重新获得其前一个值.如果先前使用my声明了变量,它将使用该变量而不是全局变量,但它仍然本地化为循环.这种隐式定位仅在foreach循环中发生.