while循环执行多次命令并每次将输出存储在不同的变量中

时间:2016-08-09 21:45:32

标签: perl loops while-loop

我想执行一个命令三次,并且每次都将命令执行的输出存储在另一个变量中。下面的代码是每次都将它存储在同一个变量中。我如何存储在不同的变量?

   int $i=0;
   while ( $i< 3 ) {
    $a = ( " command gets executed her " );
    $i = $i+1 ;
   } 

我希望输出存储在三个不同的变量中,例如$ a $ b和$ c。

1 个答案:

答案 0 :(得分:3)

您可以将输出存储在数组中

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强制标量上下文,然后每个命令的整个输出进入一个字符串,该字符串被添加为一个signle元素。所以我们得到一个包含三个元素的数组,每个元素都是一个(可能是多行的)字符串。感谢ThisSuitIsBlackNot发表评论。

如何获取命令的输出是一个不同的问题。这里我假设“命令”意味着打印到其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";
}

请注意,您必须再次组成这些特定的密钥名称并跟踪它们。

如果可能的话,我建议使用数组。处理时,例如,当您循环遍历命名变量时,始终可以将其分配给它。或者,更好的是,重新考虑导致这种需求的设计。