Perl并行迭代2个数组的方式

sub*_*ian 8 perl

我用了

Use List::MoreUtils qw(each_array);
my $it = each_array( @input_dump_arr, @created_dump_arr);
while ( my ($first, $second) = $it->()) {
}
Run Code Online (Sandbox Code Playgroud)

这是否适用于默认的perl配置?一个更广泛的问题是有编写"可移植"perl脚本的指导原则吗?我是Perl的新手,只是想弄清楚cpan是否实际上类似于boost库对c ++的影响.

Don*_*oma 7

它不是核心模块(意味着它不与perl捆绑在一起),但它是一个相对常见的模块.我会毫不犹豫地使用它.

如果你真的是偏执狂它可能不可用,假设数组大小相同,你可以使用类似下面的东西:

for my $i (0 .. $#array1) {
  my $first  = $array1[$i];
  my $second = $array2[$i];
}
Run Code Online (Sandbox Code Playgroud)

但是,幸运的是each_array()是用纯perl实现的,因此您还可以查看List/MoreUtils.pm的源代码并复制并粘贴相关的子例程.


Bor*_*din 4

您可能想要使用这个更简单的模块函数重写each_arrayrefeach_array是对该函数的多余包装,它使用原型来引用作为参数传递的数组。

它的功能与模块版本相同,只是它不检查它接收的参数,并且返回的迭代器不检查它是否没有参数或'index'.

use strict;
use warnings;

sub each_array {

  my @copy = @_;
  my $i;
  my $max;

  for (map scalar @$_, @copy) {
    $max = $_ unless defined $max and $max > $_;
  }

  sub {
    return $i if @_ and shift eq 'index';
    my $new_i = defined $i ? $i + 1 : 0;
    return if $new_i >= $max;
    $i = $new_i;
    return map $_->[$i], @copy;
  }
}

my @array1 = qw/ A B C /;
my @array2 = qw/ D E F G /;

my $iter = each_array(\@array1, \@array2);

while (my @values = $iter->()) {
  printf "%d: %s\n", $iter->('index'), join ', ', map $_ // 'undef', @values;
}
Run Code Online (Sandbox Code Playgroud)

输出

0: A, D
1: B, E
2: C, F
3: undef, G
Run Code Online (Sandbox Code Playgroud)

当然,您可以简单地each_arrayrefList::MoreUtils模块中获取代码。它是独立的,将保证与您现有代码的兼容性。