Stephan: gemischte / vermischte Daten

Hallo Leute,

ich gehe  jetzt gerade meine ersten Schritte in den unendlichen Weiten des CGI und habe, wie könnte es anders sein, ein Problem und zwar mit der Daten Übermittlung. Die Orginal Daten kommen ordnungsgemäß an nur nach der Decodierung sind die einzelnen Wertepaare nicht mehr an der Stelle wo sie eigendlich hingehören, also das erste Wertepaar an fünfter Stelle usw.

Weis jemand woran das liegt? Und wie man das beheben kann ?

Read U
Stephan

PS: das ist der verwendete Code

read(STDIN, $eingabe, $ENV{'CONTENT_LENGTH'});

Wertepaare trennen

@paare = split(/&/, $eingabe);
foreach $paar (@paare)
{
   ($schluessel, $wert) = split(/=/, $paar);
   # Sonderzeichen ersetzen
   $wert =~ tr/+/ /;
   $wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",   hex($1))/eg;
   # Hash mit Daten erstellen
   $FORM{$schluessel} = $wert;

  1. Hallo Stephan,

    [...] Die Orginal Daten kommen ordnungsgemäß an nur nach der Decodierung sind die einzelnen Wertepaare nicht mehr an der Stelle wo sie eigendlich hingehören, [...]
    Weis jemand woran das liegt? Und wie man das beheben kann ?

    Ich kann Dir leider nicht sagen, ob der Browser sich beim Übermitteln der Daten an eine bestimmte Reihenfolge (der Formularfelder) halten muss, oder ob er es sendet wie er will ;-)
    Aber wozu benötigst Du die Reihenfolge der Wertepaare, wenn Du Sie sowieso in ein Hash einliest:
    [...]

    $FORM{$schluessel} = $wert;

    [...]
    Im Hash selbst werden die (Schlüssel-)Daten sowieso nicht sortiert, sondern afaik nach einem bestimmten (Hash-)Algorithmus gespeichert. Um sortierte Wertepaare zu erhalten, musst Du, wie Wolfgang Wiese bereits in <99544.html> erwähnt hat, die Schlüssel des Hashs sortieren.

    hth

    Gruß AlexBausW

  2. Hallo Stephan,

    Weis jemand woran das liegt?

    In Hashes, und das ist das, was Du verwendest, greifst Du nicht wie bei Arrays über eine fortlaufenden Nummer (naja, könntest Du grundsätzlioch zwar, mach aber wenig sinn) auf einzelne Werte zu.
    Die interne Reihenfolge der Schlüssel, welche Du mit keys(%MyHash) bekommst, ist per Definition quasi zufällig.

    Und wie man das beheben kann ?

    Gar nicht, warum auch. Wenn Du unbedingt die Reihenfolge erhalten willst, dann speichere die Schlüssel zusätzlich in einem Array.

    also
    foreach $paar (@paare)
    {
       ($schluessel, $wert) = split(/=/, $paar);
       $wert =~ tr/+/ /;
       $wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",   hex($1))/eg;
       # Hash mit Daten erstellen
       $FORM{$schluessel} = $wert;
       push @Schluessel, $schluessel
       }
    }

    Wenn Du nun auf die Werte in der übergebenen Reihenfolge zugreifen willst, dann eben so

    foreach my $schluessel (@Schluessel)
       {
       &machwas($FORM{$schluessel};
       }

    Die Sinnhaftigkeit sei jetzt mal dahingestellt.

    BTW:
    1.) CGI ist _nicht_ Perl.
    Das wurde hier schon mehrmals erwäht. CGI ist ein Übertragungsmechanismus, Perl eine Programmiersprache
    mit Perl kann man CGI-Scripts erstellen, das ist wahr. Aber... man kann auch wesentlich mehr damit.
    Für die Bearbeitung von CGI-Requests im WWW wird oft Perl verwendet, das ist wahr. Aber... Grundsätzlich kann man das mit jeder Programmiersprache (PHP,C, sh, VB, Pascal, Cobol ;-) (ehrlich, hab ich auch schon gesehen) )

    2.) Warum immer eigene Parser für CGI-Parameter?
    Es ist sicher besser, vielfach ausgetestete Routinen zu verwenden, als alles immer wieder neu zu erfinden !!!
    Bitte verwende doch CGI.pm. Das ist besser für Dich und Deinem Provider und den Leuten, welche Deine Seiten besuchen.

    3.) Verinnerlich Dir die Konzepte von Perl und versuiche nicht irgendwelche Krücken von anderen Programmiersprachen nachzubilden.
    Hashes ist ein mächtiges Werkzeug, welches in vielen anderen Sprachen einfach nicht vorhanden ist.
    Ich habe es bisher selten als NAchteil empfunden, daß die keys der Hashes keiner erkennbaren Ordnung folgen.
    (Und wenn, dann auch zu einer Zeit, als ich gerade mit Perl begonnen habe, und irgendwas aus C oder so nachbauen wollte)

    Grüße
       Klaus