Каков наилучший способ получить последние N элементов массива Perl? - PullRequest
17 голосов
/ 04 марта 2009

Какой лучший способ получить последние N элементов массива Perl?

Если в массиве меньше N, я не хочу связку undefs в возвращаемом значении.

Ответы [ 6 ]

35 голосов
/ 04 марта 2009
@last_n = @source[-$n..-1];

Если вам не требуется undef с, то:

@last_n = ($n >= @source) ? @source : @source[-$n..-1];
5 голосов
/ 04 марта 2009

Я думаю, что вы хотите, называется ломтик .

2 голосов
/ 04 марта 2009
@a = (a .. z);
@last_five = @a[ $#a - 4 .. $#a ];
say join " ", @last_five;

выходы:

v w x y z

1 голос
/ 21 марта 2017

просто, без математики:

@a = reverse @a;
@a = splice(@a, 0, $elements_to_keep);
@a = reverse @a;
0 голосов
/ 11 октября 2018

Поскольку @a в скалярном контексте дает длину массива a, а поскольку @a == $#a + 1 (если $[ не установлено в ненулевое значение), можно получить срез от $ nth (считая от нуля) до последний элемент от @a[$n..@a-1] - # tmtowtdi.

0 голосов
/ 29 мая 2018

TMTOWTDI, но я думаю, что это немного легче читать (но удаляет элементы из @source):

my @last_n = splice(@source, -$n);

А если вы не уверены, что @source имеет хотя бы $n элементов:

my @last_n = ($n >= @source) ? @source : splice(@source, -$n);
...