Perl-Script erklären

Kann mir jemand dieses PerlScript erklären?

if ($ENV{‚REQUEST_METHOD‘} eq „GET“) { $buffer = $ENV{‚QUERY_STRING‘}; }
else { read(STDIN, $buffer, $ENV{‚CONTENT_LENGTH‘}); }
@nvpairs = split(/&/,$buffer); foreach $pair (@nvpairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(„C“, hex($1))/eg;
$in{$name} = $value; }

ich hab gerafft, dass am Ende in dem Hash „in“ die einzelnene übergebenen Daten enthalten sind, aber die Zeilen, die ein =~ enthalten raff ich nicht (ich weiss zwar, was der Operator bedeutet), komme aber mit der Syntax nicht klar und kriege nicht raus, was die einzelnen Befehle bedeuten.
Danke im Vorraus,
Reaper82

Hi,

Kann mir jemand dieses PerlScript
erklären?

ja. Es geht einfacher, sicherer und sauberer mit
use CGI;
my $cgi = new CGI;
my %in;
foreach ($cgi->param) { $in{$_} = $cgi->param($_); }

:wink:

So, jetzt von Anfang an und ausführlich:

if ($ENV{‚REQUEST_METHOD‘} eq „GET“) {
$buffer = $ENV{‚QUERY_STRING‘}; }
else { read(STDIN, $buffer,
$ENV{‚CONTENT_LENGTH‘}); }

Je nach Übertragungs-Methode wird die Variable $buffer mit den Daten gefüllt.

@nvpairs = split(/&/,$buffer);

Die einzelnen Parameter trennen.

foreach $pair (@nvpairs) {

Jeden Parameter einzeln durchgehen.

($name, $value) = split(/=/, $pair);

Name und Wert des Parameters trennen.

$value =~ tr/+/ /;

Plusse durch Leerzeichen ersetzen. (tr/// ist zeichenweise Ersetzung, und - trotz des „=~“ - keine Regular Expression)

$value =~
s/%([a-fA-F0-9][a-fA-F0-9])/pack(„C“,
hex($1))/eg;

Sodele, hier haben wir 'ne RegExp. Sie funktioniert folgendermaßen:

  • Suche ein Prozentzeichen, gefolgt von zwei Hexadezimalziffern.
  • Merke Dir die beiden Ziffern.
  • Ersetze sie durch das, was die pack-Funktion liefert, wenn man den Dezimalwert der beiden Ziffern als ASCII-Code für ein Zeichen nimmt.

pack selber ist ziemlich komplex, lies Dir dazu am besten die Perl-Dokumentation (perldoc -f pack) durch. RegExp selber wird in perldoc perlre erklärt.

$in{$name} = $value; }

Das Hash mit den Daten füllen.

ich hab gerafft, dass am Ende in dem Hash
„in“ die einzelnene übergebenen Daten
enthalten sind, aber die Zeilen, die ein
=~ enthalten raff ich nicht (ich weiss
zwar, was der Operator bedeutet), komme
aber mit der Syntax nicht klar und kriege
nicht raus, was die einzelnen Befehle
bedeuten.

Ist auch nicht leicht zu verstehen. s/// heißt „suchen und ersetzen“, das „g“ am Ende steht für „global“ (also jedes Vorkommen ersetzen), das „e“ besagt, das der Code, durch den das Vorkommen ersetzt werden soll, ausgeführt wird (ansonsten würde durch die Zeichenkette „pack(…“ selbst ersetzt werden). Eben dieses „e“ macht die RegExp vermutlich auch so schwierig, daß Du sie nicht mehr gleich verstehst :smile:

Ich hoffe, Du siehst jetzt klarer!

Cheatah
http://cheatah.net

hehe…
Hi Cheatah,

ich sehe, du hast die Zeit meiner Abwesenheit genutzt und in Perl und RegExps investiert *grins*

hmm, koennte der Code nicht sogar das Bereitstellen der Params aus dem CGI Modul sein? (nur son Gedanke…)

kampi

Hi kampi,

ich sehe, du hast die Zeit meiner
Abwesenheit genutzt und in Perl und
RegExps investiert *grins*

ja, ich habe so einiges gelernt :wink:

hmm, koennte der Code nicht sogar das
Bereitstellen der Params aus dem CGI
Modul sein? (nur son Gedanke…)

CGI.pm arbeitet anders. Der gepostete Code versagt, wenn ich mich recht erinnere, beispielsweise bei .

Cheatah
http://cheatah.net