2012-10-18 8 views
8

Il seguente frammento non funziona come previsto:Perl di "non" operatore non funziona come previsto con l'definita() funzione

$k{"foo"}=1; 
$k{"bar"}=2; 
if(not defined($k{"foo"}) && not defined($k{"bar"})){ 
    print "Not defined\n"; 
} 
else{ 
    print "Defined" 
} 

Dal momento che sia $ k { "pippo"} e $ k { "bar" } sono definiti, l'output previsto è "Defined". L'esecuzione del codice, tuttavia, restituisce "Non definito".

Ora, giocando con il codice che ho capito che l'immissione parentesi attorno a ciascuna delle not defined() chiamate produce il risultato desiderato:

if((not defined($k{"foo"})) && (not defined($k{"bar"}))){print "Not Defined"} 

immagino questo ha qualcosa a che fare con la precedenza degli operatori, ma qualcuno potrebbe spiegare che cosa esattamente sta succedendo?

risposta

22

Problema di precedenza.

not defined($k{"foo"}) && not defined($k{"bar"}) 

significa

not (defined($k{"foo"}) && not defined($k{"bar"})) 

che è equilvalent a

!defined($k{"foo"}) || defined($k{"bar"}) 

quando si vuole realmente

!defined($k{"foo"}) && !defined($k{"bar"}) 

Solutions:

  • !defined($k{"foo"}) && !defined($k{"bar"})
  • not defined($k{"foo"}) and not defined($k{"bar"})
  • (not defined($k{"foo"})) && (not defined($k{"bar"}))

PS - La lingua si chiama "Perl", non "PERL".

Problemi correlati