Frage

Da die folgende Datei:

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

Ich verwende den folgenden die Datei in einen Perl-Hash zu laden:

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

Das Ergebnis ist jedoch wie folgt:

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

Wie kann ich die obige Datei in einen Hash-laden mit, sagen wir,

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

Danke.

War es hilfreich?

Lösung

Hier gehen Sie:

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

Dies geht durch jede Zeile Splitting auf dem Zeichen ‚=‘ und entweder fügt einen Eintrag oder fügt einen bereits vorhandenen Eintrag in der Hash-Tabelle.

Andere Tipps

Wenn Sie die Kontrolle über die Datendatei haben, sollte von einem benutzerdefinierten Format zu so etwas wie YAML wechseln. Dies gibt Ihnen viel Kraft aus der Box ohne Ihr eigenes Format mehr und mehr hacken zu müssen. Insbesondere mehrere Schlüssel Erstellen einer Liste ist nicht offensichtlich. YAML Weg, es zu tun ist viel klarer.

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

Beachten Sie auch, dass YAML können Sie die Schlüssel / Wert-Paare formen, so dass sie für das Lesen zu vereinfachen ausrichten.

Und der Code, es zu analysieren, wird von einem Modul erfolgt, YAML :: XS ist die beste in der Stadt.

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

print Dumper Load scalar read_file(shift);

Und die Datenstruktur sieht so aus:

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

Können Sie einige Code in Ihre Map-Funktion hinzuzufügen, für die Existenz eines Hash-Eintrag zu prüfen und den neuen Wert anhängen?

Ich habe nicht Perl in eine Weile getan, aber wenn ich so etwas wie dies in der Vergangenheit der Fall war, las ich die Datei in Zeile für Zeile (während $ Eingabezeile = ) und Split verwendet auf ‚=‘ zu laden der Hash mit zusätzlichen überprüft, ob der Hash bereits den Schlüssel hatte, anhängt, wenn der Eintrag bereits vorhanden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top