我还在学习perl.
对我来说,引用哈希感觉更"自然"而不是直接访问它们,因为将引用传递给子句更容易(可以传递一个变量而不是列表).一般来说,我更喜欢这种方法,直接访问%hashes".
问题是,在哪里(在什么情况下)使用普通%哈希更好,所以
$hash{key} = $value;
Run Code Online (Sandbox Code Playgroud)
代替
$href->{key} = $value
Run Code Online (Sandbox Code Playgroud)
在这里是任何速度,或任何其他"东西"更喜欢使用%hashes和不是$hashrefs?或只是纯粹的个人品味和TIMTOWTDI的问题?一些例子,什么时候更好用%hash?
我认为这类问题是非常合理的:Perl或C++等编程语言已经走过了漫长的道路并积累了许多历史包袱,但人们通常会从历史的,同步的展示中学习它们.因此,他们一直在想为什么TIMTOWDI和WTF所有这些选择以及哪些更好,哪些应该是首选?
因此,在第5版之前,Perl没有引用.它只有价值类型.引用是Perl 4的附加组件,可以编写更多内容.当然,必须保留值类型以保持向后兼容性; 而且,为简单起见,因为经常你不需要引用的间接.
回答你的问题:
不要浪费时间考虑Perl哈希列表的速度.他们很快.他们是内存访问.访问数据库或文件系统或网络,这是您的程序通常会花费时间的地方.
从理论上讲,取消引用操作应该花费一点点时间,因此微小无关紧要.
如果你很好奇,那么基准测试.不要从你可能看到的差异中得出太多结论.另一个版本的内容可能会有所不同.
因此没有速度理由支持引用而不是值类型,反之亦然.
还有其他原因吗?我会说这是一个风格和品味的问题.就个人而言,我更喜欢没有->访问器的语法.
如果您可以使用普通哈希来描述数据,则使用普通哈希.但是,当您的数据结构变得更复杂时,您将需要使用引用.
想象一个程序,我存储有关库存物品的信息,以及我有多少库存物品.一个简单的哈希很好地工作:
$item{XP232} = 324;
$item{BV348} = 145;
$item{ZZ310} = 485;
Run Code Online (Sandbox Code Playgroud)
如果您所做的只是创建可以读取文件并存储报告的简单信息的快速程序,则根本不需要使用引用.
但是,当事情变得更复杂时,您需要引用.例如,我的程序不只是跟踪我的库存,我正在跟踪库存的所有方面.库存物品也有名称,创建它们的公司等等.在这种情况下,我希望我的哈希不指向单个数据点(我库存的物品数量),但是对哈希的引用:
$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";
Run Code Online (Sandbox Code Playgroud)
你可以做各种古怪的事情来做这样的事情(比如为每个字段分别设置哈希或将所有字段放在一个由冒号分隔的单个值中),但是使用引用来存储这些更复杂的结构会更容易.