Hashs mit Werten belegen
Andreas Z.
- perl
Hallo,
bisher habe ich immer versucht Hashs zu umgehen, weil ich damit nicht zurecht gekommen bin. Jetzt aber muß ich wohl oder übel diese Form von Variablen einsetzen, da mein Script sonst zu umständlich werden würde. Das Problem:
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es zuletzt versucht:
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
%Wert+=$name;
%Wert+=$value;
}
Funktioniert leider nicht. Aber warum? Wie muß die Syntax aussehen?
Danke!
AZ
bisher habe ich immer versucht Hashs zu umgehen, weil ich damit nicht zurecht gekommen bin. Jetzt aber muß ich wohl oder übel diese Form von Variablen einsetzen, da mein Script sonst zu umständlich werden würde. Das Problem:
Hashs sind ziemlich praktisch und koennen einen das Leben viel leichter machen. Es gibt keinen Grund sie nicht einzusetzen.
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es zuletzt versucht:
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
%Wert+=$name;
%Wert+=$value;
}
Das solltest Du allerdings so nicht machen. Es gibt ein Modul CGI.pm, das einem die Funktion param zur Formularfeld-Auswertung zur Verfügung stellt. Es gibt auch hier keinen Grund, weshalb diese Funktion nicht einsetzten sollte.
use CGI qw(:standard);
my $formularfeld = ¶m('formularfeld');
cu,
Peter
bisher habe ich immer versucht Hashs zu umgehen, weil ich damit nicht zurecht gekommen bin. Jetzt aber muß ich wohl oder übel diese Form von Variablen einsetzen, da mein Script sonst zu umständlich werden würde. Das Problem:
Hashs sind ziemlich praktisch und koennen einen das Leben viel leichter machen. Es gibt keinen Grund sie nicht einzusetzen.
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es zuletzt versucht:
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
%Wert+=$name;
%Wert+=$value;
}Das solltest Du allerdings so nicht machen. Es gibt ein Modul CGI.pm, das einem die Funktion param zur Formularfeld-Auswertung zur Verfügung stellt. Es gibt auch hier keinen Grund, weshalb diese Funktion nicht einsetzten sollte.
use CGI qw(:standard);
my $formularfeld = ¶m('formularfeld');cu,
Peter
Danke!
Das ist zwar eine Lösung, die ich zu allerletzt einsetzen werde (ich programmier' meinen Sch... am liebsten selbst ;-), aber so wie es aussieht, muß ich die dann wohl doch nehmen.
Ich hatte schon ein Unterprogramm geschrieben, das das Gleiche macht:
(Zurvor habe ich die Parameter in die Arrays @Bezeichnung und @Wert eingelesen)
sub request()
{
for($i=0;$i<=@Bezeichnung;$i++)
{
if($Bezeichnung[$i] eq $_[0])
{
return $Wert[$i];
}
}
}
Aber vielen Dank trotzdem!
CU
AZ
bisher habe ich immer versucht Hashs zu umgehen, weil ich damit nicht zurecht gekommen bin. Jetzt aber muß ich wohl oder übel diese Form von Variablen einsetzen, da mein Script sonst zu umständlich werden würde. Das Problem:
Hashs sind ziemlich praktisch und koennen einen das Leben viel leichter machen. Es gibt keinen Grund sie nicht einzusetzen.
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es zuletzt versucht:
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
%Wert+=$name;
%Wert+=$value;
}Das solltest Du allerdings so nicht machen. Es gibt ein Modul CGI.pm, das einem die Funktion param zur Formularfeld-Auswertung zur Verfügung stellt. Es gibt auch hier keinen Grund, weshalb diese Funktion nicht einsetzten sollte.
use CGI qw(:standard);
my $formularfeld = ¶m('formularfeld');cu,
PeterDanke!
Das ist zwar eine Lösung, die ich zu allerletzt einsetzen werde (ich programmier' meinen Sch... am liebsten selbst ;-), aber so wie es aussieht, muß ich die dann wohl doch nehmen.
Ich hatte schon ein Unterprogramm geschrieben, das das Gleiche macht:
(Zurvor habe ich die Parameter in die Arrays @Bezeichnung und @Wert eingelesen)sub request()
»» {
for($i=0;$i<=@Bezeichnung;$i++)
{
if($Bezeichnung[$i] eq $_[0])
{
return $Wert[$i];
}
}
»» }
Aber vielen Dank trotzdem!
CU
AZ
Nochmal ich!
Ich versuch's halt mit Hashs, weil ich keine Funktion benutzen möchte (am Anfang hatte ich ja eben die o.g. Funktion benutzt, wird aber unübersichtlich und langsam).
CU
AZ
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es > Ich versuch's halt mit Hashs, weil ich keine Funktion benutzen möchte (am Anfang hatte ich ja eben die o.g. Funktion benutzt, wird aber unübersichtlich und langsam).
Ja, deshalb soll man auch CGI.pm benutzen und sich nicht selbst irgendetwas ausdenken. CGI.pm ist effektiv und ausgereift. Das Argument, daß Du am liebsten alles selbst programmierst, zieht irgendwie nicht ganz. Du nutzt ja auch Perl und hast nicht Deine eigene Programmiersprache entwickelt.
Peter
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es > Ich versuch's halt mit Hashs, weil ich keine Funktion benutzen möchte (am Anfang hatte ich ja eben die o.g. Funktion benutzt, wird aber unübersichtlich und langsam).
Ja, deshalb soll man auch CGI.pm benutzen und sich nicht selbst irgendetwas ausdenken. CGI.pm ist effektiv und ausgereift. Das Argument, daß Du am liebsten alles selbst programmierst, zieht irgendwie nicht ganz. Du nutzt ja auch Perl und hast nicht Deine eigene Programmiersprache entwickelt.
Peter
Hi,
vielen Dank nochmal für Deine Antwort. Ich schreib' jetzt halt mal 'ne Mail, weil das Forum eh' schon groß genug ist. (HAB' ICH VERSUCHT, NUR LEIDER FUNZT DIE MAIL ADDY NICHT!)
Wie Du bestimmt schon gesehen hast, habe ich genau DIE Antwort bekommen, die ich gesucht habe - funktioniert prima - ein Einzeiler! Das Problem, warum ich keine fremden Tools nutzen möchte ist: Ich bin in der Ausbildung und programmiere für meinen Ausbilder teilweise kommerzielle Programme - solche Tools einzubinden verstößt da leider gegen das ©!!
Das ist eigentlich der einzige Grund, warum ich alles selbst programmieren muß, ansonsten nutze ich auch gerne Tools, bin ja auch nicht arbeitswütig ;-)
CU
AZ
Das Problem, warum ich keine fremden Tools nutzen möchte ist: Ich bin in der Ausbildung und programmiere für meinen Ausbilder teilweise kommerzielle Programme - solche Tools einzubinden verstößt da leider gegen das ©!!
Lies Dir das Copyright bei CPAN oder von ActivePerl durch.
Das ist eigentlich der einzige Grund, warum ich alles selbst programmieren muß, ansonsten nutze ich auch gerne Tools, bin ja auch nicht arbeitswütig ;-)
Es geht hier nicht um Tools, sondern letzlich um Standardfunktionen.
Du würdest ja auch nicht "sprintf" oder "split" selbst implementieren wollen. Bei "CGI::" ist es nicht anders.
Hallo,
bisher habe ich immer versucht Hashs zu umgehen, weil ich damit nicht zurecht gekommen bin. Jetzt aber muß ich wohl oder übel diese Form von Variablen einsetzen, da mein Script sonst zu umständlich werden würde. Das Problem:
Wie kann ich die Parameter, die dem Script übergeben werden, in ein Hash einlesen? So habe ich es zuletzt versucht:
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
%Wert+=$name;
%Wert+=$value;
}Funktioniert leider nicht. Aber warum? Wie muß die Syntax aussehen?
Danke!
AZ
Könnte evtl. eine Lösung sein:
$Wert{$name} = $value;
Ciao