更常用的是使用数据结构引用

Joe*_*ger 5 perl reference

我一直在阅读一些perl513*delta文件,我看到了Perl 5.14的一些新功能.从Perl 5.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
}
Run Code Online (Sandbox Code Playgroud)

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

PS如果看到它是增强的我可以改为CW,但我很想听到一些观点.

Eri*_*rom 4

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

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

  • 列表处理函数,如mapgrepsortreverseprintsayprintf许多其他函数仍然需要传递适当的列表,因此这意味着使用@$arrayvs 这些函数更简单@array

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

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

    while ($array)  { infinite loop }
    while (@$array) { what you probably wanted }
    while (@array)  { no room for error here }
    
    Run Code Online (Sandbox Code Playgroud)
  • 下标一个真实的@arrayas比在每次访问时不需要进行取消引用$array[$idx]要快一些(约 15%) 。$array->[$idx]由于散列函数的开销,与散列的差异较小,约为 3%。

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