• Publicidad

Error can't locate in @INC bajo mod_perl2

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Error can't locate in @INC bajo mod_perl2

Notapor aLiSH » 2007-05-29 02:26 @143

Hola a todos,

Estoy usando mod_perl2 y quiero reutilizar unas subrutinas que tengo en 'perl_functions.pl'. Me aparece el siguiente error,

Código: Seleccionar todo
Can't locate perl_functions.pl in @INC


La configuración de httpd.conf es la siguiente:

Código: Seleccionar todo
LoadModule perl_module modules/mod_perl.so

PerlSwitches -wT
PerlPostConfigRequire /usr/local/apache2/htdocs/www/p_scripts/perl-cgi/startup.pl
PerlSwitches -I/usr/local/apache2/htdocs/www/p_scripts/perl-cgi/
<Directory "/usr/local/apache2/htdocs/www/p_scripts/perl-cgi/">
        SetHandler perl-script
        PerlResponseHandler ModPerl::Registry
        PerlOptions +ParseHeaders
        Options +ExecCGI
        Order allow,deny
        Allow from all
</Directory>


El fichero startup.pl contiene lo siguiente:

Código: Seleccionar todo
#!/usr/bin/perl -w

use strict;

# to use other libraries in other @INC path 
# use lib qw(/absolute/path/);
use lib qw(/usr/local/apache2/htdocs/www/p_scripts/perl-cgi/);
 
# preload all mp2 modules
# use ModPerl::MethodLookup;
# ModPerl::MethodLookup::preload_all_modules();

use ModPerl::Util (); #for CORE::GLOBAL::exit

use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::RequestUtil ();

use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::Connection ();
use Apache2::Log ();

use APR::Table ();

# use ModPerl::Registry ();

use Apache2::Const -compile => ':common';
use APR::Const -compile => ':common';

1;


En el fichero desde el que se llama a 'perl_functions.pl' tengo al principio lo siguiente:

Código: Seleccionar todo
#!/usr/bin/perl

#push (@INC, '.');
warn (join ("\n",@INC));
require "perl_functions.pl";


y el resultado cuando lo quiero ejecutar:

Código: Seleccionar todo
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl/5.8.7
/usr/lib/perl5/site_perl/5.8.6
/usr/lib/perl5/site_perl/5.8.5
/usr/lib/perl5/site_perl/5.8.4
/usr/lib/perl5/site_perl/5.8.3
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl/5.8.7
/usr/lib/perl5/vendor_perl/5.8.6
/usr/lib/perl5/vendor_perl/5.8.5
/usr/lib/perl5/vendor_perl/5.8.4
/usr/lib/perl5/vendor_perl/5.8.3
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8
. at ../perl-cgi/search.pl line 4.
Can't locate perl_functions.pl in @INC
 at ../perl-cgi/search.pl line 5.


Todos los archivos .pl los tengo en la misma carpeta.

He probado un montón de cosas para intentar solucionarlo pero no me termina de funcionar. Sólo poniendo el path absoluto en require me funciona, pero no me sirve ya que los archivos van a cambiar de ubicación. Podéis ayudarme a solucionarlo?

Muchas gracias y un saludo.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Publicidad

Notapor explorer » 2007-05-29 03:49 @200

¿El perl_functions.pl devuelve verdadero en la última línea del código? ¿Tiene al menos un 1; al final?

¿No está incluido el directorio actual en @INC? En ese caso deberías agregarlo si no es uno de los directorios normales.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-29 04:02 @210

Si, en perl_functions.pl tengo 1; al final. Por otro lado, he intentado agregar el directorio al @INC por las formas que comentan en la documentación de mod_perl2,

con use lib qw(/usr/local/apache2/htdocs/www/p_scripts/perl-cgi/); en startup.pl y con PerlSwitches -I/usr/local/apache2/htdocs/www/p_scripts/perl-cgi/ en httpd.conf. Y me sigue apareciendo el mismo error.

De todos modos, me he dado cuenta de que el fichero startup.pl no se debe cargar o leer correctamente. Tengo bien la configuración? como podría comprobarlo? Gracias.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-29 06:09 @298

Según la documentación (http://perl.apache.org/docs/2.0/user/ha ... rl_Startup) lo estás haciendo bien, con la directiva PerlPostConfigRequire.

Yo creo que el tema no está en poner 'use lib' en startup.pl, si no que estás obligado a ponerlo en el script que llama a perl_functions.pl.

Una forma de evitar esto es convirtiendo perl_functions.pl en un módulo Perl, en un .pm.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-29 10:02 @459

He probado a poner 'use lib' en el script que llama a perl_functions.pl y no encuentra la subrutina que se llama desde ese script.

Por otro lado, estoy tratando de pasar perl_function.pl a Functions.pm pero me sale un error. En el archivo Functions.pm pongo al inicio: package Functions.pm; y en el script del que se llama pongo: use Functions;

Aparece el siguiente error:

Can't locate Functions.pm in @INC

y falla la compilación en la línea de: use Functions;

Estoy escribiendo correctamente el modulo?

Un saludo y muchas gracias.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-29 11:57 @539

Primero... ¿Está incluido el directorio donde está Functions.pm en @INC? Si no lo está, deberás incluir con use lib .... Por ejemplo, si está en el mismo directorio, poner use lib '.';.

Segundo... Asegurarte que Functions.pm acaba en un 1;.

Lo demás es cuestión de exportar el espacio de nombres del módulo al programa, en caso de que así lo requieras.

Yo creo que el problema está en el mod_perl, que ejecuta el programa en un entorno distinto al que reside. En ese caso habría que poner un use lib ... con el camino completo al directorio donde están los módulos.

El siguiente ejemplo funciona en línea de comandos:

Functions.pm:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
package Functions;

sub funcion {
  print "Hola, soy una función\n";
}

1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

script.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Functions;

Functions::funcion();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron