Как я могу суммировать массивы, поэлементные в Perl?

Или более старая кавычка, подобная тому, что сказал Joao:

"Жемчуг использования. Вы захотите знать удар, но не использовать его".

Печально я забыл, кто сказал это.

И да в эти дни я рекомендовал бы Python по жемчугу.

14
задан Amro 6 December 2014 в 16:49
поделиться

6 ответов

для Perl 5:

use List::MoreUtils 'pairwise';
@sum = pairwise { $a + $b } @arr1, @arr2;
29
ответ дан 1 December 2019 в 05:59
поделиться

Если вы используете Perl 6:

@a = (1 0 0 0 1) <<+>> (1 1 0 1 1)  #NB: the arrays need to be the same size

В Адвент-календаре Perl 6 есть больше примеров.

8
ответ дан 1 December 2019 в 05:59
поделиться

По сути, нет, вы не можете сделать это без «цикла по массивам», потому что вам нужно получить доступ к каждому элементу обоих массивов, чтобы их суммировать. Оба ответа до сих пор просто скрывают цикл под слоем абстракции, но он все еще существует.

Если вас беспокоит цикл по очень большим массивам, вероятно, лучше подумать о других способах поддержания актуальности суммы как вы идете.

8
ответ дан 1 December 2019 в 05:59
поделиться

что не так с циклом над массивами? это основы.

@arr1 = ( 1, 0, 0, 0, 1 );
@arr2 = ( 1, 1, 0, 1, 1 );
for ($i=0;$i<scalar @arr1;$i++){
    print $arr[$i] + $arr2[$i] ."\n";
}
7
ответ дан 1 December 2019 в 05:59
поделиться

Вы видели цикл for в стиле C и попарно . Вот идиоматический Perl для цикла и map :

my @arr1 = ( 1, 0, 0, 0, 1 );
my @arr2 = ( 1, 1, 0, 1, 1 );

my @for_loop;
for my $i ( 0..$#arr1 ) { 
    push @for_loop, $arr1[$i] + $arr2[$i];
}

my @map_array = map { $arr1[$_] + $arr2[$_] } 0..$#arr1;

Мне больше всего нравятся map и попарно . Я не уверен, что предпочитаю эти два варианта. попарно обрабатывает некоторые скучные детали сантехники, но это не встроенная карта вроде . С другой стороны, решение карты очень идиоматично и может быть непонятно для работающего неполный рабочий день.

Итак, ни у одного из подходов нет реальных выигрышей. IMO, как попарно , так и карта хороши.

6
ответ дан 1 December 2019 в 05:59
поделиться

Если вы действительно боитесь зацикливания, вы можете двоично разделить массивы, суммировать пары, а затем рекурсивно собрать полученный массив. Здесь нет циклов, а в качестве бонуса вы узнаете, как работает часть вывода быстрого преобразования Фурье.

1
ответ дан 1 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: