关于perl:更常用的使用数据结构引用

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
}

而不是使用命名散列 (%hash) 的更传统方式。

附言如果这被认为是增强的,我可以更改为 CW,但我很想听到一些观点。


在引用上使用某些数组和哈希函数的能力只是语法糖,不会影响您使用第一级复数结构的方式。这有几个原因:

给定 my $array = [1 .. 10]

  • mapgrepsortreverseprintsayprintf 等列表处理函数仍然需要传递正确的列表,所以这意味着使用 @$array 与具有这些功能的更简单的 @array

  • for/foreach循环需要传递一个列表,需要@$array

  • $array 始终为真,确定你需要写的长度 @$array

    1
    2
    3
    while ($array)  { infinite loop }
    while (@$array) { what you probably wanted }
    while (@array)  { no room for error here }
  • 将真正的 @array 下标为 $array[$idx]$array->[$idx] 略快(~15%),因为每次访问都不需要进行解引用。由于散列函数的开销,与散列的差异较小,约为 3%。

基本上,通过移动到所有引用,您可以获得一组不同的功能,需要使用解引用符号。相反,对您声明立即使用 my @array; my %hash; 的任何内容利用 pre v5.13.7 功能,并在您可能会使用过多 @{ ... }%{ ... } 构造的区域使用新的语法快捷方式和适用的功能。


良好的语法糖很重要。 Perl 本身是 C 的"唯一"语法糖,它糖化了汇编器,糖化了机器代码。

这不会改变我在您的示例中的顶级用法,但有助于减少使用复杂结构时发现的尴尬语法,即"push @($this->{somekey}), $stuff"变成"push $this->{somekey}, $stuff".


我不相信这个即将到来的变化会破坏向后兼容性。现在你在 keys $hashref 上得到一个错误,使用 perl 5.14 它将工作。因此,目前没有任何代码可以使用这样的功能。