<>;
print $_
Run Code Online (Sandbox Code Playgroud)
但这有效:
while(<>){
print $_;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本不起作用?
Cha*_*ens 10
因为while (<>)是简写while(defined($_ = <ARGV>)),但是<>;正好<ARGV>;.你可以通过B::Deparse模块看到这一点.
给定文件 example.pl
#!/usr/bin/perl
use strict;
use warnings;
<>;
while (<>) {
}
Run Code Online (Sandbox Code Playgroud)
命令
perl -MO=Deparse example.pl
Run Code Online (Sandbox Code Playgroud)
将打印
use warnings;
use strict 'refs';
<ARGV>;
while (defined($_ = <ARGV>)) {
();
}
example.pl syntax OK
Run Code Online (Sandbox Code Playgroud)
这是Perl着名的DWIM ery的一个例子.我相信它是为了阻止人们做浪费
for (<>) {
}
Run Code Online (Sandbox Code Playgroud)
<>在void上下文中对特殊外壳没有任何价值,事实上,它可能是有害的,因为当你说<>;你经常试图丢弃你不想要的文件句柄行.有$_抓它不会是有效的还是可取的.