Bonjour!

Je suis nouveau sous perl, et j'ai un problème qui relève plus de l'administration du logiciel que de son utilisation.

En effet, par défaut perl cherche les modules dans les répertoires de librairies/modules standards.

Cependant j'ai un répertoire local dans lequel j'ai installé des modules non standards. J'aimerais donc étendre ce répertoire à l'espace @INC.

en faisant un
export PERL5LIB="/opt/bss/lib/perl5:/opt/bss/lib/perl5/5.8.7:/opt/bss/lib/perl5/site_perl
la commande perl -V me montre bien que mes répertoires ont été ajoutés à liste des répertoires d'@INC, comme le montre cette sortie standard (les répertoires commençant par /opt/ sont ceux où se trouvent mes modules à moi).

Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.18-128.1.10.el5, archname=x86_64-linux-thread-multi
uname='linux ls20-bc2-13.build.redhat.com 2.6.18-128.1.10.el5 #1 smp wed apr 29 13:53:08 edt 2009 x86_64 x86_64 x86_64 gnulinux '
config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.8 -Dsitelib=/usr/lib/perl5/site_perl/5.8.8 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 -Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi -Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi -Darchname=x86_64-linux-thread-multi -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6 5.8.5 -Dscriptdir=/usr/bin'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=define uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
ccversion='', gccversion='4.1.2 20080704 (Red Hat 4.1.2-44)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='gcc', ldflags =''
libpth=/usr/local/lib64 /lib64 /usr/lib64
libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.5'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'


Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP USE_64_BIT_ALL USE_64_BIT_INT
USE_ITHREADS USE_LARGE_FILES USE_PERLIO
USE_REENTRANT_API
Built under linux
Compiled at Jul 2 2009 05:49:38
%ENV:
PERL5LIB="/opt/bss/lib/perl5:/opt/bss/lib/perl5/5.8.7:/opt/bss/lib/perl5/site_perl"
@INC:
/opt/bss/lib/perl5/5.8.7
/opt/bss/lib/perl5
/opt/bss/lib/perl5/5.8.7
/opt/bss/lib/perl5/site_perl/5.8.7
/opt/bss/lib/perl5/site_perl
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.
Le problème est que désormais perl commence par chercher les modules dans les nouveaux répertoires, et mon script de test ci-dessous qui marchait avant l'ajout des répertoires me sort une erreur dans le module Math :

#!/usr/bin/perl

use Math::Trig;
use Net::FTP;
#use Algorithm::C3;
$x = tan(0.9);
$y = acos(3.7);
$z = asin(2.4);
$pi_sur_deux = pi/2;
$rad = deg2rad(120);
print "terminé pour les calculs, voici le radian : $rad*\n";
Voici l'erreur :

is only avaliable with the XS version at /opt/bss/lib/perl5/5.8.7/Math/Complex.pm line 71
BEGIN failed--compilation aborted at /opt/bss/lib/perl5/5.8.7/Math/Complex.pm line 71.
Compilation failed in require at /opt/bss/lib/perl5/5.8.7/Math/Trig.pm line 13.
BEGIN failed--compilation aborted at /opt/bss/lib/perl5/5.8.7/Math/Trig.pm line 13.
Compilation failed in require at ./test.pl line 5.
BEGIN failed--compilation aborted at ./test.pl line 5.
Par contre le code de test ci-dessous du module Algorithm::C3 que j'avais fait pour tester mon module Algorithm::C3 installé dans le répertoire que j'ai ajouté marche bien.

#!/usr/bin/perl
use Algorithm::C3;

# merging a classic diamond
# inheritance graph like this:
#
# <A>
# / \
# <B> <C>
# \ /
# <D>

my @merged = Algorithm::C3::merge(
'D',
sub {
# extract the ISA array
# from the package
no strict 'refs';
@{$_[0] . '::ISA'};
}
);

print join ", " => @merged;
print join "\n",@INC
Conclusion: SI je supprime la variable d'environnement PERL5LIB tout marche bien avec les modules standards, mais mes modules installés ailleurs ne sont plus trouvés par perl; si je set la variable PERL5LIB, mes modules sont détectés parfaitement, mais perl commence ses recherches par les répertoires que j'ai ajoutés, et ml signale des erreurs.

Alors ma question est:

Quel peut être le problème avec Math dans le premier script de test ci-dessus, selon vous s'il vous plait?
Comment ajouter des nouveaux répertoires à la fin et non au début de @INC s'il vous plait?
Comment régler mon système afin que perl utilise toujours d'abord les répertoires standards avant d'utiliser la variable PERL5LIB? Peut-on modifier @INC directement? Dans quel fichier cela se configure?
En fin quellle solution efficace et permanente me proposeriez-vous pour mon problème de manière générale?

Merci pour votre aide.