Klaus Mock: o.k. nochmal:

Beitrag lesen

Hallo Klaus,

sorry wenn ich mich undeutlich ausgedrueckt habe, nochmal:

gegeben:

%hash = (
'vorname' => 'stuff',
'name' => 'stuff'',
'strasse' => 'stuff'
'plz' => 'stuff'
'ort' => 'stuff'
...und noch 120 Schlüssel/Werte
)

könnte doch auch so aussehen:
  @Schluessel = ('vorname','name','strasse','plz','ort',...);
oder?
Das Problem ist, wie DU schon sagtest, daß die Schlüssel eines Arrays unsortiert sind. Irgendwo mußt Du einfach einmal festlegen, _wie_ die Reihenfolge genau aussieht, in der die Daten in der Zeile stehen. 'keys' liefert einfach nur alle keys eines heashes, aber nicht in einer bestimmten Reihenfolge. Du kannst sie dann zwar mit 'sort' wieder sortieren, aber nach welchen Kriterien ? Alphabetisch ist nicht, weil das aj sicherlich nicht Deiner Reihenfolge entspricht.
Also bleibt Dir nichts anderes übrig, als die Reihenfolge irgendwie festzulegen.

gegeben:
KlausHuberAhornstrasse 345785Testhausen..........

Hier ist die Reihenfolge festgelegt, als da muß Du Dich ja dran halten.

Ergebnis soll sein:

%hash = (
'vorname' => 'Klaus',
'name' => 'Huber'',
'strasse' => 'Ahornstrasse 3'
'plz' => '45785'
'ort' => 'Testhausen'
...und noch 120 Schlüssel/Werte
)

Möglichkeit 1:
(Mein Favorit)
#hier wird die Reihenfolge festgelegt
@Schluessel = ('vorname','name','strasse','plz','ort',...);

sub einlesen
{
#  File aufmachen und so
while(<IN>)
  {
  chomp;
  my(@content) = split('',$_); #einlesen und aufteilen der eingabe
  my($i);
  my(%hash) = (); # hash leeren

for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
    {
    $hash{$Schluessel[$i]} = $content[$i]; ' Wertzuweisung
    }
  push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
  }

}

sub rausschreiben
{
#  File aufmachen und so
foreach my $href (@Records)
  {
  for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
    {
    print OUT '' if $i; # ab dem zweiten Wert ein Trennzeichen
    print $href->{$Schluessel[$i]}
    }
  print "\n";
  }

}

Möglichkeit 2:
(Würde ich nicht machen, weil viel Schreibarbeit, und hoher Änderungsaufwand)

sub einlesen
{
#  File aufmachen und so
while(<IN>)
  {
  chomp;
  my(@content) = split('',$_); #einlesen und aufteilen der eingabe
  my($i);
  my(%hash) = (); # hash leeren
  $hash{'vorname'} =$content[0];
  $hash{'name'} =$content[1];
  [usw.]
  push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
  }

}

sub rausschreiben
{
#  File aufmachen und so
foreach my $href (@Records)
  {
  print $href->{'vorname'};
  print "$href->{'name'};
  [usw.]  
  print "\n";
  }

}

so, ich glaub' jetzt haben wir es ;-)

Grüße
  Klaus