在Perl中,如果可能,如何将通用菱形(<>)文件句柄传递给子例程?

时间:2015-05-12 21:06:00

标签: perl filehandle

我有一个脚本,可以在另一个作业输出时动态地读取输入,并且需要修改并返回它。要做更复杂的修改,我希望能够捕获这个输入并将其传递给子程序,然后将一个对象返回到我的基本脚本,在那里我可以根据需要修改对象,然后将其写回。现在,我的代码看起来像这样:

while (my $line = <>) {
    # Do stuff here to build object
    # When end of record, call writeObject
    # Start new object unless eof
}

sub writeObject {
    # Iterate over object and print to STDOUT
}

我想采用第一个while循环并将其转换为一个子程序,然后我可以将其与writeObject一起放入一个我可以重用的小模块中。我认为我需要做的是以某种方式将<>传递给这个新的子例程buildObject。然后,我将构建导入buildObjectwriteObject的新脚本,并实现一个将从脚本更改为脚本的modifyObject例程。其他两个部分应该是完全可重用的,因为这个过程的部分永远不会改变。最理想的是,新例程看起来像这样:

sub buildObjects {
    my ($input) = @_;
    my @objects = ();
    while (<$input>) {
        # Build object, push to @objects when done
    }
    return \@objects;
}

使用此脚本的脚本如下所示:

my $obj = buildObjects(<>);

foreach my $object (@$obj) {
    $object = modifyObject($object);
    writeObject($object);
}

1 个答案:

答案 0 :(得分:4)

<><ARGV>的缩写,所以

buildObjects(\*ARGV);

提示:ARGV是一个神奇的文件句柄。期望底层系统文件句柄的函数无法使用它。但是,情况并非如此。