在 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
。然后,我将构建导入 buildObject
和 writeObject
的新脚本,并实施一个 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
是一个神奇的文件句柄。需要底层系统文件句柄的函数将无法使用它。不过你不是这样的。
我有一个脚本可以在另一个作业输出时连续读取输入,并希望对其进行修改和 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
。然后,我将构建导入 buildObject
和 writeObject
的新脚本,并实施一个 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
是一个神奇的文件句柄。需要底层系统文件句柄的函数将无法使用它。不过你不是这样的。