Question

Étant donné le fichier suivant:

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

J'utilise les éléments suivants pour charger le fichier dans un hachage Perl:

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

Le résultat est cependant le suivant:

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

Comment puis-je charger le fichier ci-dessus dans un hachage avec, par exemple,

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

Merci.

Était-ce utile?

La solution

Voilà:

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

Ceci parcourt chaque ligne qui se divise sur le signe '=' et ajoute une entrée ou ajoute une entrée existante dans la table de hachage.

Autres conseils

Si vous avez le contrôle sur le fichier de données, envisagez de passer d'un format personnalisé à un format tel que YAML. Cela vous donne beaucoup de puissance hors de la boîte sans avoir à pirater votre format personnalisé de plus en plus. En particulier, la création d'une liste par plusieurs clés n'est pas évidente. La manière de YAML de le faire est beaucoup plus claire.

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

Notez également que YAML vous permet de sculpter les paires clé / valeur afin de les aligner pour une lecture plus facile.

Et le code pour l’analyser est fait par un module, YAML :: XS être le meilleur du groupe.

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

print Dumper Load scalar read_file(shift);

Et la structure de données ressemble à ceci:

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

Pouvez-vous ajouter du code à votre fonction de carte pour vérifier l'existence d'une entrée de hachage et ajouter la nouvelle valeur?

Je n'ai pas fait Perl depuis un moment, mais quand je faisais quelque chose comme ça dans le passé, je lisais le fichier ligne par ligne (alors que $ inputLine = < FILE >) et utilisé split sur '=' pour charger le hachage avec des vérifications supplémentaires pour voir si le hachage contenait déjà cette clé, en ajoutant si l'entrée existait déjà.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top