This question already has answers here:
Checking for existence of hash key creates key

(4个答案)


7年前关闭。




如果像这样声明了perl哈希:
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";
}

不幸的是,这会创建 key k3,因此另一个
if (exists $h{k3}) {
  print "k3 exists\n";
}
else {
  print "k3 doesn't exist\n";
}

现在输出k3 exists

就我的目的而言,这有点不幸。我不想让Perl创建k3 key 。

我当然可以用类似的方法检查ka中的k3
if (exists $h{k3} and exists $h{k3}{ka})

不会创建 key k3。但是我想知道是否有更短的方法(和恕我直言更干净)来检查ka中的k3

编辑将该问题标记为重复。不幸的是,所提及问题中唯一提及no autovivification的答案在那里只有一个赞,并且没有被标记为已接受答案。就我的目的而言,no autovification是我需要知道的功能(并且我不知不觉地知道了)。因此,我将问题留在这里,因为我认为另一个问题中的公认答案不是最佳答案。

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

最佳答案

最简单的事情是嵌套您的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";
}

09-06 17:44