2008-10-08 7 views

Respuesta

81

use tiene lugar en tiempo de compilación, por lo que esto funcionaría:

BEGIN {push @INC, '..'} 
use EPMS; 

embargo, la mejor solución es use lib, que es una manera más agradable de escribir lo anterior:

use lib '..'; 
use EPMS; 

En Sin embargo, si está ejecutando desde un directorio diferente, se recomienda el uso de FindBin:

use FindBin;      # locate this script 
use lib "$FindBin::RealBin/.."; # use the parent directory 
use EPMS; 
+1

Por lo general, quiere hacer un desvío para que su directorio esté en el frente de la lista. De esta forma, Perl no tiene que buscar a través de @INC para encontrarlo. :) –

+0

Sí, así es, por lo que la conversión BEGIN {push} => 'use lib' tampoco es idéntica. Pero quería mostrar el cambio utilizable mínimo de la pregunta para que funcione. Gracias por notar :) – ephemient

+0

También hay PERL5LIB y el interruptor -I, como Brian menciona. – Axeman

2

Debe procesar push antes de use - y use se procesa antes. Entonces, necesitarás un BEGIN { push @INC, ".."; } para tener una oportunidad, creo.

+1

Por lo general, desea hacer un cambio para que su directorio esté en la parte delantera de la lista. De esta forma, Perl no tiene que buscar a través de @INC para encontrarlo. :) –

+0

Sí, eso también ... Normalmente, no uso nombres relativos porque normalmente no ejecuto scripts desde un directorio fijo, por lo que ... –

6

'use lib' es la respuesta, como @ephemient mencionado anteriormente. Otra opción es usar require/import en lugar de usar. Significa que el módulo no se cargará en tiempo de compilación, sino en tiempo de ejecución.

Eso le permitirá modificar @INC como lo intentó allí, o podría pasar requerir una ruta de acceso al archivo en lugar del nombre del módulo. Desde 'perldoc -f require':

si expr es un bareword, la requieren asume una extensión ".pm" y sustituye '::' con '/' en el nombre de archivo para usted, para hacer más fácil a cargue los módulos estándar. Esta forma de carga de módulos no implica el riesgo de de alterar su espacio de nombres.

19

Existen varias formas de modificar @INC.

  • conjunto PERL5LIB, como se documenta en perlrun

  • utilizar el interruptor -I en la línea de comandos, también documentado en perlrun. También puede aplicar esto automáticamente con PERL5OPT, pero simplemente use PERL5LIB si va a hacer eso.

  • use lib dentro de su programa, aunque esto es frágil ya que otra persona en una máquina diferente podría tenerlo en un directorio diferente.

  • Modifique manualmente @INC, asegurándose de hacerlo en tiempo de compilación si desea instalar un módulo con el uso. Eso es demasiado trabajo sin embargo.

11

personalmente prefiero mantener mis módulos (aquellos que escribo para mí mismo o para sistemas que puedo controlar) en un directorio determinado, y también para colocarlos en un subdirectorio. Como en:

/www/modules/MyMods/Foo.pm 
/www/modules/MyMods/Bar.pm 

Y entonces, ¿dónde las uso:

use lib qw(/www/modules); 
use MyMods::Foo; 
use MyMods::Bar; 

Como acotación al margen .. cuando se trata de empujar, yo prefiero la grasa de flecha coma:

push @array => $pushee; 

Pero eso es solo una cuestión de preferencia.

+2

Esa sintaxis de empuje parece súper confusa. Definitivamente apunta hacia el lado equivocado. Desde una perspectiva mecánica. ¿Es lo mismo que una coma? La coma es mucho más ambigua sobre la dirección y, por lo tanto, es mejor ... –

+0

@StevenLu de ['perldoc perlop'] (http://perldoc.perl.org/perlop.html # Comma-Operator): * "El operador' => 'es un sinónimo de la coma, excepto que hace que una palabra a la izquierda se interprete como una cadena si comienza con una letra o un guión bajo y está compuesta solo de letras , dígitos y guiones bajos. [...] De lo contrario, el operador '=>' se comporta exactamente como el operador de coma o el separador de argumentos de lista, según el contexto. "*' => 'también se conoce como la" coma de grasa ". – ThisSuitIsBlackNot

+0

Lástima que no se cumple para '<='. –

1

Según lo informado por "perldoc uso -f":

Es exactamente equivalente a
BEGIN { require Module; import Module LIST; }
excepto que el módulo debe ser un bareword.

Poniendo eso de otra manera, el "uso" es equivalente a:

  • funcionamiento en tiempo de compilación,
  • convertir el nombre del paquete a un nombre de archivo,
  • require -ing ese nombre de archivo y
  • import - ese paquete.

Así, en lugar de llamar a su uso, puede llamar a requerir e importación dentro de un bloque BEGIN:

BEGIN { 
    require '../EPMS.pm'; 
    EPMS->import(); 
} 

Y, por supuesto, si su módulo en realidad no hace ningún símbolo de exportación u otra inicialización cuando usted llama a la importación, puede dejar esa línea:

BEGIN { 
    require '../EPMS.pm'; 
} 
Cuestiones relacionadas