2011-02-12 43 views
5

我一直在阅读一些perl513 * delta文件,并且看到了一些Perl 5.14的新特性。从Perl 5.13.7开始,许多数组/散列函数将工作on array/hash refs as well。虽然这可能主要被看作是语法糖,或者Perl做你期望的,但我想知道,这会改变Perl中声明数据结构的范式吗?有一个已知的告诫,它打破了与小型Perl的兼容性,主要针对和反对使用匿名结构的争论是什么?更常用的数据结构引用

例如:

#!/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)的更传统的方式。

P.S.如果看到这是增强型的,我可以改为CW,但我很好奇听到一些观点。

+1

这将有额外的好处,你不必经常使用绑定变量。你可以使用重载类。 –

+0

有趣。是的,使用此功能将阻止您的代码在较早的Perl版本上运行。由于Perl版本的庞大安装基础,我会避免它,除非你知道你可以控制你将要运行的Perl版本。 (毕竟它只是语法糖。) –

回答

4

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

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

  • map列表处理功能,grepsortreverseprintsayprintf和其他许多人仍然需要通过适当的列表,所以这意味着使用@$array而不是简单的@array具有这些功能。

  • for/foreach循环需要传递一个清单,要求@$array

  • $array始终是真实的,确定你需要写@$array

    while ($array) { infinite loop } 
    while (@$array) { what you probably wanted } 
    while (@array) { no room for error here } 
    
  • 子脚本真正@array长度因为$array[$idx]$array->[$idx]稍快(〜15%),因为每次访问都不需要解除引用。由于散列函数的开销,与散列的差别较小,约为3%。

基本上,通过移动到所有引用,您将得到一组需要使用解引用sigils的不同功能。相反,利用v5.13.7功能的优势,您可以立即使用my @array; my %hash;的任何内容,并在您将使用过多的@{ ... }%{ ... }结构以及适用功能的区域中使用新的语法快捷方式。

+0

这就是我一直在寻找的东西,速度比较等等。另外我忘记了数组上的标量上下文来获得它的大小。在准备我的例子时,我注意到了/ foreach。非常感谢,我只是像往常一样反思过去。 –

1

我不相信这个即将到来的改变会打破向后兼容性。现在你在keys $hashref上得到一个错误,用perl 5.14它会工作。如此有效,目前的代码无法使用此功能。

+0

在这个意义上不是向后兼容的。我的意思是,如果我按照我提到的方式编写代码,那么它就不适用于旧版本。你需要'使用5.14'(这是正确的语法?) –

+3

'使用5.14.0'或'使用5.014000' –

+0

编辑我的代码来反映这个评论 –

1

良好的语法糖很重要。 Perl本身就是“唯一”糖语言糖,而糖语言糖则是加糖机器代码的汇编语言。

这不会改变我的顶级用法,但它将有助于减少使用复杂结构时出现的尴尬语法,即“push @($ this - > {somekey}),$ stuff”变成“推$ this - > {somekey},$ stuff“。

+0

表示同意,请参阅我对Eric的评论,谢谢 –