使用运算符对数组进行简单的元素比较

时间:2015-01-22 21:54:38

标签: arrays perl elements perl6

为了比较perl中我知道长度相同(并且具有可预测顺序)的数组的每个元素,我们有each_arrayref可以添加到有用的子程序中或直接使用:

use List::AllUtils qw/each_arrayref/;

my ($arr1, $arr2) = ( [10, 31, 12], [20, 21, 14] );

my $iterate_elems = each_arrayref($arr1, $arr2); 
while ( my ($x, $y) = $iterate_elems->() ) { 
   say $x lt $y ? "$x is lower " : "$x is higher" ; 
}

或单行剪切和粘贴:

perl -MList::AllUtils=each_arrayref -E '
  my $iter = each_arrayref([10, 31, 12], [20, 21, 14]); 
  while ( my ($x, $y) = $iter->() ){ 
  say $x lt $y ? "$x lower" : "$x higher"}'

但这似乎有点尴尬而且并非完全万无一失。我尝试使用像$iterate_elems这样的描述性术语作为迭代函数参考来帮助。也许我没有足够使用它,因为它看起来很明显。

在perl6中有metaoperators允许各种相当简洁和酷的列表比较和修改。这让我认为必须有一种方法可以在perl5中使用运算符重载来实现这一点。任何人都可以评论这个的智慧吗?看起来可能更容易理解以将运算符应用于一系列列表而不是遍历列表来应用运算符的方式编写的代码。也许创造性地使用mapList::MoreUtils的{​​{1}}也可以达到同样的效果。

令人惊讶的perl6代码示例特别受欢迎。

1 个答案:

答案 0 :(得分:1)

由于您正在使用List::AllUtilspairwise

怎么样?
use List::AllUtils qw(pairwise);

my @arr1 = (10, 31, 12);
my @arr2 = (20, 21, 14);

pairwise { 
    print $a lt $b ? "$a is lower\n" : "$a is higher\n"
} @arr1, @arr2;

这符合您所述的问题,对我来说似乎更简单,但简单'很滑......祝你好运!