【问题标题】:Alternate looping nested foreach loops交替循环嵌套 foreach 循环
【发布时间】:2018-06-06 20:47:58
【问题描述】:

我正在尝试从一个 foreach 循环中打印一个值。然后转到另一个 foreach 循环并继续直到两个数组中的最后一个元素。

@list = (10, 20, 30, 40, 50);
@list1 = (15, 25, 35, 45, 55);
OUTER:foreach $a (@list) {
        print "value of a: $a\n";
        foreach $b (@list1) {
          print "value of b: $b\n";
          next  OUTER;
        }
      }

这会从第二个 foreach 循环返回相同的值。

value of a: 10
value of b: 15
value of a: 20
value of b: 15
value of a: 30
value of b: 15
value of a: 40
value of b: 15
value of a: 50
value of b: 15

所需的输出应如下所示:

value of a: 10
value of b: 15
value of a: 20
value of b: 25
value of a: 30
value of b: 35
value of a: 40
value of b: 45
value of a: 50
value of b: 55

有没有办法交替打印两个数组中的值?任何循环控制语句都可以做到这一点?

我只是在测试这个逻辑,因为我将在我的脚本中使用它。在哪里,我将从 foreach 循环中打开一对文件并对其进行处理(每个循环一个文件)。我将使用 foreach 循环打开的文件位于不同的目录中,并且位于多个类似文件的池中。我将在我的代码中循环以使用嵌套的 foreach 逻辑打开所有这些。

脚本看起来像这样:

$dir1 = "/tmp/*";
$dir2 = "/home/*";
@files1 = glob( $dir1 );
@files2 = glob( $dir2 );
foreach (@files1) {
 .
 .
 . 
   foreach (@files2){
    .
    .
    .
   }
}

【问题讨论】:

    标签: perl foreach


    【解决方案1】:

    遍历任一数组的索引

    foreach my $i (0..$#list) {
        say "value of a: ", $list[$i]  // 'undef';  #/
        say "value of b: ", $list1[$i] // 'undef';
    }
    

    在哪里 defined-or (//) 是必需的,否则您将收到未定义元素的警告(或者如果第二个数组在第一个数组之前耗尽)。我打印字符串undef,适当调整。

    这显然假设并行处理数组是有意义的 并且它们的大小相等。如果他们不是,你可能想做一些事情,而不是在结束后继续。

    您的代码在第一次使用next 迭代后退出内部循环,下一次返回它时从头开始。

    【讨论】:

    • 非常感谢!!浪费了将近一天的时间来弄清楚如何一次获取两个文件并使用嵌套的 foreach 循环进行循环。
    • @PKV 非常欢迎 :) 现在想想如果它们不相等,你到底想做什么,还要检查什么等等。
    【解决方案2】:

    您正在从List::MoreUtils 描述each_array 的行为:

    use strict;
    use warnings;
    use 5.010;
    
    use List::MoreUtils qw(each_array);
    
    my @arr1 = (10, 20, 30, 40, 50);
    my @arr2 = (15, 25, 35, 45, 55);
    
    my $it = each_array(@arr1, @arr2);
    
    while (my ($a1, $a2) = $it->()) {
        say "value from array 1: $a1";
        say "value from array 2: $a2";
    }
    

    输出:

    value from array 1: 10
    value from array 2: 15
    value from array 1: 20
    value from array 2: 25
    value from array 1: 30
    value from array 2: 35
    value from array 1: 40
    value from array 2: 45
    value from array 1: 50
    value from array 2: 55
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多