7

で、私はこれperldoc perlvarを読みました:

現在、「ARGV」は「<>」演算子内でのみ魔法の効果を持つことに注意してください。他の場所では、"<>" によって開かれた最後のファイルに対応する単純なファイルハンドルです。特に、ファイルハンドルを必要とする関数にパラメータとして「*ARGV」を渡すと、関数が @ARGV 内のすべてのファイルの内容を自動的に読み取らない場合があります。

では、ファイルハンドルを期待する関数にパラメーターとして (またはそれに似たもの)を渡し、その関数にすべてのファイルを読み取らせるにはどうすればよいでしょうか?*ARGV@ARGV

4

3 に答える 3

12

先に進み、*ARGV型グロブまたは\*ARGVその参照を渡します。関数が最終的にそれを利用することを確認してください<$fh>or readline($fh)、その基礎となる機能的に同等です。

perlvar のマンページから引用された一節で対処されている問題は、 、、またはなどのハンドル以外の読み取りメカニズムを使用すると、ARGV魔法を開いてトリガーすることができないことを思い出させようとしているだけです。readlinereadsysreadgetc

これを実行して、それが機能することを自分自身に証明します。

sub mycat {
    my $fh = shift;
    print "$ARGV $.: $_" while <$fh>;
}
mycat(*ARGV);

それをファイルに入れて、いくつかのファイル引数を指定して実行します。

% perl mycat ./mycat //`pwd`/mycat ~/mycat
./mycat 1: sub mycat {
./mycat 2:     my $fh = shift;
./mycat 3:     print "$ARGV $.: $_" while <$fh>;
./mycat 4: } 
./mycat 5: mycat(*ARGV);
///home/tchrist/mycat 6: sub mycat {
///home/tchrist/mycat 7:     my $fh = shift;
///home/tchrist/mycat 8:     print "$ARGV $.: $_" while <$fh>;
///home/tchrist/mycat 9: } 
///home/tchrist/mycat 10: mycat(*ARGV);
/home/tchrist/mycat 11: sub mycat {
/home/tchrist/mycat 12:     my $fh = shift;
/home/tchrist/mycat 13:     print "$ARGV $.: $_" while <$fh>;
/home/tchrist/mycat 14: } 
/home/tchrist/mycat 15: mycat(*ARGV);

見る?それは正常に動作します。

于 2010-10-29T03:37:05.827 に答える
1

<>オーバーロードされたオブジェクトを反復するときに再ディスパッチできます。

{package ReadARGV;
    sub new {bless []}
    use overload '<>' => sub {<>};
}

sub reader {
    my $fh = shift;
    local $_;
    print while <$fh>;
}

reader(ReadARGV->new);

ReadARGVパッケージには単純なオブジェクト コンストラクターが含まれており、オペレーターをnewオーバーロードして単純に を呼び出します。<HANDLE><>

于 2010-10-29T03:26:53.110 に答える
-1

catあなたはそれを(Unixシステム上で)偽造することができます

open FAKE_ARGV, "cat @ARGV |";
function_expecting_filehandle(*FAKE_ARGV);
...

これで魔法の一部($ARGV$.)を失います。

結び付けられたファイルハンドルを使用する方法もあると確信しています(を参照perltie)。

于 2010-10-29T03:13:14.030 に答える