Perl while循环不会恢复默认输入参数$ _

时间:2017-07-12 23:58:28

标签: perl while-loop iteration parameter-passing

正如标题所说,我遇到了迭代后没有恢复$ _的情况。例如,将echo foo管道到下面......

$_ = 'bar';
print "$_\n";
while (<>) {
    chomp();
    print "$_\n";
}
print "$_\n";

输出

bar
foo

但我期待

bar
foo
bar

为什么$_没有恢复到父范围内的状态?

我确实读过http://perldoc.perl.org/perlvar.html,起初,即使见过这个例子,也不清楚为什么会这样。

1 个答案:

答案 0 :(得分:3)

perldoc perlsyn说明foreach循环:

  

否则,变量隐含在循环本地,并在退出循环时重新获得其前一个值。

while (<>) 分配给 $_,并且没有做出类似的保证。

while (<>)while (defined($_ = <>))相同。

我不知道Perl文档的任何部分可能导致某人认为$_会在while循环中被主题化。

请务必注意,此行为并非特定于$_。每个变量都在foreach循环中进行主题化,而没有变量位于while循环中:

$ cat p1.pl
#!/usr/bin/env perl

$foo = 'bar';

for $foo (qw(one two three)) {
    print "$foo\n";
}

print "$foo\n";

输出:

$ ./p1.pl
one
two
three
bar

将其与:

进行比较
$ cat p2.pl
#!/usr/bin/env perl

$foo = 'bar';

while ($foo = <>) {
    chomp $foo;
    print "'$foo'\n";
}

print "'$foo'\n";

输出:

$ ./p2.pl
one
'one'
two
'two'
three
'three'
''

到达最后一次打印时,$foo未定义,因为while循环在将未定义值分配给$foo后终止。