2010-11-29 8 views
11

コードPerlで配列にダイヤモンド演算子を使用できないのはなぜですか?

$ cat test1 
hello 
i am 
lazer 

nananana 
$ cat 1.pl 
use strict; 
use warnings; 

my @fh; 
open $fh[0], '<', 'test1', or die $!; 

my @res1 = <$fh[0]>; # Way1: why does this not work as expected? 
print @res1."\n"; 

my $fh2 = $fh[0]; 
my @res2 = <$fh2>; # Way2: this works! 
print @res2."\n"; 

実行

$ perl 1.pl 
1 
5 
$ 

私はWay2はありませんしながら、期待通りWay1が動作しない理由はわかりません。それらの2つの方法は同じではありませんか?ここで何が起きてるの?そのため<>オペレータの二重性の

答えて

14

(すなわち、それはglobまたはreadlineある?)、ルールはreadlineのように動作するために、あなただけの括弧内の裸の単語または単純なスカラーを持つことができるということです。したがって、配列要素を単純なスカラに代入するか(例のように)、readline関数を直接使用する必要があります。

+0

'perlの-le「印刷< < <=>用>>」' – tchrist

+0

@tchrist:グロブの楽しい一例であること以外、他の任意のポイント? – runrig

+0

いいえ、それは*ポイントでした。 :) – tchrist

6

<$fh[0]>glob($fh[0])と解析されているためです。

使用readline代わり:裸の単語よりも複雑

my @res1 = readline($fh[0]); 
8

何か(ファイルハンドルとして解釈される)または単純なスカラー$varが​​3210関数の引数として解釈されます。 barewordsと単純なスカラだけが、<...>演算子によって反復されるファイルハンドルとして扱われます。

は基本的にルールは以下のとおりです。

<bareword> ~~ readline bareword 
<$scalar> ~~ readline $scalar 
<$array[0]> ~~ glob "$array[0]" 
<anything else> ~~ glob ... 
14

ためperlopから:

場合は角括弧内だファイルハンドルもファイルハンドル名、型グロブ、または型グロブを含む単純スカラ変数でもない何か参照は、それがグロビングされすべきファイル名のパターンとして解釈され、ファイル名のリストまたはリスト内の次のファイル名のいずれかを状況に応じて、返されます。この区別は構文的根拠だけで決定される。それは)(<$x>は常に間接的なハンドルからのreadline()ですが、<$hash{key}>は常にグロブであることを意味します。

<>演算子の代わりにreadlineと入力すると、この魔法の問題を回避できます。

関連する問題