2011-07-27 23 views
1
<>; 
print $_ 

但这个工程:

while(<>){ 
    print $_; 
} 

为什么没有第一个版本的工作?

回答

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红霉素的例子。我相信这是为了从做阻止人们浪费

for (<>) { 
} 

有一个在无效的情况下没有价值的特殊外壳<>,并且,事实上,它很可能是有害的,因为当你说<>;你最经常试图从文件句柄中丢弃你不想要的一行。有$_捕捉它不会是有效的或理想的。

+0

'-MO'是什么意思?我可以找到'-M''-O',但不是'-MO'。 –

+5

'-Mmodule = arg1,arg2'等价于'use module qw/arg1 arg2 /;',所以'-MO = Deparse'是相当于'使用O qw/deparse /;'。 ['O'](http://perldoc.perl.org/O.html)模块可以轻松加载多个后端模块(即'B ::'命名空间中的模块)。 –

3

Perl while (<>)声明有一个隐式赋值给$_,这在您的第一个片段中缺失。

man perlop描述:

当且仅当输入符号是条件一个while说明(即使伪装成for(;;)环)的内部的唯一事情,该值被自动分配给全局变量$ _,摧毁之前有的东西。

1

因为:第二个是一个特例,因为如果你这样写:

while (defined($_ = <>)) { 

一日一并不是一个特例。由于您没有在任何地方存储 输入行,因此未保存。

相关问题