Какой лучший способ получить последние N элементов массива Perl?
Если в массиве меньше N, я не хочу связку undefs в возвращаемом значении.
undefs
@last_n = @source[-$n..-1];
Если вам не требуется undef с, то:
undef
@last_n = ($n >= @source) ? @source : @source[-$n..-1];
Я думаю, что вы хотите, называется ломтик .
@a = (a .. z); @last_five = @a[ $#a - 4 .. $#a ]; say join " ", @last_five;
выходы:
v w x y z
просто, без математики:
@a = reverse @a; @a = splice(@a, 0, $elements_to_keep); @a = reverse @a;
Поскольку @a в скалярном контексте дает длину массива a, а поскольку @a == $#a + 1 (если $[ не установлено в ненулевое значение), можно получить срез от $ nth (считая от нуля) до последний элемент от @a[$n..@a-1] - # tmtowtdi.
@a == $#a + 1
$[
@a[$n..@a-1]
TMTOWTDI, но я думаю, что это немного легче читать (но удаляет элементы из @source):
@source
my @last_n = splice(@source, -$n);
А если вы не уверены, что @source имеет хотя бы $n элементов:
$n
my @last_n = ($n >= @source) ? @source : splice(@source, -$n);