Альтернативные циклы вложенных циклов foreach - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь напечатать значение из одного цикла 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){
    .
    .
    .
   }
}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы описываете поведение each_array из Список :: MoreUtils :

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
0 голосов
/ 07 июня 2018

Цикл по индексу любого из массивов

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

, где необходимо определено-или (//), иначе вы получите предупреждения для неопределенных элементов (или есливторой массив истощается до первого).Я печатаю строку undef, корректирую по мере необходимости.

Это явно предполагает, что имеет смысл обрабатывать массивы параллельно и иметь одинаковый размер.Если это не так, вы можете захотеть сделать что-то иное, чем продолжить, как только закончите.

Ваш код выходит из внутреннего цикла после первой итерации с next, и в следующий раз, когда он возвращается к нему, он начинается сначало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...