J'essaie de filtrer un tableau de termes en utilisant un autre tableau en Perl. J'ai Perl 5.18.2 sur OS X, mais le comportement est le même si je use 5.010
. Voici ma configuration de base:Perl: Suppression d'éléments de tableau et redimensionnement du tableau
#!/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;
}
}
}
Cela fonctionne pour tirer les lignes qui correspondent aux différents termes de recherche, mais la longueur du tableau ne change pas. Si j'écris sur le tableau @terms
résultant, je reçois:
[alpha]
[delta quadrant]
[zeta]
[eta]
[theta chi]
[kappa]
[]
[]
[]
[]
Comme vous pouvez attendre de cela, l'impression scalar(@terms)
obtient un résultat de 10
.
Ce que je veux est un tableau résultant de longueur 6, sans les quatre éléments vides à la fin. Comment puis-je obtenir ce résultat? Et pourquoi le tableau ne rétrécit-il pas, étant donné que le perldoc page about splice
dit: «Le tableau croît ou se rétrécit si nécessaire.»?
(Je ne parle pas couramment Perl, donc si vous pensez "Pourquoi ne pas juste ...?", C'est presque certainement parce que je ne le sais pas ou je ne l'ai pas compris quand j'en ai entendu parler.)
'grep' fonctionne sur les tableaux et renvoie les éléments correspondants. Peut-être que vous voulez dire '$ terms [$ ind] = ~/$ filter /' pour correspondre à un seul? – tadman
Oui, ça ressemble à ça, merci! Je ne comprends toujours pas pourquoi le tableau n'a pas rétréci avec ce que je faisais avant. –
Il est toujours difficile de supprimer des éléments d'un tableau que vous itérez activement. Cela décale le décalage de 1 chaque fois que vous fusionnez quelque chose. – tadman