Perl 更普遍地使用数据结构引用
我一直在阅读一些perl513*delta文件,并且看到了perl5.14的一些新特性。从Perl5.13.7开始,许多数组/哈希函数都可以工作。虽然这可能主要被视为语法糖,或者说Perl做了您所期望的事情,但我想知道,这是否会改变Perl中声明数据结构的范例?已知的警告是它破坏了与早期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
#!/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的评论,谢谢