while循环与perl中单独使用菱形运算符之间的区别

时间:2012-02-21 20:22:50

标签: perl

我对以下内容感到困惑:

<>; print;

VS

while(<>){print;}

第一个不打印任何东西,但第二个打印。 <>是否始终将输入读取存储到$_

谢谢。

3 个答案:

答案 0 :(得分:13)

当钻石文件输入迭代器处于while循环的条件时,它才是神奇的:

$ perl -MO=Deparse -e '<>; print;'
<ARGV>;
print $_;
-e syntax OK

$ perl -MO=Deparse -e 'while (<>) {print;}'
while (defined($_ = <ARGV>)) {
    print $_;
}
-e syntax OK

perlop

中记录了这一切

答案 1 :(得分:8)

除了while语句的条件外,它不会。

$ perl -MO=Deparse -e 'while(<>) { print }'
while (defined($_ = <ARGV>)) {
    print $_;
}
-e syntax OK

$ perl -MO=Deparse -e '<>; print'
<ARGV>;
print $_;
-e syntax OK

perlop说明自动分配到$_只会在此上下文中发生:

  

通常,您必须将返回的值分配给变量,但在那里   是自动分配发生的一种情况。当且仅当   输入符号是“while”条件下唯一的内容   声明(即使伪装成“for(;;)”循环),值为   自动分配给全局变量$ _,破坏任何东西   曾经有过。 (这对你来说似乎很奇怪,但是   你将在你编写的几乎每个Perl脚本中使用该构造。)   $ _变量未隐式本地化。你必须放一个“本地的   $ _;“如果您希望这种情况发生在循环之前。”

答案 2 :(得分:2)

来自http://perldoc.perl.org/perlvar.html(谈论$ _):

&#34;当操作的结果作为while测试的唯一标准进行测试时,输入记录的默认位置。在一段时间的测试之外,这不会发生。&#34;