Andreas: GIbt es in Perl sowas wie urlencode in PHP(GET-Problem)

Hallo!
Gibt es in Perl auch sowas wie  folgenden Code in PHP:

".urlencode($Variable)."

Und zwar will ich gerne eine Variable per Get-Methode übergeben, nur sobald diese ein Leerzeichen enthält ist es vorbei.
In php habe ich das so gemacht:

link.php?Variable=<?echo ".urlencode($Variable).";?>
Nur wie mache ich das in PERL???

Hab so ein Script, das nur weiterleiten soll aber die Variablen übergeben:
print <<EOF ;
<html>
<meta http-equiv="refresh" content="0;URL=http://217.223.146.148/insert.php?Produkt=".urlencode($Produkt)."">
EOF

Ich dachte den Befehl gäbe es auch in PERL, gibts wahrscheinlich auch, ich kwende Ihn wahrscheinlich falsch an. Oder ist das gar nicht möglich? Genau diese Variante geht jedenfalls mit PHP, halt mit echo.

Die Daten werden dann erst von einem PHP-Script gelesen. Wenn ich das normal über ein Formular mit POST übergebe, ist alles OK.
Wäre sehr Dankbar für Eure Hilfe!

Gruß
Andreas

  1. Hallo,

    Gibt es in Perl auch sowas wie  folgenden Code in PHP:

    ".urlencode($Variable)."

    Da Perl nicht ursprünglich für Web-G'schichtln entwickelt wurde, ist keine äquivalente Funktion eingebaut.
    Allerdings ist
    1.) das Encoding nicht so kompliziert, eine Regex gen+ügt
    2.) eine solche Funktion im Modul CGI (eigentlich in CGI::Util) enthalten, das allerdings inzwischen zum 'Standard-Lieferumfang' gehört.

    also

    my $qery = new CGI;
    print $query->escape('Was auch immer für ein Text!');

    Grüße
      Klaus

    1. Hallo,

      my $qery = new CGI;
      print $query->escape('Was auch immer für ein Text!');

      oder als Funktionen:

      URL-encode data

      sub escape {
          shift() if ref($_[0]);
          my $toencode = shift;
          return undef unless defined($toencode);
          $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
          return $toencode;
      }

      unescape URL-encoded data

      sub unescape {
          shift() if ref($_[0]);
          my $todecode = shift;
          return undef unless defined($todecode);
          $todecode =~ tr/+/ /;       # pluses become spaces
          $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
          return $todecode;
      }

      Reiner

    2. Hallo!
      Also ich habe das mal so probiert:

      #!/usr/bin/perl

      use CGI qw(param);

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

      $Beschreibung = param("Beschreibung");
      $Preis = param("Preis");

      print '<html>';
      print '<head>';
      print '<meta http-equiv="refresh" content="0;URL=http://217.234.346.185/session.php?';
      my $qery = new CGI;
      print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');
      print '">';

      exit ;

      Aber da bekomme ich nur
      <meta http-equiv="refresh" content="0;URL=http://217.224.146.148/session.php?
      angezeigt, sonst passiert nichts.
      Wie soll ich das sonst machen?
      Gruß
      Andreas

      1. Hallo,

        Ich denke daß da Perl die Mitarbeit verweigert, weil
        use CGI qw(param);

        aussagt, daß Du nur die Funktion param brauchen wirst
        und

        my $query = new CGI;
        print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');

        aber ersten das Modul im Objektorientierten Ansatz und dazu noch die Methode escape verwenden will

        Außerdem würde

        print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');

        Preis%3D%24Preis%26Beschreibung%3D%24Beschreibung
        als Ergebnis bringen, da ja der ganze String 'escaped' wird, Du aber wahrscheinlich
        Preis=1234&Beschreibung=abc%20edef%20dshfdskhs
        erwartest.
        Das ist jetzt mal eine Vermutung, falls Du den Error-Log Deines Webservers inspizieren würdest, würdest Du auch entsprechende Hinweise finden.

        warum nicht:

        #!/usr/bin/perl -w

        use strict; # sollte in keinem guten Script fehlen
        use CGI;

        my $query = new CGI;
        print "Content-type: text/html\n\n" ;

        my $Beschreibung = $query->escape($query->param('Beschreibung'));
        my $Preis = $query->escape($query->param('Preis'));

        print '<html>';
        print '<head>';
        print '<meta http-equiv="refresh" content="0;URL=http://217.234.346.185/session.php?';
        print "Preis=$Preis&Beschreibung=$Beschreibung";
        print '">';

        exit ;

        (Ich weiß könnte noch etwas besser sein, aber ich wollte nicht zu weit vom geposteten Code weg)

        Literaturhinweise (unvollständig):

        Grüße
          Klaus

        1. Hi KLaus!
          Danke, klappt jetzt wunderbar!
          Ich habe ja das Probkem dass ich an die Error-Log des Servers nicht dran darf, ich weiß, könnte ich auch lokal installieren, aber ich habe mich jetzt für PHP entschieden, da ich damit sehr viel besser klar komme.
          Da ich jetzt auch den Warenkorb in PHP geschrieben habe, brauchte ich ein Script, welches die Unzähligen alten Seiten auf diesen Umleitet, denn vorher hatten wir da noch keinen Warenkorb, außerdem was das CGI-BIN Verzeichnis noch im Hauptverzeichnis dieser Domain...
          mit PHP geht einiges viel einfacher, wobei ich manchmal, man glaubt es kaum, anfange PERL zu vermissen, denn manche Sachen waren in Perl besser als in PHP.
          Naja, jedenfalls nochmal Danke für deine Hilfe,

          Gruß
          Andreas

          1. Hallo,

            Danke, klappt jetzt wunderbar!

            Na toll, aber hast Du auch verstanden, warum es jetzt klappt?

            mit PHP geht einiges viel einfacher, wobei ich manchmal, man glaubt es kaum, anfange PERL zu vermissen, denn manche Sachen waren in Perl besser als in PHP.

            Tja, das ist so eine Problem, Perl ist vielleicht für den Anfang etwas schwierig, wenn man das Konzept dahinter nicht versteht. Allerdings läßt einen Perl selbst in vertrackten Situationen äußerst selten im Regen stehen.  Deshalb werde ich mich wohl nie mit PHP ernsthaft auseinandersetzen. Naja nie ist vielleicht nicht richtig, aber zumindest nich, solange ich es irgenwie vermeiden kann;-)

            Grüße
              Klaus

  2. Hallo Andreas,
    mir ist nicht ganz klar welches problem es dort geben soll.
    Wenn du eine variable übergeben willst per Get die aber auch gleichzeitg Leerzeichen beinhaltet, solltest du diese variable vielleicht ersteinmal koodieren. So eine Arte Filter einbauen.
    Ich kann dir jetzt leider nicht sagen ob es eine solche Funktion berreits schon für Perl gibt , kann gut sein, allerdings sollte es auch so keine große schwierigkeit sein sich einen "Filter" selbst zu programmieren.
    Also vor dem Abschicken checkst du erstmal die Variable nach besonderen Zeichen durch (z.b. Leerzeichen) und anschließend ersetzt du diese.
    Einfaches Beispiel.

    $getstring =~ s/ /%20/g;

    *nicht getestet

    Dieser Befehl ersetzt alle " " Leerzeichen durch ein "%20".
    Du solltest dich vielleich mal mit der Mustererkennung oder auch "pattern Matching" genannt, auseinandersetzen.

    anschließend musst du diese "koodierte" -Variable natürlich in dem anderen script wieder zurücksetzten bzw. die umkehrwerte für den filter benutzen, sprich aus "%20" wird wieder " ".

    Gruß Urmel

    1. ohhhh da war wohl jemand schnell ;)
      cool jetzt weiss ich endlich das es da was gibt (CGI-Funktion), DANKE ;)