alligator: Global symbol Errorlog (CGI/PERL)

Hi Leute
                             ich bekomm die Fehlermeldung von meinem Webserver:
                             Global symbol "$spielplanlaenge" requires explicit package name at spielergebnisse_beta.pl line 221.
                             Global symbol "@spielplan" requires explicit package name at spielergebnisse_beta.pl line 226.
                             Global symbol "@ergebnisse" requires explicit package name at spielergebnisse_beta.pl line 236.
                             Global symbol "@ergebniss" requires explicit package name at spielergebnisse_beta.pl line 358.

Mir isch klar, dass es irgendwas mit globalen Variablen zu tun hat bzw. irgendwas mit "my". Vielleicht kann
                             mir jmd. genauer auf die Sprünge helfen. Hab auch schon in ERfahrung gebracht, dass ich irgendwas mit
                             use strict vars machen muss/soll, aber steig da echt nicht ganz durch.

thx
                             alligator

  1. Hi,

    In Perl ist es normalerweise nicht notwendig, Variablen zu deklariern, das heißt dann u.A.aber auch, daß Vertipper nicht mehr gefunden werden und außerdem leicht mit globalen und lokalen Variablen durcheinander kommen kann..

    Möchte man das nun aber, so kann man "use strict;" angeben, womit Variablen nun deklariert (vorzugsweise mit "my") werden müssen (das hat auch noch ein paar andere Auswirkungen, am besten in ner Perl-Doku nachlesen).

    Tut man dies dennoch nicht, an der falschen Stelle oder vertippt sich, so erhällt man die von dir genannten Fehlermeldungen.

    Also immer brav die Variablen mit my $variablenname oder my @variablenname oder my ($variablenname1, @variablenname2) oder my $variablenname = "hödeldifö" oder... deklarieren und auf die richtige schreibweise achten.

    Gruß
    Marcus

    1. HI Marcus,
      danke für deine Antwort.
      Aber mir ist dann nicht klar wie ich globale Variablen deklarieren muss, denn my und local sind ja nicht global.

      cu
      alligator

      1. Hallo!

        #!/usr/bin/perl -w

        use strict;

        my $var1;       # globale Variable

        sub blabla
        {
            my $var2;   # lokale Variable nur innerhalb der Subroutine gültig
        }

        while(something)
        {
            my $var3;   # ebenfalls lokale Variable nur innerhalb der whileschleife gültig
        }

        Alles klar?

        Gruß Markus

        1. Hallo!

          #!/usr/bin/perl -w

          use strict;

          my $var1;       # globale Variable

          sub blabla
          {
              my $var2;   # lokale Variable nur innerhalb der Subroutine gültig
          }

          while(something)
          {
              my $var3;   # ebenfalls lokale Variable nur innerhalb der whileschleife gültig
          }

          Alles klar?

          Gruß Markus

          Hmm hört sich logisch an :-)
          Werds gleich mal versuchen ....

          Danke !!!
          cu
          alligator

        2. Hallo,

          my $var1;       # globale Variable

          sub blabla
          {
              my $var2;   # lokale Variable nur innerhalb der Subroutine gültig
          }

          $var1 ist zwar innerhalb von blabla() "zu sehen", weil blabla() im
          lexikalischen Geltungsbereich (Block, Datei) von $var1 liegt, das ändert
          aber nichts daran das $var1 eine lokale Variable ist.

          Globale Variable erhalten u.a. einen Eintrag in der jeweilgen Symboltabelle,
          lassen sich mit local "überschreiben", ..., was für lokale Variable nicht zutrifft.

          Gruß Kai

      2. Hallo,

        Aber mir ist dann nicht klar wie ich globale Variablen deklarieren muss,

        perldoc -f our
        perldoc vars

        Du solltest dir über die Unterschiede von lokalen und globalen Variabelen im
        Klaren sein und überlegen, ob du wirklich globale Variablen brauchst.

        Hinweise dazu findest du unter:

        perldoc perlsub
        perldoc perlmod

        Gruß Kai

        1. Hallo,

          Aber mir ist dann nicht klar wie ich globale Variablen deklarieren muss,

          perldoc -f our
          perldoc vars

          Du solltest dir über die Unterschiede von lokalen und globalen Variabelen im
          Klaren sein und überlegen, ob du wirklich globale Variablen brauchst.

          Hinweise dazu findest du unter:

          perldoc perlsub
          perldoc perlmod

          Gruß Kai

          HI Kai,

          ich bin im logischen Unterschied schon drüber bewußt aber nicht wie ich es Syntaxmäßig machen muss.
          Aber der Post von Markus hat mich da schon ein wenig weiter gebracht, obwohl ich noch ein kleines Syntaxproblem mit my habe:

          So tut es:

          my @aussortiert;
          my @fertig;

          foreach my $sort (@htmlgesplittet)

          {
           if (($sort =~ m/onClick="surl='/i) || ($sort =~ m/FONT class="S" size="2" face="arial, helvetica, sans-serif">/i))

          {
               push(@aussortiert, "$sort");
           }
          }

          foreach my $sort_abschneiden (@aussortiert)
          {
           if (($sort_abschneiden =~ m/sans-serif">(.+)/) || ($sort_abschneiden =~ m/surl='(.+?)'/))
              {
           push (@fertig, "$1");

          }
          }

          So nicht:

          foreach my $sort (@htmlgesplittet)

          {
           if (($sort =~ m/onClick="surl='/i) || ($sort =~ m/FONT class="S" size="2" face="arial, helvetica, sans-serif">/i))

          {
               push(my @aussortiert, "$sort");
           }
          }

          foreach my $sort_abschneiden (@aussortiert)
          {
           if (($sort_abschneiden =~ m/sans-serif">(.+)/) || ($sort_abschneiden =~ m/surl='(.+?)'/))
              {
           push (my @fertig, "$1");

          }
          }

          Da bringt er mir wieder den Global-Errorlog ???
          Das ist mir noch nicht so ganz klar, warum das so ist, aber ich werd mir das nochmla in der Perldoc durchlesen und hoffe das es dann klarer ist *bet*

          cu
          alligator

          1. Hallo!

            Vermutlich greifst Du zu einem späteren Zeitpunkt auf die Arrays zu. Da diese aber im 2.Beispiel nur innerhalb der if-Schleifen(lokal!) deklariert sind, kommt dann der Fehler. So wie im 1.Beispiel ist es richtig, da die Array global deklariert sind und du somit sowohl innerhalb der Schleifen, als auch außerhalb darauf zugreifen kannst.

            Gruß Markus

            1. Hallo!

              Vermutlich greifst Du zu einem späteren Zeitpunkt auf die Arrays zu. Da diese aber im 2.Beispiel nur innerhalb der if-Schleifen(lokal!) deklariert sind, kommt dann der Fehler. So wie im 1.Beispiel ist es richtig, da die Array global deklariert sind und du somit sowohl innerhalb der Schleifen, als auch außerhalb darauf zugreifen kannst.

              Gruß Markus

              Aber ich dachte es ist eine lokale Variable nur in Unterprogrammen und nicht in einer Anweisung (Z.B. if oder for-Schleife!) ???

              cu
              alligator

              1. Hallo,

                Aber ich dachte es ist eine lokale Variable nur in Unterprogrammen und nicht in einer Anweisung (Z.B. if oder for-Schleife!) ???

                perldoc -f my

                A my' declares the listed variables to be local (lexically) to the enclosing block, file, or eval'. [...]

                Das kann der Block einer for-Schleife, genau wie der eines do, ..., oder
                sogar ein freistehender Block sein.

                Gruß Kai

                1. Hi nochmal zusammen,

                  also ich habs jetzt verstanden :-)
                  Isch zwar eigenartig, wenn ich das mit anderen Sprachen vergleiche, aber egal.
                  Find ich echt klasse von euch beiden, dass ihr mir mit meinem Problem weitergeholfen habt.

                  thx  & cu
                  alligator

              2. Hallo!

                Aber ich dachte es ist eine lokale Variable nur in Unterprogrammen und nicht in einer Anweisung (Z.B. if oder for-Schleife!) ???

                Variablen, die mit my innerhalb einer Schleife (while|for|if|unless) deklariert werden, sind lokale Variablen und gelten nur innerhalb dieser Schleife.

                my var1;
                sub blabla
                {
                    my $var2;
                    if(bedingung)
                    {
                        my $var3;
                    }
                }

                Hier gilt $var2 innerhalb der gesamten Subroutine, d.h. auch innerhalb der if-Schleife, ist aber eine lokale Variable. $var3 dagegen gilt nur innerhalb der if-Schleife und ist ebenfalls eine lokale Variable. $var1 ist eine globale Variable und gilt im gesamten Bereich.
                Ich hoffe, es kommt langsam Licht ins Dunkel.

                Gruß Markus