Wie lade ich eine Datei in einen Perl hash?
Angesichts der folgenden Datei:
department=value1
location=valueA
location=valueB
department=value2
Ich folgenden verwenden, laden Sie die Datei in einen Perl hash:
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, jedoch, wie folgt:
$VAR1 = {
'location' => 'valueB',
'department' => 'value2'
};
Wie kann ich laden Sie die obige Datei in ein hash mit, sagen wir,
$VAR1 = {
'location' => 'valueA,valueB',
'department' => 'value1,value2'
};
Dank.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier gehen Sie:
Diese Spaziergänge durch jede Zeile, die Teilung auf das Zeichen '=' und entweder fügt man einen Eintrag oder fügt zu einem bestehenden Eintrag in der hash-Tabelle.
Wenn ich den test unter Windows mit Perl-5.12.1, die Werte haben immer einen vorhergehenden Komma.... Ich habe ändern die Letzte Anweisung in eine vollständige wenn-bedingt.
InformationsquelleAutor
Wenn Sie haben die Kontrolle über die Daten-Datei, die Umstellung von einem benutzerdefinierten format so etwas wie YAML. Dies gibt Ihnen viel power aus der box, ohne zu hacken Ihr benutzerdefiniertes format mehr und mehr. Insbesondere, mehrere Schlüssel erstellen einer Liste ist nicht offensichtlich. YAML - Art zu tun, es ist viel klarer.
Beachten Sie auch, dass YAML ermöglicht das Formen der Schlüssel/Wert-Paare, so dass Sie line-up für das Lesen zu vereinfachen.
Und den code analysieren das geschieht durch ein Modul, YAML::XS als der beste der Reihe.
Und die Datenstruktur sieht so aus:
die Zeile print Dumper Laden scalar read_file(shift); sieht verdächtig aus. Fehlt doublecolon?
Es ist richtig.
Dumper()
von Data::Dumper,Load()
von YAML::XS,scalar
ist gebaut und in derread_file()
aus File::Slurp. Mit den Klammern sieht es aus wieprint(Dumper(Load(scalar(read_file(shift)))))
was ist der Grund, warum ich aufgehört habe die Klammern.Ich sehe, danke..
InformationsquelleAutor
Können Sie code hinzufügen, um Ihre map-Funktion zu prüfen, die Existenz eines hash-Eintrag und fügt den neuen Wert?
Ich nicht getan habe Perl in eine Weile, aber wenn ich so etwas Tat in der Vergangenheit, ich lese die Datei Zeile für Zeile (während $inputLine = <DATEI>) und split auf '=' laden der hash mit zusätzlichen Prüfungen, um zu sehen, ob der hash bereits, dass der Schlüssel, mit dem anfügen, wenn der Eintrag bereits existiert.
InformationsquelleAutor