存在时检查的键是否存在

Ren*_*ger 7 perl associative-array

如果perl-hash声明如下:

use warnings;
use strict;

my %h;
Run Code Online (Sandbox Code Playgroud)

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

if (exists $h{k3}) {
  print "k3 exists\n";
}
else {
  print "k3 doesn't exist\n";
}
Run Code Online (Sandbox Code Playgroud)

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

我还可以检查是否存在kak3:

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

不幸的是,这创造了关键k3,所以另一个

if (exists $h{k3}) {
  print "k3 exists\n";
}
else {
  print "k3 doesn't exist\n";
}
Run Code Online (Sandbox Code Playgroud)

现在打印k3 exists.

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

我可以,当然,检查ka范围内k3的东西,如

if (exists $h{k3} and exists $h{k3}{ka})
Run Code Online (Sandbox Code Playgroud)

这不会创建密钥k3.但我想知道是否有一种更短(更清洁)的方式来检查ka内部k3.

编辑问题被标记为重复.不幸的是,提到的问题中唯一的答案是提到no autovivification那里只有一个赞成,并没有被标记为已接受的答案.就我的目的而言,这no autovification是我需要知道的特征(并且我在不知不觉之后).所以,我在这里留下我的问题,因为我认为在另一个问题中接受的答案不是最佳答案.

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

小智 2

最简单的事情是嵌套你的 if:

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";
}
Run Code Online (Sandbox Code Playgroud)