Newsgroup: it.comp.lang.perl
Titolo: processare un input

salve a tutti,
sto "lavorando" alla sicurezza di una CGI che ho scritto (voi direte: "Ne
hai di lavoro da fare!" .-)).
Ebbene, vorrei processare le stringhe che il programma riceve da un form
html con metodo post, in modo da bloccarne l'esecuzione in certi casi.
Sono a buon punto, ma non riesco a superare il problema seguente: mi sono
accorto che se dal form schiaccio solo il bottone "Entra" (input
type="submit") raggiungo la pagina che non dovrei raggiungere, e questo
perche' la CGI accetta come validi il carattere niente (null). Vorrei
escluderlo processando l'input, ma non ho trovato nella doc niente che fa al
caso mio:-(((
NB: ho provato a controllare il flusso con l'espressione regolare:
if ($input =~ /""/)    {die};                            # il problema
rimane;
e con l'espressione regolare:
if ( $input =~ // )    {die};                            # blocca tutto;
Sapete darmi una dritta???
grazie
asast

 caso mio:-(((
if ($input) {...}
esegui l'if solo se $input e' qualcosa, se non hanno scritto niente
$input e' undef
Sempre che abbia capito il problema
-- 
齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,�Enrica Iaffei                     Aggregated Technologies ltd
7, Aristotelous Str.              3, Demetriou Vikella Str.           
1056 Nicosia       CYPRUS         1061 Nicosia       CYPRUS
phone +357 2 346261               +357 2 755750
"Da molti anni non mi chiedo pi�quale posto �la mia casa
 ho scoperto che la mia casa �insieme a me ovunque vada"
齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,虜,齯滌`偕爻,�


Qualcosa tipo
$input=~/^\s*$/
forse ti potrebbe venir utile.
-- 
Saluti,
Giancarlo

 cerchero` un'altra donna dentro ai sogni di Tarzan...

 Giancarlo
Giancarlo,
ho utilizzato il pattern che mi hai suggerito al fine di bloccare
l'esecuzione del programma nel momento in cui non venga passato nessun
carattere, ma semplicemente premuto [Invio], in STDIN (sto provando da linea
di comando ma anche tramite form HTML con metodo POST dovrebbe essere lo
stesso).
Purtroppo la soluzione non e' funzionante, segue il semplice codice di
esempio:
@elenco_nomi = ("pluto", "pippo", "topo");
print "Inserire il nome: \n";
$nome = <STDIN>;
chomp $nome;
if ($nome =~/^\s*$/)    {
                @controllo_nome = grep /^$nome$/, @elenco_nomi;
                $ctl_nome = "controllo_nome";
                print "Il nome esiste\n" if $ctl_nome eq $nome;
                } else {
                    print "I dati immessi non sono validi\n"
}
In questo esempio la procedura di controllo che mi hai consigliato fallisce
nel caso in cui venga premuto [Invio] al prompt "Inserire il nome: " e viene
avviata la procedura di confronto tra scalari che, fra l'altro, ma quello e'
un problema diverso, ha esito positivo in questo caso.
Forse mi ero spiegato male nel mio post, cmq ti ringrazio.
Per chi avesse il mio stesso "problema" invece, ho utilizzato con successo
le istruzioni suggeritemi in questo stesso thread nel secondo e quarto post
a partire dal mio.
grazie e ciao,
asast

                print "Il nome esiste\n" if $ctl_nome eq $nome;
Temo che questo print non sara' _MAI_ eseguito, prova a sostituire queste 3
linee con:
print "Il nome esiste\n" if grep /^$nome$/, @elenco_nomi;
-- 
Saluti,
Giancarlo

 Giancarlo
Giancarlo,
        a parte che avevo fatto un errore nel trascrivere il codice, nella
linea in cui interpolavo l'array @controllo_nome nella stringa $ctl_nome, e
adesso l'ho corretto (vedi sopra).
        Detto, questo, ho seguito i consigli del tuo ultimo post e ti do
atto che hai ragione, l'istruzione di blocco da te suggeritami funziona.
  Il codice che ho testato ora:
@elenco_nomi = ("pluto", "pippo", "topo");
print "Inserire il nome: \n";
$nome = <STDIN>;
chomp $nome;
if ($nome =~/^\s*$/)    {
                if (grep /^$nome$/, @elenco_nomi)    {
                            print "Il nome esiste\n"
                                        }    else    {
                                    print "I dati immessi non sono validi\n"
                                     }
                        };
In effetti, se al prompt viene premuto [Invio], il programma stampa la
stringa "I dati immessi non sono validi".
Ma allora mi chiedo, perche il programma di cui ho postato il codice in
precedenza accettava [Invio] e faceva passare??? (sara' forse proprio l'istr
uzione in cui il contenuto di @controllo_nome viene interpolato in $ctl_nome
che fa danno?)
 cosi' succedeva a me :-(
Se hai tempo, lo proveresti???
Se hai una spiegazione vorrei conoscerla.
grazie,
asast

 cosi' succedeva a me :-(
Forse ti sei un po' perso nel gestire il flusso del tuo programma.
la regex  /^\s*$/ match-a sei la stringa contiene solo 0 o piu' blank (spazi o
simili), mi sembra megli di cercare solo "stringa vuota" cosi' se uno ti passa
solo spazi non vengono accettati lo stesso.
Il tuo primo codice eseguiva i controlli quando l'input match-ava con la regex,
quindi solo quando la stringa era vuota, altrimenti dava "input non valido".
Adesso se l'input e vuoto non fa nulla, altrimenti fa il suo bel grep etc.
Non mi sembra quello di cui avevi bisogno.
Provo a scriverti due righe (vediamo se ti chiariscono qualcosa sulle regex) poi
cerca di capire il codice prima di ripostare altre domande:
<code>
@elenco_nomi = ("pluto", "pippo", "topolino", "pluto","qui quo qua","banda-bassotti");
while (<DATA>) {
        print "Ricerca di: ";
        chomp;
        print "\"$_\"\n";
        do      {
                print "I dati immessi non sono validi\n\n";
                next;
                }
# decommenta una delle linee seguenti esegui e prova capire un po' come 
# e perche' si comporta nei vari modi
#               if ($_ =~/^\s*$/);
#               if ($_ =~/^\W*$/);
#               unless ($_ =~/^\w+$/);
#               unless ($_ =~/^[a-zA-Z\-]+$/);
        $nome=$_;
        @array=grep /^$nome$/, @elenco_nomi;
        print "Trovate ", scalar @array," ricorrenze di \"$nome\"\n\n";
}
__END__
pluto
pippo
topolino
paperino
  pluto
pi...@disney.com
qui quo qua
banda-bassotti
</code>
-- 
Saluti,
Giancarlo