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




Reply via email to