Gary: uninitialized value / Perlbehandlung?

Abend zusammen...

vorm schlafengehen noch ein sehr großes Problem:

Beim durchsehen des error.logs von apache konnte ich sehen, daß Perl wohl Skalarbrobleme hat.
-----------------------------------
In Perlscript oben steht:
my $anrede = CGI::param('anrede');
-----------------------------------
weiter unten steht:
$anrede =~ s/;//g;
-----------------------------------

Ich habe für Testzwecke folgendes gemacht:

Setze ich manuell oben: my $anrede = "Herr";
Ist unten alles gut mit: $anrede =~ s/;//g;

Lasse ich aber die "CGI::param('anrede');" und schicke aber von der HTML-Seite keinen Wert für "$anrede" via cgi mit, ergibt das im Serverlog diesen Fehler:
Use of uninitialized value $anrede in substitution (s///) at /xxx/xxx/cgi-bin/XXX.pl line 55.

Also wann immer ein Formular von der Webseite das Perlscript aufruft, und alle werte, die das Script erwartet (param) übertragen werden. Gibt es im Logfile vom Server keine Probleme. Fehlt ein Wert im Formular (also leer), ergibt dies einen Eintrag im Serverlog.

Habe um den Skalar "$anrede" zu überprüfen folgendes versucht:

if($anrede ne ""){
                 $anrede =~ s/;//g;
                 }

Quasi wenn der Inhalt von $Anrede nicht gleich "leer" ist -> dann soll er den Filter verwenden, sonst nicht.

Aber bereits nach dem if wird der Skalar "$Anrede" nicht akzeptiert, da uninitialized...

Wie bekomme ich das hin, cgi-parameter ( CGI::param('anrede'); ) auf Vorrat zu haben, auch wenn ich sie vielleicht gar nicht brauche?

Z.B. automatisch auf "X" setzen wäre eine ausgezeichnete Möglichkeit. Aber wie?

Gruß Gary

  1. Z.B. automatisch auf "X" setzen wäre eine ausgezeichnete Möglichkeit. Aber wie?

    So:
    my $anrede = CGI::param('anrede') || 'X';

    Struppi.

    1. Abend Struppi

      Hey - Rekordzeit und das zu dieser Stunde - respekt!

      Z.B. automatisch auf "X" setzen wäre eine ausgezeichnete Möglichkeit. Aber wie?

      So:
      my $anrede = CGI::param('anrede') || 'X';

      Du bist schon so ein "käpsele"! Wenn du mir jetzt noch verraten könntest, was die beiden || bedeuten sollen und wie man perlen auf solche Art und Weise lernt? Das ist ja gerade zu ein sog. High-Class-Scripting...

      Manman seid ihr fit hier vom Selferverein... Hut ab

      Gruß Gary

      1. Hi Struppi,

        Habe es umprogrammiert. Läuft wie ne eins! (Was die Fehlermeldungen betrifft. Ob die Skalare noch zu gebrauchen sind sehe ich Morgen...)

        Ein lustigen Fehler hat mir das Serverlog noch ausgegeben:

        File does not exist: /var/www/favicon.ico

        ->Er sucht tatsächlich nach einem favicon. Das konnte man früher haben - musste aber nicht. Heute muss man es haben - sonst Fehlerlog...

        Dann werd ich ihm morgen eben ein kleines KDB-Test-Favicon füttern - wenn er denn unbedingt eines haben will *g*

        BTW: Gibt es da Standartgrößen? War glaub mal 16x16 oder 32x32 Bildpunkte äh ich meine natürlich Pixel....

        Gruß und Gute Nacht

        Gary

        1. Habe es umprogrammiert. Läuft wie ne eins! (Was die Fehlermeldungen betrifft. Ob die Skalare noch zu gebrauchen sind sehe ich Morgen...)

          Natürlich nicht. Struppis Antwort funktioniert nicht in gewissen pathologischen Fällen. Du solltest dir angewöhnen, jedenfalls // zu verwenden, nicht ||. Der erstere prüft auf Definiertheit, der letztere auf Wahrheit. Erläuterung siehe perlop. Diese Beispiele zeigen das Problem:

          'irgendein String'  || 'X'     #  ok 'irgendein String'
              5                   || 'X'     #  ok 5
              undef               || 'X'     #  ok 'X'
              '0'                 || 'X'     # nok 'X'
              '0 but true'        || 'X'     #  ok '0 but true'
              0                   || 'X'     # nok 'X'
              0E0                 || 'X'     # nok 'X'

          'irgendein String'  // 'X'     #  ok 'irgendein String'
              5                   // 'X'     #  ok 5
              undef               // 'X'     #  ok 'X'
              '0'                 // 'X'     #  ok '0'
              '0 but true'        // 'X'     #  ok '0 but true'
              0                   // 'X'     #  ok 0
              0E0                 // 'X'     #  ok 0

          Mit anderen Worten: mit || kann man nicht einen logisch falschen, aber definierten Wert wie '0' übergeben. Dein Code macht nicht (immer) das, was du erwartest. Dies ließe sich womöglich von einem bösartigen Benutzer ausnutzen. Diese Absätze sind also keine Korinthenkackerei, sondern ein ernster Sicherheitshinweis.

          Ein lustigen Fehler hat mir das Serverlog noch ausgegeben:
          File does not exist: /var/www/favicon.ico
          Er sucht tatsächlich nach einem favicon.

          Der Server macht fast nie was von allein. Er macht das, weil dein Browser eins angefordert hat. Dies geschieht automatisch, sofern nicht vom Benutzer unterbunden.

          1. Hi CPAN

            In deinem Link heisst es:
            "that it tests the left hand side's definedness instead of its truth."

            Also es testet die linke Seite auf ihre "Definiertheit" anstelle auf ihre "Wahrheit"....

            Naja, mein WG-Englisch ist etwas eingerostet. Müsste es aber Sinngemäss treffen...

            Gut werde ich sofort ausprobieren.
            Kann ja durchaus sein, daß man gewollt oder ungewollt ne Null eingibt...

            Danke für den Hinweis

            Gruß Gary

          2. Mit anderen Worten: mit || kann man nicht einen logisch falschen, aber definierten Wert wie '0' übergeben. Dein Code macht nicht (immer) das, was du erwartest. Dies ließe sich womöglich von einem bösartigen Benutzer ausnutzen. Diese Absätze sind also keine Korinthenkackerei, sondern ein ernster Sicherheitshinweis.

            Naja, wenn bei einer falschen Eingabe der Defaultwert genommen wird, halte ich das für Sicherheitstechnisch unbedenklich. Wenn der Defaultwert ein Sicherheitsproblem wäre, dann liegt das Problem dort und nicht daran, dass der || Operator auch auf die Zahl null matcht.

            Allerdings muss Gary natürlich Wissen, dass er mit || keine Null mehr eingeben kann. (Was aber bei der Anrede verschmerzbar ist)

            Aber auch, dass der // Operator relativ neu ist (5.10?) und in seinem Fall auch nur die halbe Lösung ist, da jetzt ein Leerstring eingeben werden könnte, was u.U. auch nicht erwünscht ist.

            Insofern würde ich an seiner Stelle unbedingt den Oder Operator verwenden, da er in dem Fall richtiger ist.

            Struppi.

            1. Tach auch.

              richtiger

              Haha!

              Bis die Tage,
              Matti

            2. Hi Struppi

              Allerdings muss Gary natürlich Wissen, dass er mit || keine Null mehr eingeben kann. (Was aber bei der Anrede verschmerzbar ist)

              Aber datum wie "01.11.2010" Als string müsste ja trotzdem gehen - du sprichst von einer einzelnen Null?

              Aber auch, dass der // Operator relativ neu ist (5.10?)[...]

              Das habe ich gemerkt: "//" funktioniert nicht. Das heisst er funktioniert schon im Programm und auch der server macht keine fehler. Aber: Mein texteditor ist dann unbruchbar, weil er die Schlüsselwörter nicht mehr hervorhebt und fehler so nicht mehr anzeigt. Er kennt das "//" nicht.

              Gruß Gary

              1. Allerdings muss Gary natürlich Wissen, dass er mit || keine Null mehr eingeben kann. (Was aber bei der Anrede verschmerzbar ist)

                Aber datum wie "01.11.2010" Als string müsste ja trotzdem gehen - du sprichst von einer einzelnen Null?

                Ja ich spreche von einer einzelnen Null. CPAN hat dir doch gezeigt, wie der Operator wirkt.

                Aber auch, dass der // Operator relativ neu ist (5.10?)[...]

                Das habe ich gemerkt: "//" funktioniert nicht. Das heisst er funktioniert schon im Programm und auch der server macht keine fehler. Aber: Mein texteditor ist dann unbruchbar, weil er die Schlüsselwörter nicht mehr hervorhebt und fehler so nicht mehr anzeigt. Er kennt das "//" nicht.

                Das liegt aber eher am Editor.

                Struppi.

      2. Moin!

        So:
        my $anrede = CGI::param('anrede') || 'X';

        Wenn du mir jetzt noch verraten könntest, was die beiden || bedeuten sollen

        Ich übersetze es Dir:

        Der lokale Skalar $anrede habe, wenn der CGI-Parameter 'anrede' einen Wert hat (der wahr repräsentiert) den Wert des CGI-Parameters - sonst 'X'. Die '||' symbolisieren also ein "oder".

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Hi fastix

          Danke auch dir -fastix :-)

          Gruß Gary

      3. Bounjoun Gary,

        wie man perlen auf solche Art und Weise lernt? Das ist ja gerade zu ein sog. High-Class-Scripting...

        1. Einführung in Perl (Randal L. Schwartz & Tom Phoenix), ISBN 3-89721-147-5
        2. Programmieren mit Perl (Larry Wall, Tom Christiansen & Jon Orwant), ISBN 3-89721-144-0

        Adiou.