无法将所有输出存储到Perl中的数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将所有输出存储到Perl中的数组相关的知识,希望对你有一定的参考价值。
我正在从文件中读取行并将其输入到命令中。
open my $handle, '<', $path_to_file;
foreach $line (<$handle>) {
my @output = `cmd`;
我想将每个输出存储到数组。但无法存储它,它会覆盖以前的值
答案
open my $handle, '<', $path_to_file;
foreach $line (<$handle>) {
my @output = `cmd`;
} # I added this closing brace.
你有几个问题。
首先,每次循环,你都会声明一个新的空的@output
实例。所以在循环之外声明变量。
my @output;
open my $handle, '<', $path_to_file;
foreach $line (<$handle>) {
@output = `cmd`;
}
但是这里仍然存在问题。你在循环的每次迭代中都覆盖了整个@output
。您想将数据添加到@output
的末尾。因此,不应该为数组赋值,而应该将push()
添加到数组末尾的新元素。
my @output;
open my $handle, '<', $path_to_file;
foreach $line (<$handle>) {
push @output, `cmd`;
}
更新:正如Borodin在评论中指出的那样,push()
在反引号上强加了列表上下文,因此它们将返回一个列表,其中每个元素都是来自命令输出的单行。您可能希望通过确保每次执行命令返回单个字符串(可能包含嵌入的换行符)来驯服该行为:
push @output, scalar `cmd`;
或者创建一个二维数组,其中@array
的每个元素都是对另一个数组的引用,该数组包含来自单次执行命令的所有输出行:
push @output, [ `cmd` ];
以上是关于无法将所有输出存储到Perl中的数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Perl 的 system() 的输出重定向到文件句柄?