Newsgroup: it.comp.lang.perl
Titolo: librerie di funzioni per cgi

Innanzitutto un grandissimo Buon Nalale a tutti...
...ma passiamo alle cose serie ;)
Il mio problema è semplice semplice, e da bravo principiante ve lo propongo:
volendo scrivere mie personalissime librerie in perl (semplici raccolte di
funzioni da richiamare dentro cgi che servono a diverse pagine di un sito
web), come faccio??? Provando a mettere le funzioni dentro un file .pl e ad
includerlo nei vari CGI con "require" non funziona...
...e siccome di idee in proposito non ne ho proprio, aspetto ansioso
ulteriori e natalizie delucidazioni ;)
pit

 ulteriori e natalizie delucidazioni ;)
Probabilmente il metodo piu` semplice e` lasciare che sia h2xs ad
"apparecchiare". Ecco un esempio (funziona analogamente in ambiente
*nix):
  C:\WINDOWS\Desktop\Perl>h2xs -XA MioModulo
  Writing MioModulo/MioModulo.pm
  Writing MioModulo/Makefile.PL
  Writing MioModulo/README
  Writing MioModulo/
test.pl
  Writing MioModulo/Changes
  Writing MioModulo/MANIFEST
  C:\WINDOWS\Desktop\Perl>
Il file all'interno del quale devi scrivere la tua collezione di 
funzioni e` MioModulo.pm (all'interno del file troverai uno 
scheletro di modulo, e le indicazioni per completarlo). Ulteriori
indicazioni le puoi ottenere leggendo perlmod. E` una lettura 
consigliata, benche` possa sembrarti di perdere tempo leggendo 
anziche` "pestando i tasti".
+++
Quello che ho descritto e` il metodo IMO piu` pulito e semplice 
per procedere. Ma anche la tecnica che hai usato tu dovrebbe 
funzionare. Ad esempio:
Nel file Mylib.pm:
------------
sub foo
{
    	print "Ciao, sono la funzione foo!\n";
}
1; # E` importante
------------
Nel file 
script.pl
------------
require Mylib;
foo();
------------
Quali problemi hai incontrato tu?
Anche in questo caso ti consiglio di leggere cose come 
  perldoc -f use
  perldoc -f require
oltre ovviamente a perlmod.
ciao
Stefano

 Stefano
Grazie 1000,
pit

piccola delucidazione... pitfigher č misteriosamente (potere del
BiancoNatale???) divenuto "il ministro"...

 bianca... 
E` un po' poco per individuare il bug. 
Fermo restando che non e` necessaria alcuna (pre)compilazione per usare
un modulo, e che basta uploadarlo sul server per poterlo usare, provo a
darti qualche consiglio di carattere generale per ovviare al problema:
* L'estensione e` importante, nel senso che use e require assumono che 
  il modulo che richiami abbia estensione .pm. Quindi se scrivi
 
    require il_mio_modulo;
  cercano il file '
il_mio_modulo.pm
', e si lamentano se non lo trovano.
  Se vuoi puoi scrivere:
    require '
il_mio_modulo.pl
';
  Per una serie di motivi, tuttavia, e` piu` comodo usare l'estensione 
  .pm per i moduli. Ti consiglio di attenerti alla convenzione.
* E` importante che il file che contiene la tua libreria di funzioni 
  'ritorni' un valore vero. Se guardi l'esempio del mio primo post 
  troverai in fondo a Mylib.pm l'istruzione:
    1;
  Ma puo` andar bene anche qualcosa come:
    "That's all folks";
  Ho usato l'espressione, forse impropria, "file che ritorna un valore".
  Il motivo e` nella semantica di require e use, i quali, in una fase del
  loro funzionamento, fanno qualcosa di simile a:
    $result = do $filename; # E $filename e` proprio il file che 
                            # che contiene il modulo. Quindi quell'1
                            # che hai messo in fondo al modulo e` il
                            # valore che assumera` $result.
    die "$filename did not return true value" unless $result
  Per ulteriori indicazioni, perldoc -f require.  
