9

次のスニペットは期待どおりに機能しません。

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

$k{"foo"} と $k{"bar"} の両方が定義されているため、期待される出力は "Defined" です。ただし、コードを実行すると、「未定義」が返されます。

ここで、コードをいじってみると、各not defined()呼び出しを括弧で囲むと、望ましい結果が得られることがわかりました。

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

これは演算子の優先順位と関係があると思いますが、正確に何が起こっているのか誰か説明できますか?

4

1 に答える 1

27

優先順位の問題。

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

意味

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

に相当する

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

あなたが本当に欲しいとき

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

ソリューション:

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

PS - 言語名は「PERL」ではなく「Perl」です。

于 2012-10-18T15:50:38.387 に答える