关于一个散列的问题[新手学Perl]

关于一个散列的问题[新手学Perl]

关于一个散列的问题[新手学Perl]
刚开始接触perl 在看散列这方面的内容时 遇到这样一个问题 搞不清楚

%hash=(width=>'300',height=>'150');
print %hash," \n";
[color=red]print %hash." \n";[/color]

输出结果:

width300height150
[color=red]2/8[/color]

为什么 [color=red]print %hash." \n";[/color] 输出的2/8 请知道的告知一下 谢谢



%hash用" . "和\n连接后变.
%hash用" . "和\n连接后变成一个标量
为什么是2/8就不知道了
[quote]my %hash = ( widt.
[quote]my %hash = ( width => '300', height => '150', length => '500' );
print ( scalar %hash );[/quote]
结果:3/8

[quote]my %hash = ( width => '300', height => '150', asd => '500' );
print ( scalar %hash );[/quote]
结果:2/8

[quote]my %hash = ( width => '300', height => '150', abc => '500' );
print ( scalar %hash );[/quote]

结果:3/8

[quote]my %hash = ( width => '300', height => '150', abcd => '500' );
print ( scalar %hash );[/quote]

结果:2/8

这是一个用斜线分隔的已用空间和分配总空间组成的字符串。(Perl语言编程第三版99页)

不过结果很奇怪




   

2/8 代表这个 hash 预支了.
2/8 代表这个 hash 预支了 8 个 buckets 来准备装元素。这里装了 2 个元素。
Perl 里的 hash 其实是 array,
每个 hash 的 key 都是先通过 Perl 内部带的 hash 函数计算得到一个 index 整数, 假设是X
然后把这个 index 整数 % 预支的bucket 数来取余数, X % 8 = Y
这个余数就是在 array 那里存放 hash key 的这个值. array[Y] = hash value.

但,Y 值不一定是唯一的,如果俩个 key 都计算得出同一个 array index 值,那么这两个 key 的 value 就都放到一个 bucket 里了( 一个 bucket 里是以 linked list 形式来存放的 ) , 这就是为什么有时存了 3 个 key, 但 scalar %hash 显示 2/8 。 这代表的是有 2 个值都放到一个 bucket 了。

上面说的是些 Perl internal 的东西了,感兴趣的朋友可以看看这篇文章 http://www.perl.com/lpt/a/2002/10/01/hashes.html

原来在Windows下多用VB,后来跑跑Linux,开始学Perl,刚开始接触Perl时觉得这东西老土,而且经常被一些东西搞得不知所以,还以为Perl是个破烂,但慢慢学多一点后发现这东西的灵活性大了去,也理解了为什么这么多老外对其热情不减。除了写客户端快速界面程序外,VB和她真是没法比,套一句:不怕做不到,就怕想不到;可能还是蛮合适的。
相对其他语言,使用Perl比较要紧的是要清楚自己在干什么,Perl不象其他语言那样比较“死板”,她是一门比较“聪明”的语言,一般的语言歧义是比较少的,写什么就是什么,但Perl有上下文的概念,在不同的上下文得到的结果是不一样的,例如上面的例子就是在不同上下文中产生的不同效果,Perl到处渗透着这种思想,所以除非必要,否则还是用一种自己容易理解的方式去写程序。
一旦用惯Perl以后就比较烦其他语言的做法,象Java一样什么都要说得明明白白,很累,就象生产线上的工人……。
呵呵 谢谢楼上的说明 偶现.
呵呵 谢谢楼上的说明 偶现在就觉得 perl的语法有点松散 看来要继续加油啊
我认为松散是特点,有程序.
我认为松散是特点,有程序员发挥的余地。