我这样做是为了运行外部命令,预先添加一些数据并将其全部发送到另一个外部命令:
my $prepend = 'foo foo foo';
my $contents = `command`;
open(my $handle, "|-", "command_2"))
print $handle $prepend . $contents;
close $handle;
当$contents
(从外部流程返回)很小(通常小于1k)时,这很好,但是当它很大时(最多10,20,30MB) ),我怀疑这是不必要的内存密集型。
所以我把它改成了:
my $prepend = 'foo foo foo';
open(my $handle_in, "-|", "command"))
open(my $handle_out, "|-", "command_2"))
print $handle_out $prepend;
while (<$handle_in>) {
print $handle_out $_;
}
close $handle_in;
close $handle_out;
这实际上是否能节省内存?当command
返回许多MB数据时,它是否会遇到任何性能问题?有更好的方法吗?
答案 0 :(得分:0)
在第一种情况下,在发送任何输出之前,您将command
的整个输出读入内存。在第二种情况下,您一次只能读取一行。
如果命令的输出很大并且由许多行组成,那么是的,你将节省内存。
在第二种情况下还有更多的工作要做,所以它会慢一些,但可能不会那么明显。