Use data structure references more commonly
我一直在阅读一些 perl513*delta 文件,并且看到了 Perl 5.14 中的一些新功能。从 Perl 5.13.7 开始,许多数组/哈希函数也可以在数组/哈希引用上工作。虽然这可能主要被视为语法糖,或者 Perl 做你期望的事情,但我想知道,这会/应该改变在 Perl 中声明数据结构的范式吗?众所周知,它破坏了与早期 Perl 的兼容性,那么主要支持和反对使用匿名结构的争论是什么?
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env perl use strict; use warnings; use 5.13.7; my $hashref = { english => 'hello', spanish => 'hola', french => 'bon jour' }; foreach my $greeting (keys $hashref) { say $hashref->{$greeting}; #use say since we need a later version anyway } |
而不是使用命名散列 (
附言如果这被认为是增强的,我可以更改为 CW,但我很想听到一些观点。
在引用上使用某些数组和哈希函数的能力只是语法糖,不会影响您使用第一级复数结构的方式。这有几个原因:
给定
-
map 、grep 、sort 、reverse 、print 、say 、printf 等列表处理函数仍然需要传递正确的列表,所以这意味着使用@$array 与具有这些功能的更简单的@array 。 -
for/foreach 循环需要传递一个列表,需要@$array -
$array 始终为真,确定你需要写的长度@$array 1
2
3while ($array) { infinite loop }
while (@$array) { what you probably wanted }
while (@array) { no room for error here } -
将真正的
@array 下标为$array[$idx] 比$array->[$idx] 略快(~15%),因为每次访问都不需要进行解引用。由于散列函数的开销,与散列的差异较小,约为 3%。
基本上,通过移动到所有引用,您可以获得一组不同的功能,需要使用解引用符号。相反,对您声明立即使用 良好的语法糖很重要。 Perl 本身是 C 的"唯一"语法糖,它糖化了汇编器,糖化了机器代码。 这不会改变我在您的示例中的顶级用法,但有助于减少使用复杂结构时发现的尴尬语法,即"push @($this->{somekey}), $stuff"变成"push $this->{somekey}, $stuff". 我不相信这个即将到来的变化会破坏向后兼容性。现在你在