On Thu, Sep 18, 2003 at 12:07:16PM +0300, Ilmari Karonen <[EMAIL PROTECTED]> wrote:
> 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:
for $x () does a more complete localization than local($x) does:
use Tie::Scalar;
tie $x, "Tie::StdScalar";
sub checktie { print '$x is ', (tied($x)?'':'not '), "tied in $_[0]\n" }
for $x (1) { checktie('for') }
{ local $x; checktie('local($x)') }
{ local *x; checktie('local(*x)') }
> 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"!
This error seems to be removed in 5.8.1 and it works there (though the
error entry was erroneously left in perldiag).
But this prints "pingping":
sub foo:lvalue { $foo }
$foo = " pong\n";
{ local &foo; print $foo="ping" }
print $foo;