正如标题所说,我遇到了迭代后没有恢复$ _的情况。例如,将echo foo
管道到下面......
$_ = 'bar';
print "$_\n";
while (<>) {
chomp();
print "$_\n";
}
print "$_\n";
输出
bar
foo
但我期待
bar
foo
bar
为什么$_
没有恢复到父范围内的状态?
我确实读过http://perldoc.perl.org/perlvar.html,起初,即使见过这个例子,也不清楚为什么会这样。
答案 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
后终止。