7

perldoc perlvar中,我读到:

注意,目前“ARGV”只在“<>”操作符内有它的神奇效果;在其他地方,它只是一个普通文件句柄,对应于“<>”打开的最后一个文件。特别是,将“*ARGV”作为参数传递给需要文件句柄的函数可能不会导致您的函数自动读取@ARGV 中所有文件的内容。

那么,如何*ARGV或类似的东西)作为参数传递给需要文件句柄的函数,并让该函数读取所有文件@ARGV

4

3 回答 3

12

继续并传入*ARGVtypeglob 或\*ARGV, 它的引用。只需确保最终使用它的函数通过<$fh>操作符或readline($fh)它的底层功能等效项来使用它。

perlvarARGV联机帮助页中引用的段落中解决的问题只是想提醒您,如果您使用除句柄之外的任何其他读取机制(例如,或.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 回答