deprecated idiom to simulate state variables

Hi all,
I guess it was in Modern Perl that I saw this deprecated idiom to
simulate state <http://perldoc.perl.org/functions/state.html>
variables:

sub foo{
   my $initialized_once = 1 if 0;
  ...
}

Now, why is that working and initializing the variable the first time?
I mean, each time such row is evaluated the condition is 0 = false, so
the variable should not be initialized never.
What am I missing?

Thanks,
Luca
0
fluca1978
1/10/2017 8:04:00 AM
perl.beginners 29180 articles. 2 followers. Follow

1 Replies
9 Views

Similar Articles

[PageSpeed] 7

On Tue, Jan 10, 2017 at 09:04:00AM +0100, Luca Ferrari wrote:
> Hi all,
> I guess it was in Modern Perl that I saw this deprecated idiom to
> simulate state <http://perldoc.perl.org/functions/state.html>
> variables:
> 
> sub foo{
>    my $initialized_once = 1 if 0;
>   ...
> }
> 
> Now, why is that working and initializing the variable the first time?
> I mean, each time such row is evaluated the condition is 0 = false, so
> the variable should not be initialized never.
> What am I missing?

You are missing a fairly complicated interaction between the
implementation details of variable handling at compile-time and
run-time.  The details are probably not important unless you want to
understand them in order to hack on the core, or just for interest.  In
that case you will be able to find out all the gory details by searching
the perl5-porters mailing list archives or doing some git archaeology.

The behaviour came about by accident, but then people found out that it
filled a hole in the language and started using it.  The important point
is that it was deprecated in perl-5.10.0 and will be removed in
perl-5.30.0 (in a couple of years).  As you note, the correct way to get
this behaviour nowadays is to use the "state" keyword.

-- 
Paul Johnson - paul@pjcj.net
http://www.pjcj.net
0
paul
1/10/2017 8:24:36 AM
Reply: