在perldoc perlvar中,我读到了以下内容:
注意到,目前"ARGV“只在"<>”操作符中有其神奇的效果;在其他地方,它只是一个普通的文件句柄,对应于"<>“打开的最后一个文件。特别是,将"*ARGV“作为参数传递给需要文件句柄的函数,可能不会导致函数自动读取@ARGV中所有文件的内容。
因此,如何将*ARGV (或类似的东西)作为参数传递给期望文件句柄的函数,并让该函数读取@ARGV中的所有文件
发布于 2010-10-29 03:37:05
继续前进,传入*ARGV类型或\*ARGV,这是它的引用。只需确保函数最终通过<$fh>运算符或readline($fh) (它的底层功能等效项)使用它。
perlvar手册中引用的段落中提到的问题只是想提醒您,如果在句柄上使用readline以外的任何其他读取机制,您将无法打开readline的魔法触发,例如read、sysread或getc。
运行这个来向自己证明它是有效的:
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-29 03:26:53
在迭代重载对象时,可以将其重新分派到<>:
{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-29 03:13:14
您可以使用cat (在Unix系统上)伪造它。
open FAKE_ARGV, "cat @ARGV |";
function_expecting_filehandle(*FAKE_ARGV);
...这样就失去了一些魔力($ARGV,$.)。
我确信也有一种方法可以处理绑定的文件句柄(参见perltie)。
https://stackoverflow.com/questions/4048619
复制相似问题