Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在标量上下文中计算Perl中的哈希值的原因是什么?_Perl_Hash_Scalar - Fatal编程技术网

在标量上下文中计算Perl中的哈希值的原因是什么?

在标量上下文中计算Perl中的哈希值的原因是什么?,perl,hash,scalar,Perl,Hash,Scalar,我意识到在标量上下文中用Perl计算数组是有用的:它会产生大量元素 但是,能够在标量上下文中计算哈希值的实际用途是什么?e、 g my$scalar\u值=%hash 标量(%hash) 据我所知,它会生成一个类似“3/4”的字符串,提供有关哈希内部的一些信息,这些信息似乎只对调试有用。它会生成一个值,可以用作真/假标志,以了解哈希是否为空(无键) 例如: if (%hash) { print "Hash has elements\n"; } else { print "Ha

我意识到在标量上下文中用Perl计算数组是有用的:它会产生大量元素

但是,能够在标量上下文中计算哈希值的实际用途是什么?e、 g

  • my$scalar\u值=%hash

  • 标量(%hash)


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

它会生成一个值,可以用作真/假标志,以了解哈希是否为空(无键)

例如:

if (%hash) {
    print "Hash has elements\n";
} else {
    print "Hash is empty\n";
}
if
强制表达式进入标量上下文,因为它用作布尔表达式

这与在标量上下文中使用
@array
测试空性非常相似:

if (@array) {
    # NOT empty!
}
标量(%hash)用于检查哈希算法是否正常工作。如果您有1000个密钥,并且您看到类似于2/16的值,这意味着所有密钥仅解析为16个分配桶中的2个。这意味着您的所有密钥都非常相似,并且会导致大量冲突,从而导致在bucket中进行长时间的连续搜索

默认存储桶计数为8

perl -le '$h{a}=1;print scalar %h'
1/8
用1000个存储桶预置散列(精确到2的幂)

当您为PerlOO添加哈希时,这也会有所帮助。
如果知道会有很多键,则可以加快速度。

数组是带有
@
符号的变量,列表是源代码中的一系列项。在这个代码中,
@array=(1,2,3)
(1,2,3)
是一个列表,
@array
是一个数组变量。perlfaq4包含更多信息:?但是我不能写
标量(1,2,3,4)
?如果是这种情况,那么根据您的语句,“list”是正确的,否?从技术上讲,列表不可能存在于标量上下文中,您在标量上下文中有逗号运算符,它首先计算1,然后将其丢弃,然后计算2,然后计算3,最后计算并返回4。因此,您得到的不是列表的长度,而是由逗号运算符计算的最后一个表达式。所以在标量上下文中,
(a,b)
意味着
计算a并扔掉它,计算b并返回它
,而在列表上下文中,它意味着
计算a并将其推到堆栈上,计算b并将其推到堆栈上,返回堆栈
我知道我的错误是什么了。谢谢你指出!如果我使用qw()呢?换句话说
标量(qw(1234))
?这将是标量上下文中的一个列表no?
qw
,其行为方式与逗号运算符相同,它丢弃除最终值以外的所有值,然后返回最终值。如果将我的第一句话编辑为“列表是源代码中的一系列项(仅当该系列在列表上下文中时)”,其中“空”的意思是“没有键”。@tchrist-作为澄清补充了这一点,但我对“空哈希”的其他解释有点不知所措。这是因为人们对
%h=(foo=>undef)
作为标量意味着一些不同的东西。就像它们在
@a=(undef)
上变得古怪一样。每一个都有一个有效的索引,尽管没有有效的值。所以关键是它的键计数。@tchrist-当你的大脑拒绝看到
%h=(foo=>undef)时,你知道你使用Perl的时间太长了
任何接近合理的“空”散列的地方:)
perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024