在Perl中,为什么`while(<HANDLE>){...}`构造没有本地化`$ _`?

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有关,但这可能是错误的.

因此,如果有人知道(或者更好地参与语言设计讨论),您能否与我们分享这种行为背后的原因?更具体地说,为什么允许值$_在循环之外保持被认为是重要的,尽管它可能导致的错误(我倾向于在S​​O和其他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)

Eug*_*ash 14

螺纹上perlmonks.org:

两者之间存在差异foreach ,while因为它们是两个完全不同的东西.foreach在循环遍历列表时总是分配给变量,而while通常不循环.这只是while (<>)一个例外,只有当有一个菱形运算符时才有一个隐式赋值$_.

并且:

为什么while(<>) 没有隐含地将$_其本地化作为其魔力的一部分的一个可能原因是有时您想要访问$_循环外的最后一个值 .


ike*_*ami 7

很简单,while从不本地化.没有变量与while构造相关联,因此它甚至没有任何本地化的东西.

如果您在while循环表达式或while循环体中更改了某个变量,那么您有责任充分确定它的范围.