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