On Jul 15, Connie Chan said: >### Lib 1 ### >use strict; >our %abc; >$abc{a} = 1; >$abc{b} = 2; >### EOF Lib 1 ### > >### Lib 2 ### >use strict; >our $a = "ME"; >### EOF Lib 2 ###
You've made the mistake of using $a (or $b) as a variable name. These two variables are protected from use strict 'vars', because they are used in sorting routines: my @sorted = sort { $a <=> $b } @numbers; >### Script 1 ### >use strict; >eval { require "lib1.pl" } or die "lib 1"; >eval { require "lib2.pl" } or die "lib 2"; > >print $abc{a}; >### EOF Script 1 ### > >When I run script 1, Perl throws me the err of 'explicit package', >but if I change to print $a, instead of $abc{a}, I got "ME" correctly... >Why ? The our() declaration ONLY HAS EFFECT in the scope it is declared in. That means it won't affect another file. And even MORE importantly, require() happens AT RUN-TIME, and use strict 'vars' is a COMPILE-TIME check. That means that even if you had put use vars '%abc'; in the libraries, you wouldn't have been ok, because the libraries you wrote get require()d. You could get around that with a BEGIN block, which forces compile-time execution. # foo.pl use strict; use vars '$x'; $x = 10; # main.pl use strict; BEGIN { require "foo.pl" } print $x; # no error :) >Besides, how can I make some hash just like %ENV, so can access >everywhere ? You can create a variable (scalar, array, hash, even function!) that is available in ALL packages by using a special caret-syntax: package foo; use strict; ${^name} = 1; # no error! package bar; use strict; print ${^name}; # 1, no error! -- Jeff "japhy" Pinyan [EMAIL PROTECTED] http://www.pobox.com/~japhy/ RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/ ** Look for "Regular Expressions in Perl" published by Manning, in 2002 ** <stu> what does y/// stand for? <tenderpuss> why, yansliterate of course. [ I'm looking for programming work. If you like my work, let me know. ] -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]