【问题标题】:Fixing keys that spring into existence when calling exist on a nested hash修复在嵌套哈希上调用存在时出现的键
【发布时间】:2016-09-18 21:54:50
【问题描述】:

亲爱的 Stackoverflowers,

当在哈希上调用存在以测试进一步嵌套在不存在的哈希中的键的存在时,它将创建导致最终测试的键以查看最终键是否存在。

perldoc 的例子是这样的:

undef $ref;
if (exists $ref->{"Some key"}) {}
print $ref;  # prints HASH(0x80d3d5c)

我非常喜欢 perl 的自动验证功能;但是,我现在非常害怕将存在用于我可能拥有的任何未来项目。

有谁知道是否和/或如何编辑 perl 使用的库,或者可能使用模块来纠正这个问题?实在是太傻了,如果不存在就让人看看以后的key是否存在。

最后,从Checking for existence of hash key creates key 中的以下问题中学习,建议使用 cmets 状态 OO 样式用于深度嵌套哈希。深度嵌套 (>n=10) 和高内存 (>8GB) 是否存在任何技术问题,这些嵌套哈希中存储的浮点值非常简单?还是只是这样的问题?

【问题讨论】:

标签: perl hash key exists


【解决方案1】:

取消引用未定义的变量[1] 是导致自动生存的原因[2]。解引用示例:

  • $ref->{key}${$ref}{key}
  • $ref->[0]${$ref}[0]
  • $$ref
  • @$ref

你可以通过替换来避免它

exists( $ref->{"Some key"} )

$ref && exists( $ref->{"Some key"} )

或添加

no autovivification;

  1. 在某些情况下。

  2. “Autovivification”也可用于指不存在的变量 ($x = 1;)、散列元素 (my %h; $h{$key} = 1;) 和数组元素 (my @a; $a[3] = 1;) 的创建。这篇文章不涉及这些,因为它与这里无关。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    你应该添加

    no autovivification;
    

    到模块的顶部。这将防止自动激活将结构创建到您的测试点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2014-09-03
      • 2013-02-08
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多