在perldoc perlvar
中,我读到了这个:
请注意,目前“ARGV”只有 它在“<>”中的神奇效果 操作;其他地方只是一个平原 文件句柄对应最后一个 文件由“<>”打开。特别是, 将“* ARGV”作为参数传递给a 期望文件句柄的函数可能 不会导致你的功能 自动读取所有内容 @ARGV中的文件。
那么,如何我将*ARGV
(或类似于它的东西)作为参数传递给需要文件句柄的函数,并让该函数读取{{{}中的所有文件1}}?
答案 0 :(得分:12)
继续前进并传递*ARGV
typeglob或\*ARGV
,其引用。只需确保最终使用它的函数通过<$fh>
运算符或readline($fh)
,它的基础功能等价物来实现。
perlvar联机帮助页中引用的段落中提到的问题只是提醒您,如果您有任何问题,您将无法启动ARGV
的魔术开放在句柄上使用除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);
请参阅?它工作正常。
答案 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
)。