Perl magic——foreach 变量默认是本地定义的并覆盖外部值

2024-01-31

我期待着@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 没有隐式创建内部变量。

这个文件 http://www.misc-perl-info.com/perl-foreach.html说同样的。If you declare VAR with my, the scope of the variable will extend throughout the foreach statement, but not beyond it.

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


这在中没有详细描述文档 http://perldoc.perl.org/perlsyn.html#Foreach-Loops,但它是这样说的:

foreach 循环迭代普通列表值,并依次将变量 VAR 设置为列表的每个元素。如果变量前面带有关键字 my,则它是词法作用域的,因此仅在循环内可见。否则,该变量对于循环来说是隐式本地的,并在退出循环时恢复其先前的值。如果该变量之前是用 my 声明的,则它使用该变量而不是全局变量,但它仍然本地化到循环。这种隐式本地化仅发生在 foreach 循环中。

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

my $innr_element='';
foreach local $innr_element ( @arr1 ) {
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl magic——foreach 变量默认是本地定义的并覆盖外部值 的相关文章

随机推荐