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:

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.
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 $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
      this kind of problems happened to me too ...

      You and me both, brother. And thank you for the compliment.


      Give a man a fish:  <%-{-{-{-<