Comment charger un fichier dans un hachage Perl?

etant Donné le fichier suivant:

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

j'utilise ce qui suit 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, cependant, est comme suit:

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

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

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

Merci.

11
demandé sur 2 revsIan Dexter 2008-10-25 02:13:56

3 réponses

Ici, vous allez:

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

ceci parcourt chaque ligne séparant le signe ' = ' et ajoute une entrée ou ajoute une entrée à une entrée existante dans la table de hachage.

21
répondu Nikhil 2008-10-26 00:22:07

si vous avez le contrôle du fichier de données, envisagez de passer d'un format personnalisé à quelque chose comme YAML. Cela vous donne beaucoup de puissance hors de la boîte sans avoir à hacker votre format personnalisé de plus en plus. En particulier, plusieurs clés créant une liste ne sont pas évidentes. La façon de faire de YAML est beaucoup plus claire.

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

notez aussi que YAML vous permet de sculpter les couples clé/valeur afin qu'ils s'alignent 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'
        };
5
répondu Schwern 2008-10-26 00:21:20

pouvez-vous ajouter du code à votre fonction map 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 j'ai fait quelque chose comme ça dans le passé, j'ai lu le fichier ligne par ligne (alors que $inputLine = ) et j'ai utilisé split sur '=' pour charger le hash avec des vérifications supplémentaires pour voir si le hash avait déjà cette clé, en ajoutant si l'entrée existait déjà.

-1
répondu Mark 2008-10-27 21:06:48