Newsgroup: it.comp.lang.perl
Titolo: quesito funzione() or funzione()

salve a tutti!
osservazione: molto spesso si vedono cose del tipo:
open( FILE, ">", $nomefile ) or die "ERRORE: $!";
ovvero esegue l'istruzione die se open ritorna un qualcosa non TRUE.
e se io volessi fare una cosa del genere
open( FILE, ">", $_[0] ) or funzione_mia_di_morte_hahaha();
dove funzione_mia_di_morte_hahaha() è del tipo:
sub funziona_mia_di_morte_hahaha(){
	open ERRORLOG, ">>", $error_log || die "errore apertura $error_log \n";
	my $error = "errore - $_[0] \n";
	print ERRORLOG $error;
	die $error;
}
che non ritorna niente, può funzionare?
saluti!
ar

 ar
ci sono molte cose da dire: La risposta comunque e' si'!
perldoc perlop dice che per l' operatore or e l' operatore ||
e comunque operatori logici e' definito (come in C) l' ordine
di valutazione delle espressioni.
(espressione_1 ) or (espressione_2) viene prima calcolata
espressione_1 e poi espressione_2 MA A CAUSA DELLA SHORT EVALUATE,
espressione_2 viene calcolata solo se necessario, cioe se espressione_1
non ha prodotto risultato riconducibile a TRUE.
anche per l' operatore and o && (differiscono solo per le precedenze
di associativita')
(espressione_1) and (espressione_2) se espressione_1 ha restituito FALSE o
undef o ... qualsiasi cosa riconducibile a FALSE, si procede alla
valutazione di espressione_2 che diviene necessaria per calcolare il
risultato di AND logico.
Solo il fatto che sia definito l' ordine di valutazione rende possibile
l' uso di quelle sintassi.
enfatizzo l' attenzione alle differenze di precedense tra or e ||
da perldoc perlop
$a = $b or $c;              # bug: this is wrong
($a = $b) or $c;            # really means this
$a = $b || $c;              # better written this way
--
Altra cosa da dire: in Perl la tipizzazione non e' di scuola pascal, cioe'
a compile time Per non si chiede se la sug che metti a destra di or
e' di un tipo senzato per calcolare or.
le sub o i blocchi {} restituiscono il valore dell' ultima espressione
calcolata, quindi qualcosa restituisce sempre :)
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 non ha prodotto risultato riconducibile a TRUE.
giusto per onor di cronaca: questo comportamento degli or o degli and l'ho
anche sentito chiamare "cortocircuito"...
allora nel caso del mio codice dopo l'or entra all'interno della
funzione_di_morte() ma poi esegue il die e finisce tutto lì. (correggimi
se sbaglio).
grazie dell'esauriente risposta! ;-)
ar

         open ERRORLOG, ">>", $error_log || die "errore apertura $error_log \n";
[snip]
Attenzione alle questioni di precedenza evidenziate da Roberto C.
Nella prima open(), utilizzi 'or', a precedenza più bassa, insieme
alle parentesi, per cui viene effettivamente interpretata come "prova
ad aprire il file in $_[0], e se ti va male chiama la funzione_...".
Nella seconda open, invece, non fai uso di parentesi per la open() ma
usi || che ha precedenza più alta, per cui in realtà stai scrivendo:
    open ERRORLOG, ">>", ($error_log || die "errore apertura
$error_log \n");
Ammesso che $error_log contenga un nome di file non interpretabile
come "falso", il "die" di apertura del file suddetto non verrà mai
eseguito. Questo è il tipico caso in cui devi utilizzare or:
   open ERRORLOG, ">>", $error_log or die "errore apertura $error_log
\n";
che viene interpretato come:
   (open ERRORLOG, ">>", $error_log) or (die "errore apertura
$error_log \n");
ossia, nuovamente, "prova ad aprire il file, e se va buca chiama
die...".
Ciao,
   Flavio.