2011-10-07 9 views
5

Aquí está el escenario, tengo dos archivos: 1. dir/A.pm 2. dir/nuevo_dir/aFindBin en más de un módulo

Así es como A.pm parece:

package A; 
use FindBin; 
use Test::More; 
is (FindBin->again, 'dir', 'got dir'); 
1;      

es así como en el siguiente aspecto:

use FindBin; 
use Test::More qw(no_plan); 
use A; 
is (FindBin->again, 'dir/new_dir', 'got dir/new_dir'); 

por lo que corrí archivo en perl con nuevo_dir/en espera y mis pruebas a pasar. Pero este es el resultado de mi prueba:

not ok 1 - got dir 
# Failed test 'got fir' 
# at A.pm line 6. 
#   got: 'dir/new_dir' 
#  expected: 'dir' 
ok 2 - got dir/new_dir 
1..2 

¿Estoy haciendo algo mal? Soy muy nuevo en Perl. ¡¡Por favor ayuda!!

Respuesta

7

Como Dave Sherohman notes, FindBin es para encontrar la ubicación de la secuencia de comandos principal, no módulos individuales. A partir de la documentación:

NAME 
     FindBin - Locate directory of original perl script 

(Es cierto que la documentación no, un tanto confusamente, consulte "módulos" en la sección "Problemas conocidos", pero en realidad no significa lo que creo que quiere decir con eso).

De todos modos, si nos fijamos en la fuente con perldoc -m FindBin, verá que FindBin obtiene la ruta a la secuencia de comandos desde la variable $0. Si usted está interesado en encontrar la ubicación de un módulo incluido a través de use (o require), usted debe mirar debajo %INC lugar, algo como esto:

package Foo::Bar; 
use File::Spec; 
my ($vol, $dir, $file) = File::Spec->splitpath($INC{'Foo/Bar.pm'}); 
+0

"Ciertamente, la documentación hace, de manera algo confusa, referirse a" módulos "en la sección" PROBLEMAS CONOCIDOS ", pero en realidad no significa lo que usted piensa que significa con eso". - Creo que entendí mal lo que significa FindBin-> nuevamente.Estoy claro ahora. ¡Gracias por toda la ayuda! – junbon

3

Si entiendo bien la pregunta, a.t está en el directorio dir/new_dir/ y está usando new_dir/a.t a ejecutarlo desde dir/, ¿verdad?

Si es así, está haciendo lo correcto. Desde a.t está en dir/new_dir, siempre debe obtener dir/new_dir de FindBin - su trabajo es Encuentra la Bin ario (programa), no para encontrar el archivo que está siendo llamado desde, por lo que el resultado será el mismo en A.pm como está en a.t.

La función ->again es para ejecutar instancias de programas completamente diferentes dentro del mismo intérprete de perl, como lo que hace mod_perl, no solo para usar diferentes módulos dentro de un único programa.

5

FindBin encuentra la ubicación del archivo de Perl lanzado, no de archivo actualmente en ejecución.

No veo por qué se necesitaría el camino a un módulo — File::ShareDir se pueden utilizar para acceder a los archivos de datos del módulo — pero el siguiente lo encontrará:

use Cwd   qw(realpath); 
use File::Basename qw(dirname); 

my $module_dir = dirname(realpath(__FILE__)); 

La misma advertencia que Encuentra :: Se aplica bin: Esto solo funciona si chdir no ha sido cambiado.

+0

¡Genial! Gracias por la mención de File :: ShareDir, no sabía de eso. –

Cuestiones relacionadas