2016-08-08 9 views
-3

Ich möchte eine Hash-Tabelle für die Daten in meiner Datei erstellen.Textdatei in Hash-Tabelle

Die Datei enthält eine Reihe von Befehlen, die als

===|showcommand| 

Jedes Mal, wenn ich geschrieben werden diese Begrenzer ich einen Hash-Schlüssel erstellen möchten, und speichern die Daten darunter als Array in den Wert, bis er sieht das nächste Trennzeichen.

Das nächste Trennzeichen wird die gleiche Sache tun, die einen Hash-Schlüssel mit dem Trennzeichen-Namen erstellen und die Daten in den nächsten darauf folgenden Zeilen in einem Array als Wert speichern soll.

+2

Bitte lesen Sie [ask], und bearbeiten Sie dann diese Frage, um eine [mcve] einzuschließen. –

Antwort

0
my %commands; 
my $name; 
my $body; 
while (<>) { 
    if (my ($new_name) = /===\|([^|]*)\|/) { 
     $commands{$name} = $body if defined($name); 
     $name = $new_name; 
     $body = ''; 
    } else { 
     $body .= $_; 
    } 
} 

$commands{$name} = $body if defined($name); 

nimmt den Körper des Befehl beginnt auf der Zeile nach der Kopfzeile, und mit dem nächsten Kopfzeile auf der Zeile vor dem einen stoppen.

+0

danke für die Antwort ikegami. Was ich brauche, um zu verstehen, ist, wie ich einen Hash in der Unterfunktion erstellen würde, der den gesamten Hash zurückgibt, nachdem er fertig ist. –

0

Sie haben es wahrscheinlich schon funktioniert, aber fügen Sie noch einen kleinen Kommentar, in Bezug auf die Frage, wie Sie den Hash von einer Funktion zurückgeben.

Hier ist ein Beispiel:.

Eingang -datei (die folgende verwendet, die, wie ich glaube, eine ähnliche Struktur wie die Eingabe -Dateien enthält

===|showcommand| 
cmd1 
cmd2 
cmd3 
cmd4 
===|testcommand| 
command1 
command2 
command3 
===|anothercommand| 
another1 
another2 
another3 
another4 

Perl -script:

use strict; 

# Calling ReadCommandFile to build hash. 
my %commands = ReadCommandFile("./commands.txt"); 

# ReadCommandFile - reads commands.txt and builds 
# a hash. 
sub ReadCommandFile() 
{ 
    my $file = shift; 
    my %hash =(); 
    my $name; 

    open(FILE, "<$file"); 

    while(<FILE>) 
    { 
    if($_ =~ /===\|(.*)\|/) 
    { 
     $name = $1; 
     $hash{$name} = [];  
    } 
    else 
    { 
     my $line = $_; 
     $line =~ s/\n$//; 
     push(@{$hash{$name}}, $line); 
    } 
    } 

    close(FILE); 

    return %hash; 
} 

Als Ergebnis sollten Sie den folgenden Hash erhalten (Ausgabe von Data :: Dumper):

$VAR1 = 'anothercommand'; 
$VAR2 = [ 
      'another1', 
      'another2', 
      'another3', 
      'another4' 
     ]; 
$VAR3 = 'showcommand'; 
$VAR4 = [ 
      'cmd1', 
      'cmd2', 
      'cmd3', 
      'cmd4' 
     ]; 
$VAR5 = 'testcommand'; 
$VAR6 = [ 
      'command1', 
      'command2', 
      'command3' 
     ]; 

Sie können dann diese einzelnen Elemente wie Zugang:

den dritten Befehl von "Showcommand" Get:

print "\nCommand #3: " . $commands{'showcommand'}[2]; 

Ausgang: cmd3

Die Daten aus der Datei wird in einen Hash kopiert und die Befehle werden als Array unter den jeweiligen Schlüsselwörtern hinzugefügt.

Danke!

Verwandte Themen