我用过
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 ++的推动。
答案 0 :(得分:7)
它不是核心模块(意味着它不与perl捆绑在一起),但它是一个相对常见的模块。我会毫不犹豫地使用它。
如果您真的偏执,它可能无法使用,假设数组相同大小,您可以使用以下内容:
for my $i (0 .. $#array1) {
my $first = $array1[$i];
my $second = $array2[$i];
}
但是,幸运的是each_array()是用纯perl实现的,所以你也可以查看List / MoreUtils.pm的源代码并复制并粘贴相关的子程序。
答案 1 :(得分:4)
您可能希望使用模块的each_arrayref
函数的这种更简单的重写。 each_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;
}
<强>输出强>
0: A, D
1: B, E
2: C, F
3: undef, G
当然,您可以从each_arrayref
模块中获取List::MoreUtils
的代码。它是独立的,可以保证与现有代码的兼容性。
答案 2 :(得分:2)
有些模块直接与Perl本身分发。它们通常被称为“核心模块”。你总是可以使用它们。 List::Util
是其中之一,但List::MoreUtils
不是。
但是,List::MoreUtils
是CPAN上可用的模块。 CPAN通常被认为是“Perl的标准库”,类似于“标准库”对C ++的用途。大多数人认为可以要求其应用程序的用户从CPAN安装某些模块,特别是如果它们是使用良好的模块。
List::MoreUtils
绝对是一个很好用的模块。它已存在很长一段时间了。我所知道的所有主要Linux发行版都包含它的打包版本。
因此,如果您的目标不是100%独立于非核心模块,那么我强烈建议您继续使用List::MoreUtils
以及CPAN上可用的大多数其他精细模块。他们就是Perl摇滚的原因。
稍微偏离主题:我不得不承认我更喜欢pairwise
(也来自List::MoreUtils
),因为它的行为更像map
。以你的例子:
use List::MoreUtils qw(pairwise);
pairwise { do_stuff($a, $b) } @input_dump_arr, @created_dump_arr;