reload modulu

Honza Pazdziora adelton na informatics.muni.cz
Čtvrtek Březen 11 07:52:08 MET 2004


On Wed, Mar 10, 2004 at 07:04:42PM +0100, Ondrej Koala Vacha wrote:
> 
> Mejme program, ktery obsahuje 'use x.pm' a bezi. Zmenim x.pm - treba

Protoze v dalsim bude potreba byt i syntakticky presny, tak
predpokladejme, ze obsahuje

	use x;

(nikoli .pm).

> opravim chybu v nejake funkci. Neni nejaka cesta jak perlu rict, aby x.pm
> znovu nacetl pri behu?

Perl se pri nacitani modulu ridi globalnim hashem %INC. Takze abychom
perl prinutili, aby ten samy mobul natahl a zkompiloval znovu, musime
vytvorit zdani, ze ten modul jeste natazen nebyl. Tedy

	delete $ENV{'x.pm'};

Nasledne modul natahneme. Nemuzeme ale pouzit ciste

	use x;

protoze toto je compile-time zalezitost, takze by se provedlo uz pri
prvotni kompilaci a podruhe nikoli. Pouzijeme misto toho

	eval "use x";

coz ma krome toho, ze jde o run-time efekt, navic i tu peknou
vlastnost, ze program nespadne natvrdo, pokud modul nacist nepujde.

A nyni si prosvistime nejaka sloviska^H^H^H^H^H^H^H^H^H^He priklady:

$ cat Modul.pm
package Modul;
use strict;
use warnings;
sub jezek {
	print "$main::x\n";
}
jezek();
1;
__END__

$ cat skript.pl
#!/usr/bin/perl
use strict;
use warnings;
 
BEGIN { $main::x = 34; }
use Modul;
 
package Modul;
sub jezek {
        print "Changed jezek $main::x\n";
}
 
package main;
$main::x = 65;
Modul::jezek();
delete $INC{"Modul.pm"};
eval "use Modul";
 
__END__

Dokazete predpovedet, co se stane, pokud spustim

$ perl ./skript.pl

?

Je jasny vyznam kazdeho jednotliveho radku? Je jasne, jak potlacit ty
hlasky o predefinovanych funkcich?

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
		Only self-confident people can be simple.


Další informace o konferenci Perl