【问题标题】:Initialize hash elements to 0将哈希元素初始化为 0
【发布时间】:2015-05-14 03:35:15
【问题描述】:

我通过这样做在 Perl 中声明一个哈希:

my %hash = ();

我继续向哈希添加元素。有时,$hash{$x} 没有定义,这意味着它可能是null。因此,当我尝试打印它时,我什么也得不到。如果未定义条目$x,我希望看到0。有人可以告诉我该怎么做吗?如何将哈希元素初始化为 0

【问题讨论】:

  • 将哈希声明为= () 是多余的。
  • 请出示您的 Perl 代码,以便我们为您提供适当的帮助

标签: perl hashcode perl-data-structures


【解决方案1】:

您可以在遇到未定义值时使用defined-or operator//(适用于 Perl 5.10 及更高版本)打印默认值,而不是尝试设置默认值。

在本例中,当您打印散列元素时,您要么打印该元素,要么如果未定义,则打印0

use 5.010;

say $hash{$x} // 0;

【讨论】:

  • 在早期版本的 perl 中| 0 可以工作,但会将空字符串替换为零。
  • @Sobrique 那不应该是|| 0吗?
  • 理想情况下是的,尽管在这个有限的例子中它并没有太大的区别。按位或undef | 0 的计算结果也为0 :)。也可以使用||=//= 来分配。 print $hash{$key} //= 0;
【解决方案2】:

没有像未定义的哈希键的默认值这样的东西

操作哈希的正确方法是测试您的密钥是否已定义,使用“定义”函数(请参阅perl defined

[~]=> perl -e '%x = (a=>1, c=>5); for (a..d) { print "$_ => "  . (defined $x{$_} ? $x{$_} :0) . "\n"  }'
a => 1
b => 0
c => 5
d => 0

【讨论】:

    【解决方案3】:

    请注意,不测试是否定义了键,而是使用 exists 关键字测试键是否存在。一个测试看看这个值是否是用定义的关键字定义的。

    print "Exists\n"    if exists $hash{$key};
    print "Defined\n"   if defined $hash{$key};
    print "True\n"      if $hash{$key};
    

    第一个测试密钥是否存在, 第二个,如果定义了值并且 第三个,如果该值返回一个真值。

    【讨论】:

      【解决方案4】:

      可以初始化哈希。

      my %hash = ();
      @hash{@keys} = (0) x @keys;
      

      这将创建一个哈希,为每个键赋予一个元素,然后将值设置为与键数组一样长的 0 数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 2016-10-24
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        相关资源
        最近更新 更多