Подтвердить что ты не робот

Использование двойного отрицания (!!)

Итак, я натолкнулся на код, который выглядит как

@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;

Это первый раз, когда я вижу использование двойного отрицания. Какая польза от этого? Когда человек будет использовать его?

4b9b3361

Ответ 1

Он преобразует небулевые типы в boolean (dualvar(0,"") или 1).

Это быстрый способ сделать это, вместо того, чтобы пытаться явно указать его (что может занять больше символов). Оператор ! отрицает истинность его аргумента. Следовательно, используются два из них.

Многие типы объектов являются "правдивыми", а другие - "ложными".

  • Единственными ложными значениями являются 0, undef, "", "0" и некоторые перегруженные объекты.
  • Примерами истинных значений являются 1, "asdf" и все другие значения.

Ответ 2

Это много фанков для блока sort!

Это по существу двухуровневая сортировка:

  • ASCII-BETICAL
  • удаленные файлы сначала, а затем восстановленные

Итак, можно переписать его как (непроверенный):

@documents = sort {  exists $deleted_documents_names{$a} # same effect as '!!'
                       <=> 
                     exists $deleted_documents_names{$b}
                  ||
                     uc( $a ) cmp uc( $b )
                  }
             @documents;