Newsgroup: it.comp.lang.perl
Titolo: problemi con l'istallazione di un modulo: aiuto.

Ho istallato un modulo per usare Interbase.
L'istallazione lo ha istallato nei seguenti path:
/usr/lib/perl5/site_perl/5.6.0/i386-linux/Bundle/DBD/InterBase.pm
/usr/lib/perl5/site_perl/5.6.0/i386-linux/DBD/InterBase.pm
/usr/lib/perl5/site_perl/InterBase.pm
Se eseguo il programma non trova le librerie e dice:
install_driver(InterBase) failed: Can't locate DBD/InterBase.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at (eval 4) line 3.
Perhaps the DBD::InterBase perl module hasn't been fully installed,
or perhaps the capitalisation of 'InterBase' isn't right.
Available drivers: ExampleP, Pg, Proxy, mysql.
 at ./
loginuser.pl
 line 18
Cosa devo fare?
 ho provato a copiare InterBase.pm dove dice lui ma sembra non funzionare
molto!
Grazie in anicpo, Mario.

ma sembra non funzionare molto!
Come richiami il modulo nel programma? Cosa c'č scritto nella riga "use"?
Ciao.

 (eval 4) line 3.
Sembra che lo script sia stato eseguito con la versione 5.8.0
Max

 Come richiami il modulo nel programma? Cosa c'è scritto nella riga "use"?
Con l'occasione ringrazio per avermi risposto!
SHEL di quando eseguo il programma:====================
=======================================================
./
loginuser.pl
Content-type: text/html
<html>
<head>
<title>Ago</title>
</head>
<body bgcolor="#FFCC66">
<p align="left">
<a href="/cgi-bin/ago/
index.pl
">
<img border="0" src="/agendalogo.jpg" width="81" height="47" align="left">
</a><br>
<br></p><hr><br>
install_driver(InterBase) failed: Can't locate DBD/InterBase.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at (eval 4) line 3.
Perhaps the DBD::InterBase perl module hasn't been fully installed,
or perhaps the capitalisation of 'InterBase' isn't right.
Available drivers: ExampleP, Pg, Proxy, mysql.
 at ./
loginuser.pl
 line 18
