Thread "Always use my; never use local" ? (8 answers)
Opened by RalphFFM at 2008-02-01 11:30

murphy
 2008-02-02 03:18
#105478 #105478
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
betterworld+2008-02-01 17:40:05--
[...]
Naja, ok, 5.10... wie isn das, braucht man local da jetzt ueberhaupt noch, wenn man auch my auf Spezialvariablen anwenden kann?


Man braucht schon deswegen weiterhin local, weil $_ die einzige Spezialvariable ist, die sich bei Perl 5.10 besonders verhält, wenn man eine lexikalische Version von ihr mit my deklariert.

Geändert hat sich hier effektiv auch nicht das Verhalten des Perlkerns sondern des Perlcompilers, welcher an den Stellen, wo er schon immer automatisch einen Zugriff auf $_ in den Parsetree einfügt, nun zuerst den lokalen lexikalischen Namensraum nach einem $_ durchsucht und erst falls es ein solches nicht gibt das globale $_ benutzt.

Im Übrigen hat diese Änderung des Compilers auch den netten Spinoff, dass es jetzt einen Subroutinenprototypen _ gibt, welcher $ entspricht, wobei der Parameter aber implizit mit $_ belegt wird, wenn er nicht explizit angegeben wird.

Das Verhalten von my $_ und local $_ ist aber natürlich auch unter Perl 5.10 noch subtil verschieden – nur für die klassischen Anwendungsfälle macht es keinen Unterschied mehr. Nur mal als Beispiel:
Code: (dl )
1
2
3
% perl -Mstrict -Mwarnings -E 'sub g { say }; sub f0 { local $_ = 42; g }; sub f1 { my $_ = 23; g }; f0; f1'
42
Use of uninitialized value $_ in say at -e line 1.
When C++ is your hammer, every problem looks like your thumb.

View full thread "Always use my; never use local" ?