On Mon, Apr 21, 2008 at 10:40 AM, J. Peng <peng.kyo@[EMAIL PROTECTED]
> wrote:
> I'm not sure, but why this can work?
>
> use strict;
> use warnings;
> use Data::Dumper;
>
> my $y=0;
> my @[EMAIL PROTECTED]
=(1,2,3) if $y;
> print Dumper \@[EMAIL PROTECTED]
>
>
> Since $y is false, it seems @[EMAIL PROTECTED]
shouldn't be declared.
> But why the last print can work?
snip
Because of a quirk in how the current and past versions of perl parsed
and handled the statement. It is a mis-feature according to Larry.
Some people used to use it to create state variables. The correct way
to create a state variable prior to 5.10 is with a closure:
{
my @[EMAIL PROTECTED]
= (1, 2, 3);
sub function_that_uses_x {
...
}
}
In Perl 5.10 we got the state* function that works like the my
function but does not reinitialize each time through:
sub function_that_uses_x {
state @[EMAIL PROTECTED]
= (1, 2, 3);
...
}
Of course, the old way is still handy if you need to share a state
value between functions:
{
my $shared = 0;
sub f1 {
...
}
sub f2 {
...
}
}
--
Chas. Owens
wonkden.net
The most im****tant skill a programmer can have is the ability to read.


|