首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何告诉一个Perl函数,该函数接受要从特殊ARGV句柄读取的文件?

我如何告诉一个Perl函数,该函数接受要从特殊ARGV句柄读取的文件?
EN

Stack Overflow用户
提问于 2010-10-29 02:46:23
回答 3查看 499关注 0票数 7

perldoc perlvar中,我读到了以下内容:

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

因此,如何将*ARGV (或类似的东西)作为参数传递给期望文件句柄的函数,并让该函数读取@ARGV中的所有文件

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-29 03:37:05

继续前进,传入*ARGV类型或\*ARGV,这是它的引用。只需确保函数最终通过<$fh>运算符或readline($fh) (它的底层功能等效项)使用它。

perlvar手册中引用的段落中提到的问题只是想提醒您,如果在句柄上使用readline以外的任何其他读取机制,您将无法打开readline的魔法触发,例如readsysreadgetc

运行这个来向自己证明它是有效的:

代码语言:javascript
复制
sub mycat {
    my $fh = shift;
    print "$ARGV $.: $_" while <$fh>;
}
mycat(*ARGV);

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

代码语言:javascript
复制
% 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);

看见?效果很好。

票数 12
EN

Stack Overflow用户

发布于 2010-10-29 03:26:53

在迭代重载对象时,可以将其重新分派到<>

代码语言:javascript
复制
{package ReadARGV;
    sub new {bless []}
    use overload '<>' => sub {<>};
}

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

reader(ReadARGV->new);

ReadARGV包包含一个简单的对象构造函数new,然后重载<HANDLE>操作符以简单地调用<>

票数 1
EN

Stack Overflow用户

发布于 2010-10-29 03:13:14

您可以使用cat (在Unix系统上)伪造它。

代码语言:javascript
复制
open FAKE_ARGV, "cat @ARGV |";
function_expecting_filehandle(*FAKE_ARGV);
...

这样就失去了一些魔力($ARGV$.)。

我确信也有一种方法可以处理绑定的文件句柄(参见perltie)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4048619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档