在golfing down a solution的过程中,我偶然发现了这种看似奇怪的行为
我原以为$::_
或$main::_
会引用全球$_
,而不是环本地$_
:
$::_
$ perl -E '$_=0; say $::_; say $::_ for 1..4'
0
1
2
3
4
$main::_
$ perl -E '$_=0; say $main::_; say $main::_ for 1..4'
0
1
2
3
4
在 -MO::Deparse
下,两种表单的结果完全相同:
$ perl -MO=Deparse -E '$_=0; say $::_; say $main::_ for 1..4'
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$_ = 0;
say $_;
say $_ foreach (1 .. 4);
-e syntax OK
看起来明确声明$_
循环变量my
允许$main::_
按预期工作:
$ perl -E '$_=0; for my $_ (1..4) { say $::_ }'
0
0
0
0
并-MO=Deparse
高兴地强调:
$ perl -MO=Deparse -E '$_=0; for my $_ (1..4) { say $::_ }'
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$_ = 0;
foreach my $_ (1 .. 4) {
say $main::_;
}
-e syntax OK
请注意,这是在Perl 5.16.3下,因此deprecation of my $_
不适用。
问题
$_
的值(因此循环打印0
)?答案 0 :(得分:3)
是否需要这种行为?
是。你告诉循环使用$_
又名$main::_
[1] 作为循环变量,所以它确实如此。
如果您希望它使用其他变量,则由您指定其他变量。
这种行为在Perl 5.24中有什么不同吗?
没有
我希望它能够从循环内访问循环外部声明的$ _的值(所以在循环中打印0)
为循环变量使用不同的变量,在循环之前复制$_
,在循环之前引用$_
,或导航堆栈以找到恢复$_
的指令1}}。
$_
的无限制引用是指当前包中的$main::_
,而不是$_
。答案 1 :(得分:2)
是的,这是预期的。你的一个班轮等同于:
$_ = 0;
say $_;
{
local $_;
$_ = 1;
while( $_ <= 4 ){
say $_;
}continue{
$_++;
}
}
Perl会在$_
,for
和map
中对grep
进行本地化,以便它们不会破坏其中已有的值。它对$a
中的$b
和sort
执行相同的操作。