10

我还在学习perl。

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

问题是,在哪里(在什么情况下)最好使用普通的 %hash,所以

$hash{key} = $value;

代替

$href->{key} = $value

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

4

3 回答 3

9

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

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

要回答您的问题:

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

从理论上讲,取消引用操作应该花费一点时间,所以时间太短应该没有关系。

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

因此,没有理由优先考虑引用而不是值类型,反之亦然。

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

于 2013-07-01T22:46:22.837 回答
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";

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

于 2013-07-01T22:49:28.337 回答
2

$hashrefs对我来说,使用to的主要原因%hashes是能够为它们赋予有意义的名称(一个相关的想法是命名对匿名哈希的引用),这可以帮助您将数据结构与程序逻辑分开,并使事情更易于阅读和维护。

If you end up with multiple levels of references (refs to refs?!) you start to loose this clean and readable advantage, though. As well, for short programs or modules, or at earlier stages of development where you are retesting things as you go, directly accessing the %hash can make things easier for simple debugging (print statements and the like) and avoiding accidental "action at a distance" issues so you can focus on "iterating" through your design, using references where appropriate.

In general though I think this is a great question because TIMTOWDI and TIMTOCWDI where C = "correct". Thanks for asking it and thanks for the answers.

于 2013-07-02T13:54:44.863 回答