hashing hashes found perl file hash

hashes - ¿Cómo cargo un archivo en un hash Perl?



perl digest md5 centos 7 (3)

Dado el siguiente archivo:

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

Uso lo siguiente para cargar el archivo en un hash 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, por ejemplo,

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

Gracias.


Aqui 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 agrega a una entrada existente en la tabla hash.


Si tiene control sobre el archivo de datos, considere cambiar de un formato personalizado a algo como YAML. Esto le proporciona una gran cantidad de energía 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 hace un módulo, YAML :: XS es 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'' };


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

No he usado Perl en mucho tiempo, pero cuando hice algo así en el pasado, leo el archivo línea por línea (mientras $ inputLine = <FILE>) y uso split en ''='' para cargar el hash con verificaciones adicionales para ver si el hash ya tenía esa clave, anexando si la entrada ya existía.