2009-08-18 21 views
5

En mi aplicación, puse todos los módulos en un directorio, llamémoslo libx. Dado que depende del usuario elegir dónde desplegar la aplicación, no quiero codificar la ruta lib.¿Por qué "usar lib" no tiene efecto de esta manera?

Por lo tanto, al comienzo de myapp.pl, escribí las siguientes líneas de código.

#! /usr/bin/perl -w 
use strict; 

my $curr_dir = $0; 
my $curr_lib = $curr_dir; 
$curr_lib =~ s/myapp\.pl/libx/; 

use $curr_lib ; 

En lugar de obtener lo que esperaba, ¡tuve errores de compilación!

¿Qué pasa con mi código? No quiero codificar la ruta de acceso de la lib al usar use lib, ¿cómo debo hacer esto?


En este momento se me olvidó mencionar que cuando se despliega la aplicación, myapp.pl y libx se encuentran en el mismo directorio.

Respuesta

15

el uso ocurre en tiempo de compilación, no en tiempo de ejecución, por lo que su variable no se ha establecido aún. que puede hacer:

my $curr_lib; 
BEGIN { 
    $curr_lib = $0; 
    $curr_lib =~ s/myapp\.pl/libx/; 
}  
use lib $curr_lib; 

o usted podría:

use FindBin; 
use lib "$FindBin::Bin/libx"; 
2

Tuve problemas con esto antes también. Lo que sucede es que Perl hace dos pasadas sobre tu código: una para compilarla y la segunda para ejecutarla. En su ejemplo, las líneas 4,5 y 6 no se ejecutan hasta el tiempo de ejecución, pero use surte efecto durante el tiempo de compilación.

Una posibilidad es ponerlo todo dentro de un bloque BEGIN{}, que hará que el código se ejecute en tiempo de compilación. He hecho esto, pero es desordenado/feo. (Por cierto, en lugar de $0, necesita usar $ARGV[0] en Perl).

La mejor manera de decirle a Perl dónde recoger bibliotecas es usar la bandera -I. Usted puede ponerlo en la línea #!, o si usted está comenzando la secuencia de comandos desde otro script, puede comenzar como

 
perl -I/your/directory/libx your_script.pl 

Usted puede uso de rutas relativas, así que tal vez

 
perl -I./libx script.pl 

haría trabajo para ti.

+0

Ayudaría si nos dijera exactamente cómo espera que su usuario inicie la aplicación. ¿Simplemente escribirán 'myapp?pl ', y les corresponde a ellos tener $ PATH configurado para que myapp.pl se pueda encontrar en cualquier directorio que lo hayan bloqueado? –

1

use xxx es una Directiva en tiempo de compilación, no una instrucción tiempo de ejecución. No puede establecerlo mediante programación dentro del script que está ejecutando.

Es posible que tenga que probar require rather than use

Si necesita use, es necesario establecer la variable de entorno $PERL5LIB para asegurar que sus módulos están correctamente situados y utilizados, o cambiar su línea de tinglado para leer #! /usr/local/perl -w -I/path/to/libx. Existen otros métodos (local::lib, etc.), pero de su pregunta parece que su control sobre la instalación es un poco limitado para ese tipo de enfoque.

+1

Esto no es 100% cierto, puede usar una cadena 'eval' para ejecutar un' uso' en tiempo de ejecución. –

Cuestiones relacionadas