Global symbol Errorlog (CGI/PERL)
alligator
- webserver
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
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
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
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
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
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
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
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
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
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
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
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
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