2011-07-27 3 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 

を考えると

これはPerlの有名なDWIM ERYの一例である

use warnings; 
use strict 'refs'; 
<ARGV>; 
while (defined($_ = <ARGV>)) { 
    (); 
} 
example.pl syntax OK 

を印刷します。私はそれをやってから人々を停止するために行われていたと信じて無駄な

あなたが <>;を言うとき、あなたが最も頻繁にあるので、実際には、それはおそらく有害になり、そこ無効コンテキストでの特殊なケース <>に何も値がされていない、と
for (<>) { 
} 

あなたがファイルハンドルから望まない行を捨てようとしています。 $_を捕まえることは効率的ではなく、望ましいことでもありません。

+0

「-MO」は何を意味していますか? –

+5

'-Mmodule = arg1、arg2'は' use module qw/arg1 arg2 /; 'と同じですので、' -MO = Deparse'は次のようになります。 'use qw/deparse /;と等価です。 ['O'](http://perldoc.perl.org/O.html)モジュールは、複数のバックエンドモジュール(すなわち' B :: '名前空間にあるモジュール)を簡単に読み込むことを可能にします。 –

3

Perl while (<>)ステートメントの暗黙的な割り当ては$_です。これは最初のスニペットにはありません。

これはman perlopに記載されている:

入力シンボル(for(;;)ループを装っても)while文の条件内部唯一のものである場合のみと、値が自動的に割り当てられている場合グローバル変数$ _は以前にあったものを破壊します。

1

あなたが書かれたかのように第二1は、特殊なケースですので:

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

第一1は特殊なケースではありません。入力欄にはどこにでも を保存していないので、保存されませんでした。

関連する問題