2010-04-21 5 views
1

Je donne les résultats suivants, simple script CGI Perl:Comment définir @INC de Perl pour un script CGI?

use strict; 
use warnings; 
use CGI(); 
use CGI::Carp qw(fatalsToBrowser); 

use Template; 

print CGI::header(); 

foreach(@INC) { 
    print "$_\n"; 
} 

Quand appelé (http://[..]/cgi-bin/p.cgi) Je suis donné l'erreur suivante:

Can't locate Template.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /home/pistacchio/webapps/htdocs/cgi-bin/p.cgi line 8. 
BEGIN failed--compilation aborted at /home/pistacchio/webapps/htdocs/cgi-bin/p.cgi line 8. 

Je me suis assuré que modèle est installé et même lors de l'exécution de cette programme de shell cela fonctionne (charges) et les sorties de modèles:

Content-Type: text/html; charset=ISO-8859-1 

/home/pistacchio/lib/perl5 
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi 
/home/pistacchio/lib/perl5/lib 
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi 
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi 
/usr/lib/perl5/site_perl/5.8.8 
/usr/lib/perl5/site_perl 
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi 
/usr/lib/perl5/vendor_perl/5.8.8 
/usr/lib/perl5/vendor_perl 
/usr/lib/perl5/5.8.8/i386-linux-thread-multi 
/usr/lib/perl5/5.8.8 

modèle est installé dans /home/pistacchio/lib/perl5/lib/i386-linux-thread-multi

[[email protected] i386-linux-thread-multi]$ pwd 
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi 
[[email protected] i386-linux-thread-multi]$ ls 
auto perllocal.pod Template Template.pm 

Ce répertoire est correctement listé dans env et, comme précédemment affiché, dans @INC. Dans @INC il est montré deux fois, donc j'ai même essayé de le sortir avant d'appeler use Template, mais sans résultat. De env:

[[email protected] i386-linux-thread-multi]$ env 
[..] 
PERL5LIB=/home/pistacchio/lib/perl5:/home/pistacchio/lib/perl5/lib:/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi 
[..] 

Suppression use Template se débarrasse du problème.

+1

Vous dites que Template est dans @INC, mais si vous lisez le @INC dans votre sortie CGI, vous voyez que ce n'est évidemment pas le cas. –

Répondre

4

Je suggère d'ajouter ce qui suit à votre CGI

use lib "/home/pistacchio/lib/" ; 

La variable env PERL5LIB est probablement pas disponible pour les programmes CGI.

Édition Ce que je voulais dire, toute valeur que vous avez définie dans PERL5LIB à partir d'un shell ne sera pas disponible. Le serveur Web ne s'exécute pas en tant qu'utilisateur. Par conséquent, son environnement n'est pas votre environnement utilisateur.

+0

Salut, merci pour l'entrée, mais rien n'a changé – pistacchio

+0

oh, ça marche en ajoutant l'utilisation lib "/ home/pistacchio/lib/perl5/lib/i386-linux-thread-multi" – pistacchio

+2

La variable d'environnement PERL5LIB est en effet disponible pour les programmes CGI , ce n'est simplement pas la valeur que vous définissez dans votre compte d'utilisateur. –

3

Vous pouvez le configurer de différentes manières en fonction de votre serveur Web. Dans Apache, vous pouvez utiliser la directive SetEnv:

SetEnv PERL5LIB /path/to/your/libs 

Cela applique ensuite à tout ce qu'il contient. Si vous l'avez dans un fichier .htaccess, par exemple, il s'applique à tout sous ce répertoire.

Si vous ne pouvez pas faire quelque chose comme ça, vous êtes coincé en fixant vous-même la valeur de @INC dans chaque script avec le pragma lib.

Questions connexes