【问题标题】:Printing Hash in Perl在 Perl 中打印哈希
【发布时间】:2013-03-22 06:10:35
【问题描述】:

我想知道下面的代码为什么打印“2/8”。

#!/usr/bin/perl
#use strict;
#use warnings;
%a = ('a'=>'dfsd','b'=>'fdsfds');
print %a."\n";

【问题讨论】:

  • 为什么要注释掉严格和警告?
  • @squiguy:代码测试完毕~
  • 您应该始终use strictuse warnings 启动每个程序,无论是在开发、测试还是生产中。尽管您说您的程序无法使用use strict 进行测试,因为它无法编译。
  • @Tawnos:该代码中没有引用。他打印哈希引用。另外,请不要通过发布指向充满侵犯版权的网站的链接来让 Stack Overflow 面临法律诉讼。
  • @Dave Cross:我的英文不太好!!你说的什么意思?Stack Overflow不发链接吗?但是,我看到很多人在Stack Overflow发链接?

标签: perl hash


【解决方案1】:

您正在通过将 scalar context 与字符串 '\n' 连接起来打印散列

如果您在标量上下文中评估哈希,如果哈希返回 false 是空的。如果有任何键/值对,则返回 true;更多的 准确地说,返回的值是一个字符串,由 已使用的桶和分配的桶数,用 a 分隔 斜线。

2/8 表示在分配的 8 个存储桶中,2 已被触及。考虑到您只插入了 2 个值,到目前为止它做得很好:)

该值显然没有用,除了评估散列函数的执行情况。使用print %a; 打印其内容。

【讨论】:

  • @DarkCthulhu:我想知道桶是否与系统配置相关?
  • @baozailove 您获得的存储桶和分布取决于使用的哈希函数。你可以详细阅读它here。它应该独立于底层系统。
  • 实际上2/8 的用处很小,以至于有人谈论将其更改为与!!%a 相同。
【解决方案2】:

正如@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:非常感谢!
猜你喜欢
  • 2017-09-30
  • 2016-12-18
  • 2011-10-27
  • 2012-10-23
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2020-10-16
  • 2013-06-24
相关资源
最近更新 更多