我应该选择散列,对象还是数组来表示Perl中的数据实例?

Dav*_*d B 3 arrays perl hash object data-structures

我一直在想这个,但从来没有真正深入了解它.

情况是这样的:我有一组相对较大的数据实例.每个实例都具有相同的集合或属性,例如:

# a child instance
name
age
height
weight
hair_color
favorite_color
list_of_hobbies
Run Code Online (Sandbox Code Playgroud)

通常我会将一个孩子表示为哈希,并将所有孩子放在哈希哈希值(或哈希数组)中.

这种方法总是困扰我的是我并没有真正使用所有孩子(内部哈希)具有相同结构的事实.如果数据真的很大,似乎可能浪费内存,所以如果每个内部哈希都是从头开始存储的,那么键名的名称似乎比数据本身要多得多......同时请注意当我构建这样的数据结构时,我经常将nstore它们用于磁盘.

我想知道在这个角度创建一个子对象是否更有意义,即使我不需要OO.它会更紧凑吗?查询会更快吗?

或者将每个孩子表示为阵列是否有意义?例如:

my ($name, $age, $height, $weight, $hair_color, $favorite_color, $list_of_hobbies) = 0..7; 
my $children_h = {
  James => ["James", 12, 1.62, 73, "dark brown", "blue", ["playing football", "eating ice-cream"]], 
  Norah => [...], 
  Billy => [...]
};
print "James height is $children_h->{James}[$height]\n";
Run Code Online (Sandbox Code Playgroud)

回想一下我的主要关注点是空间效率(存储时的RAM或磁盘),时间效率(即加载存储的数据集然后从实例y获取属性x的值)和......便利性(代码可读性等).

谢谢!

hob*_*bbs 11

  1. Perl非常聪明,可以在哈希之间共享密钥.如果你有100,000个具有相同五个键的哈希值,perl会将这五个字符串存储一次,并引用它们十万次.担心空间效率不值得你花时间.

  2. 基于哈希的对象是最常见的类型,也是最容易使用的对象,所以除非你有充分的理由不这样做,否则你应该使用它们.

  3. 你应该省去很多麻烦,开始使用Moose,并且不再担心你的对象的内部(虽然,就在你和我之间,Moose对象是基于哈希的,除非你使用特殊扩展来制作它们 - 否则再说一次,如果没有一个很好的理由,你不应该这样做.)