rainer: Perl-Script mit Link aufrufen

Ich habe folgendes Problem:

Ich möchte ein Perl-script mit einem Link aufrufen und dabei eine Variable übergeben.
( <a href="script.pl?var=value"> )
Das Script scheint diese Variable aber nicht zu übernehmen.
Wenn Ich dieses Script aber mit ein Formular  (Get or Post) aufrufe funktioniert es.
Kann mir jemand sagen wo mein Fehler liegt?

Danke
rainer

  1. hi ho

    ( <a href="script.pl?var=value"> )
    Das Script scheint diese Variable aber nicht zu übernehmen.

    Wie uebernimmt dein script die variable (Code bitte)

    cua

    n.d.p.

    1. hi ho

      ( <a href="script.pl?var=value"> )
      Das Script scheint diese Variable aber nicht zu übernehmen.

      Wie uebernimmt dein script die variable (Code bitte)

      Hier ist der Code:

      #!/usr/bin/perl -w

      $query_string = ();
      $key_value_pairs = ();
      %FORM_SUCHE = ();
      (*FORM_SUCHE) = @_;
      $request_method = $ENV{'REQUEST_METHOD'};
      if($request_method eq "GET")
      {
      $query_string = $ENV{'QUERY_string'};
      }
      else
      {
      read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
      }
      @key_value_pairs = split(/&/, $query_string);
      foreach $key_value (@key_value_pairs)
      {
      ($key, $value) = split(/=/, $key_value);
      $value =~ tr/ +/ /;
      $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
      $value =~ s/\n/<br>/g;
      $FORM_SUCHE{$key} = $value;
      }

      rainer

      1. Hallo,

        »»  $query_string = $ENV{'QUERY_string'};
        Ich bin mir jetzt nicht 100% sicher, aber ich meine, es muss QUERY_STRING heißen (alles groß).
        Und da Perl auf Groß-/Kleinschreibung achtet, wäre der Fehler geklärt.

        fs

        1. Danke,
          jetzt funzt es.

          cu
          rainer

      2. hi ho

        Felix hat natuerlich recht, oder ist es ein Schreibfehler nur hier?
        Hier nochmal ne Methode, die jedenfalls funktioniert, und uebersichtlicher aussieht.. .-)

        ( <a href="script.pl?var=value"> )

        #!/usr/bin/perl -w

        use strict;
        use CGI;

        my $q=new CGI;
        my $variable=$q->param('var');

        cua

        n.d.p.

        1. hi!

          Mal eine Frage von mir:

          use CGI;
          my $q=new CGI;
          my $variable=$q->param('var');

          Was ist der Vorteil obiger Methode (Perl-OOP) gegenüber einem solchen
          Aufruf:

          use CGI;
          my $variable = CGI::param('var');

          Ist der Overhead bei der Erzeugung von Objekten (oben) nicht viel
          größer als beim direkten Aufruf der Modulfunktionen. Oder gibt es
          einen richtigen Grund, die obere Methode der unteren vorzuziehen?

          bye, Frank!

          1. hi ho

            Ist der Overhead bei der Erzeugung von Objekten (oben) nicht viel
            größer als beim direkten Aufruf der Modulfunktionen.

            in diesem Fall allerdings (mal davon abgesehen, dass fuer speziell diese Anwendung CGI.pm sowieso ein bisschen Overhead darstellt .-))

            einen richtigen Grund, die obere Methode der unteren vorzuziehen?

            ja, gibt es, naemlich genau dann, wenn das Objekt ein Gedaechtnis besitzt (sprich Eigenschaften), die du einmal definierst, und dann so oft abrufen, oder Methoden darauf anwenden kannst, wie du lustig bist, u.a. deswegen wurde ja die OOP eingefuehrt (im Fall CGI-Variablen abrufen trifft das wie gesagt nicht zu .-)

            cua

            n.d.p.

          2. Hallo!

            Ist der Overhead bei der Erzeugung von Objekten (oben) nicht viel
            größer als beim direkten Aufruf der Modulfunktionen.

            Du greifst grade direkt auf eine Variable zu. Das ist in der OOP ÄUSSERST unerwünscht!

            In Perl gibt es zwar nicht wirklich private Variablen, jedoch sollte man sich daran halten, da sonst alle Vorteile der OOP verloren gehen und einige unkontrollierte Nebenwirkungen entstehen können.
            Kapselung heißt hier die Devise.

            Natürlich entsteht ein gewisser "Overhead", doch a) ist der gering (einmaliger Zugriff) und b) trittst Du gerade alle Prinzipien der OOP mit den Füßen.
            Es ist in der OOP IMMER besser, nur über die vorgesehenen Schnittstellen zuzugreifen.

            Warum?
            In der nächsten Version von cgi.pm könnte der Autor sich vielleicht entschließen, den Hash nicht mehr "param" zu nennen, sondern ganz anders. Über die Methode bekommst Du dann trotzdem den richtigen Wert, über die Variable nicht mehr...
            Das nur als Beispiel.

            Oder wie perlmodlib sagt:
            "Perl doesn't have an infatuation with enforced privacy. It would prefer that you stayed out of its living room
            because you weren't invited, not because it has a shotgun."

            fs

            1. hi!

              Ist der Overhead bei der Erzeugung von Objekten (oben) nicht
              viel größer als beim direkten Aufruf der Modulfunktionen.
              Du greifst grade direkt auf eine Variable zu. Das ist in der OOP
              ÄUSSERST unerwünscht!

              Sorry, aber das ist Quatsch. Mit CGI::param('var') greife ich genau
              auf die gleiche _Funktion_ zu wie mit $q->param('var'). Und natürlich ist das dann auch kein OOP mehr - hab ich ja auch geschrieben.

              In der nächsten Version von cgi.pm könnte der Autor sich
              vielleicht entschließen, den Hash nicht mehr "param" zu nennen,
              sondern ganz anders. Über die Methode bekommst Du dann trotzdem
              den richtigen Wert, über die Variable nicht mehr...

              Ist mir klar, ich weiß, was OOP ist. CGI::param() ist aber immer noch
              eine Funktion, keine Variable. Bitte überdenke deine Antwort unter
              diesem Aspekt nochmal... :)

              bye, Frank!

      3. hi!

        $query_string = ();
        $key_value_pairs = ();
        %FORM_SUCHE = ();

        Was sollen immer diese Initialisierungen, noch dazu an dieser Stelle
        mit Klammern? Perl initialisiert seine Variablen selbst. Wichtiger
        wäre hier die Angabe eines Gültigkeitsbereichs:

        my $query_string, $key_value_pairs, %FORM_SUCHE;

        (*FORM_SUCHE) = @_;

        Und du weißt natürlich genau, was dieses Konstrukt macht? Wenn nicht,
        solltest du das vielleicht lieber rausschmeißen.

        @key_value_pairs = split(/&/, $query_string);

        my @key_value_pairs = ...

        foreach $key_value (@key_value_pairs)
        {

        »»  ($key, $value) = split(/=/, $key_value);

        my ($key, $value) = ...

        »»  $value =~ tr/ +/ /;

        tr/+/ /; müsste hier vollkommen reichen.

        Im übrigen solltest du wirklich lieber das Modul CGI.pm verwenden.
        Dann brauchst du auch dieses seltsame Konstrukt
          (*FORM_SUCHE) = @_;
        nicht mehr (dient vermutlich sowieso nur zu Testzwecken an dieser
        Stelle). Und auch deine anderen Probleme dürftest du damit lösen.

        bye, Frank!

  2. Hallo,

    ( <a href="script.pl?var=value"> )

    ^  hier fehlt was

    a href="/cgi-bin/script.pl?param" ... oder
    a href="http://www.domain.de/cgi-bin/script.pl?param"

    Alles klar?

    Das Script scheint diese Variable aber nicht zu übernehmen.
    Wenn Ich dieses Script aber mit ein Formular  (Get or Post) aufrufe funktioniert es.

    $ENV{QUERY_STRING} ist eine CGI Variable.

    Viele Grüße aus dem Badischen, Rolf

    1. Hallo,

      ( <a href="script.pl?var=value"> )
                    ^  hier fehlt was

      »»

      War hier etwas dumm von mir geschrieben, aber in der HTML-Datei ist der absolute Pfad zu dem Script angegeben und es wird auch ausgeführt.
      Der Wert wird halt nicht übergeben.

      Gruß
      rainer