2013-07-01 71 views
10

我还在学Perl。我应该在Perl中使用哈希还是hashrefs?

对我来说感觉更“自然”来,而不是直接访问它们散列引用,因为它更容易引用传递到子,(一个变量可以传递的,而不是一个列表)。一般来说,我喜欢这种方法,它其中一个直接访问%hashes”。

的问题是,在这里(在什么情况下)是更好地使用纯%哈希值,所以

$hash{key} = $value; 

,而不是

$href->{key} = $value 

是这里的任何速度,或其他任何“东西”是什么喜欢使用%hashes而不是$hashrefs?或者它事只是纯粹的个人品味和TIMTOWTDI?一些例子,当是更好地使用%hash

+4

在任何你想传递给周围的子程序或方法,这些事物的复杂的程序,此时你会反正他们被转换为引用。我通常使用hashrefs,除非它是一次性脚本。 –

+0

投票重新开启......这绝对是回答客观 – Zaid

回答

9

我觉得这种问题是非常合理的:编程语言如Perl或C++已经走过了漫长的道路,积累了大量的历史包袱,但人们通常从历史无关,同步揭露学习他们。因此,他们一直在想,为什么TIMTOWDI和WTF会做出所有这些选择,哪些更好,哪些应该更受欢迎?

因此,在版本5之前,Perl没有引用。它只有价值类型。引用是Perl 4的附加组件,可以编写更多的东西。值类型必须保留,当然,以保持向后兼容性;并且为了简单起见,因为通常您不需要引用的间接引用。

要回答你的问题:

不要浪费时间去思考Perl的哈希表的速度。他们很快。他们是内存访问。访问数据库或文件系统或网络,这是您的程序通常会花费时间的地方。

从理论上讲,解引用操作应该花费很少的时间,这么小的应该不重要。

如果你很好奇,然后benchmark。不要从你可能看到的差异中得出太多的结论。在另一个版本中,情况可能会不同。

因此,没有速度的理由支持引用超过值类型,反之亦然。

有没有其他原因?我会说这是一个风格和品味的问题。就我个人而言,我更喜欢没有->访问器的语法。

5

如果您可以使用纯哈希来描述您的数据,则使用纯哈希。但是,当您的数据结构变得更复杂时,您将需要使用引用。

想象一下,我正在存储有关库存项目的信息以及我有多少库存的程序。一个简单的散列效果很好:

$item{XP232} = 324; 
$item{BV348} = 145; 
$item{ZZ310} = 485; 

如果你正在做的是创建一个可以读取文件和存储简单信息的报告程序快速,没有必要在所有使用引用。

但是,当事情变得更加复杂时,您需要参考。例如,我的程序不只是跟踪我的库存,我正在跟踪我库存的所有方面。库存物品也有名字,创建它们,等等。在这种情况下,公司,我希望有我的哈希没有指向一个单一的数据点(项目我有股票的数量),而是一个散列的引用:

$item{XP232}->{DESCRIPTION} = "Blue Widget"; 
$item{XP232}->{IN_STOCK}  = 324; 
$item{XP232}->{MANUFACTURER} = "The Great American Widget Company"; 

$item{BV348}->{DESCRIPTION} = "A Small Purple Whatzit"; 
$item{BV348}->{IN_STOCK}  = 145; 
$item{BV348}->{MANUFACTURER} = "Acme Whatzit Company"; 

你可以做各种古怪的事情做这样的事情(如为每个场单独的哈希值或者把所有的字段由冒号分隔单个值),但它只是更容易使用引用存储这些更复杂的结构。

+0

你D意识到,你可以删除'一个问题 - >'?如:'$ item {XP232} {DESCRIPTION}' – shawnhcorey

2

对我来说,最主要的原因使用$hashrefs%hashes是给他们有意义的名字的能力(相关想法将被命名为引用匿名哈希),它可以帮助你从程序逻辑中分离出来的数据结构,使事情变得更容易阅读和维护。

如果你最终引用(裁判到裁判?!)的多层次开始松动这种清洁和可读性的优势,虽然。同样,对于短程序或模块,或者你在哪里,你去,直接访问%hash可以使事情变得更容易进行简单的调试(print报表等)在距离再测试的东西,避免意外的“动作发展的早期阶段“问题,以便您可以专注于在设计中”迭代“,并在适当的地方使用参考。

一般来说,虽然我认为这是一个很好的问题,因为TIMTOWDITIMTOCWDI其中C =“正确”。感谢您提出问题并感谢您的答案。