Поиск значений в массиве с использованием Perl - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть два массива @input0 и @input1. Я хотел бы цикл for, который проходит через все значения в @input1, и если значение существует в @input0, значение сохраняется в новом массиве @input.

Все массивы содержат только цифры. Максимально 10 номеров на элемент массива (см. Ниже):

@input0 = {10061 10552 10553 10554 10555 10556 10557 10558 10559 10560, 10561 10562 10563 10564 10565 10566 10567 10573 10574 10575, ...}

@input1 = {20004 20182 ...}

Ответы [ 4 ]

7 голосов
/ 06 февраля 2012

Самый краткий и идиоматический способ добиться этого в Perl - это не использование цикла for, а map и grep

my %seen0 = map { ($_ => 1) } @input0;
my @input = grep { $seen0{$_} } @input1;

Если вы специально хотите использовать цикл for, объясните, почемуподход map / grep не работает (если это не домашняя работа, в этом случае вопрос должен быть помечен как один)

2 голосов
/ 06 февраля 2012

Коротко, сладко и медленно:

my @input = grep $_ ~~ @input0, @input1;

Подробно и быстрее с циклом for:

my %input0 = map {$_, 1} @input0;
my @input;

for (@input1) {
    push @input, $_ if $input0{$_};
}
1 голос
/ 06 февраля 2012

Вы также можете использовать hashslice + grep:

my %tmp ;
@tmp{@input0} = undef ; # Fill all elements of @input0 in hash with value undef
my @input = grep { exists $tmp{$_} } @input1 ; # grep for existing hash keys
0 голосов
/ 07 февраля 2012

Ответ dgw был почти готов, но содержал пару вещей, которые не являются лучшей практикой. Я считаю, что это лучше:

my %input0_map;
@input0_map{ @input0 } = ();
my @input = grep { exists $input0_map{$_} } @input1;

Вы не должны называть переменную 'tmp', если она не находится в очень маленькой области видимости. Поскольку этот фрагмент кода не заключен в фигурный блок, мы не знаем, насколько велика область видимости.

Вы не должны присваивать в хэш-фрагмент один «undef», потому что это означает, что первый элемент назначается с этим литералом undef, а другие элементы назначаются с неявным undefs. Это будет работать, но это плохой стиль. Либо присвойте им все значения, либо им ВСЕ присваивают неявно (как это происходит, если мы присваиваем из пустого списка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...