http://qs321.pair.com?node_id=1174355

Krambambuli has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I have two simple modules:
package Demo1; use base qw/Exporter/; $SUCCESS = 1; BEGIN { use Exporter(); @ISA = qw(Exporter); @EXPORT = qw( $SUCCESS ) } 1;
and
package Demo2; sub import { ${[caller]->[0].'::'}{$_} = ${__PACKAGE__."::"}{$_} foreach grep { not /^(ISA|isa|BEGIN|import|Dumper)$/ } keys %{__PACKAGE__."::"}; } use constant { SUCCESS => 0, }; 1;
and a minimalistic test program, that is
#!/usr/bin/perl use strict; use warnings; use Demo1; use Demo2; print "SUCCESS: ", SUCCESS, "\n"; print "\$SUCCESS: $SUCCESS\n"; exit;
If I run the program as shown, I see an compile time error, like
Bareword "SUCCESS" not allowed while "strict subs" in use at ./demo.pl + line 9. Execution of ./demo.pl aborted due to compilation errors.
but if I simply change the order of the use instructions, i.e. I run
#!/usr/bin/perl use strict; use warnings; use Demo2; use Demo1; print "SUCCESS: ", SUCCESS, "\n"; print "\$SUCCESS: $SUCCESS\n"; exit;
then the displayed result is the expected one,
SUCCESS: 0 $SUCCESS: 1
I'd love to understand what's happening here - and would bve grateful to learn if there is a way to not have to use the two modules in a strict order in order to have the code working nevertheless.

Many thanks in advance.