【发布时间】:2011-07-27 04:24:33
【问题描述】:
Perl 没有使用以下语法自动本地化 $_ 的设计(或技术)原因是什么:
while (<HANDLE>) {...}
改写为:
while (defined( $_ = <HANDLE> )) {...}
隐式写入$_ 的所有其他构造都以本地化方式(for/foreach、map、grep)执行此操作,但使用while,您必须显式本地化变量:
local $_;
while (<HANDLE>) {...}
我的猜测是它与在“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
}
【问题讨论】:
-
这就是为什么我(几乎)从不信任 $_。
-
我想你的意思是 { local $_;而 (
) { ... } } -
@MkV => 上面只是一个代码 sn-p(因此是
...,没有定义HANDLE等)。周围的范围是隐含的(无论是裸块、子程序块、控制语句块......)如果你因此而否决了这个问题,那真是可悲。 -
具有所需行为的解决方法:
for (local $_=<H>;defined;$_=<H>) ... -
更多细节:
while (defined (local $_ = <HANDLE>)) { ... }
标签: perl language-design while-loop local