我用过
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++的作用。
发布于 2013-04-16 13:58:47
您可能希望使用此模块的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当然,您可以简单地从List::MoreUtils模块中获取each_arrayref的代码。它是自包含的,并将保证与现有代码的兼容性。
发布于 2013-04-16 05:12:14
它不是一个核心模块(这意味着它没有与perl捆绑在一起),但它是一个相对常见的模块。我会毫不犹豫地使用它。
如果你真的是偏执狂,它可能是不可用的,假设数组是大小相同的,你可以使用如下代码:
for my $i (0 .. $#array1) {
my $first = $array1[$i];
my $second = $array2[$i];
}不过,幸运的是,each_array()是用纯Perl语言实现的,因此您还可以查看List/MoreUtils.pm的源代码,并复制和粘贴相关子例程。
发布于 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。对于您的示例:
use List::MoreUtils qw(pairwise);
pairwise { do_stuff($a, $b) } @input_dump_arr, @created_dump_arr;https://stackoverflow.com/questions/16024480
复制相似问题