Paso 2: Modelo Simple
Perl tiene básicamente 3 tipos de datos primitivos. Picaduras, conjuntos indexados y matrices asociativas.
Muy temprano, descubrieron era más fácil para mí trabajar con punteros a estas estructuras, y la referencia cuando sea necesario. Matrices asociativas se prestan bien a pares clave valor. Sin embargo, esto no es el final de esta consideración, como una clave puede asignar a más de un valor. Dependiendo de la aplicación, definir estrictamente el valor de la asociación puede clobber un valor previo. Así que vamos a ver cómo nos podríamos modelo varios valores que se asignan a una tecla.
Tenga en cuenta los siguientes enfoques:
Código:
#!/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;
Salida:
#perl association_approaches.pl<br>$VAR1 = { 'city2' => { 'zip3' => 1, 'zip1' => 2 }, 'city1' => 'zip1,zip3,zip1', 'city3' => [ 'zip1', 'zip3', 'zip1' ] };
En cada uno de estos enfoques, el comportamiento es determinado por la existencia / definición de la clave. Además, los métodos de aprovechan el concepto de "autovivification" de Perls. Cada tecla se podrá acumular una serie de "tokens". En el primer enfoque, el valor de una clave se utiliza directamente como una cadena. Si más de un símbolo (token) se requiere, se agrega a la cadena separada por un carácter arbitrario. En este caso sería una coma, pero más en general, puede seleccionar permitir tokenización con la función split. El segundo enfoque, el valor se mantiene separado haciendo otra capa de asociación. En última instancia, el hash será necesario asignar un valor. Se podría definir en cualquier número de valores. El valor seleccionado se inicializa en 1 e incrementado en inscripciones posteriores. El tercer enfoque se ve en el uso de conjuntos indexados para cada uno de los valores.
El primer acercamiento fue utilizado en una aplicación, donde estaba bajo un poco más de una contracción del tiempo. Muestra su crianza como algo utilizado para manejar archivos csv. Encontré que como tokens se volvieron más complicados se hizo más difícil y más difícil escoger un separador de testigo fiable. Cuando tuve tiempo de volver atrás y evaluar alternativas me encontré con que me ha gustado el segundo enfoque. Donde como el tercer enfoque fue engorroso para mi aplicación, ofreció el segundo enfoque se definió la habilidad de crear una lista única con el beneficio de lado de contar el número de veces el par. En mi aplicación el orden de entrada no era importante, como poder iterar por el conjunto de claves. aplicaciones donde el orden es más importante, utilizando matrices tiene más sentido.
Ahora vamos a ver qué podemos hacer con número aproximación 2.
# 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;
Salida:
#perl revit.pl $VAR1 = { 'zip3' => { 'city2' => 1 }, 'zip1' => { 'city2' => 2 } }; #
Tenga en cuenta cómo han cambiado las claves y valores, y que la cuenta de enlace sigue siendo el mismo.