无法将所有输出存储到Perl中的数组

时间:2018-03-03 09:44:56

标签: perl

我正在读取文件中的行并将其输入到命令中。

.c

我想将每个输出存储到数组中。但无法存储它,它会覆盖以前的值

1 个答案:

答案 0 :(得分:3)

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` ];