Как получить фрагмент из ссылки на массив? - PullRequest
27 голосов
/ 23 апреля 2010

Допустим, у нас есть следующий массив:

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 ]

30 голосов
/ 24 апреля 2010

Чтобы получить срез, начинающийся со ссылки на массив, замените имя массива блоком, содержащим ссылку на массив. Я использовал пробел, чтобы распределить части, но это все то же самое:

 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];
13 голосов
/ 23 апреля 2010

Просто нарежьте ссылку (синтаксис похож на разыменование, см. Комментарии), а затем превратите полученный список обратно в ссылку:

my $arr_ref2=[@$arr_ref[0..2]];
5 голосов
/ 23 апреля 2010
my $arr_ref2 = [ @$arr_ref[0..2] ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...