Perl的新特性:后缀解引用

后缀解引用是即将在下一个主要Perl版本中出现的酷炫新特性。尽管Perl 5.20版本要到春季才会发布,但你现在就可以使用Perl开发者版本中的后缀解引用特性。

要求

您需要安装最新Perl开发者版本(v5.19.8)。您可以使用Perlbrew获取它。

$ perlbrew install perl-5.19.8
$ perlbrew switch perl-5.19.8

或者您可以从cpan.org下载并构建Perl v5.19.8。

一旦安装了5.19.8,您还需要实验性发行版。通过命令行使用cpan进行安装。

$ cpan experimental

环绕解引用基础

在Perl中,我们习惯于使用环绕操作来解引用变量。环绕操作涉及将我们的引用用花括号括起来,并在前面添加适当的变量符号。例如,要解引用一个数组:

my $array_ref = [1, 2, 3];
push @{$array_ref}, 4;

在这里,我们声明了一个数组引用,然后使用环绕操作(“@{}”)来解引用数组,使我们能够将标量推送到数组中。从风格上来说,环绕操作很丑陋。Perl语法已经充满了符号和花括号,我们不需要更多。在深层嵌套引用的情况下,环绕解引用也难以阅读,因为解引用符号在左边,而解引用箭头链则延伸到右边。

my $deep_array_ref = [[[[[1,2,3]]]]];
push @{$deep_array_ref->[0][0][0][0]}, 4;

进入后缀解引用

后缀解引用是一个新特性,它是环绕解引用的直接替代品。我们不需要用环绕操作来包装引用,而是在引用的末尾附加一个解引用符号。让我们用后缀解引用重新审视前面的两个示例。

use experimental 'postderef';

my $array_ref = [1, 2, 3];
push $array_ref->@*, 4;

my $deep_array_ref = [[[[[1,2,3]]]]];
push $deep_array_ref->[0][0][0][0]->@*, 4;

在这里,我们使用后缀操作(“->@*”)解引用了数组。您甚至可以获得数组的最后一个元素索引。

use experimental 'postderef';

my $array_ref = [1, 2, 3];
my $last_element_index = $array_ref->$#*;

这比环绕解引用更干净,因为没有额外的花括号,它更直观,因为它遵循从左到右的优先级,嵌套引用更容易阅读,因为我们不需要回溯到引用的开始处来定位符号。我们找到了一个胜者!

后缀解引用在环绕解引用可以工作的任何地方都可以使用

数组并不是唯一受益于这个新特性的。后缀解引用也可以与标量、哈希、代码引用和全局变量一起使用。

use experimental 'postderef';
use feature 'say';

my $scalar   = 'hello world!';
my %hash     = ( hello => 'world!' );
my $code     = sub { say 'hello world!' };

my $sundry_ref = [  \$scalar,
                    \%hash,
                     $code ];

# scalar
say $sundry_ref->[0]->$*;

# hash
for (keys $sundry_ref->[1]->%*) { say "$_ $sundry_ref->[1]{$_}" }

# coderef
$sundry_ref->[2]->&*;

结论

后缀解引用语法比环绕解引用更简洁,更容易理解。如果您还没有看到它,请查看Perl pumpking,Ricardo Signes 在NYC.pm上介绍后缀解引用(整个谈话都很棒)。

有关更多后缀解引用示例,请参阅Perl 源测试文件和新的perlref

喜欢这篇文章?帮助我们,转发它!


这篇文章最初发布在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程的艺术。

查看他们的文章

反馈

这篇文章有什么问题吗?通过在GitHub上打开问题或拉取请求来帮助我们。