32

さて、次のようなコードに出くわしました

@documents_names = sort {
         !!$deleted_documents_names{$a} == !!$deleted_documents_names{$b}
          ? uc($a) cmp uc($b)
          : !!$deleted_documents_names{$a}
          cmp !!$deleted_documents_names{$b}
         } @documents_names;

二重否定の使い方は初めて見ました。それの用途は何ですか?人はいつそれを使用しますか?

4

2 に答える 2

44

非ブール型をブール型 (dualvar(0,"")または1) に変換します。

これは、明示的にキャストしようとする代わりに、これを行うためのショートカットの方法です (より多くの文字が必要になる場合があります)。!演算子は、引数の真偽を否定します。したがって、それらのうちの2つが使用されます。

多くのオブジェクト タイプは「真実」であり、他のタイプは「偽」です。

  • 唯一の false 値は、、、、0およびいくつかのオーバーロードされたオブジェクトです。undef"""0"
  • 真の値の例は1"asdf"、 、およびその他すべての値です。
于 2012-09-05T10:07:05.763 に答える
10

sortそれはブロックにとってたくさんのファンクです!

これは基本的に2レベルのソートです:

  1. アスキーベティカル
  2. 最初に削除されたファイル、次に削除されていない

したがって、それを(テストされていない)として書き直すことができます:

@documents = sort {  exists $deleted_documents_names{$a} # same effect as '!!'
                       <=> 
                     exists $deleted_documents_names{$b}
                  ||
                     uc( $a ) cmp uc( $b )
                  }
             @documents;
于 2012-09-05T11:14:01.250 に答える