如何避免未初始化的值?

时间:2011-07-14 10:38:01

标签: perl

我使用这个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 个答案:

答案 0 :(得分:6)

在检查是否已定义之前,您正在检查是否$a eq '',因此警告“在字符串eq中使用未初始化的值”。只需更改条件中的事物顺序:

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

只要'或'匹配链中的任何内容,Perl就会停止处理条件,从而避免将undef与字符串进行比较的错误尝试。

答案 1 :(得分:-1)

scrub中,如果散列有密钥key的条目,则检查为时已晚。如果哈希键不存在,scrub()只会看到标量undef。但哈希可以有一个值为undef的条目,如下所示:

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

所以我建议使用exists函数检查哈希条目。