Использование двойного отрицания (!!)
Итак, я натолкнулся на код, который выглядит как
@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;
Это первый раз, когда я вижу использование двойного отрицания. Какая польза от этого? Когда человек будет использовать его?
Ответы
Ответ 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;