Newsgroup: it.comp.lang.perl
Titolo: Programma

Ciao a tutti, sono nuovo del news, ma ho tanti problemi che spero qualcuno
di Voi mi aiuterà a risolvere; innanzitutto io sto gestendo un sito e ho
realizzato un form da compilare i cui dati devono essere presi dal server e
mandati ad una casella e-mail; ho realizzato il form e anche il programma in
perl, ma non ne vuole sapere di funzionare. E' un programma molto semplice,
qualcuno se la sente di darci un'occhiata? Lo metto in allegato. Grazie
tante a tutti coloro che cercheranno di aiutarmi. Ciao.
require ('
mini-lib.pl
');
sub Metodo_non_gestibile  {
 print "Content-type: text/html\n";
 print "\n";
 print "<HTML>\n";
 print "<HEAD>\n";
 print "<TITLE>Errore</TITLE>\n";
 print "</HEAD>\n";
 print "<BODY>\n";
 print "<H1>Metodo $ENV{REQUEST_METHOD} non gestibile.</H1>\n";
 print "</BODY>\n";
 print "</HTML>\n";
};
sub Verifica_dati  {
 if ( $DATI{nome} eq "0" )  {
  return 0
 };
 if ( $DATI{paese} eq "" )  {
  return 0
 };
 if ( $DATI{username} eq "" )  {
  return 0
 };
 if ( $DATI{e-mail} eq "" )  {
  return 0
 };
 return 1;
};
sub Dati_nascosti  {
 print "<INPUT TYPE=hidden NAME=\"nome\" VALUE=\"$DATI{nome}\" >\n";
 print "<INPUT TYPE=hidden NAME=\"paese\" VALUE=\"$DATI{paese}\" >\n";
 print "<INPUT TYPE=hidden NAME=\"username\" VALUE=\"$DATI{username}\" >\n";
 print "<INPUT TYPE=hidden NAME=\"e-mail\" VALUE=\"$DATI{e-mail}\" >\n";
};
sub Richiedi_conferma  {
 print "Content-type: text/html\n";
 print "\n";
 print "<HTML>\n";
 print "<HEAD>\n";
 print "<TITLE>Conferma</TITLE>\n";
 print "</HEAD>\n";
 print "<BODY>\n";
 print "<H1>Conferma dati inseriti.<H1>\n";
 print "Si prega di controllare i dati e di confermare se sono corretti.\n";
 print "<PRE>";
 print "Nome e Cognome: $DATI{nome}\n";
 print "Paese di residenza: $DATI{paese}\n";
 print "Nome utente scelto: $DATI{username}\n";
 print "Indirizzo E-Mail: $DATI{e-mail}\n";
 print "</PRE>";
 print "<FORM ACTION=\ "
http://www.multimedia-italy.it/cgi-bin/dati.pl\
"
METHOD=\"POST\">\n";
 print "<INPUT TYPE=hidden NAME=\"modulo\" VALUE=\"registrazione
conferma\">\n";
 &Dati_nascosti;
 print "<INPUT TYPE=submit VALUE=\"Conferma i dati\">\n";
 print "</FORM>\n";
 print "Se i dati non sono esatti si prega di ritornare\n";
 print "alla <A
HREF=\"
http://www.multimedia-italy.it/temp/ita/modulo_ita.html\
">compilazion
e del modulo</A>.\n";
 print "</BODY>\n";
 print "</HTML>\n";
};
sub Dati_insufficienti  {
 print "Content-type: text/html\n";
 print "\n";
 print "<HTML>\n";
 print "<HEAD>\n";
 print "<TITLE>Errore</TITLE>\n";
 print "</HEAD>\n";
 print "<BODY>\n";
 print "<H1>I dati inseriti nel modulo sono insufficienti.<H1>\n";
 print "Si prega di controllare e aggiungere i dati mancanti.\n";
 print "<P><A
HREF=\"
http://www.multimedia-italy.it/temp/ita/modulo_ita.html\
">";
 print "Ritorna al modulo di registrazione</A>\n";
 print "</BODY>\n";
 print "</HTML>\n";
};
sub Modulo_errato  {
 print "Content-type: text/html\n";
 print "\n";
 print "<HTML>\n";
 print "<HEAD>\n";
 print "<TITLE>Errore</TITLE>\n";
 print "</HEAD>\n";
 print "<BODY>\n";
 print "<H1>Il modulo inviato non è previsto.<H1>\n";
 print "Si prega di utilizzare il \n";
 print "<A
HREF=\"
http://www.multimedia-italy.it/temp/ita/modulo_ita.html\
">";
 print "modulo d'ordine standard</A>\n";
 print "</BODY>\n";
 print "</HTML>\n";
};
sub E_mail_errore  {
 print "Content-type: text/html\n";
 print "\n";
 print "<HTML>\n";
 print "<HEAD>\n";
 print "<TITLE>Errore</TITLE>\n";
 print "</HEAD>\n";
 print "<BODY>\n";
 print "<H1>Impossibile inviare l'ordine<H1>\n";
 print "Si prega di scusare l'inconveniente.\n";
 print "</BODY>\n";
 print "</HTML>\n";
};
sub E_mail  {
 local ( $destinatario ) = $_[0];
 local ( $oggetto ) = $_[1];
 local ( $contenuto ) = $_[2];
 local ( $sendmail ) = "/bin/mail $destinatario";
 unless ( open( EMAIL, "| $sendmail ") ) {
  return 0;
 };
 print EMAIL "$oggetto\n";
 print EMAIL "\n\n";
 print EMAIL "$contenuto\n";
 print EMAIL ".\n";
 close( EMAIL );
};
sub Invio_registrazione  {
 local ( $registrazione ) = "";
 $registrazione = $registrazione . "Nome e Cognome: $DATI{nome}\n" ;
 $registrazione = $registrazione . "Paese: $DATI{paese}\n" ;
 $registrazione = $registrazione . "Nome Utente scelto: $DATI{username}\n" ;
 $registrazione = $registrazione . "E-Mail: $DATI{email}\n" ;
 if (
  &E_mail ( '
stop...@libero.it
',
   'Registrazione da modulo FORM 
dati.pl
', $registrazione )
  ) {
         print "Content-type: text/html\n";
  print "\n";
  print "<HTML>\n";
  print "<HEAD>\n";
  print "<TITLE>Conferma invio</TITLE>\n";
  print "</HEAD>\n";
  print "<BODY>\n";
  print "<H1>Conferma invio<H1>\n";
  print "I Vostri dati sono stati inviati.\n";
  print "Grazie.\n";
  print "</BODY>\n";
  print "</HTML>\n";
 } else {
  &E_mail_errore;
 };
};
sub Decodifica_GET  {
 local ( $richiesta ) = $ENV{'QUERY_STRING'};
 local ( @coppia ) = ();
 local ( $elemento ) = "";
 local ( $nome ) = "";
 local ( $valore ) = "";
 local ( %DATI ) = ();
 @coppia = split( '&', $richiesta );
 foreach $elemento ( @coppia ) {
  ( $nome, $valore ) = split( '=', $elemento );
  $valore =~ tr/+/ /;
  $nome =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
  $valore =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
  $DATI{$nome} = $valore;
 };
 return %DATI;
};
sub Decodifica_POST  {
 local ( $richiesta ) = "";
 local ( @coppia ) = ();
 local ( $elemento ) = "";
 local ( $nome ) = "";
 local ( $valore ) = "";
 local ( %DATI ) = ();
 read( STDIN, $richiesta, $ENV{CONTENT_LENGHT} );
 @coppia = split( '&', $richiesta );
 foreach $elemento ( @coppia ) {
  ( $nome, $valore ) = split( '=', $elemento );
  $valore =~ tr/+/ /;
  $nome =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
  $valore =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
  $DATI{$nome} = $valore;
 };
 return %DATI;
};
1;
local ( %DATI ) = ();
if ( $ENV{REQUEST_METHOD} eq 'GET' ) {
 %DATI = &Decodifica_GET;
} elsif ( $ENV{REQUEST_METHOD} eq 'POST' ) {
 %DATI = &Decodifica_POST;
} else {
 &Metodo_non_gestibile;
};
if ( $DATI{modulo} eq 'registrazione base' ) {
 if ( &Verifica_dati ) {
  &Richiedi_conferma;
 } else {
  &Dati_insufficienti;
 };
} elsif ( $DATI{modulo} eq 'registrazione conferma' ) {
 if ( &Verifica_dati ) {
  &Invio_registrazione;
 } else {
  &Dati_insufficienti;
 };
} else {
 &Modulo_errato;
};
1;

E' vero il programma come dici tu e' semplice, ma la tua implementazione non
lo e' altrettanto.
Allora, innanzi tutto evita la decodifica dei GET e POST distinta ed
implementata con funzione a parte. Usa piuttosto CGI.pm che e' un modulo
standard e quindi (se hai una nuova versione di Perl) lo possiedi
sicuramente:
use CGI;
$q=new CGI;
$campo_moulo=$q->param("campo_modulo");
Come vedi non hai bisogno di sapere se era get o post e non hai bisongo
nemmeno di decodificare la stringa. param fa tutto da sola, metti tra
parentesi il name del campo del form HTML ed il value verra' restituito (e
nell'esempio registrato nella variabile).
Secondo consiglio, usa due files distinti, uno per il form ed uno per la
conferma. Non vedo alcun motivo  per usare un unico CGI. Se li separi usi la
tecnologia KIS, keep it simple, e cio' facilita a rendere il codice piu'
leggibile, piu' semplice con meno probabilita' di errori.
Se devo essere sincero mi e' venuto male quando ho sbirciato il sorgente !!!
E' una programmazione Perl piuttosto vecchia ed incasinata. Scusa, ma vista
l'ora mi sono rifiutato di analizzarlo. Intanto prova a seguire il mio
consiglio, e se poi non gira ancora riposta pure e ti prometto che te lo
metto a posto :-)
Alex
P.S. Se hai tempo, mi spieghi come e' possibile che tu abbia fatto un
programma cosi' lungo se qualche ora fa non eri nemmeno capace di far andare
un breve programma perl. (./
file.pl
 ), ti ricordi ??

Ciao Alex, ti ringrazio per la risposta; oggi proverò a seguire i tuoi
consgli cercando di aggiustare il programma. Per quanto riguarda la tua
domanda devo ammettere che il programma non l'ho scritto io (io conosco il
c, ma il perl, anche se mi sembra molto simile, rimane ancora sconosciuto
per me), ma l'ho semplicemente copiato e modificato per le mie esigenze
dagli "Appunti Linux": immagino che tu sappia cosa siano e se li hai anche
puoi trovare una conferma di quanto ti dico a pag 1474 (credo). Non avendo a
disposizione l'asp (l'abbonamento che ho fatto non lo comprende) ho dovuto
ripiegare sul cgi, anche se non conosco il perl: ho fatto ciò anche con la
convinzione che cmq posso sempre trovare brave persone come te che cercano
di dare una mano a persone un po' ignoranti come me. Grazie ancora.
ps oggi provo la tua soluzione, poi ti faccio sapere se sono riuscito a
farcela
"Alex" <Nom...@wow.boh> ha scritto nel messaggio
news:jOKb6.15595$ew1.1...@news.infostrada.it...


