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 Perl
kerns sondern des Perl
compilers, 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:
% 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.