* Infine, nella fase di sviluppo di CGI, ti consiglio di usare CGI::Carp.
  E` sufficiente qualcosa come:
    use CGI::Carp qw/fatalsToBrowser/;
  in maniera tale da ricevere i messaggi d'errore direttamente nel browser.
  Una volta che lo script finisce in produzione, e` buona norma togliere
  o commentare quell'istruzione.
mi pare sia tutto, quindi avro` dimenticato qualcosa ;)
ciao
Stefano

 Stefano
...un saluto grande come la distanza che percorrei in 5 secondi a piedi se
la luce viaggiasse a 20km orari...
...pit

 Nell'attesa del consiglio 
Prova un semplice test:
1) in un file che chiamerai 
programma.pl
 metti il seguente:
#!/usr/local/bin/perl
use CGI;
require "mia_libreria";
stampa();
2) in file che chiamerai mia_libreria  (senza estensione) scrivi:
sub stampa {
	$q = new CGI;                        # create new CGI object
	print $q->header,                    # create the HTTP header
	      $q->start_html('hello world'), # start the HTML
	      $q->h1('hello world'),         # level 1 header
	      $q->end_html;                  # end the HTML
}
1;
3) carica entrambi i file sul server, nella stessa directory
4) se sei su uno *nix, fai un chmod +x 
programma.pl
5) richiama 
programma.pl
 da un browser
Sul browser dovresti leggere "hello world".
Ti funziona?
-- 
$_=q,6;-16;-1;-8;0;7;-13;-12;-9;-3;13#4A75737420616E6F74686572,,($_,$b)=
split?#?;@b=split?;?;map{$c.=$_,$d.=chr$b[$e++]+ord}split??,pack'H24',$b
;chop$d,print$c.chr(32).$d

 1;
Così com'è mi dà errore per mancata restituzione di header.
Se provo ad aggiungere il "Content-type: text/html\n\n" al primo file,
funziona, ma il risultato nel caro browser è quello a cui ormai sono
dannatamente abituato: una paginozza tutta bianca.
Che faccio, spero in un miracolo o spero in un dono posticipato di
BabboNatale?
Nell'attesa di un segno,
grazie2000,
pit

 Nell'attesa di un segno,
1) hai un server unix? hai accesso telnet o ssh a tale server?
2) fai l'upload dei file in formato ASCII?
3) se fai l'upload del seguente file che chiamerai 
programma2.pl
,
   e lo chiami dal browser, cosa succede?
#!/usr/local/bin/perl
use CGI;
stampa();
sub stampa {
        $q = new CGI;                        # create new CGI object
        print $q->header,                    # create the HTTP header
              $q->start_html('hello world'), # start the HTML
              $q->h1('hello world'),         # level 1 header
              $q->end_html;                  # end the HTML
}
-- 


 }
Lo spazio č windooze (temo), il formato č ascii, il programma2 funziona
(cosě come tanti altri piů complessi...)...
...il problema a quanto pare riguarda proprio il require di file esterni...
...e non so che fareeeeeeeeeeeeeeeee
pit

 ...e non so che fareeeeeeeeeeeeeeeee
Nemmeno io! Sul mio IIS (su WinXP Pro) il sistema a 2 file funziona.
Se conosci il path assoluto dove posizioni i tuoi script,
mettilo prima della libreria, ad es. :
require "c:\\inetpub\\scripts\\mia_libreria";
o anche
require "c:/inetpub/scripts/mia_libreria";
Oppure (sparo, ma non credo)
require ".\\mia_libreria";


 require ".\\mia_libreria";
Ci proverň, ma domani, sennň Santo Stefano come lo passo? :))

 require ".\\mia_libreria";
Ci proverò, ma domani, sennò Santo Stefano come lo passo? :))
Comunque grazie mille per l'aiuto, spero d'arrivare alla soluzione, magari
scoprendo che il problema è proprio su chi mi dà lo spazio web... mah!
Ancora grazie e buon Santo Stefano (visto che ci siamo...),
il ministro