11

コード

$ 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
$

なぜWay1期待どおりに動作しないのかわかりませんWay2。これらの 2 つの方法は同じではありませんか? ここで何が起きてるの?

4

4 に答える 4

14

<> 演算子の二重の性質 (つまり、globreadlineか) のため、ルールは readline として動作することであり、括弧内にはベアワードまたは単純なスカラーのみを含めることができます。したがって、配列要素を単純なスカラーに割り当てるか (例のように)、 readline 関数を直接使用する必要があります。

于 2010-11-29T15:39:17.320 に答える
14

perlopからの理由:

山括弧内がファイルハンドルでも、ファイルハンドル名、型グロブ、または型グロブ参照を含む単純なスカラー変数でもない場合、グロブされるファイル名パターン、およびファイル名のリストまたはリスト内の次のファイル名のいずれかとして解釈されます。コンテキストに応じて返されます。この区別は、構文上の理由だけで決定されます。つまり<$x>、常に間接ハンドルからの readline()<$hash{key}>ですが、常に glob() です。

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

于 2010-11-29T15:44:07.430 に答える
8

ベアワード (ファイル ハンドルとして解釈される) または単純なスカラーよりも複雑なものはすべて、関数$varへの引数として解釈されglob()ます。ベアワードと単純なスカラーのみが、<...>オペレーターによって反復されるファイル ハンドルとして扱われます。

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

<bareword> ~~  readline bareword
<$scalar>  ~~  readline $scalar
<$array[0]> ~~ glob "$array[0]"
<anything else> ~~ glob ...
于 2010-11-29T15:40:35.073 に答える
6

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

readline代わりに使用してください:

my @res1 = readline($fh[0]);
于 2010-11-29T15:39:48.130 に答える