我有一个脚本,可以在另一个作业输出时动态地读取输入,并且需要修改并返回它。要做更复杂的修改,我希望能够捕获这个输入并将其传递给子程序,然后将一个对象返回到我的基本脚本,在那里我可以根据需要修改对象,然后将其写回。现在,我的代码看起来像这样:
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);
}
答案 0 :(得分:4)
<>
是<ARGV>
的缩写,所以
buildObjects(\*ARGV);
提示:ARGV
是一个神奇的文件句柄。期望底层系统文件句柄的函数无法使用它。但是,情况并非如此。