Ciao, sono sempre io, ma stavolta il numero delle mie domande č aumentato;
ma eccole:
1. come faccio a verificare se un programma CGI scritto in perl funziona?
2. l'unico modo č quello di mandarlo sul server?
3. o c'č qualche altro modo?
4.vi
 sottopongo un sub:
sub E_mail  {
 local ( $destinatario ) = $_[0];
 local ( $oggetto ) = $_[1];
 local ( $contenuto ) = $_[2];
 local ( $sendmail ) = "/bin/mail $destinatario";
 unless ( open( EMAIL, "| $sendmail ") ) {
  return 0;
 };
 print EMAIL "$oggetto\n";
 print EMAIL "\n\n";
 print EMAIL "$contenuto\n";
 print EMAIL ".\n";
 close( EMAIL );
};
la riga
local ( $sendmail ) = "/bin/mail $destinatario";
cosa significa? Che cavolo č /bin/mail? Questo punto mi č veramente oscuro!!
Qualcuno mi aiuta??? Ho imminente bisogno!! Ciao.

cosa significa? Che cavolo è /bin/mail? Questo punto mi è veramente
oscuro!!
Qui piu' che di CGI si parla di UNIX. /bin/mail e' il programma mail che si
trova nella cartella bin.
Potresti anche vedere : /usr/bin/sendmail che indica il programma sendmail
nella cartella /usr/bin/.
Su windows NT potresti vedere infine un programma che si chiama blat (che
tuttavia non e' sempre presente).
In altre parole per inviare la mail usi un programma che si chiama mail (nel
tuo caso).
Il programma mail (e la cartella) e' tipico di Unix, quindi se tu hai un
server NT scordati che vada !
Usa piuttosto Net::SMTP o Mail::Mailer. (se presenti).
La sub che mi hai postato e' scarna e mal scritta (a mio avviso).
Inoltre, non postare lo stesso messaggio 2 volte (anche se con titoli
differenti)  :-)
Alex

