Проверка 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'} ) ) {
Другие вопросы по тегам