7
votes

Filtrer un hachage de hachage à Perl

J'ai un hachage de hasch que j'ai besoin de filtrer. J'ai trouvé comment faire une recherche mais cela n'a pas répondu à ma question.

Dis avoir un hachage de hash comme celui-là: p>

my %HoH = (
    flintstones => {
        husband   => "fred",
        pal       => "barney",
        town      => "springfield"
    },
    simpsons => {
        husband   => "homer",
        wife      => "marge",
        kid       => "bart",
        town      => "springfield",
    },
);


0 commentaires

3 Réponses :


11
votes

Vous avez d'abord besoin de trouver les clés des éléments que vous souhaitez supprimer: xxx

alors vous les supprimez: xxx

ou Utilisation d'une tranche de hachage: xxx


6 commentaires

Dans le grep Vous traitez des chaînes ( keys% hoh ) comme hashrefs.


@THissuiSblackNot, corrigé.


Comme toujours, plus propre et plus élégant que la solution que je travaillais. J'imagine que vous pouvez écrire ce genre de choses dans votre sommeil.


Le Var que je reçois est une référence afin que la ligne devienne: Supprimer $ hoh -> {$ _} pour grep {$ hoh -> {$ _} {town} eq 'springfield'} clés (% {$ hoh})


Toujours quelle est cette syntaxe? Puis-je faire quelque chose comme l'impression $ _ pour ('Test1', 'Test2')


Oui. C'est ce qu'on appelle un "modificateur de déclaration". Documenté dans PerlSyn



4
votes

Si vous avez besoin de grep code> ou plan code> via HASHES, vous pouvez envisager d'utiliser grepp code> ou mapp code> de liste :: paires . Avantage, c'est qu'il n'est plus nécessaire de mentionner plus la variable de hachage d'origine dans le bloc de code Grep / carte, ce qui le rend plus "fonctionnel". Donc, votre problème pourrait être résolu comme ceci:

use List::Pairwise qw(grepp);
%HoH = grepp { $b->{town} eq 'springfield' } %HoH; # $a is the current key, $b is the current value


0 commentaires

0
votes
for my $key (keys %HoH) {
delete $HoH{$key} if(!$HoH{$key}{town});
                    (OR)
delete $HoH{$key} if($HoH{$key}{town} !~ m/springfield/);
}
Use any one of the delete option you will get your answer...

0 commentaires