如何告诉Perl函数从特殊的ARGV句柄读取文件?

时间:2010-10-29 02:46:24

标签: perl filehandle argv

perldoc perlvar中,我读到了这个:

  

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

那么,如何我将*ARGV(或类似于它的东西)作为参数传递给需要文件句柄的函数,并让该函数读取{{{}中的所有文件1}}?

3 个答案:

答案 0 :(得分:12)

继续前进并传递*ARGV typeglob或\*ARGV,其引用。只需确保最终使用它的函数通过<$fh>运算符或readline($fh),它的基础功能等价物来实现。

perlvar联机帮助页中引用的段落中提到的问题只是提醒您,如果您有任何问题,您将无法启动ARGV魔术开放在句柄上使用除readline之外的其他阅读机制,例如readsysreadgetc

运行此项以向自己证明它有效:

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);

请参阅?它工作正常。

答案 1 :(得分:1)

在迭代重载对象时,您可以重新发送到<>

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

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

reader(ReadARGV->new);

ReadARGV包中包含一个简单的对象构造函数new,然后重载<HANDLE>运算符,只需调用<>

答案 2 :(得分:-1)

您可以使用cat(在Unix系统上)假冒它

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

你失去了一些魔力($ARGV$.)。

我确信也可以使用绑定的文件句柄(参见perltie)。