0
votes

Convertir des valeurs séparées par des virgules sur une paire de valeur de clé Perl

J'ai un éventail d'états dans le format xxx

que je veux formaté comme: xxx

Ceci est principalement pour que je Peut plus facilement en boucle à l'aide du module HTML :: Modules ( https://metacpan.org/ POD / HTML :: Modèle # TMPL_LOOP )

Je suis assez nouveau à Perl, alors inconscient de la manière de faire ce genre d'action et de ne pas trouver quelque chose de similaire.


0 commentaires

5 Réponses :


1
votes

sauf si vous avez besoin de garder ce hachage autour d'une utilisation ultérieure, je pense que simplement boucler à travers les éléments deux à la fois serait plus simple. Vous pouvez accomplir facilement ce type de bouclage avec épissure code> :

my @states = ('AL','Alabama','AK','Alaska','AR','Arkansas'...);
my @state_hashes = ();
while (my ($code, $name) = splice(@states, 0, 2)) {
   push @state_hashes, { $code => $name };
}
# do w/e you want with @state_hashes


0 commentaires

2
votes
use List::Util 1.29;
@state_hashes = List::Util::pairmap { +{ $a => $b } } @states;

3 commentaires

Ou liste d'utilisation :: util 1.29 qw (pairmap); @state_hashes = paireMap {+ {$ a => $ b}} @states; . Vous pouvez toujours importer lors de la spécification d'une version.


@ikegami Je ne suis pas un grand fan d'importation


Assez juste, mais d'autres sont. (J'aime importer, mais j'aime bien énumérer exactement ce que j'importe plutôt que d'importer les valeurs par défaut comme vous l'avez fait)



1
votes

Bundle_by de la liste :: Utilsby peut facilement créer ce format:

use strict;
use warnings;
use List::UtilsBy 'bundle_by';
my @states = ('AL', 'Alabama', 'AK', 'Alaska', 'AR', 'Arkansas', ... );
my @hashes = bundle_by { +{@_} } 2, @states;


0 commentaires

0
votes

mappe code> Solution avec quelques objets PERLISH

my @states = ('AL','Alabama','AK','Alaska','AR','Arkansas','VT','Vermont');

my %states;
map { $states{$states[$_]} = $states[$_+1] unless $_%2 } 0..$#states;


0 commentaires

3
votes

Ce qui suit ne serait-il pas plus logique pour HTML :: Modèle? XXX PRE>

Cela vous permettrait d'utiliser le modèle suivant: P>

use List::Util 1.29 qw( pairmap );

{
   my %escapes = (
      '&' => '&',
      '<' => '&lt;',
      '>' => '&gt;',
      '"' => '&quot;',
      "'" => '&#39;',
   );

   sub text_to_html(_) { $_[0] =~ s/([&<>"'])/$escapes{$1}/rg }
}

states => [ pairmap { +{ id_html => $a, name_html => $b } } map text_to_html, @states ]


2 commentaires

Pourquoi utilisez-vous la version dans Liste d'utilisation :: util 1.29 qw (pairmap); ? Sans version Liste d'utilisation :: util qw (pairmap); sur la liste :: util avant 1.29 le code avec l'échec "pairmap" n'est pas exporté par la liste :: Module UTIL .


1) Le message d'erreur est meilleur parce qu'il dit comment résoudre le problème. 2) Je ne mettez pas vraiment la version dans l'instruction ; Je l'place dans makefile.pl/build.pl. Cela communique au lecteur quelle version placer dans makefile.pl/build.pl.