[root@localhost ago]# <br> nome=<br>password=<br><br>
[root@localhost ago]#
PROGRAMMA:
=====================================================
[root@localhost ago]# cat 
loginuser.pl
#! /usr/bin/perl
use CGI;
use DBI;
require "./webtools/
apparence.pl
";
top_page();
$cgi=CGI::new();
$name=$cgi->param("name");
$password=$cgi->param("password");
print ("<br>I tuoi dati sono: <br> nome=$name<br>password=$password<br><br>");
$dbh = DBI->connect("dbi:InterBase:db=$databasefile", $sysdba, $passworddba,{AutoCommit=>0});
$query='SELECT pw  FROM utente WHERE id='.$dbh->quote($name);
$sth = $dbh->prepare($query);
$sth->execute();
@rows=$sth->fetchrow_array();
if ($rows[$#rows] eq $password)
{
#esiste name
   pagina_login();
}
else
{
#non esiste name
print("<br><font size=\"+1\"> <b> Login o password non corrette</b></font><br>");
};
$dbh->commit();
$dbh->disconnect();
end_page();
sub pagina_login
{
print("<br><br> Ben venuto nella tua agenda.");
print("<br><br>AGENDA:<a href=\"./agenda/
index.pl?name=$name&pw=$password\
">Gestione delle attivit?</a><br><br>");
print("RUBRICA:<a href=\"./rubrica/
index.pl?name=$name&pw=$password\
">Gestione della Rubrica</a><br><br>");
print("CANTINA:<a href=\"./cantina/index.p?name=$name&pw=$password\">Gestione delle cose</a><br><br>");
print("ECONOMIA:<a href=\"./economia/
index.pl?name=$name&pw=$password\
">Gestione economia</a><br><br>");
print("GRUPPI:<a href=\"./gruppo/
index.pl?name=$name&pw=$password\
">Gestione Gruppi</a><br><br><br>");
}
1
[root@localhost ago]#

Se do il comando:
perl -I/usr/local/lib/perl5/site_perl/5.6.1/i686-linux/DBD/InterBase.pm ./
prova.pl
tutto funziona correttamente!
Sapendo ciò, cosa posso scrivere nel codice per farlo funzionare?
o cosa posso copiare e dove?
Grazie in anticipo, Mario.
Scrivendo un programmino con "use lib" tutto funziona
#! /usr/bin/perl
use lib qw(/usr/local/lib/perl5/site_perl/5.6.1/i686-linux/DBD/);
use CGI;
use DBI;
$dbh = DBI->connect("dbi:InterBase:db=/opt/interbase/bin/agenda.gdb", "agenda","2per3",{AutoCommit=>0});
$query='SELECT idattivita  FROM attivita';
$sth = $dbh->prepare($query);
$sth->execute();
while($hr=$sth->fetchrow_hashref)
{
print("tutto OK $hr->{IDATTIVITA}\n");
}
$dbh->commit();
$dbh->disconnect();
1
[root@localhost ago]#
se inserisco la stessa riga in un file caricato da apache (
login.pl
) non
funziona 
FILE LOGIN.pl
==================================
#! /usr/bin/perl 
use lib qw(/usr/local/lib/perl5/site_perl/5.6.1/i686-linux/DBD/);
use CGI;
use DBI;
use CGI qw(fatalsToBrowser);
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(-debug :standard);
[...]
========================
errore del server:
Software error:
install_driver(InterBase) failed: Can't locate loadable object for module DBD::InterBase in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.6.1/i686-linux/DBD/ /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at (eval 4) line 3
Compilation failed in require at (eval 4) line 3.
Perhaps a module that DBD::InterBase requires hasn't been fully installed
 at /var/www/cgi-bin/ago/
loginuser.pl
 line 26

$dbh = DBI->connect("dbi:InterBase:db=$databasefile", $sysdba, $passworddba,{AutoCommit=>0});
Allora, il modulo InterBase.pm è richiamato dalla procedura install_driver
di DBI.pm, richiamata a sua volta dal metodo DBI->connect, che riconosce
correttamente il nome del driver, che è scritto con maiuscole e minuscole al
posto giusto.
E ritorniamo al punto di partenza: il modulo non è nel percorso di ricerca
contenuto in @INC. Infatti, questo fa riferimento a
  /usr/lib/perl5/5.8.0/i386-linux-thread-multi
  /usr/lib/perl5/5.8.0
  /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
  /usr/lib/perl5/site_perl/5.8.0
  /usr/lib/perl5/site_perl
  /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
  /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl
directory nelle quali si aspetta di trovare una sottodirectory DBD,
all'interno della quale si aspetta di trovare il modulo InterBase.pm.
Quindi, InterBase.pm dovrebbe essere in una di queste:
  /usr/lib/perl5/5.8.0/i386-linux-thread-multi/DBD
  /usr/lib/perl5/5.8.0/DBD
  /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD
  /usr/lib/perl5/site_perl/5.8.0/DBD
  /usr/lib/perl5/site_perl/DBD
  /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBD
  /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl/DBD
Mentre tu ci dici che InterBase.pm è stato installato in:
  /usr/lib/perl5/site_perl/5.6.0/i386-linux/Bundle/DBD
  /usr/lib/perl5/site_perl/5.6.0/i386-linux/DBD
  /usr/lib/perl5/site_perl
Nessuna delle quali ha niente a che vedere con quelle sopra.
A parte il fatto che quel "i386-linux-thread-multi" fa temere che comunque
le cose non andranno lisce, il tentativo successivo da fare potrebbe essere
mettere finalmente il modulo InterBase.pm al posto giusto, cioè in una delle
directory di cui sopra. Dai un'occhiata in giro, perché oltre al modulo .pm
in perl è possibile che ci siano anche dele librerie binarie, che dovranno
anch'esse essere riposizionate.
Meglio ancora sarebbe cercare un pacchetto adatto alla tua distribuzione e
alla tua versione di perl, se ti riesce di trovarlo, ad evitare esperimenti
probabilmente di esito deludente.
Ciao.

Scusate... sembra non funzionare comunque usando "use lib"
ho preso un abbaglio!
(con perl -I...  ./
prova.pl
 funziona però)


FORSE CI SIAMO!!!!
il programma funziona se uso
"perl 
prova.pl
"
non funziona se uso
"./
prova.pl
"
[root@localhost ago]# which perl
/usr/local/bin/perl
infatti se  inizio il file con:
#! /usr/local/bin/perl
e non con 
#! /usr/bin/perl 
Funziona!
Ma ora due domande:
1)che cavolo è successo? perchè? ho due versioni di perl? doppioni?
ho fatto un update dalla redhat 7 alla 8... dopo ciò è successo il casino
infatti!)
2)c'è un modo per non dover riscrivere l'head di ogni file!
Grazie per il vostro aouto!
Mario.

install_driver(InterBase) failed: Can't locate loadable object for module DBD::InterBase in @INC
Ooooh! Hai visto che il messaggio č cambiato? Non č piů "Can't locate
DBD/InterBase.pm". Che significa che finalmente lo trova, questo accidenti
di InterBase.pm, e per qualche motivo non gli va bene (forse non trova una
libreria binaria richiesta da InterBase.pm).
Io mi fermo qui, che nelle complicazioni di Apache (che presumibilmente usa
un suo perl, con un proprio @INC), non sono in grado di entrarci.
Ciao.

 2)c'è un modo per non dover riscrivere l'head di ogni file!
Una sana ricompilazione del Perl! :-)
Altrimenti un link simbolico:
    #> ln -s /usr/bin/perl  /usr/local/bin/perl
e reinstalli il modulo con la 5.8.0.
Se vuoi continuare ad usare la vecchia versione di Perl:
    #> ln -s /usr/local/bin/perl  /usr/bin/perl
    - Enrico