如何从数组引用中获取一个元素?

32

假设我们有以下数组:

my @arr=('Jan','Feb','Mar','Apr');
my @arr2=@arr[0..2];

如果我们有以下数组引用,如何执行相同的操作:

my $arr_ref=['Jan','Feb','Mar','Apr'];
my $arr_ref2; # How can we do something similar to @arr[0..2]; using $arr_ref ?
3个回答

39
为了获取从数组引用开始的切片,请使用包含数组引用的块替换数组名称。我使用空格将各个部分分开,但仍然是同一件事情:
 my @slice =   @   array   [1,3,2];
 my @slice =   @ { $aref } [1,3,2];

如果块中的引用是一个简单标量(即不是数组或哈希元素或大量代码),您可以省略花括号:

 my @slice =   @$aref[1,3,2];

那么,如果你想从中获取一个引用,你可以使用匿名数组构造器:

 my $slice_ref = [ @$aref[1,3,2] ];

有了新的后缀解引用特性 (实验性) 在 v5.20 中,

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

my @slice = $aref->@[1,3,2];

2
那个后解引用的功能看起来非常有用! - ZeroKnight

14

只需对引用进行切片(语法类似于解引用,参见注释),然后将结果列表转换回引用即可:

my $arr_ref2=[@$arr_ref[0..2]];

1
这并不是它的作用。@$ref[...] 是使用引用的数组切片;没有中间数组生成。请参阅 http://perlmonks.org?node=References+quick+reference。 - ysth
1
哦,也许你所说的“resulting array”是指由数组切片生成的内容?那不是一个数组,而是一个列表。 - ysth
1
@ysth:认为使用引用来切片数组就像切片解引用后的数组并不会产生歧义,对吧? - Cascabel
1
让人们认为 @$ref[...](@$ref)[...] 一样低效是不好的。 - ysth
1
记住列表和数组之间的区别:http://www.effectiveperlprogramming.com/2010/01/whats-the-difference-between-a-list-and-an-array/ :) - brian d foy

5
my $arr_ref2 = [ @$arr_ref[0..2] ];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接