<>;
print $_
但这有效:
while(<>){
print $_;
}
为什么第一个版本不起作用?
答案 0 :(得分:10)
因为while (<>)
是while(defined($_ = <ARGV>))
的简写,但<>;
只是<ARGV>;
。您可以使用B::Deparse
模块查看此内容。
给定文件example.pl
#!/usr/bin/perl
use strict;
use warnings;
<>;
while (<>) {
}
命令
perl -MO=Deparse example.pl
将打印
use warnings;
use strict 'refs';
<ARGV>;
while (defined($_ = <ARGV>)) {
();
}
example.pl syntax OK
这是Perl着名的DWIM ery的一个例子。我认为这样做是为了阻止人们做浪费
for (<>) {
}
在void上下文中,特殊套管<>
没有任何价值,事实上,它可能是有害的,因为当你说<>;
时,你经常试图抛弃一条线不想从文件句柄。让$_
抓住它不会有效或不可取。
答案 1 :(得分:3)
Perl while (<>)
语句隐含了对$_
的分配,这在第一个代码段中缺失。
当且仅当输入符号是
while
语句条件内的唯一内容时(即使伪装成for(;;)
循环),该值将自动分配给全局变量$ _ ,摧毁以前的任何东西。
答案 2 :(得分:1)
因为第二个是特例,就像你写的那样:
while (defined($_ = <>)) {
第一个不是特例。既然你没有存储 输入线在任何地方,都没有得到保存。