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

问题描述 投票:0回答:1

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

open my $handle, '<', $path_to_file;
foreach  $line (<$handle>) {
  my @output  = `cmd`;

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

perl
1个回答
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` ];
© www.soinside.com 2019 - 2024. All rights reserved.