Yitzchak Scott-Thoennes wrote: >
Can anyone give a justification why this should work as it does (or a reasonable use):
$ perl -wle'sub getaglob {*loopvar} for ${&getaglob} (qw/the owl and the pussyc at/) { print $loopvar }'
Well, why not? After all, it works everywhere else:
sub getaglob {*foo}
$foo = "beep\n";
print ${&getaglob};What's weird is that the more conventional way -- using references -- does _not_ work in for() loops:
sub getaref {\$foo}
for ${&getaref} (qw/one two three/) {print "$foo\n"}fails with "Not a GLOB reference". The other way around it works:
sub getaref {\$foo}
for $foo (qw/one two three/) {print "${&getaref}\n"}I guess it's because for() localizes the variable it's iterating over, and needs the glob for that. Oddly enough, however, local() does not accept a glob that way:
sub getaglob {*foo}
$foo = "pong\n";
for ${&getaglob} ("ping ") { print $foo }
print $foo;works, printing "ping pong", while:
sub getaglob {*foo}
$foo = "pong\n";
{ local ${&getaglob} = "ping "; print $foo }
print $foo;fails with "Can't localize through a reference"!
Weird.
-- Ilmari Karonen
