我应该更喜欢Perl中的哈希值还是hashref?

时间:2013-07-01 21:57:12

标签: perl

我还在学习perl。

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

问题是,在哪里(在什么情况下)使用普通%哈希更好,所以

$hash{key} = $value;

而不是

$href->{key} = $value

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

3 个答案:

答案 0 :(得分:9)

我认为这类问题非常合理:Perl或C ++等编程语言已经走过了漫长的道路并积累了许多历史包袱,但人们通常会从历史的,同步的曝光中学习它们。因此,他们一直在想为什么TIMTOWDI和WTF所有这些选择以及哪些更好,哪些应该是首选?

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

回答你的问题:

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

从理论上讲,取消引用操作应该花费一点点时间,这一点很小也不重要。

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

因此没有速度理由支持引用而不是值类型,反之亦然。

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

答案 1 :(得分: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";

你可以做各种古怪的事情来做这样的事情(比如为每个字段分别设置哈希或将所有字段放在用冒号分隔的单个值中),但是使用引用来存储这些更复杂的结构会更容易

答案 2 :(得分:2)

对我而言,使用$hashrefs%hashes的主要原因是能够为它们提供有意义的名称(相关的想法将命名为匿名哈希的引用),这可以帮助您分离数据结构从程序逻辑,使事情更容易阅读和维护。

如果你最终得到多个级别的引用(引用引用?!),你就会开始失去这个清晰可读的优势。同样,对于简短的程序或模块,或者在您开始重新测试的早期开发阶段,直接访问%hash可以使简单的调试(print语句等)变得更容易。避免意外的“远距离行动”问题,这样你就可以专注于“迭代”你的设计,并在适当的时候使用参考。

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