Pamtoffel: Daten eines Hashs anzeigen

Hallo Freunde der Volksmusik,

Betr.:  es werden nicht alle Daten eines Hashs angezeigt

Folgende Situation:
In einer HTML-Seite befinden sich zwei Eingabefelder (input type="text" name="name" - und - textarea name="text" rows=6 cols=80) mit deren Hilfe ich die getaetigten Eingaben ueber ein CGI in eine Textdatei speicher (Inhalt der Textdatei sieht dann so aus:  name=Tim&text=Das+ist+Tims+Text&name=Anja&text=Das+ist+Anjas+Text&). Funktionier soweit alles wunderbar.

Nun moechte ich den Inhalt der Textdatei in einer zweiten HTML-Seite wieder anzeigen. Funktioniert eigentlich auch ganz prima, einzig, es wird immer nur der letzte Eintrag der Textdatei angezeigt (trotz meiner unglaublichen while-Schleife). Und genau das ist mein Problem: Was zum Teufel muss ich machen, damit alle Inhalte der Textdatei angezeigt werden ?????
Wenn da jemand ne Loesung haette.........

Anbei mein CGI-Script zum Auslesen der Textdatei:

open (DAT, "<dateneingabe.txt");
$daten = <DAT>;
close (DAT);

%daten = &CGIDatenaufbereiter ($daten);

while (($temp, $wert) = each %daten)
{
  print "$temp : $wert<br>";
  $temp = 0;
}

####################################################

sub CGIDatenaufbereiter
{
local ($cgidatenskalar, $name, $daten);
local @cgidatenliste;
local %cgidatenhash;
if ( $_[0] )
{
$cgidatenskalar = $_[0];
}
else
{
print STDERR "Es wurden keine Daten an den CGIDatenaufbereiter übergeben\n";
}
@cgidatenliste = split(/[&;]/ , $cgidatenskalar);
foreach $listeneintrag (@cgidatenliste)
{
$listeneintrag =~ s/+/ /go;
($name, $daten) = split( /=/ , $listeneintrag);
$name =~ s/%(..)/pack("c",hex($1))/ge;
$daten =~ s/%(..)/pack("c", hex($1))/ge;
$cgidatenhash{$name} = $daten;
}
return %cgidatenhash;
}

.....Ende des Problems

  1. hi!

    open (DAT, "<dateneingabe.txt");
    $daten = <DAT>;
    close (DAT);

    Evtl. liegt es schon daran. Mit $daten = <DAT>; liest du ja nur eine
    einzige Zeile ein und bereitest die dann auf. Wenn du aber mehrere
    Zeilen in der Datei stehen hast, musst du eine Liste mit den ganzen
    Daten füllen, zb. einfach mit @daten = <DAT>;.

    %daten = &CGIDatenaufbereiter ($daten);

    sub CGIDatenaufbereiter
    {
    local ($cgidatenskalar, $name, $daten);
    local @cgidatenliste;
    local %cgidatenhash;

    Statt local solltest du hier my schreiben. Für local gibt es keinen
    Grund. Den Rest der Funktion auf die Liste, die übergeben wird (s.o.)
    anzupassen, überlasse ich dir als Übung... ;)

    bye, Frank!

  2. Hallo,

    [...]Inhalt der Textdatei sieht dann so aus:  name=Tim&text=Das+ist+Tims+Text&name=Anja&text=Das+ist+Anjas+Text&).
    [...] einzig, es wird immer nur der letzte Eintrag der Textdatei angezeigt (trotz meiner unglaublichen while-Schleife). Und genau das ist mein Problem: Was zum Teufel muss ich machen, damit alle Inhalte der Textdatei angezeigt werden ?????

    Ich denke Du solltest Dir zu aller erst überlegen, unterschiedliche Zeichen für das Trennen der Felder und der Datensätze zu verwenden.
    Also z.B. irgendwas in der Art

    name=Tim&text=Das+ist+Tims+Text;name=Anja&text=Das+ist+Anjas+Text;
    (wobei '&' das Trennzeichen zwischen den einzenen 'Feldern' ist und ';' zwischen den einzelnen Datensätzen)

    Du muß nur Zeichen verwenden, welche nicht Bestandteil des Textes sein können bzw. diese ensprechend vor dem Eintragen in Deine Textdatei maskieren.

    @cgidatenliste = split(/[&;]/ , $cgidatenskalar);
    foreach $listeneintrag (@cgidatenliste)
      {
      $listeneintrag =~ s/+/ /go;
      ($name, $daten) = split( /=/ , $listeneintrag);
      $name =~ s/%(..)/pack("c",hex($1))/ge;
      $daten =~ s/%(..)/pack("c", hex($1))/ge;
      $cgidatenhash{$name} = $daten;
      }
    return %cgidatenhash;
    }

    Hier steckt auch ein Wurm drinnen, überleg einmal:

    @cgidatenliste = split(/[&;]/ , $cgidatenskalar);

    Du bekommst ein array mit folgenden Eintägen:
    @cgidatenliste[0] = 'name=Tim'
    @cgidatenliste[1] = 'text=Das+ist+Tims+Text'
    @cgidatenliste[2] = 'name=Anja'
    @cgidatenliste[3] = 'text=Das+ist+Anjas+Text;'

    Jetzt gehts in die Schleife: (nur der relevante Teil)
    Beim ersten Durchlauf: $cgidatenhash{'name'} = 'Tim';
    Beim zweiten Durchlauf: $cgidatenhash{'text'} = 'Das ist Tims Text';
    Beim dritten Durchlauf: $cgidatenhash{'name'} = 'Anja';
    ...
    Äh, jetzt wird der Eintrag vom ersten Durchlauf gerade überschrieben.
    Das geht jetzt so weiter, bis Du alle Daten eingelesen hast. Und am ende bleibt nur mehr der letzte Eintrag über.

    Dein Problem kannst Du z.B. mit einer 'List of Hashes' lösen. Wie das alles geht findest Du unter
    perldoc perldsc

    Grüße
      Klaus

    BTW: Ohne Einrückungen ist der Code ganz schön schwierig zu lesen.