2017-07-20 5 views
1

と$ _は最近、私は特定のperlスクリプトに次のようなものに出くわした: 違い= Perlの

while(<FH>){ 
    $var1 = <FH>; $var2 = $_ 
} 

内部のファイルハンドル名を持つダイヤモンドオペレータがreadline(FH)と同じように動作しますので、私はこのような書面で特別な意味があるのは分かっていますか?

ありがとうございました

+0

ファイルからいくつかの複雑な**シーケンス**行を処理することが理にかなっているかもしれません。これは、より完全な例がなければ、まったくの推測です。 – AnFi

答えて

4

直接の質問については、ドキュメントをご覧ください。

readline

から、これは<EXPR>演算子を実装する内部関数ですが、あなたはそれを直接使用することができます。 <EXPR>オペレータはI/O Operators in perlop

で詳しく説明されており、I/O Operatorsに我々は

<FILEHANDLE>

readline(*FILEHANDLE)を綴られる文を見つけます。 readlineを参照してください。

したがって<FH>readline(FH)は、(我々がreadline()*FH又はFHを渡すことができる)と等価です。

字句ファイルハンドルは、型グロブよりも優先されることに注意してください。たとえば、Typeglobs and Filehandles in perldataを参照してください。だから、

open my $fh, '<', $file or die "Can't open $file: $!"; 

のようなあなたのファイルを開くと、あなたは(それに関連付けられたファイルから)「ファイルハンドルから」読むために<$fh>を行います。

オペレータ<>には他にもいくつかのプロパティがあります。広範なperlopの説明を参照してください。


質問の残りのコードスニペットは他の問題を引き起こします。

while条件内の<FH>は、スカラーコンテキスト内にあり、FHに接続されたリソースから1行を読み込みます。ループ本体に入ると、<FH>になります。は次の行を読み込み、$var1に割り当てられます。

<$FH>while内の唯一のものである場合、その行はデフォルトのvariable $_に割り当てられます。上記のI/O Operatorsを参照してください。したがって$var2がこの行に割り当てられます。

ループの本体が実行された後、最初の行は$var2になり、次の行は$var1になります。この奇妙なループは、各繰り返しで2行に渡ります。

関連する問題