无法将所有输出存储到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() 的输出重定向到文件句柄?

如何将正则表达式捕获存储在 Perl 的数组中?

Perl - 正则表达式匹配的输出非常奇怪,确实

从 perl 数组/哈希打印信息

[perl] perl 中二维哈希hash 与python 二维字典dict

将结果数据附加到 Parallel::ForkManager Perl 中的标量变量