空でない場合(したがってブール値の意味で真)@a = @b || @c
を取得することを目的として、割り当ての複雑なバリエーションを実行したいと思います。ドキュメントには、私にはできないことが明記されています。(そしてそれは事実についても正しいです!)@b
@c
「||」、「//」、および「&&」演算子は、最後に評価された値を返します(0または1を返すCの「||」および「&&」とは異なります)。
[...]
特に、これは、割り当てのために2つのアグリゲートから選択するためにこれを使用してはならないことを意味します。
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
残念ながら、それは本当に私に理由を教えてくれません。
私が予想したことはこれでした:
@a =
は配列の割り当てであり、右側にリストコンテキストを誘導します。@b || @c
は右側で、リストコンテキストで評価されます。||
Cスタイルの論理和論理和です。左から右に評価し(必要な場合)、コンテキストを伝播します。@b
リストコンテキストで評価されます。true(つまり、空でない)の場合、それが返されます。- そうでない場合は、
@c
リストコンテキストでも評価され、返されます。
明らかに、私の最後から2番目のステートメントは間違っています。なんで?そして、さらに重要なことに、ドキュメントまたはソースのどの部分がこの動作を説明していますか?
PS:質問の範囲外ですが、三項演算子を使用するというドキュメントの提案を控える理由は、私@b
が実際には一時的なもの(関数呼び出しの結果)であるためです。