|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Unterschiedliches Verhalten my ... / use vars - aber nur lokal
|
Seitenanfang |
Hallo, wenn ich nachfolgendes Skript im Internet laufen lasse, gibt es keinen Unterschied, ob ich die Variable $zahl mit my oder mit use vars deklariere. Es wird bei jedem Start ausgegeben *** $zahl(1): 1 *** *** $zahl(2): 2 *** Wenn ich es auf meinem lokalen System (XAMMP/Apache) laufen lasse, so kommt das gleiche Ergebnis, wenn ich die Variable mit use vars definiere. Wenn ich sie mit my definiere, so kommt beim ersten Aufruf *** $zahl(1): 1 *** *** $zahl(2): 2 *** beim zweiten *** $zahl(1): 2 *** *** $zahl(2): 3 *** dann *** $zahl(1): 3 *** *** $zahl(2): 4 *** u.s.w. d.h. es wird offensichtlich die Variable an der Zeile 9 des Skripts nicht mehr initialisiert. Jetzt dachte ich aber, dass bei der Defin. am Anfang my und use vars gleiche Wirkung haben. Und warum läuft es nur lokal falsch. Ist da ein Parameter einzustellen, so nach dem Motto 'wenn my angegeben, dann behandele es wie ...' Vielen Dank Hier das Skript:
#!/usr/bin/perl -w use strict; use LWP::UserAgent; #use vars qw($zahl); my $zahl; use CGI; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; $zahl = 1; print <<AAA; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head></head><body> AAA getinc (); print <<GGG; </div> </body> </html> GGGsub getinc {print "*** \$zahl(1): $zahl ***<br>"; $zahl= $zahl+1; print "*** \$zahl(2): $zahl ***<br>"; }
Datum: 05.06.2007-14:02

|
re: Unterschiedliches Verhalten my ... / use vars - aber nur loka
|
Seitenanfang |
| Hallo! Vermutlich hast du mod_perl in deinem Indianer mit installiert. Um dieses 'mystische' Verhalten zu vermeiden, solltest du in subroutinen keine Variablen benutzen, die Außerhalb erstellt wurden. Umgehen könntest du das Problem z.B. folgendermaßen:
getinc(\$zahl); ... sub getinc { my $zahl = ${shift}; print ... }
Jetzt übergibts du einen Zeiger auf die eigentliche $zahl, die du vorher initialisiert hast, es sollte funktionieren. Möchtest du den Wert der Variablen in der Subroutine gar nicht ändern, reicht es natürlich auch, nur den Wert von $zahl zu übergeben.
getinc($zahl); ... sub getinc { my $zahl = shift; print $zahl; }
Grüße, Skrilax
Datum: 06.06.2007-10:17

|
|

|

|

|
 |

|

|
|