Perl 更普遍地使用数据结构引用

Perl 更普遍地使用数据结构引用,perl,reference,Perl,Reference,我一直在阅读一些perl513*delta文件,并且看到了perl5.14的一些新特性。从Perl5.13.7开始,许多数组/哈希函数都可以工作。虽然这可能主要被视为语法糖,或者说Perl做了您所期望的事情,但我想知道,这是否会改变Perl中声明数据结构的范例?已知的警告是它破坏了与早期Perl的兼容性,那么支持和反对主要使用匿名结构的论点是什么 例如: #!/usr/bin/env perl use strict; use warnings; use 5.13.7; my $hashre

我一直在阅读一些perl513*delta文件,并且看到了perl5.14的一些新特性。从Perl5.13.7开始,许多数组/哈希函数都可以工作。虽然这可能主要被视为语法糖,或者说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
)的更传统的方式


另外,如果这被认为是增强性的,我可以改成CW,但我很想听听一些观点

我不相信即将到来的更改会破坏向后兼容性。现在您在
键$hashref
上遇到一个错误,使用Perl5.14它将正常工作。因此,实际上当前的代码都不能使用这种功能。

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

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

  • 列表处理功能,如
    map
    grep
    排序
    反向
    打印
    say
    printf
    ,以及许多其他功能仍然需要通过正确的列表传递,因此这意味着使用
    @$array
    而不是简单的
    @array

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

  • while ($array)  { infinite loop }
    while (@$array) { what you probably wanted }
    while (@array)  { no room for error here }
    
  • $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%


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

良好的语法糖分很重要。Perl本身是C之上的“唯一”语法糖,它是汇编程序的糖,是机器代码的糖


根据您的示例,这不会改变我的顶级用法,但有助于减少在使用复杂结构时发现的笨拙语法,即“push@($This->{somekey}),$stuff”变为“push$This->{somekey},$stuff”。

这将增加一个好处,即您不必经常使用绑定变量。你可以使用重载类。有趣。是的,使用此功能将防止代码在较旧的Perl版本上运行。由于较旧的Perl版本有着庞大的安装基础,除非您知道您可以控制将要运行的Perl版本,否则我将避免使用它。(这毕竟只是语法上的甜点。)从这个意义上说,这不是向后兼容的。我的意思是,如果我按照我提到的方式编写代码,它将无法在旧版本上工作。您需要
使用5.14
(这是正确的语法吗?
使用5.14.0
使用5.014000
@Joel从这个角度来看,您是正确的-您必须自己定义您(将)针对的perl版本。最近我个人的目标是
使用5.010
,主要是因为
给定的
和smartmatches。但是,如果您正在制作一些通用库,您可能需要更高的向后兼容性。这就是我要寻找的,速度比较等。另外,我忘记了数组上的标量上下文以获取其大小。我在准备示例时注意到for/foreach。谢谢,我只是想得太多了。同意,请看我对Eric的评论,谢谢