Pregunta

Dado el siguiente archivo:

department=value1
location=valueA
location=valueB
department=value2

Utilizo lo siguiente para cargar el archivo en un hash de Perl:

use File::Slurp;
use Data::Dumper;
my %hash = map {
   s/#.*//;
   s/^\s+//;
   s/\s+$//;
   m/(.*?)\s*=\s*(.*)/;
} read_file($file);
print Dumper(\%hash);

El resultado, sin embargo, es el siguiente:

$VAR1 = {
          'location' => 'valueB',
          'department' => 'value2'
        };

¿Cómo puedo cargar el archivo anterior en un hash con, digamos,

$VAR1 = {
          'location' => 'valueA,valueB',
          'department' => 'value1,value2'
        };

Gracias.

¿Fue útil?

Solución

Aquí tienes:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

Esto recorre cada línea que se divide en el signo '=' y agrega una entrada o se agrega a una entrada existente en la tabla hash.

Otros consejos

Si tiene control sobre el archivo de datos, considere cambiar de un formato personalizado a algo como YAML. Esto le brinda una gran potencia fuera de la caja sin tener que hackear su formato personalizado cada vez más. En particular, las claves múltiples que crean una lista no son obvias. La forma de hacerlo de YAML es mucho más clara.

name:       Wally Jones
department: [foo, bar]
location:   [baz, biff]

Tenga en cuenta también que YAML le permite esculpir los pares clave / valor para que se alineen para una lectura más fácil.

Y el código para analizarlo lo realiza un módulo, YAML :: XS ser el mejor del grupo.

use File::Slurp;
use YAML::XS;
use Data::Dumper;

print Dumper Load scalar read_file(shift);

Y la estructura de datos se ve así:

$VAR1 = {
          'department' => [
                            'foo',
                            'bar'
                          ],
          'location' => [
                          'baz',
                          'biff'
                        ],
          'name' => 'Wally Jones'
        };

¿Puede agregar algún código a su función de mapa para verificar la existencia de una entrada hash y agregar el nuevo valor?

No he hecho Perl en mucho tiempo, pero cuando hice algo como esto en el pasado, leí el archivo en línea por línea (mientras $ inputLine = < FILE >) y usó split on '=' para cargar el hash con verificaciones adicionales para ver si el hash ya tenía esa clave, agregando si la entrada ya existía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top