POD2-IT
view release on metacpan or search on metacpan
IT/perlfaq9.pod view on Meta::CPAN
analizzati dal server, NdT]. L'altro tipo (un path assoluto) viene
risolto internamente al server senza alcuna redirezione HTTP. Le
specifiche CGI non permettono di usare URL relative in nessuno dei
due casi.
L'utilizzo di CGI.pm E<egrave> caldamente raccomandato. Questo esempio mostra
la redirezione con una URL completa. Questa redirezione E<egrave> gestita
dal browser web.
use CGI qw/:standard/;
my $url = 'http://www.cpan.org/';
print redirect($url);
Il seguente esempio mostra invece una redirezione con un path assoluto.
Questa redirezione E<egrave> gestita dal server web locale.
my $url = '/CPAN/index.html';
print redirect($url);
Se scritta direttamente, una redirezione potrebbe essere come segue
(il "\n" finale E<egrave> mostrato separatamente, per chiarezza), usando
una URL completa o un path assoluto.
print "Location: $url\n"; # header di risposta CGI
print "\n"; # fine degli header
=head2 Come faccio ad inserire una password nelle mie pagine web?
Per abilitare l'autenticazione per il vostro server web, E<egrave> necessario
configurarlo. La configurazione E<egrave> differente per i diversi tipi di
server web---apache la effettua in maniera differente da iPlanet che
differisce da IIS. Controllate la documentazione del vostro server web per i
dettagli del vostro particolare server.
=head2 Come si fanno a modificare i file .htpasswd e .htgroup in Perl?
I moduli HTTPD::UserAdmin e HTTPD::GroupAdmin forniscono un'inferfaccia
OO consistente a questi file, senza badare al loro formato. I database
possono essere di testo, dbm, Berkeley DB o un qualsiasi database che abbia
un driver DBI compatibile. HTTPD::UserAdmin supporta file usati nelle
autenticazioni "Basic" e "Digest". Di seguito un esempio:
use HTTPD::UserAdmin ();
HTTPD::UserAdmin
->new(DB => "/pippo/.htpasswd")
->add($nomeutente => $password);
=head2 Come faccio ad assicurarmi che gli utenti non immettano in una form dei valori che possono far fare brutte cose al mio script CGI?
Consultate i riferimenti elencati nella nella sezione Security della CGI
Meta FAQ [in inglese, NdT]:
http://www.perl.org/CGI_MetaFAQ.html
=head2 Come effettuo il parsing dell'header di una mail?
Per una soluzione veloce-e-sporca, provate questa soluzione derivata da
L<perlfunc/split>:
$/ = '';
$header = <MSG>;
$header =~ s/\n\s+/ /g; # unisce le linee successive
%head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header );
Questa soluzione non funziona bene se, ad esempio, state cercando di
gestire tutte le linee Received. Un approccio piE<ugrave> completo
consiste nell'usare il modulo Mail::Header da CPAN (parte del pacchetto
MailTools).
=head2 Come faccio a decodificare una form CGI?
(contributo di brian d foy)
Usate il modulo CGI.pm che trovate nel Perl. E<Egrave> veloce e facile ed
effettivamente svolge un bel po' di lavoro er garantire che le cose avvengano in
maniera corretta. Si occupano delle richieste GET, POST ed HEAD, form multipart, campi
multivalore, stringhe di interrogazione, combinazioni di messaggi del body e molte altre
cose di cui probabilmente non vorreste starci a pensare.
Niente di piE<ugrave> semplice: il modulo CGI effettua il parsing [analisi sintattica, NdT]
dell'input e rende disponibile ogni valore attraverso la funzione C<param()>.
use CGI qw(:standard);
my $totale = param( 'prezzo' ) + param( 'spedizione' );
my @items = param( 'oggetto' ); # valori multipli, stesso nome del campo
Se volete un approccio orientato agli oggetti, CGI.pm puE<ograve> fare pure questo.
use CGI;
my $cgi = CGI->new();
my $total = $cgi->param( 'prezzo' ) + $cgi->param( 'spedizione' );
my @items = $cgi->param( 'oggetto' );
Potreste anche provare CGI::Minimal che E<egrave> una versione leggera della stessa cosa.
Anche altri moduli del tipo CGI::*, disponibili su CPAN, potrebbero fare un lavoro migliore per voi.
Molte persone tentano di scrivere il proprio decodificatore (o copiare quello di un altro programma)
e poi incappare in una o molte problematiche di questo tipo di compito. E<Egrave> molto piE<ugrave>
semplice e meno seccante usare CGI.pm.
=head2 Come si fa a verificare la validitE<agrave> di un indirizzo di posta elettronica?
Non si puE<ograve>. Almeno, non in tempo reale. E<Egrave> un peccato, eh?
Senza inviare una mail all'indirizzo e senza controllare che ci sia un essere
umano a rispondere dall'altra parte, non si puE<ograve> stabilire se un
indirizzo email E<egrave> valido. Anche se applicate lo standard per gli
header delle mail, potete avere problemi, poichE<eacute> esistono indirizzi
cui si puE<ograve> mandar posta che non seguono le regole dell'RFC-822
(lo standard per gli header delle mail), e indirizzi che le seguono cui
invece non si puE<ograve> mandare posta.
In molti sono tentati di provare ad eliminare certi indirizzi non validi
che appaiono frequentemente con una semplice espressione regolare, come
C</^[w.-]+@(?:[w-]+.)+w+$/>. E<egrave> una pessima idea. Comunque, questo
IT/perlfaq9.pod view on Meta::CPAN
$mailer = Mail::Mailer->new();
$mailer->open({ From => $indirizzo_mittente,
To => $indirizzo_destinatario,
Subject => $oggetto,
})
or die "Non posso aprire: $!\n";
print $mailer $body;
$mailer->close();
Il modulo Mail::Internet usa Net::SMTP, che E<egrave> meno Unix-centrico di
Mail::Mailer, ma anche meno affidabile. Evitate i comandi SMTP puri. Ci
sono molte ragioni per servirsi di un agente di trasporto della posta
come sendmail. Queste includono le code, i record MX, e la sicurezza.
=head2 Come si usa MIME per creare un allegato ad un messaggio?
Questa risposta proviene direttamente dalla documentazione di MIME::Lite.
Create un messaggio multipart (vale a dire, un messaggio con degli allegati).
use MIME::Lite;
### Crea un nuovo messaggio multipart:
$msg = MIME::Lite->new(
From =>'me@ilmiohost.com',
To =>'te@iltuohost.com',
Cc =>'qualche@altrohost.com, ancora@uno.com',
Subject =>'Un messaggio in due parti...',
Type =>'multipart/mixed'
);
### Aggiunge una parte (ogni "attach" ha gli stessi argomenti di "new"):
$msg->attach(Type =>'TEXT',
Data =>"Ecco la GIF che volevi"
);
$msg->attach(Type =>'image/gif',
Path =>'aaa000123.gif',
Filename =>'logo.gif'
);
$text = $msg->as_string;
MIME::Lite include anche un metodo per inviare queste cose.
$msg->send;
Con le impostazioni di default usa L<sendmail>, ma puE<ograve> essere
adattato per usare SMTP attraverso L<Net::SMTP>.
=head2 Come faccio a leggere la posta elettronica?
BenchE<eacute> sia possibile usare il modulo Mail::Folder (che E<egrave>
disponibile su CPAN come parte del pacchetto MailFolder) oppure il modulo
Mail::Internet (contenuto nel pacchetto MailTools), spesso un modulo
E<egrave> eccessivo. Ecco un programma che ordina i messaggi.
#!/usr/bin/perl
my(@msgs, @sub);
my $msgno = -1;
$/ = ''; # legge paragrafo per paragrafo
while (<>) {
if (/^From/m) {
/^Subject:\s*(?:Re:\s*)*(.*)/mi;
$sub[++$msgno] = lc($1) || '';
}
$msgs[$msgno] .= $_;
}
for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) {
print $msgs[$i];
}
O, piE<ugrave> brevemente:
#!/usr/bin/perl -n00
# bysub2 - ordinamento per soggetto alla awk
BEGIN { $msgno = -1 }
$sub[++$msgno] = (/^Subject:\s*(?:Re:\s*)*(.*)/mi)[0] if /^From/m;
$msg[$msgno] .= $_;
END { print @msg[ sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msg) ] }
=head2 Come faccio a sapere il mio hostname, il nome del mio dominio e il mio indirizzo IP?
X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
gethostbyname, Socket, Net::Domain, Sys::Hostname>
(contributo di brian d foy)
Il modulo Net::Domain, che fa parte della distribuzione standard a partire dal
perl5.7.3, puE<ograve> farvi ottenere il fully qualified domain name (FQDN)
[nome di dominio completo, NdT], il nome dell'host oppure il nome del dominio.
use Net::Domain qw(hostname hostfqdn hostdomain);
my $host = hostfqdn();
Anche il modulo C<Sys::Hostname>, incluso nella della distribuzione standard a partire dal
perl5.6, puE<ograve> ottenere il nome dell'host.
use Sys::Hostname;
$host = hostname();
Per ottenere l'indirizzo IP, potete usare la funzione interna C<gethostbyname> per
cambiare il nome in un numero. Per cambiare quel numero nella forma ad ottetto puntata
(a.b.c.d) che la maggior parte delle persone si aspetta, usate la funzione C<inet_ntoa>
dal modulo C<Socket>, anch'esso distribuito con il perl.
use Socket;
my $indirizzo = inet_ntoa(
scalar gethostbyname( $host || 'localhost' )
);
=head2 Come prelevo una news o la lista dei newsgroup attivi?
Usate i moduli Net::NNTP oppure News::NNTPClient, entrambi disponibili
su CPAN. Essi possono rendere facili compiti quali prelevare la lista dei
neswgroup, ad esempio:
perl -MNews::NNTPClient
-e 'print News::NNTPClient->new->list("newsgroups")'
( run in 2.947 seconds using v1.01-cache-2.11-cpan-54e63673c56 )