QUERY_STRING in ein Hash?
Christian Block
hi,
eine frage:
wie lese ich folgende url in ein hash ein:
www.bla.de/cgi-bin/bla.pl?name=henry&id=00002
also, dass es so gespeichert wird:
%variable{"name", "henry", "id", "00002"}
wer kann mir helfen?
hi!
eine frage:
wie lese ich folgende url in ein hash ein:
www.bla.de/cgi-bin/bla.pl?name=henry&id=00002
also, dass es so gespeichert wird:
%variable{"name", "henry", "id", "00002"}
So werden Hashs nie gespeichert ;))
if ($ENV{'REQUEST_METHOD'} eq 'GET')
{
$data = $ENV{'QUERY_STRING'};
} else {
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
}
my @data = split /&/, $data;
for (@data)
{
my ($key, $value) = split /=/;
$value =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
$param{$key} = $value;
}
bye, Frank!
Hi,
wie lese ich folgende url in ein hash ein:
www.bla.de/cgi-bin/bla.pl?name=henry&id=00002
also, dass es so gespeichert wird:
%variable{"name", "henry", "id", "00002"}So werden Hashs nie gespeichert ;))
doch, in etwa schon ;-)
my %hash = ("name", "wert", "anderer name", "anderer wert");
print $hash{'name'};
Schöner ist es aber, so zu notieren:
my %hash = ("name" => "wert", "anderer name" => "anderer wert");
Folgendes ist aber für die ursprüngliche Frage wesentlich einfacher und sicherer:
use CGI;
my $query = new CGI;
print $query->param("name"); # ist ja schon fast ein Hash *g*
Wenn Du dann ein richtiges Hash haben willst, schreibst Du:
my %hash;
foreach ($query->param()) { $hash{$_} = $query->param($_); }
Aber Vorsicht bei Multiple Selects - die sollten weiterhin mit my @selects = $query->param("name"); als Array angesprochen werden!
Cheatah
Hallo, vielen Dank!
Da muss ich jetzt erstmal durchsteigen ;-))
MFG
Christian Block
Hallo nochmal,
da ich durch diesen Programmierdschungel nicht so ganz durchsteige, würde es mich riesig freuen, wenn ihr mir die einzelnen Zeilen erklären könntet!!!
Wäre echt supernett!!
MFG
Christian Block
Hallo nochmal,
da ich durch diesen Programmierdschungel nicht so ganz durchsteige, würde es mich riesig freuen, wenn ihr mir die einzelnen Zeilen erklären könntet!!!
Wäre echt supernett!!
MFG
Christian Block
Hallo nochmal,
da ich durch diesen Programmierdschungel nicht so ganz durchsteige, würde es mich riesig freuen, wenn ihr mir die einzelnen Zeilen erklären könntet!!!
Wäre echt supernett!!
MFG
Christian Block
Ups, sorry!!
Wollte die Nachricht nicht 3x senden, mein Browser hat mir nach dem Absenden immer eine nicht gefunde Seite angezeigt, daher dachte ich, dass es nicht geklappt hat (dumme Standleitung - passiert damit öfters)!
Wollte nicht gegen die Forum-Ordnung verstoßen!
MFG
Christian Block
Hi,
da ich durch diesen Programmierdschungel nicht so ganz durchsteige, würde es mich riesig freuen, wenn ihr mir die einzelnen Zeilen erklären könntet!!!
klar doch! Wir hatten:
use CGI;
my $query = new CGI;
print $query->param("name"); # ist ja schon fast ein Hash *g*
my %hash;
foreach ($query->param()) { $hash{$_} = $query->param($_); }
In den ersten beiden Zeilen wird das Modul CGI.pm eingebunden und ein neues CGI-Objekt erzeugt. Dieses hat verschiedene Fähigkeiten und Eigenschaften (lies dazu am besten die Perl-Doku zum Modul CGI.pm), u.a. sind auch automatisch die übergebenen Parameter ausgewertet. Die dritte Zeile ist einfach nur ein Beispiel, wie Du auf die Parameter zugreifst.
In der vierten Zeile wird ein Hash erzeugt. Die fünfte Zeile ist dann interessant: Es werden der Reihe nach alle Parameter genommen ($query->param() enthält jene Liste) und in das Hash gespeichert. Danach hast Du im Grunde nur die Schreibweise erhalten, die Du schon im Script benutzt - sonst müßtest Du alle $hash{xyz} durch $query->param(xyz) ersetzen.
Was da im Hintergrund passiert (besonders bei new CGI), ist eigentlich egal; es passiert zwar eine ganze Menge (eben alles das, was Du sonst in Dein Script schreiben müßtest), aber die Hauptsache ist, daß es funktioniert ;-)
Cheatah
hi!
my $query = new CGI;
Was da im Hintergrund passiert (besonders bei new CGI), ist eigentlich egal; es passiert
zwar eine ganze Menge (eben alles das, was Du sonst in Dein Script schreiben müßtest),
aber die Hauptsache ist, daß es funktioniert ;-)
Kommen wir zu der Frage: gibt es in Perl Konstruktoren oder ist das lediglich eine Art Workaround :-))
Achja, objektorientierte Programmierung in Perl ist schon was tolles. Vor allem, wenn man davon ausgeht, dass die meisten Leute Perl-Skripts nur anpassen können und nichtmal annähernd wissen, was OOP überhaupt ist, dann aber mit solchen Konstrukten konfrontiert werden ;)
bye, Frank!
Tag!
%query = ();
sub ReadQueryString() {
my @args;
my ($field, $value);
%query = ();
return unless exists($ENV{'QUERY_STRING'});
@args = split(/&/, $ENV{'QUERY_STRING'});
for (@args) {
s/%([0-9A-Fa-f]{2})/chr(hex($1))/ge;
($field, $value) = split(/=/, $_);
$query{$field} = $value;
}
}
Hoffe das haut so hin.
Calocybe
Hi nochmal
Nachdem ich Franks Posting gelesen habe (welches gleich noch die POST-Methode mitbehandelt), sehe ich einen kleinen Fehler bei mir. Ersetze
($field, $value) = split(/=/, $_);
durch
($field, $value) = split(/=/, $_, 2);
dann sollte es passen.
Calocybe
hi!
($field, $value) = split(/=/, $_);
durch
($field, $value) = split(/=/, $_, 2);
dann sollte es passen.
Die ursprüngliche Methode funktioniert auch. Im $value-Teil dürfen keine =-Zeichen mehr vorkommen, also teilt split den String sowieso nur in zwei Teile.
bye, Frank!
Achu Hi!
Die ursprüngliche Methode funktioniert auch. Im $value-Teil dürfen keine =-Zeichen mehr vorkommen, also teilt split den String sowieso nur in zwei Teile.
Ich habe aber die Uebersetzung der %XX-Sequenzen VOR dem split durchgefuehrt, deshalb koennen durchaus mehr als ein = in $_ stehen. Aber selbst wenn man es hinter das split setzt, sollte man immer darauf vorbereitet sein, dass sich jemand nicht 100%ig an die Konvention haelt. Wenn ich Fehlersituationen mit derart wenig Aufwand abfangen kann, warum sollte ich es nicht tun?
Calocybe