use strict a pouzivani spolecnych promennych bez explicitniho uvedeni baliku

Honza Pazdziora adelton na informatics.muni.cz
Úterý Březen 12 12:44:32 MET 2002


On Tue, Mar 12, 2002 at 12:06:13PM +0100, Pavel Šmerk wrote:
> 
> Ukazu to jeste na jinem priklade:
> 
> $ cat I.pm
> $^W = 1;
> package I;
> print my $callpack = caller, "\n";
> *{"${callpack}::x"} = \${"${callpack}::x"};
> 1;
> 
> $ perl -Mstrict -MI -we '$x = 1; print "$x\n"'
> main
> 1
> 
> $ perl -we '*{"main::x"} = \${"main::x"}; use strict; $x = 1; print $x;'
> Global symbol "$x" requires explicit package name at -e line 1.
> Global symbol "$x" requires explicit package name at -e line 1.
> Execution of -e aborted due to compilation errors.

Je to fakt zajimave. Srovnej s 

	BEGIN { *{"main::x"} = \${"main::x"}; }
	use strict;
	$x = 1;
a s
	package a;
	BEGIN { *{"main::x"} = \${"main::x"}; }
	package main;
	use strict;
	$x = 1;
a s
	package main;
	BEGIN { *{"main::x"} = \${"main::x"}; }
	package a;
	package main;
	use strict;
	$x = 1;

a sleduj, jak se meni chybove hlasky. Evidentne on podle typeglobu
poznava, ze se neco importovalo, a evidentne zevnitr toho package
to nechodi. Cili reseni je zda se pouzit jiny package.

> Jestli tomu rozumim spravne, prvni prikaz druheho perl -... je presne to 
> same, co udela vkladany balik I. Ale strict mi jednou $x sezere a jednou 
> ne, jak je to mozne? Je to extrahovano z vars.pm, Exporter.pm to resi v 
> podstate stejne.

Primarni problem je v tom, ze se snazis to delat v runtime, coz
neprojde -- to je ten rozil mezi treba use a require. Ale fakt je,
ze to zda se neprochazi, ani kdyz to delam v compile time, v tom
samem package.

> Krome toho, ze me to zajima ze zvedavosti, bych chtel neco jako defined 
> \&our ? our %options : jednoduse_nasimulovat_our_%options.

Pouzit $]? Nebo eval?

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
      ... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------


Další informace o konferenci Perl