Я пытаюсь отфильтровать массив терминов, используя другой массив в Perl. У меня Perl 5.18.2 на OS X, хотя поведение такое же, если я use 5.010
. Вот моя основная установка:Perl: удаление элементов массива и изменение размера массива
#!/usr/bin/perl
#use strict;
my @terms = ('alpha','beta test','gamma','delta quadrant','epsilon',
'zeta','eta','theta chi','one iota','kappa');
my @filters = ('beta','gamma','epsilon','iota');
foreach $filter (@filters) {
for my $ind (0 .. $#terms) {
if (grep { /$filter/ } $terms[$ind]) {
splice @terms,$ind,1;
}
}
}
Это работает, чтобы вытащить строки, которые соответствуют различным условиям поиска, но длина массива не изменяется. Если я выписывать в результате @terms
массив, я получаю:
[alpha]
[delta quadrant]
[zeta]
[eta]
[theta chi]
[kappa]
[]
[]
[]
[]
Как и следовало ожидать от этого, печать scalar(@terms)
получает результат 10
.
Я хочу получить результирующий массив длиной 6, без четырех пустых элементов в конце. Как получить этот результат? И почему матрица не уменьшается, учитывая, что perldoc page about splice
говорит: «Массив растет или сжимается по мере необходимости»?
(Я не очень свободно владею Perl, поэтому, если вы думаете: «Почему бы вам не просто ...?», Это почти наверняка, потому что я не знаю об этом или не понимаю его когда я услышал об этом.)
'grep' работает на массивах и возвращает соответствующие элементы. Может быть, вы имеете в виду '$ terms [$ ind] = ~/$ filter /', чтобы соответствовать одному? – tadman
Да, похоже, что это работает, как и предполагалось, спасибо! Я все еще смущен тем, почему массив не сжимался тем, что я делал раньше. –
Всегда сложно удалить элементы из массива, который вы активно итерируете. Это сдвигает смещение на 1 каждый раз, когда вы соедините что-то. – tadman