40

私のプログラムのこのPerlコードのスニペットは、間違った結果をもたらしています。

$condition ? $a = 2 : $a = 3 ;
print $a;

の値に関係なく$condition、出力は常に3です。どうしてですか?

4

5 に答える 5

79

これはPerlのドキュメントで説明されています。

Perl演算子の優先順位のため、ステートメントは次のように解析されます。

($condition ? $a= 2 : $a ) = 3 ;

?:演算子は割り当て可能な結果を​​生成するため、条件の結果に3が割り当てられます。

$ conditionが真の場合、これは($ a = 2)=3が$a=3を与えることを意味します

$ conditionがfalseの場合、これは($ a)=3が$a=3を与えることを意味します

これを書く正しい方法は

$a = ( $condition ? 2 : 3 );
print $a;

私たちは仕事でこれに噛まれたので、他の人がそれが役立つことを願ってここに投稿しています。

于 2008-08-12T16:05:34.390 に答える
40

優先順位の問題に苦しんでいる可能性があると思われる場合は、Perlが何を意味しているのかを理解するための秘訣です。

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

あなたの場合、それはあなたに表示されます:

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

...その時点で、「ああ、それはそれを説明している」と言うべきです!

于 2008-09-05T21:41:11.420 に答える
21

前の答えを拡張するためだけに...何らかの理由で、割り当てを条件付きの一部にする必要がある場合は、次のように記述します。

$condition ? ($a=2) : ($a=3);

これは、条件に基づいてさまざまな変数に割り当てる場合に役立ちます。

$condition ? ($a=2) : ($b=3);

また、変数を選択しているが、何があっても同じものを割り当てる場合は、次のようにすることもできます。

($condition ? $a : $b) = 3;
于 2008-08-22T04:58:03.367 に答える
4

Perl 演算子の優先順位により、ステートメントは次のように解析されます。

($condition ? $a = 2 : $a ) = 3 ;

?: 演算子は割り当て可能な結果を​​生成するため、条件の結果に 3 が割り当てられます。

$condition が true の場合、これは $a=2=3 が $a=3 を与えることを意味します

$condition が false の場合、これは $a=3 が $a=3 を与えることを意味します

これの正しい書き方は

$a = $condition ? 2 : 3;

一般に、元の例のように、代入を行うために条件文を使用する習慣を本当にやめるべきです。これは、Perl が書き込み専用であるという評判を得ることにつながるようなものです。

経験則として、条件式は単純な値のみを対象とし、副作用のある式は対象としません。あなたや他の誰かが今から 8 か月後にこのコードを読む必要がある場合、このように読みたいと思いますか?

$x < 3 ? foo($x) : bar($y);

それともこんな感じ?

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}
于 2008-09-16T15:43:29.753 に答える
0

上記のチトニウムの答えに対する1つの提案:

同じ変数に異なる値を割り当てたい場合は、これが良いかもしれません(コピーブックの方法):

$ a =($ condition)?2:3;

于 2008-09-04T12:54:51.383 に答える