On Mon, Apr 21, 2008 at 10:40 AM, J. Peng <[EMAIL PROTECTED]> wrote:
> I'm not sure, but why this can work?
>
> use strict;
> use warnings;
> use Data::Dumper;
>
> my $y=0;
> my @x =(1,2,3) if $y;
> print Dumper [EMAIL PROTECTED];
>
>
> Since $y is false, it seems @x 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 @x = (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 @x = (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 important skill a programmer can have is the ability to read.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/