Geltungsbereich von my
Charles
- perl
Ich bin gerade etwas ratlos und finde auch im Netz und im SELFHTML-Archiv oder Forum nach langer Suche keine klare Auskunft, sondern nur recht ungenau Hinweise, was den Geltungsbereich von "my" anbetrifft.
Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:
sub xyz {
while my ($i > 0) {
$i++;
usw.....
}
}
gilt dann die Erklärung für $i nur in der Schleife oder in der ganzen subroutine?
Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?
Für Tipps (auch Hinweise auf Websites mit Erläuterungen) wäre ich sehr dankbar.
Charles
hallo,
Ich bin gerade etwas ratlos und finde auch im Netz und im SELFHTML-Archiv oder Forum nach langer Suche keine klare Auskunft
Die gibt es zwar in SELFHTML selbst, allerdings an etwas versteckter Stelle.
Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:
sub xyz {
while my ($i > 0) {
$i++;
usw...
... so solltest du eine Fehlermeldung bekommen.
Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?
Ups. Da geht einiges durcheinander. Zunächst einmal: mit "my" mußt du nur dann Variablen deklarieren, wenn du auch "use strict;" einsetzt. Das ist allerdings dringend geboten, genauso wie "use CGI::Carp qw(fatalsToBrowser);". Eine derart deklarierte Variable hat einen bestimmten Geltungsbereich. Du möchtest eventuell in einer Subroutine eine bestimmte Variable verwenden, die außerhalb dieser Subroutine nicht mehr gelten soll; genau dafür ist "my" gut.
while my ($i > 0) {
ist eine sehr zweifelhafte Angabe. Du könntest aber
while (my $i > 0) {
schreiben. Oder besser noch:
sub xyz {
my $i;
while ($i > 0) {
Das Ganze ist etwas komplizierter (und ließe sich mit "use vars qw()" teilweise außer kraft setzen), aber für den Anfang mag dir das vielleicht erstmal weiterhelfen. Vermutlich ist das, was dir "perldoc strict" auf deiner Konsole liefert, für dich eher verweirrend als erhellend, obwohl es alles das aussagt, was du wissen möchtest.
Grüße aus Berlin
Christoph S.
Hej,
Angenommen ich habe eine subroutine, und in dieser noch eine while- oder for-Schleife. Wenn ich nun innerhalb der while-Schleife in der sub die Erklärung mache:
sub xyz {
while my ($i > 0) {
$i++;
usw.....
}
}
Das ist ganz schlecht aus zwei Gründen:
1.) Ist es syntaktisch falsch! Es müsste doch eher:
sub xyz {
while ( my $i > 0) {
$i++;
usw.....
}
}
heissen.
2.) ist das aus einem konkreten Grund problematisch: Damit deklarierst du $i bei der Prüfung des boolschen Ausdruckes jedesmal neu. Anders als z.B. bei einer for-Schleife, wo die Deklaration in der Initialisierung nur einemal vorgenommen wird:
for( my $i = 0; $i < 10; $i++ ) {
print( $i );
}
Und was sind denn Geltungsräume für my-Deklarationen, Subs, Schleifen, eventuell auch if-Anweisungen?
Mit my deklararierte Variablen gelten immer in dem Block, in dem sie deklarariert worden sind:
http://perldoc.perl.org/functions/my.html
Beste Grüße
Biesterfeld
2.) ist das aus einem konkreten Grund problematisch: Damit deklarierst du $i bei der Prüfung des boolschen Ausdruckes jedesmal neu. Anders als z.B. bei einer for-Schleife, wo die Deklaration in der Initialisierung nur einemal vorgenommen wird:
for( my $i = 0; $i < 10; $i++ ) {
print( $i );
}
oder etwas Perliger
~~~perl
for my $i (0..10) {
print $i ;
}
Struppi.
Hej,
oder etwas Perliger
for my $i (0..10) {
print $i ;
}
Deswegen heisst es wahrscheinlich auch Perl. Solcher Code wird erst erträglich wenn die dritte Gerstenkaltschale im Rachen perlt :)
\*SCNR\*
Biesterfeld
--
Art.1: Et es wie et es
Art.2: Et kütt wie et kütt
Art.3: Et hätt noch immer jot jejange
[Das Kölsche Grundgesetz](http://isamhaddad.de/stuff/kgg.pdf)
Hey,
Coping with Scoping http://perl.plover.com/FAQs/Namespaces.html erklärt noch sehr viele interessante Dinge im Zusammenhang mit my
.