use v5.14; { my $count = 1; sub counter { say $count++; } } counter(); counter(); counter(); counter();
Unfortunately, this approach hides a subtle pitfall — well, subtle enough, at any rate, to catch me more than once. The problem is here illustrated:
>perl -wMstrict -le "use v5.14; ;; counter(); counter(); ;; { my $count = 42; ;; sub counter { say $count++; } } ;; counter(); counter(); " 0 1 42 43
There is a critical dependence upon order of execution. The $count lexical variable is created at compile time, so the counter() function has no problem accessing it; the code runs with warnings and strictures fully enabled. The variable is not initialized within its closure until some moment during run time; this moment may precede or follow any invocation of the function that quite happily accesses the variable. KaBoom!
It's pretty easy to avoid this problem: perhaps the easiest way is to just use a state variable! But the first step toward avoidance is awareness.
In reply to Re^6: Use of "my" after Perl v5.14
by AnomalousMonk
in thread Use of "my" after Perl v5.14
by Rohit Jain
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |