始终不理解伪散列

始终不理解伪散列

$john = [ {age => 1, eyes => 2, weight => 3}, 47, "brown", 186 ];

john是一个指向匿名数组的引用, 那么, 为什么:
$john->{weight}
可以调用?

根据大骆驼中的解释:
The type of the dereference is determined by the right operand, that is, by what follows directly after the arrow. If the next thing after the arrow is a bracket or brace, the left operand is treated as a reference to an array or a hash, respectively, to be subscripted by the expression on the right.

那么, 如果把john这个引用当成了hash引用的话,最多$john->{weight}返回3, 为什么这里返回了186?
我在 5.10 里,这么做是会出错的

Not a HASH reference at test2.pl line 8.
哦,原来这就是 伪散列 啊,

本身是一个数组,用起来却像个散列



看来新版本 不支持 了啊
perl 5.9.0 and higher:

Pseudo-hashes have been removed from Perl as of 5.10. Consider using restricted hashes or fields::new() instead. Using fields::phash() will cause an error.
Not a HASH reference at D:\ebook\Perl\work\test.pl line 3.

难道我可以不学这个怪异的语法了...看了几天,要 了
不难理解吧?
其实就是个匿名数组,只不过:
1,该数组的下标 0 不可访问;因为它里面储存有本数据结构的元数据。
2,本来数组的下标应该是数字的,但是现在可以用字符串了。字符串下标和数字下标之间的对应关系储存在数组的下标 0。

总的来说就是:
$john->{weight} 的意思,
就是 $john->[ $john->[0]->{weight} ]。

use warnings; 之后就会发现,这个语法早就废弃了。
事实证明 Perl 5.10 已经不支持这个语法了。


QUOTE:
原帖由 flw 于 2008-8-9 17:20 发表
不难理解吧?
其实就是个匿名数组,只不过:
1,该数组的下标 0 不可访问;因为它里面储存有本数据结构的元数据。
2,本来数组的下标应该是数字的,但是现在可以用字符串了。字符串下标和数字下标之间的对应 ...

似乎明白点了。。
不过让我用,肯定用不来~
>>>2,本来数组的下标应该是数字的,但是现在可以用字符串了。字符串下标和数字下标之间的对应关系储存在数组的下标 0。

这就是我不明白的地方...
$john = [ {age => 1, eyes => 2, weight => 3}, 47, "brown", 186 ];
这是一个匿名数组的引用, 数组第一个元素是一个匿名引用.
那么,为什么$john->{weight}会得到186呢?我觉得如果从数组和hash互相转换的角度考虑,至多给我返回3, 因为weight=>3.

看来这个语法也不得到Perl编写者的认同,我决定不再扣这个细节.也就是说,这个语法是需要Perl编译器特殊支持的, 而不是使用原有的引用之类的语法就可以自解释的.