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

nim*_*ims 1 perl loops while-loop

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

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

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

zdi*_*dim 6

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

my @output;

for (1..3) {
   my $cmd = '...';
   push @output, scalar qx($cmd);
}
Run Code Online (Sandbox Code Playgroud)

现在元素@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
Run Code Online (Sandbox Code Playgroud)

由于push需要一个列表来推送到一个数组上,因此会施加列表上下文,并且(没有scalarqx将从命令中返回一个行列表(当输出有多于一行时)。因此,每一行都将作为一个单独的元素添加到@output. 但是标量强制标量上下文,然后每个命令的整个输出进入一个字符串,作为单个元素添加。所以我们得到一个包含三个元素的数组,每个元素都是一个(可能是多行的)字符串。感谢ThisSuitIsBlackNot发表评论。

如何获得命令的输出是一个不同的问题。在这里,我假设“命令”暗示了一个打印到它的外部命令STDOUT,并且我省略了错误检查。最好运行qx并捕获其输出,检查错误,然后才将输出放在阵列上。


分配给单独的变量有特定的要求。单程

my ($out1, $out2, $out3);

for ($out1, $out2, $out3) {
    my $cmd = '...';
    $_ = qx($cmd);
}
Run Code Online (Sandbox Code Playgroud)

在这里,您必须明确列出变量名称,以声明它们并循环遍历它们。这不是很好的代码,因为您必须列出所有变量,因此很难跟踪事物,并且必须将任何更改应用于多个地方。

如果您正在考虑动态构造变量名称,为了避免处理变量列表,这意味着处理符号引用——而您不想这样做。随着时间的推移,已经有很多人反对它,这显然是一种不鼓励的做法。例如,请参阅这篇文章。一方面,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";
}
Run Code Online (Sandbox Code Playgroud)

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

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