我想执行一个命令三次,并且每次都将命令执行的输出存储在另一个变量中。下面的代码是每次都将它存储在同一个变量中。我如何存储在不同的变量?
int $i=0;
while ( $i< 3 ) {
$a = ( " command gets executed her " );
$i = $i+1 ;
}
我希望输出存储在三个不同的变量中,例如$ a $ b和$ c。
答案 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";
}
请注意,您必须再次组成这些特定的密钥名称并跟踪它们。
如果可能的话,我建议使用数组。处理时,例如,当您循环遍历命名变量时,始终可以将其分配给它。或者,更好的是,重新考虑导致这种需求的设计。