4

我期待@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";

但我什么也没得到(空白输出)。如果$innr_element由 Perl 在内部创建为块范围变量(内部到 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 没有隐式地创建内部变量。

这份文件也是这么说的。If you declare VAR with my, the scope of the variable will extend throughout the foreach statement, but not beyond it.

这是另一个 perl 魔法还是我错过了什么?

4

1 回答 1

10

这在文档中没有详细描述,但它是这样说的:

foreach 循环遍历一个普通的列表值,并依次将变量 VAR 设置为列表的每个元素。如果变量以关键字 my 开头,则它是词法范围的,因此仅在循环中可见。否则,该变量隐含地是循环的局部变量,并在退出循环时恢复其先前的值。如果该变量以前用 my 声明过,它会使用该变量而不是全局变量,但它仍被本地化到循环中。这种隐式本地化仅发生在 foreach 循环中。

所以,这不是魔术,变量只是本地化的。您的示例可能如下所示:

my $innr_element='';
foreach local $innr_element ( @arr1 ) {
...
于 2013-09-02T09:10:42.560 回答