存在时检查的键是否存在

时间:2013-06-04 20:20:24

标签: perl associative-array

如果perl-hash声明如下:

use warnings;
use strict;

my %h;

然后,我可以使用exists检查此哈希中是否存在密钥:

if (exists $h{k3}) {
  print "k3 exists\n";
}
else {
  print "k3 doesn't exist\n";
}

由于k3不存在,脚本会打印k3 doesn't exist

我还可以检查ka中是否存在k3

if (exists $h{k3}{ka}) {
  print "k3 ka exists\n";
}
else {
  print "k3 ka doesn't exist\n";
}

不幸的是,这会创建密钥k3,以便另一个

if (exists $h{k3}) {
  print "k3 exists\n";
}
else {
  print "k3 doesn't exist\n";
}

现在打印k3 exists

这对我的目的来说有点不幸。我宁愿不想让perl创建k3密钥。

我当然可以使用类似

的内容检查ka中的k3
if (exists $h{k3} and exists $h{k3}{ka})

不会创建密钥k3。但我想知道在ka内检查k3是否有更短(且更清晰)的方式。

修改问题标记为重复。不幸的是,提到的no autovivification提到的问题中唯一的答案只有一个赞成,并没有标记为已接受的答案。出于我的目的,no autovification是我需要知道的功能(并且我在不知不觉之后)。所以,我在这里留下我的问题,因为我认为在另一个问题中接受的答案不是最佳答案。

不幸的是,到目前为止,还没有人接受我要接受的no autovification。因此,我可以回答我自己的问题。

1 个答案:

答案 0 :(得分:2)

最简单的方法是嵌套你的ifs:

if (exists $h{k3}) {
  print "k3 exists\n";
  if (exists $h{k3}{ka}) {
    print "k3 ka exists\n";
  }
  else {
    print "k3 ka doesn't exist\n";
  }
}
else {
  print "k3 doesn't exist\n";
}