Я использую следующий код, чтобы проверить, пустой ли хэш. Есть ли лучший способ и безопасно ли это использовать?
if (!keys %hash) { print "Empty";}
Я использую следующий код, чтобы проверить, пустой ли хэш. Есть ли лучший способ и безопасно ли это использовать?
if (!keys %hash) { print "Empty";}
if (%hash)
Будет работать нормально.
Из perldoc perldata:
Если вы оцениваете хэш в скалярном контексте, он возвращает false, если хэш пусто. Если есть пары ключ/значение, он возвращает true; Больше точно, возвращаемое значение представляет собой строку, состоящую из числа использованные ковши и количество выделенных ведер, разделенных слэш.
Была ошибка, из-за которой привязанные хеши в скалярном контексте всегда возвращали false. Ошибка была исправлена в 5.8.5. Если вы обеспокоены обратной совместимостью, то я бы придерживался if( !keys %hash )
. В противном случае используйте if( !%hash )
, как рекомендовано другими.
Simpler:
if (!%hash) {
print "Empty";
}
! накладывает скалярный контекст, а хэш, вычисляемый в скалярном контексте, возвращает:
false
, если есть нулевые ключи (не указаны в документации, но экспериментально возвращает 0
Строка, обозначающая, сколько используемых/выделенных ковшей используется для клавиш > 0, что, конечно, НЕ будет ложным (например, "3/6" )
"Лучше" - субъективный термин. Однако я бы сказал, что код, который легче понять, можно охарактеризовать как "лучше". По этой причине я пришел к выводу, что !keys %hash
лучше, потому что все, написавшие perl-код, будут знать, что делает этот код и что он работает. !%hash
- это что-то, по крайней мере, мне придется искать, чтобы убедиться, что он действительно работает или только выглядит так, как будто это сработает. (Причина в том, что возвращаемое значение хеша в скалярном контексте довольно запутанно, в то время как поведение массивов в скалярном контексте хорошо известно и часто используется.)
Кроме того, !keys %hash
сохраняется.
Нет, нет лучшего или более безопасного способа проверить, является ли хэш пустым.