如何从数组引用中获取切片?

Sac*_*in 27 perl

让我们说我们有以下数组:

my @arr=('Jan','Feb','Mar','Apr');
my @arr2=@arr[0..2];
Run Code Online (Sandbox Code Playgroud)

如果我们有如下所示的数组引用,我们怎么能做同样的事情:

my $arr_ref=['Jan','Feb','Mar','Apr'];
my $arr_ref2; # How can we do something similar to @arr[0..2]; using $arr_ref ?
Run Code Online (Sandbox Code Playgroud)

bri*_*foy 30

要从数组引用开始获取切片,请将数组名称替换为包含数组引用的块.我用空格来展开各个部分,但它仍然是一样的:

 my @slice =   @   array   [1,3,2];
 my @slice =   @ { $aref } [1,3,2];
Run Code Online (Sandbox Code Playgroud)

如果块内的引用是一个简单的标量(所以,不是数组或哈希元素或很多代码),你可以不用括号:

 my @slice =   @$aref[1,3,2];
Run Code Online (Sandbox Code Playgroud)

然后,如果你想要一个引用,你可以使用匿名数组构造函数:

 my $slice_ref = [ @$aref[1,3,2] ];
Run Code Online (Sandbox Code Playgroud)

在v5.20中使用了新的后解引用功能(实验),

use v5.20;
use feature qw(postderef);
no warnings qw(experimental::postderef);

my @slice = $aref->@[1,3,2];
Run Code Online (Sandbox Code Playgroud)

  • 该后引用功能似乎真的很有用! (2认同)

Cas*_*bel 13

只需切片引用(语法类似于解除引用,查看注释),然后将结果列表转回ref:

my $arr_ref2=[@$arr_ref[0..2]];
Run Code Online (Sandbox Code Playgroud)


DVK*_*DVK 5

my $arr_ref2 = [ @$arr_ref[0..2] ];
Run Code Online (Sandbox Code Playgroud)