Los programas que quieren usar las subrutinas en la librería pueden invocar el fichero con require
lhp@nereida:/tmp$ perl -wde 0 main::(-e:1): 0 DB<1> require GRID::Machine # Cargada DB<2> require "GRID::Machine" # Error Can't locate GRID::Machine in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl /usr/local/lib/perl/5.8.7 /usr/local/share/perl/5.8.7 /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4.) at (eval 17)[/usr/share/perl/5.8/perl5db.pl:628] line 2. DB<3> require "GRID/Machine.pm" # Cargada DB<4> x %INC 0 're.pm' 1 '/usr/lib/perl/5.8/re.pm' 2 'attributes.pm' 3 '/usr/share/perl/5.8/attributes.pm' .. .................................................... 42 'GRID/Machine.pm' 43 '/usr/local/share/perl/5.8.8/GRID/Machine.pm' .. .................................................... 60 'GRID/Machine/MakeAccessors.pm' 61 '/usr/local/share/perl/5.8.8/GRID/Machine/MakeAccessors.pm' 62 'Module/Which.pm' 63 '/usr/local/share/perl/5.8.8/Module/Which.pm' 64 'GRID/Machine/Result.pm' 65 '/usr/local/share/perl/5.8.8/GRID/Machine/Result.pm' .. .................................................... 110 'Term/ReadLine/Gnu.pm' 111 '/usr/lib/perl5/Term/ReadLine/Gnu.pm'
la función require
lee el archivo si este no ha
sido leido antes.
En el hash especial %INC están las librerías cargadas. Obsérvense las líneas 42 y 43.
El módulo Module::Util
proporciona la función module_path
que devuelve el camino relativo para un módulo. Así si se quiere saber donde está un módulo:
DB<1> use GRID::Machine DB<2> use Module::Util qw( :all ); DB<3> x $INC{module_path('GRID::Machine')} 0 '/soft/perl5lib/share/perl/5.8.8//GRID/Machine.pm'o bien:
DB<4> x module_is_loaded('GRID::Machine') 0 '/soft/perl5lib/share/perl/5.8.8//GRID/Machine.pm'
El archivo cargado no tiene que necesariamente estar asociado
con un package
. Su evaluación por require
debe devolver verdadero. Por ello la última sentencia ejecutada
deberá devolver una valor cierto. De aquí que un paquete normalmente termine con:
return 1;
Si se omiten las comillas y el sufijo, se asume una extensión .pm
:
lhp@nereida:/tmp$ perl -wde 0 main::(-e:1): 0 DB<1> require "CGI" # Error Directory /usr/local/share/perl/5.8.8/CGI not allowed in require at (eval 5)[/usr/share/perl/5.8/perl5db.pl:628] line 2. DB<2> require CGI # OK DB<3> require "CGI.pm" # OK
Casiano Rodríguez León