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

In Perl, if possible, how do I pass a generic diamond (<>) filehandle to a subroutine?

我有一个脚本可以在另一个作业输出时连续读取输入,并希望对其进行修改和 return。要进行更复杂的修改,我希望能够捕获此输入并将其传递给子例程,然后子例程 return 一个对象到我的基本脚本,我可以在其中根据需要修改对象,然后把它写回来。现在,我的代码看起来像这样:

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);
}

<><ARGV>的缩写,所以

buildObjects(\*ARGV);

提示:ARGV是一个神奇的文件句柄。需要底层系统文件句柄的函数将无法使用它。不过你不是这样的。