strawberry - perl-lane linux




¿Perl no incluye el directorio actual en @INC de forma predeterminada? (2)

Nunca he entendido por completo la resolución de Perl de los nombres de los paquetes, pero siempre asumí que lo siguiente siempre debería funcionar, suponiendo que esté ejecutando myscript.pl desde el directorio que lo contiene:

myscript.pl (contains the following statement: use Class1::Class2::Class3)
Class1/
    Class2/
        Class3.pm (contains the following package declaration: package Class1::Class2::Class3;)

Sin embargo, esto no funciona en mi código porque Class3.pm no se puede ubicar. En cuanto a @INC, no incluye el directorio actual, solo varios directorios de mi instalación de Strawberry Perl.

¿Cuál es la forma recomendada de resolver esto? Supongo que podría modificar @INC, o podría comenzar a usar FindBin, pero no estoy seguro de cuál es la mejor. Heredé este código y simplemente lo estoy migrando a una nueva ubicación, pero no parece que el código anterior necesitara dicha solución (podría estar equivocado, seguir buscando ...)


Perl 5.26 eliminó tener el directorio de trabajo actual en @INC como una medida de seguridad.

Se explica en las notas de 5.26 perldelta .


Sí, el directorio actual se eliminó de @INC en 5.26 por razones de seguridad.

Sin embargo, cualquier código que dependa de que el directorio actual esté en @INC tuvo errores mucho antes de 5.26. El código que lo hizo, como el suyo, utilizó incorrectamente el directorio actual como un proxy para el directorio del script. Esa suposición es a menudo incorrecta. Deberías haber estado usando lo siguiente todo el tiempo:

use FindBin 1.51 qw( $RealBin );
use lib $RealBin;

o

use Cwd qw( abs_path );
use File::Basename qw( dirname );
use lib dirname(abs_path($0));




perl