在Perl中打印哈希值

5
我想知道下面的代码为什么输出“2/8”。
#!/usr/bin/perl
#use strict;
#use warnings;
%a = ('a'=>'dfsd','b'=>'fdsfds');
print %a."\n";

12
为什么严格模式和警告被注释掉了? - squiguy
@squiguy:代码已经测试过了~ - baozailove
3
无论是在开发、测试还是生产环境中,您都应该始终使用“use strict”和“use warnings”来开始每个程序。尽管您可能会说您的程序已经使用了“use strict”进行测试,但实际上它不会通过编译。请务必记住这一点。 - Borodin
@Tawnos:那段代码中不存在引用。他并没有打印哈希引用。此外,请不要在Stack Overflow上发布链接到充满侵犯版权的网站,以免留下法律问题。 - Dave Cross
@baozailove:不,我并不是说你不应该发布链接。我是说你不应该发布到侵犯版权的网站的链接。docstore.mik.ua上的Web服务器包含了一些未被允许在线发布的书籍副本。不要链接到这些盗版书籍的副本。 - Dave Cross
显示剩余3条评论
2个回答

9
您正在通过将哈希与字符串'\n'连接来在标量上下文中打印哈希。
如果您在标量上下文中评估哈希,则如果哈希为空,则返回false。如果有任何键/值对,则返回true;更准确地说,返回的值是由已使用的桶数和分配的桶数组成的字符串,用斜杠分隔。 2/8表示在分配的8个桶中,2个被触及。考虑到您仅插入了2个值,它目前表现良好 :)
该值显然没有用处,除非评估哈希函数的性能。使用print %a;来打印其内容。

@DarkCthulhu:我想知道桶是否与系统配置相关? - baozailove
@baozailove,您获得的桶和分布取决于所使用的哈希函数。您可以在此处详细了解它(http://www.perl.com/pub/2002/10/01/hashes.html)。它应该是独立于底层系统的。 - Anirudh Ramanathan
实际上,2/8 的用处非常少,因此有人提议将其更改为与 !!%a 相同。 - Brad Gilbert

5

如@Dark所述,您正在标量上下文中打印哈希。

如果您真的想打印一个哈希表,则使用Data::Dumper模块。

use Data::Dumper;
...
...
print Dumper(%a);

例如:

use Data::Dumper; 
my %hash = ( key1 => 'value1', key2 => 'value2' ); 
print Dumper(%hash); # okay, but not great 
print "or\n"; 
print Dumper(\%hash); # much better

输出结果:

$VAR1 = 'key2'; 
$VAR2 = 'value2'; 
$VAR3 = 'key1'; 
$VAR4 = 'value1'; 
or 
$VAR1 =    { 
             'key2' => 'value2', 
             'key1' => 'value1' 
           };

致sarathi:非常感谢你! - baozailove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接