Comment puis-je obtenir une partie seulement d'un hachage en Perl?
Est-il un moyen d'obtenir un sous-hash? Dois-je utiliser un hachage de la tranche?
Par exemple:
%hash = ( a => 1, b => 2, c => 3 );
Je veux seulement
%hash = ( a => 1, b => 2 );
- Comme il n'y a rien, en toute logique, "tranche" je soupçonne que quelque chose à voir avec la 'carte'. Dans un tableau et que vous souhaitez faire sur la base d'un indice, mais dans une table de hachage n'est pas fiable représentation interne des données. Vous auriez besoin d'un certain type de qualificatif (regex?) pour définir ce qui doit aller dans le subhash et ce qui ne l'est pas.
- BTW, vous hachage syntaxe est incorrecte: tour accolades "()" pour une plaine de hachage, "{}" pour l'anonyme de hachage références.
Vous devez vous connecter pour publier un commentaire.
Hachage tranches retourner les valeurs associées à une liste de clés. Pour obtenir un hash tranche vous modifiez le sceau de @ et de fournir une liste de clés (dans ce cas
"a"
et"b"
):Souvent, vous pouvez utiliser une citation mot de l'opérateur de produire la liste:
Vous pouvez également attribuer à un hachage de la tranche, donc si vous voulez une nouvelle table de hachage qui contient un sous-ensemble d'un autre de hachage, vous pouvez dire
Beaucoup de gens vont utiliser un carte au lieu de hachage tranches:
De départ avec Perl 5.20.0, vous pouvez obtenir les clés et les valeurs en une seule étape si vous utilisez le % de sigil au lieu de l' @ prefix:
Vous voudrez probablement pour assembler une liste de touches que vous souhaitez:
Et ensuite utiliser une boucle pour faire du hash:
Ou:
(Ma préférence va à la seconde, mais quel que soit celui que vous aimez est la meilleure.)
Encore une autre façon:
Trop de la programmation fonctionnelle, m'amène à penser de
zip
premier.Avec Liste::MoreUtils installé,
Malheureusement, le prototype de la Liste::MoreUtils de
zip
inhibeSi vous voulez vraiment éviter la variable intermédiaire, vous pourriez
Ou il suffit d'écrire votre propre
zip
sans la problématique de prototype. (Ce qui n'a pas besoin de Liste::MoreUtils à tous.)Si vous allez à la mutation en place,
évite la copie supplémentaire que le
map
etzip
solutions engager. (Oui, la mutation de la table de hachage, alors que vous êtes de l'itération, c'est sûr... tant que la mutation n'est de supprimer le plus récemment réitéré paire.)%keep = map +($_ => 1), qw(a b);
?FWIW, je l'utilise à l'Orignal::Autobox ici:
Dans la vraie vie, je l'utilise pour extraire le "nom d'utilisateur" et "mot de passe" à partir d'un formulaire de soumission et passer de Catalyseur du
$c->authenticate
(qui s'attend à ce que, dans mon cas, un hashref contenant le nom d'utilisateur et le mot de passe, mais rien d'autre).Nouveau en perl 5.20 est de hachage tranches de la restitution des clés ainsi que les valeurs à l'aide d' % comme sur la dernière ligne ici:
Une table de hachage est un non-ordonnée contenant, mais le terme de tranche n'a vraiment de sens qu'en termes d'ordre de l'conteneur. Peut-être l'aide d'un tableau. Sinon, vous pouvez juste avoir à enlever tous les éléments que vous ne voulez pas produire vos " sous-hash.