首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行迭代2个数组的Perl方式

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

Stack Overflow用户
提问于 2013-04-16 04:49:26
回答 3查看 7.1K关注 0票数 9

我用过

代码语言:javascript
复制
Use List::MoreUtils qw(each_array);
my $it = each_array( @input_dump_arr, @created_dump_arr);
while ( my ($first, $second) = $it->()) {
}

这在默认的perl配置中可以工作吗?一个更广泛的问题是,是否有编写“可移植”perl脚本的指导原则?我是Perl的新手,只是想弄清楚cpan是否真的类似于boost库对c++的作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-16 13:58:47

您可能希望使用此模块的each_arrayref函数的更简单的重写。each_array是这个函数的多余包装器,它使用原型来引用作为参数传递的数组。

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

代码语言:javascript
复制
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;
}

输出

代码语言:javascript
复制
0: A, D
1: B, E
2: C, F
3: undef, G

当然,您可以简单地从List::MoreUtils模块中获取each_arrayref的代码。它是自包含的,并将保证与现有代码的兼容性。

票数 4
EN

Stack Overflow用户

发布于 2013-04-16 05:12:14

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

如果你真的是偏执狂,它可能是不可用的,假设数组是大小相同的,你可以使用如下代码:

代码语言:javascript
复制
for my $i (0 .. $#array1) {
  my $first  = $array1[$i];
  my $second = $array2[$i];
}

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

票数 7
EN

Stack Overflow用户

发布于 2013-04-16 04:57:29

有一些模块直接随Perl本身一起分发。它们通常被称为“核心模块”。你可以随时使用它们。虽然List::MoreUtils不是,但List::Util是其中之一。

但是,CPAN上提供了List::MoreUtils模块。CPAN通常被认为是“Perl的标准库”,类似于C++的“标准库”。大多数人认为,要求其应用程序的用户安装来自CPAN的某些模块是可以的,特别是如果它们是常用的模块。

List::MoreUtils绝对是一个使用得很好的模块。它已经存在很长一段时间了。据我所知,所有主要的Linux发行版都包含它的打包版本。

因此,如果您的目标不是100%独立于非核心模块,那么我强烈建议您继续使用List::MoreUtils和CPAN上提供的大多数其他优秀模块。这就是为什么Perl如此强大。

稍微偏离话题:我必须承认,对于两个数组,我更喜欢pairwise (也来自List::MoreUtils),因为它的行为更像map。对于您的示例:

代码语言:javascript
复制
use List::MoreUtils qw(pairwise);
pairwise { do_stuff($a, $b) } @input_dump_arr, @created_dump_arr;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16024480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档