Как избежать неинициализированного значения? - PullRequest
3 голосов
/ 14 июля 2011

Я использую эту функцию scrub для очистки выходных данных от других функций.

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my %h = (
    a => 1,
    b => 1
    );

print scrub($h{c});

sub scrub {
    my $a = shift;

    return ($a eq '' or $a eq '~' or not defined $a) ? -1 : $a;
}

Проблема возникает, когда я также хотел бы обработать случай, когда ключ в хэше не существует, что показано в примере с scrub($h{c}).

Какие изменения следует внести в scrub, чтобы он мог обработать этот случай?

Ответы [ 2 ]

6 голосов
/ 14 июля 2011

Вы проверяете, есть ли $a eq '', прежде чем проверять, определено ли оно, отсюда и предупреждение "Использование неинициализированного значения в строковом эквалайзере".Просто измените порядок вещей в условном выражении:

return (!defined($a) or $a eq '' or $a eq '~') ? -1 : $a;

Как только что-нибудь в цепочке совпадений 'или', Perl прекратит обработку условного выражения, что позволит избежать ошибочной попытки сравнить undef со строкой.

0 голосов
/ 14 июля 2011

В scrub слишком поздно проверять, есть ли в хэше запись для ключа key. scrub() видит скаляр, который равен undef, только если ключ хеша не существует. Но хэш может иметь запись со значением undef также, например:

my %h = (
 a => 1,
 b => 1,
 c => undef
); 

Поэтому я предлагаю проверить записи хеша с помощью функции exists.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...