Perl magic - 默认情况下是foreach变量在本地定义并覆盖外部值

时间:2013-09-02 09:00:09

标签: perl

我期待@arr1的最后一个元素作为此代码的输出:

#!/usr/bin/perl
my @arr1 = qw(son kon bon won kon don pon won pon don won);
my $innr_element = '';
foreach $innr_element ( @arr1 ) {
    ## do something
}
print "--->$innr_element<---\n";

但我什么都没得到(空白输出)。如果Perl在内部创建$innr_element作为块范围变量(内部到foreach),那么下面应该可以正常工作。

#!/usr/bin/perl
use strict;
my @arr1 = qw(son kon bon won kon don pon won pon don won);
#my $innr_element = '';
foreach $innr_element ( @arr1 ) {
    ##do something
}
print "--->$innr_element<---\n";

但上面的代码返回错误。

Global symbol "$innr_element" requires explicit package name at test.pl line 5.
Global symbol "$innr_element" requires explicit package name at test.pl line 8.
Execution of test.pl aborted due to compilation errors.

很明显,Perl并没有隐式创建内部变量。

This document说同样的话。 If you declare VAR with my, the scope of the variable will extend throughout the foreach statement, but not beyond it.

这是另一种perl魔法还是我遗失了什么?

1 个答案:

答案 0 :(得分:10)

the documentation中未对此进行详细介绍,但其内容如下:

  

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

因此,它不是魔术,变量仅仅是本地化的。您的示例可能如下所示:

my $innr_element='';
foreach local $innr_element ( @arr1 ) {
...