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

Rya*_*son 7 perl filehandle argv

perldoc perlvar,我读到这个:

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

那么,如何可以我通过*ARGV(或一些类似于它)作为一个参数设置为期望一个文件句柄的功能,并有功能读取所有的文件@ARGV

tch*_*ist 12

继续前进并传入*ARGVtypeglob或其\*ARGV参考.只需确保最终使用它的函数通过<$fh>运算符或其readline($fh)基础功能等效函数来实现.

这个问题从perlvar手册页所引用段寻址只是想提醒你,你将无法得到ARGV魔法开来触发,如果你使用的任何其他阅读机制比readline在把手上,如read,sysreadgetc.

运行这个来向自己证明它的工作原理:

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

将它放在一个文件中,然后用几个文件参数运行它:

% 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);
Run Code Online (Sandbox Code Playgroud)

看到?它工作正常.