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

vir*_*rus 3 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";
Run Code Online (Sandbox Code Playgroud)

但我什么都没得到(空白输出).如果$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";
Run Code Online (Sandbox Code Playgroud)

但上面的代码返回错误.

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.
Run Code Online (Sandbox Code Playgroud)

很明显,Perl并没有隐含地创建内部变量.

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

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

TLP*_*TLP 10

文档中没有详细描述,但它的内容如下:

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

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

my $innr_element='';
foreach local $innr_element ( @arr1 ) {
...
Run Code Online (Sandbox Code Playgroud)