In the OPed code, the statement
BEGIN { say __PACKAGE__."::begin $variable"; }
refers to the lexical $variable scalar, but the BEGIN block executes first, after the $variable is declared, but before it is initialized at run time. Hence, it is uninitialized, but still consistent with strict. Changing the variable name makes this clear:
Changing the scalar name back to $variable accesses the lexical again, but it's still not initialized at the time the BEGIN block runs, nor at the first invocation of Foo->test('xxx'); (but it is initialized by the time Foo->test('yyy'); runs):c:\@Work\Perl\monks>perl -wMstrict -le "use strict; use warnings; use feature 'say'; ;; Foo->test('xxx'); ;; { package Foo; ;; my $variable = 'bar'; ;; BEGIN { say __PACKAGE__ . qq{::begin $vaRRRRiable}; } ;; sub test { say $_[0], $_[1], $variable; } } ;; Foo->test('yyy'); " Global symbol "$vaRRRRiable" requires explicit package name at -e line + 1. BEGIN not safe after errors--compilation aborted at -e line 1.
c:\@Work\Perl\monks>perl -wMstrict -le "use strict; use warnings; use feature 'say'; ;; Foo->test('xxx'); ;; { package Foo; ;; my $variable = 'bar'; ;; BEGIN { say __PACKAGE__ . qq{::begin $variable}; } ;; sub test { say $_[0], $_[1], $variable; } } ;; Foo->test('yyy'); " Use of uninitialized value $variable in concatenation (.) or string at + -e line 1. Foo::begin Use of uninitialized value $variable in say at -e line 1. Fooxxx Fooyyybar
Give a man a fish: <%-{-{-{-<
In reply to Re: Use of uninitialised value... but it is defined ?!
by AnomalousMonk
in thread Use of uninitialised value... but it is defined ?!
by seki
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |