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

Resuelto Stephen asked hace 6 años • 3 respuestas

Nunca he entendido completamente la resolución de nombres de paquetes de Perl, pero siempre asumí que lo siguiente siempre debería funcionar, asumiendo que estás 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 no se puede localizar Class3.pm. Mirando @INC, no incluye el directorio actual, solo varios directorios de mi instalación de Strawberry Perl.

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

Stephen avatar Oct 03 '17 23:10 Stephen
Aceptado

Perl nunca ha buscado módulos en el directorio del script.

Perl buscó en el directorio actual. Debido a que el directorio actual es a veces el mismo que el directorio del script, Perl buscó en el directorio del script.

Pero el directorio actual suele ser diferente al directorio del script. Entonces, un código como el suyo que supone que Perl busca módulos en el directorio del script siempre ha tenido errores.

Desde la versión 5.26, Perl ya no busca en el directorio actual por razones de seguridad. Esto simplemente hizo que el error fuera más evidente.


Para indicarle a Perl que busque módulos en el directorio del script, use lo siguiente:

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 ) );
ikegami avatar Oct 03 '2017 17:10 ikegami

Tener .(el directorio actual) @INCse eliminó en 5.26 por razones de seguridad ( CVE-2016-1238 ). Algunas distribuciones de Linux han respaldado el cambio, por lo que es posible que te encuentres con este problema incluso si estás usando, por ejemplo, 5.24.

melpomene avatar Oct 03 '2017 17:10 melpomene

Perl 5.26 eliminó el directorio de trabajo actual @INCcomo medida de seguridad.

Se explica en las notas de Perldelta 5.26 .

stevieb avatar Oct 03 '2017 16:10 stevieb