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。
您可以将输出存储在数组中
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需要一个列表来推送到一个数组上,因此会施加列表上下文,并且(没有scalar)qx将从命令中返回一个行列表(当输出有多于一行时)。因此,每一行都将作为一个单独的元素添加到@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)
请注意,您必须再次组成这些特定的键名并跟踪它们。
如果可能的话,我建议使用数组。例如,当您处理它时,您始终可以在循环时将其分配给命名变量。或者,更好的是重新考虑导致这种需求的设计。