Ok grazie, ma ho ancora un dubbio; la cartella bin/mail a cosa si riferisce?
a una cartella del server? perchè nella mia parte di hard disk ho la
cartella cgi-bin, ma non penso ci sia l bin. Grazie. Ciao.
ps scusa se c'erano due msg uguali, ma il primo non lo visualizzzavo (devo
ancora capire perchè..) e quindi pensavo non l'avesse spedito (non lo
visualizzo tutt'ora!!).
"Alex" <Nom...@wow.boh> ha scritto nel messaggio
news:oYHc6.39468$ew1.2...@news.infostrada.it...


cartella cgi-bin, ma non penso ci sia l bin. Grazie. Ciao.
La cartella non e' bin/mail ma solo /bin !!!
mail e' il programma. Ovviamente si riferisce al programma mail residente
sul server, il server sul quale risiede il sito. Se il sito risiede sul tuo
PC allora si riferisce al tuo computer, se risiede sul server tizio_caio
allora si riferisce a tizio_caio !!!
Nella tua parte di hdisk del server non hai quella cartella ? Non devi
averla :
supponiamo che il path del tuo sito sia:
/home/www_users/free/tuo_spazio/
e quella dei tuoi cgi:
/home/www_users/free/tuo_spazio/cgi-bin/
Bene quella del programma e' :
/bin/
e il programma si chiama mail -> /bin/mail
Capito ? Usi un programma che si trova nel H-disk (ma non nel tuo spazio) .
Per questo non puoi vedere se e' presente e dove sta, ma devi per forza
chiederlo !!!
Alex