Eri*_*rom 23 perl language-design local while-loop
Perl没有$_
使用以下语法自动进行本地化的设计(或技术)原因是什么:
while (<HANDLE>) {...}
Run Code Online (Sandbox Code Playgroud)
哪个被重写为:
while (defined( $_ = <HANDLE> )) {...}
Run Code Online (Sandbox Code Playgroud)
所有隐式写入其它结构的$_
以集中方式做到这一点(for/foreach
,map
,grep
),但是while
,必须明确定位变量:
local $_;
while (<HANDLE>) {...}
Run Code Online (Sandbox Code Playgroud)
我的猜测是它与在命令行开关的"Super-AWK"模式下使用Perl有关,但这可能是错误的.
因此,如果有人知道(或者更好地参与语言设计讨论),您能否与我们分享这种行为背后的原因?更具体地说,为什么允许值$_
在循环之外保持被认为是重要的,尽管它可能导致的错误(我倾向于在SO和其他Perl代码中看到所有这些)?
如果从上面不清楚,$_
必须进行本地化的原因while
如下例所示:
sub read_handle {
while (<HANDLE>) { ... }
}
for (1 .. 10) {
print "$_: \n"; # works, prints a number from 1 .. 10
read_handle;
print "done with $_\n"; # does not work, prints the last line read from
# HANDLE or undef if the file was finished
}
Run Code Online (Sandbox Code Playgroud)
很简单,while
从不本地化.没有变量与while
构造相关联,因此它甚至没有任何本地化的东西.
如果您在while
循环表达式或while
循环体中更改了某个变量,那么您有责任充分确定它的范围.