2010-04-07 20 views
5

Yo uso use lib "./DIR" para tomar una biblioteca de una carpeta en otro lugar. Sin embargo, parece que no funciona en mi servidor, pero funciona bien en mi escritorio local. ¿Alguna razón en particular?¿Cómo funciona Perl's lib pragma?

Y una pregunta más, ¿se propaga use lib en varios módulos?

Dos situaciones: Digamos que hago una clase base que requiere algunas bibliotecas, pero sé que es necesario ampliarla y la clase extendida deberá usar otra biblioteca. ¿Puedo poner el comando use lib en la clase base? ¿o tendré que ponerlo en cada clase extendida?

Finalmente, ¿puedo tener un use package donde el paquete contiene un montón de lib de uso, propagará las instrucciones de uso lib a mi módulo actual? < - No lo creo, pero pregunta de todos modos

Respuesta

3

El . en su declaración use lib significa "directorio de trabajo actual" y solo funcionará cuando su script se ejecute desde el directorio correcto. La idea del servidor de cwd es probablemente algo diferente (o indefinido). Suponiendo que el directorio de la biblioteca está ubicada conjuntamente con la con la escritura y privado a lo que quiere hacer algo como esto en su lugar:

use FindBin; 
use lib "$FindBin::Bin/DIR"; 

Una declaración use lib afecta @INC - la lista de ubicaciones perl búsquedas cuando use o require un módulo Afecta globalmente a la instancia actual del intérprete. En realidad, debería poner solamente las declaraciones use lib en scripts, no en módulos.

En principio, usted podría tener un package MyLibs que consistía en un montón de use lib declaraciones y luego use MyLibs antes de usar cualquiera de los paquetes en esos lugares, pero yo no lo recomendaría.

+0

Utilicé getcwd para averiguar dónde "." es. Solo curiosidad por saber si es posible averiguar dónde se encuentra el script de Perl. No funcionó cuando traté de usar FindBin porque la lib y el bin no están ubicados conjuntamente. Así que aquí hay un ejemplo de lo que estoy tratando de hacer. Ejecuto el script perl de decir carpeta1. Tiene uso lib "/ abs/path/topack /"; usar paquete En el paquete, uso lib './FOLDER2'; asumiendo que el cwd sería el mismo. Ya que "." apunta a Folder1, y no a la ruta. Está mal. ¿Cómo no uso el camino absoluto en el paquete pero también puedo usarlo? ¿Es posible? – Tyug

+0

@Tyug: puede determinar de dónde se cargó un módulo inspeccionando '% INC'. Consulte http://stackoverflow.com/questions/1463414 para obtener una pregunta similar que debería orientarlo en la dirección correcta. –

+0

¡Muchas gracias! – Tyug

2

No hay forma de saber por qué no está funcionando en su servidor sin más información. En particular, verifique los registros de errores de su servidor y vacíe @INC en algún lugar si es necesario, y compárelo con las rutas de acceso de su biblioteca.

use lib modifica @INC, que es global, por lo que mientras se ejecuta el use lib antes de que otros paquetes tratan de incluir cosas, va a trabajar y todos los demás paquetes verá la nueva incluyen rutas de acceso.

Para obtener más información sobre @INC, consulte su entrada en perlvar.