Decodierten QUERY_STRING in Hash kopieren?

hi :smile:

ohh, ich glaub ich weiss nicht, wie ich das gescheit erklären soll :-/ so werde ich einfach mal den Code hier hinschreiben, den ich versucht habe zum laufen zu bekommen :smile:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "CGI-Feedback\n";

$Daten = $ENV{'QUERY\_STRING'};
$Daten =~ tr/+/ /;
$Daten =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$Daten =~ s///g;
@temp = split(/\&/, $Daten);
foreach $test (@temp) {
 ($get1, $get2) = split(/\=/, $test);
 %test = ($get1, $get2); #irgendwie sollte das hier gepusht werden, kein plan wie
}
print "$test{'action'}
";
print "$test{'value'}";

was ich versuche zu beabsichtigen ist folgendes:
ich sende Daten zu dem script via GET methode so:

test.pl?action=test&value=hallo

was ich mit dem script jetzt erreichen wollte ist, das es egal ist, in welcher Reihenfolge ich die Daten per get übersende ich die Daten auslesen wollte. Wenn ich das so in den Hash reinschreibe, wird aber immer wieder der Wert mit dem letzten übersanten überschrieben :frowning:. Ich müsste quasi so was ähnliches wie ‚push‘ benutzen, um die Daten in den Hash zu schreiben, damit der letzte wert nicht wieder überschrieben wird.

Ich hoffe ich habe das einigermassen umschreiben können :confused:

bye,
Martin

Rehi :smile:

GANZ ABGESEHEN DAVON; DASS DIE LEUTE ENDLICH AUFHÖREN SOLLEN $ENV ZU BENUTZEN UND STATTDESSEN LIEBER DAS CGI-PAKET VERWENDEN:

#!/usr/bin/perl
use CGI; #cgi-modul laden
use strict; #variablen-deklaration (my ..) erzwingen.
my $q=new CGI; my %hash; my $l;

print $q-\>header; print $q-\>start\_hmtl;
foreach $l ($q-\>param) {
 $hash{$l}=$q-\>param($l); print 'name: '.$l.' value: '.$hash;
}
print $q-\>end\_html;

ist was kürzer nicht wahr? Zum Vergleich:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print
"CGI-Feedback\n";

$Daten = $ENV{'QUERY\_STRING'};
$Daten =~ tr/+/ /;
$Daten =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$Daten =~ s///g;
@temp = split(/\&/, $Daten);
foreach $test (@temp) {
 ($get1, $get2) = split(/\=/, $test);
 %test = ($get1, $get2); #irgendwie sollte das hier epusht
werden, kein plan wie
}
print "$test{'action'}
";
print "$test{'value'}";

Allerdings ist $q->param schon ein hash. also kannst du dir die schleife sparen und im skript gleich mit

 $name=$q-\>param('nachname');

zugreifen.

viele grüße, holli

Dein Fehler war, daß die Form

%irgendwas=("key"=\>"val") bzw
%irgendwas=("key","val") 

nur zum initialisieren von hashes benutzt wird! Genau wie bei Arrays.

@j = (1,2,3,4,5,6);

(Array hat jetzt 6 element

@j=(""); 

Jetzt hat Array 1 element, die alten werte sind gelöscht.

Das gleiche gilt für hashes.

Zum HINZUFÜGEN verwendet

by arrays: $array[9]="irgendwas";
by hashes analog: $hash{"key"}="value";

cu, holli

Rehi :smile:

GANZ ABGESEHEN DAVON; DASS DIE LEUTE ENDLICH AUFHÖREN SOLLEN
$ENV ZU BENUTZEN UND STATTDESSEN LIEBER DAS CGI-PAKET
VERWENDEN:

sorry, wenn ich noch´n newbee bin :frowning:(

#!/usr/bin/perl
use CGI; #cgi-modul laden
use strict; #variablen-deklaration (my …) erzwingen.
my $q=new CGI; my %hash; my $l;

print $q->header; print $q->start_hmtl;
foreach $l ($q->param) {
$hash{$l}=$q->param($l); print 'name: ‚.$l.‘ value:
'.$hash;
}
print $q->end_html;

Ich habe den code versucht auszuprobieren. Funzt aber ned :frowning: Ich bekomme nur die Fehlermeldung, das das Script nicht fehlerfrei ausgeführt werden könne :frowning:
Mal abgesehen davon, das ich das mit dem use CGI; ehe nicht versetehe, da ich eben noch ned so weit bin *schäm* :frowning:
Gibt´s dafür eine deutsch Anleitung ?

gruss,
Martin

#!/usr/bin/perl
use CGI; #cgi-modul laden
use strict; #variablen-deklaration (my ..) erzwingen.
my $q=new CGI; my %hash; my $l;

print $q-\>header; print $q-\>start\_html;
foreach $l ($q-\>param) {
 $hash{$l}=$q-\>param($l); print 'name: '.$l.' value:
'.$hash;
}
print $q-\>end\_html;

Hohi,

also bis auf den kleinen Tippfehler (siehe fettdruck) müßte das eigentlich laufen.

Zur Erläuterung: Das CGI-Modul (Einbindung: use CGI:wink: ist ein Modul mit vielfältigen Funktionen zur CGI-Programmierung. U.a. übernimmt es das (SICHERE) dekodieren von Query-Strings (Eingaben aus dem Browser)
Es ist besser dieses Modul zu benutzen, als die Parameter selbst auszuwerten, da man dabei leicht felher macht (Sicherheistlücke!!).

cu, holli