Étape 2: Modèle Simple
Perl a essentiellement 3 types de données primitifs. Piqûres, les tableaux indexés et les tableaux associatifs.
J’ai découvert très dès le départ, qu'il était plus facile pour moi de travailler avec des pointeurs vers ces structures et hors de référence si nécessaire. Tableaux associatifs se prêtent bien à des jumelages de la valeur de la clé. Cependant, ce n’est pas l’issue de cet examen, tel qu’une clé peut mapper à plusieurs valeurs. Selon l’application, strictement définissant la valeur de l’association peut écraser une valeur antérieure. Nous allons donc voir comment nous pourrions modeler plusieurs valeurs qui sont mappés à une clé.
Examiner les approches suivantes :
Code :
#!/usr/bin/perl <br>use strict; # Just do it! use warnings; use Data::Dumper; <br> my $key1 = 'city1'; my $key2 = 'city2'; my $key3 = 'city3'; my $val1 = 'zip1'; my $val2 = 'zip2'; my $val3 = 'zip3'; my $val4 = 'zip1'; my = ($val1,$val3,$val4); # Make a quick list Notice the repeated value my $hashref; # Initialize the structure
#approach 1 hash of string-tokens foreach my $value ( { if ($hashref->{$key1}) { my $current_value = $hashref->{$key1}; $hashref->{$key1} = $current_value . "," . $value; }else{ $hashref->{$key1} = $value; } } # print Dumper $hashref;
#approach 2 key-assoc-cnt hash foreach my $value ( { if ($hashref->{$key2}->{$value}) { $hashref->{$key2}->{$value} ++; }else{ $hashref->{$key2}->{$value} = 1; } } # print Dumper $hashref;
#approach 3 hash - array associations foreach my $value ( { if ($hashref->{$key3}) { push( , $value); #switch order push vs unshift }else{ $hashref->{$key3} = [ $value ]; } } print Dumper $hashref;
Sortie :
#perl association_approaches.pl<br>$VAR1 = { 'city2' => { 'zip3' => 1, 'zip1' => 2 }, 'city1' => 'zip1,zip3,zip1', 'city3' => [ 'zip1', 'zip3', 'zip1' ] };
Dans chacune de ces approches, le comportement est déterminé par l’existence / définition de la clé. En outre, les méthodes de tirer parti de Perls "autovivification" concept. Chaque clé s’accumulent d’une série de « jetons ». Dans la première approche, la valeur d’une clé est directement utilisée sous forme de chaîne. Si plus d’un jeton est requis, il est ajouté à la chaîne séparée par un caractère arbitraire. Dans ce cas, il serait une virgule, mais plus généralement, il peut être sélectionnée pour permettre de jetons avec la fonction split. Dans la seconde approche, la valeur est gardée séparée en rendant une autre couche de liaison. En fin de compte, le hachage devront se voir assigner une valeur. Il pourrait être fixé à n’importe quel nombre de valeurs. La valeur sélectionnée est initialisée à 1 et en incrémentant dans les inscriptions subséquentes. La troisième approche examine l’utilisation de tableaux indexés pour chacune des valeurs.
La première approche a été utilisée dans une application, où j’avais un peu plus d’un manque de temps. Il montre son éducation comme quelque chose qui permet de gérer les fichiers csv. J’ai trouvé que des jetons est devenu plus compliqués il est devenu plus difficile et plus difficile à choisir un séparateur de jeton fiable. Quand j’ai eu le temps de revenir en arrière et évaluer des approches alternatives, j’ai trouvé que j’ai aimé la deuxième approche. Où le troisième approche était lourd pour mon application, la deuxième approche a offert la possibilité de créer une liste unique avec l’avantage de compter le nombre de fois la paire a été définie. Dans ma demande, l’ordre d’entrée n’était pas important, tant que pouvoir itérer sur l’ensemble des touches. applications où la commande est encore plus important, l’utilisation de tableaux est plus logique.
Maintenant nous allons voir ce que nous pouvons faire avec le numéro 2 de la démarche.
# original hash from approach 2 $VAR1 = { 'city2' => {<br> 'zip3' => 1, 'zip1' => 2 } }
# Extending from approach 2 above # Reverse it my $revhash = {}; foreach my $key (keys(%$hashref)){ foreach my $val (keys(%{$hashref->{$key}})){ $revhash->{$val}->{$key} = $hashref->{$key}->{$val}; } } print Dumper $revhash;
Sortie :
#perl revit.pl $VAR1 = { 'zip3' => { 'city2' => 1 }, 'zip1' => { 'city2' => 2 } }; #
Remarquez comment les clés et valeurs ont échangées, et que le nombre de liens reste la même.