【问题标题】:Keys that spring into existence if checked with exists [duplicate]如果检查存在则弹出存在的键[重复]
【发布时间】:2013-05-31 08:59:47
【问题描述】:

如果一个 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

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

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 键。

当然,我可以在k3 中检查ka,类似

if (exists $h{k3} and exists $h{k3}{ka})

它不会创建密钥k3。但我想知道是否有一种更短(而且更简洁)的方法来检查 k3 内的 ka

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

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

【问题讨论】:

  • “Autovivification”通常会做你想做的事:让中间引用迅速存在。对于使用exists 测试嵌套结构,这是不幸的。 and 将各个级别放在一起是通常的方法,但 no autovivification 可能会有所帮助(我从未使用过该模块)。
  • @amon:您应该将其提升为答案

标签: perl associative-array


【解决方案1】:

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

【讨论】:

  • “最简单”这个词的有趣用法 :-) 我想说最简单的就是使用“无自动生存”。
  • 最简单的地方在于它只在他拥有的代码中移动而无需添加任何内容。同样最简单的是它不执行冗余测试。
猜你喜欢
  • 2019-08-08
  • 2017-11-22
  • 2021-09-01
  • 2019-07-16
  • 1970-01-01
  • 2019-10-17
  • 2012-12-13
  • 2013-03-02
  • 2011-12-26
相关资源
最近更新 更多