Проверка hashref, если условие возвращает ноль
Некоторое время я использовал perl, но довольно часто сталкивался с этим, скажем, $results - это хеш-код, а код подобен приведенному ниже:
$results->{'Key_1'} = 'Valid_string';
if ( $results->{'Key_1'} ) { ---> this doesn't return true
Code to do something .....
}
Если мой вопрос ясен, может кто-нибудь объяснить, почему это происходит?
2 ответа
Я думаю, единственная причина в том, что $results
не является ссылкой на HASH или ваша "допустимая строка" на самом деле является целым числом: 0
Вы можете проверить это с:
print ref $results;
Должно вернуться
HASH(0x.......)
если нет, то есть проблема.
Лучший тест, как это, чтобы избежать каких-либо сюрпризов:
if (exists($results->{'Key_1'})) {
# ...
}
Увидеть perldoc perlreftut
А также perldoc -f exists
:
существует EXPR
Учитывая выражение, которое определяет элемент хеша, возвращает истину, если указанный элемент в хеше когда-либо был инициализирован, даже если соответствующее значение не определено.
Это не произойдет для этой строки. Это может быть правдой для других строк.
$results->{'Key_1'} = ''; # Empty string is false.
$results->{'Key_1'} = '0'; # Zero is false.
Или, может быть, вы не назначали строку вообще
$results->{'Key_1'} = 0; # Zero is false.
$results->{'Key_1'} = undef; # Undef is false.
defined
вернет true для пустой строки и ноль:
if ( defined( $results->{'Key_1'} ) ) {
exists
вернет true для пустой строки, ноль и undef:
if ( exists( $results->{'Key_1'} ) ) {