2015-01-22 5 views
2

Для сравнения каждого элемента массива, что я знаю, такие же длины (и которые имеют предсказуемый порядок) в 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" ; 
} 

или один-lineishly для вырезания и вставки:

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. Может ли кто-нибудь прокомментировать эту мудрость? Похоже, что было бы легче понять код, написанный таким образом, который применяет операторы к ряду списков, а не итерации по спискам для применения операторов. Возможно, творческое использование map или List::MoreUtils's apply достигнет того же.

Удивительные образцы кода perl6 особо приветствуются.

+0

Возможно, мне не хватает точки вашего вопроса, но ... Если вы знаете, что длина такая же, что не так с 'для my $ i (0 .. $ # array1) {say $ array1 [$ i ], $ array2 [$ i]; } '? – ThisSuitIsBlackNot

+0

Как правило, массив или список будут намного больше, и можно захотеть сделать больше сравнений элементов, которые, как я полагаю, должны сделать «each_arrayref». Но да, проще, когда это возможно. –

+0

Думаю, я все еще не понимаю. Как бы массив с большим количеством элементов или необходимость большего сравнения изменил логику в цикле? Возможно, более конкретный пример в порядке ... – ThisSuitIsBlackNot

ответ

1

Поскольку вы используете List::AllUtils, а как насчет pairwise?

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; 

Это соответствует вашей проблеме, как указано, и, кажется, проще для меня, но «простых» скользкий ... Успехов!

Смежные вопросы