Давайте скажем, что у нас есть следующий массив:
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 ?
Чтобы получить фрагмент, начинающийся со ссылки на массив, замените имя массива блоком, содержащим ссылку на массив. Я использовал пробелы, чтобы разложить части, но это все равно:
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];
Просто нарежьте ссылку (синтаксис аналогичен разыменованию, см. Комментарии), а затем превратите полученный список обратно в ссылку:
my $arr_ref2=[@$arr_ref[0..2]];