Cargando una Librería con require

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19