2011-07-27 55 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($_ = <>)) { 

一日一併不是一個特例。由於您沒有在任何地方存儲 輸入行,因此未保存。

相關問題