解决方法
这在
defined
和
exists
的perldoc条目中有详细记录。下面是一个快速摘要:
defined $ hash {key}告诉你是否定义给定键的值(即不是undef)。使用它来区分未定义的值和在布尔上下文中为false的值,例如0和”。
exists $ hash {key}告诉你%hash是否包含给定的键。使用它来区分未定义的值和不存在的值。
这是最容易看到一个例子。给定这个散列:
- my %hash = (a => 1,b => 0,c => undef);@H_403_3@
这里是检索,定义和存在的结果:
# key value defined exists
a 1 1 1 b 0 1 1 c undef 0 1 d undef 0 0@H_403_3@在实践中,人们经常只写if($ hash {key}){…},因为(在很多通常情况下)只有真值有意义/可能。如果false值有效,那么必须在测试中添加defined()。 exists()的使用频率更低。最常见的情况是可能在使用哈希作为集合。例如
my %set = map { $_ => undef } 'a' .. 'z';@H_403_3@使用undef设置值有几个好处:
>它更准确地表示意图(只有键是有意义的,而不是值)。
>所有undef值共享单个分配(这会节省内存)。
> exists()测试稍快(因为Perl不必检索值,只确定有一个)。它也有缺点,你必须使用exists()来检查集合成员身份,这需要更多的输入,如果你忘记它会做错的事情。
另一个存在的地方是有用的是在尝试检索值之前探测锁定的哈希值(这将触发异常)。