Domanda

Dato il seguente file:

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

Uso quanto segue per caricare il file in 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);

Il risultato, tuttavia, è il seguente:

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

Come posso caricare il file sopra in un hash con, diciamo,

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

Grazie.

È stato utile?

Soluzione

Ecco qua:

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

In questo modo vengono esaminate tutte le linee che si dividono sul segno '=' e si aggiunge una voce o si aggiunge a una voce esistente nella tabella hash.

Altri suggerimenti

Se hai il controllo sul file di dati, considera di passare da un formato personalizzato a qualcosa come YAML. Questo ti dà molta potenza fuori dalla scatola senza dover hackerare sempre più il tuo formato personalizzato. In particolare, più chiavi che creano un elenco non sono ovvie. Il modo di farlo di YAML è molto più chiaro.

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

Nota anche che YAML ti consente di scolpire le coppie chiave / valore in modo che si allineino per una lettura più semplice.

E il codice per analizzarlo è fatto da un modulo, YAML :: XS essere il migliore del gruppo.

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

print Dumper Load scalar read_file(shift);

E la struttura dei dati si presenta così:

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

Puoi aggiungere del codice alla funzione della tua mappa per verificare l'esistenza di una voce hash e aggiungere il nuovo valore?

Non ho fatto Perl da un po ', ma quando ho fatto qualcosa del genere in passato, ho letto il file riga per riga (mentre $ inputLine = < FILE >) e usato split su '=' per caricare l'hash con ulteriori controlli per vedere se l'hash aveva già quella chiave, aggiungendo se la voce esisteva già.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top