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

17

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

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

    
задан mike 04.03.2009 в 18:57
источник

6 ответов

34
@last_n = @source[-$n..-1];

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

@last_n = ($n >= @source) ? @source : @source[-$n..-1];
    
ответ дан chaos 04.03.2009 в 19:06
источник
  • Это не работает, если @source имеет меньше, чем $ n элементов. –  mike 04.03.2009 в 19:10
  • Все работает нормально. undefs переходят в @last_n в положениях, для которых @source не имеет значений, что является правильным для некоторой не совсем-необоснованной семантики того, что означает «взять последние N элементов». –  chaos 04.03.2009 в 19:13
  • Это довольно умно! –  Schwern 05.03.2009 в 03:59
  • @Swwern: Я заинтригован, чтобы узнать, что вас удивило. Это арифметика с отрицательными целыми числами? Надеюсь, условное выражение очевидно. –  Borodin 29.05.2018 в 11:14
  • @Borodin Прошло девять лет, но я собираюсь догадаться, что, поскольку 3..1 не работает, не учитывалось -3 ..- 1. –  Schwern 29.05.2018 в 21:08
5

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

    
ответ дан siukurnin 04.03.2009 в 19:01
источник
2
@a = (a .. z);
@last_five = @a[ $#a - 4 .. $#a ];
say join " ", @last_five;

выходы:

  

v w x y z

    
ответ дан Nathan 04.03.2009 в 19:06
источник
1

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

@a = reverse @a;
@a = splice(@a, 0, $elements_to_keep);
@a = reverse @a;
    
ответ дан sbin_bash 21.03.2017 в 15:57
источник
-1

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

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

И если вы не уверены, что @source имеет как минимум $n элементов:

my @last_n = ($n >= @source) ? @source : splice(@source, -$n);
    
ответ дан user2355282 29.05.2018 в 10:36
источник
  • Это удаляет элементы из исходного массива. Метка массива оставляет их на месте, что наиболее вероятно, что нужно. –  Borodin 29.05.2018 в 10:41
-3
 my $size = (scalar @list) - 1;
 my @newList = @list[$size-$n..$size];
    
ответ дан Tim Howland 04.03.2009 в 19:05
источник
  • Не работает. Вам нужно ... сигила, а не запятая, а размер $ слишком велик. –  chaos 04.03.2009 в 19:15
  • вы правы, слишком много времени в groovy - я отредактирую, чтобы соответствовать –  Tim Howland 04.03.2009 в 19:17
  • Может также просто сказать $ # список, как Натан вместо того, чтобы ставить скаляр (@list) - 1 в переменную. –  chaos 04.03.2009 в 19:31
  • @TimHowland: все, что вы публикуете в качестве ответа, должно быть проверено. Вы должны объявить код как непроверенный, если есть законная причина пренебрежения. –  Borodin 29.05.2018 в 10:44