您可以将输出存储在数组中
my @output;
for (1..3) {
my $cmd = '...';
push @output, scalar qx($cmd);
}
现在@output 的元素具有连续命令运行的输出。
请注意,qx(反引号)可以返回包含命令所有输出行的字符串,也可以返回包含输出行作为元素的列表,具体取决于调用它的上下文。
my @out = qx(ls -l .); # @out elements have lines from output
my $out = qx(ls -l .); # all lines from output are in string $out
由于push 需要一个列表来推送到一个数组,列表上下文 被强加并且(没有scalar)qx 将从命令返回一个行列表(当输出多于一行)。因此,每一行都将作为一个单独的元素添加到@output。但是scalar 强制标量上下文,然后每个命令的整个输出进入一个字符串,该字符串作为单个元素添加。所以我们得到一个包含三个元素的数组,每个元素都是一个(可能是多行的)字符串。感谢ThisSuitIsBlackNot 的评论。
如何获得命令的输出是另一个问题。在这里,我假设“command”暗示了一个打印到其STDOUT 的外部命令,并且我省略了错误检查。最好运行qx 并捕获其输出,检查错误,然后才将输出放到数组中。
分配给单独的变量有特定的要求。一种方式
my ($out1, $out2, $out3);
for ($out1, $out2, $out3) {
my $cmd = '...';
$_ = qx($cmd);
}
在这里,您必须显式列出变量名称,以声明它们并循环它们。这并不能写出非常好的代码,因为您必须列出所有变量,因此更难跟踪事物,并且必须将任何更改应用于多个地方。
如果您正在考虑动态构建变量名称,以避免处理变量列表,这意味着要处理symbolic references——您不想这样做。随着时间的推移,已经有很多反对它的说法,这显然是一种非常不鼓励的做法。例如,参见this post。一方面,use strict 不允许。
如果您坚持使用名称,则可以使用带有在运行时构建的键名的哈希
my %out;
for (1..3) {
my $cmd = '...';
my $key = 'o' . $_; # name keys as 'o1', 'o2', etc
$out{$key} = qx($cmd);
}
for (sort keys %out) {
print "$_ => $out{$_}\n";
}
请注意,您必须再次编造这些特定的键名并跟踪它们。
如果可能的话,我建议使用数组。例如,当您处理它时,您总是可以在循环时分配给命名变量。或者,更好的是,重新考虑导致这种需求的设计。