我对以下内容感到困惑:
<>; print;
VS
while(<>){print;}
第一个不打印任何东西,但第二个打印。 <>
是否始终将输入读取存储到$_
?
谢谢。
答案 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
中记录了这一切
答案 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;