【问题标题】:What is the reason to ever evaluate a hash in Perl in a scalar context?在标量上下文中评估 Perl 中的哈希的原因是什么?
【发布时间】:2012-03-12 04:25:52
【问题描述】:

我意识到在标量上下文中评估 Perl 中的数组很有用:它会产生 # 个元素。

但是,能够在标量上下文中评估哈希的实际用途是什么?例如

  • my $scalar_value = %hash;

  • scalar(%hash)

据我了解,它会生成一个类似“3/4”的字符串,提供有关哈希内部的一些信息,这些信息似乎仅对调试有用。

【问题讨论】:

  • 数组是带有@符号的变量,列表是源代码中的一系列项目。在这段代码中@array = (1, 2, 3)(1, 2, 3) 是一个列表,@array 是一个数组变量。 perlfaq4 包含更多信息:perldoc.perl.org/…?
  • 但是我不能写scalar( 1,2,3,4 )吗?如果是这样,那么根据您的陈述,“列表”是正确的,不是吗?
  • 从技术上讲,标量上下文中不存在列表,您所拥有的是标量上下文中的逗号运算符,它首先计算 1,然后将其丢弃,然后是 2,然后是 3,最后是 4评估并返回。因此,您获得的不是列表的长度,而是逗号运算符评估的最后一个表达式。因此,在标量上下文中,(a, b) 表示 evaluate a and throw it away, evaluate b and return it,而在列表上下文中,则表示 evaluate a and push it onto the stack, evaluate b and push it onto the stack, return the stack
  • 我明白我的错误是什么。感谢您指出!如果我使用 qw() 会怎样?换句话说scalar(qw(1 2 3 4))?那将是一个列表吗?
  • qw 在标量上下文中的行为方式与逗号运算符相同,它会丢弃除最终值之外的所有值,然后返回。如果编辑为“列表是源代码中的一系列项目(仅当该系列位于列表上下文中)”,我的第一个陈述可能会更清楚

标签: perl hash scalar


【解决方案1】:

标量(%hash) 可让您检查散列算法是否正常工作。如果您有 1,000 个密钥并且您看到类似 2/16 的内容,这意味着所有密钥都解析为 16 个分配的存储桶中的 2 个。这意味着您的所有键都非常相似并导致大量冲突,从而导致在存储桶中进行长时间的连续搜索。

默认桶数为 8

perl -le '$h{a}=1;print scalar %h'
1/8

用 1000 个桶预存储散列(最接近 2 的幂)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024

当您为 perl OO 祝福哈希时,这也有帮助。 如果你知道会有很多键,你可以加快速度。

【讨论】:

    【解决方案2】:

    它产生一个值,该值可用作 TRUE/FALSE 标志以了解哈希是否为空(无键)。

    举个例子:

    if (%hash) {
        print "Hash has elements\n";
    } else {
        print "Hash is empty\n";
    }
    

    if 将表达式强制转换为标量上下文,因为它用作布尔表达式。

    这是一个非常类似于在标量上下文中使用@array 来测试空虚的概念:

    if (@array) {
        # NOT empty!
    }
    

    【讨论】:

    • “空”的意思是“没有钥匙”。
    • @tchrist - 补充说作为澄清,但我对如何解释“空哈希”感到有点茫然?
    • 这导致人们对%h = (foo=>undef) 是否意味着与标量不同的东西感到很奇怪。就像他们对@a = (undef) 变得怪异一样。每一个都有一个有效的索引,尽管没有有效的值。所以它的关键数很重要。
    • @tchrist - 当你的大脑拒绝将%h = (foo=>undef) 视为接近于看似合理的“空”散列时,你知道你使用 Perl 工作的时间太长了 :)
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2012-12-19
    • 2016-03-14
    • 2013-09-13
    • 2017-05-08
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多