in reply to Use of uninitialised value... but it is defined ?!
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: <%-{-{-{-<
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Use of uninitialised value... but it is defined ?!
by Discipulus (Canon) on Mar 02, 2016 at 08:19 UTC | |
by AnomalousMonk (Archbishop) on Mar 02, 2016 at 17:27 UTC |