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上。
标签
反馈
这篇文章有什么问题吗?通过在GitHub上打开问题或拉取请求来帮助我们。