【问题标题】:while loop to execute a command multiple times and store the output in a different variable each timewhile循环多次执行命令并将输出存储在每次不同的变量中
【发布时间】:2021-06-30 03:49:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl loops while-loop


    【解决方案1】:

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

    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 需要一个列表来推送到一个数组,列表上下文 被强加并且(没有scalarqx 将从命令返回一个行列表(当输出多于一行)。因此,每一行都将作为一个单独的元素添加到@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";
    }
    

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

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

    【讨论】:

    • 如果我想将它存储在 3 个不同的变量中怎么办?
    • @nims 从字面上看?好的,我将对此进行补充。
    • @nims 添加了一个带有 cmets 的示例。
    • 完美。感谢您的解释。这很有帮助
    • @nims 太棒了:)。让我知道是否有更多解释/澄清有用。
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多