5

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

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

2 回答 2

9

您通过将其与字符串 '\n' 连接来在标量上下文中打印哈希

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

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

该值显然没有用,除了评估散列函数的表现如何。用于print %a;打印其内容。

于 2013-03-22T06:16:28.727 回答
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' 
           };
于 2013-03-22T06:21:29.743 回答