【问题标题】:What's the best way to get the last N elements of a Perl array?获取 Perl 数组的最后 N 个元素的最佳方法是什么?
【发布时间】:2010-10-11 08:03:15
【问题描述】:

获取 Perl 数组的最后 N 个元素的最佳方法是什么?

如果数组小于N,我不希望返回值中有一堆undefs

【问题讨论】:

    标签: perl arrays slice


    【解决方案1】:

    我想你想要的是slice

    【讨论】:

      【解决方案2】:
      @last_n = @source[-$n..-1];
      

      如果您不需要undefs,那么:

      @last_n = ($n >= @source) ? @source : @source[-$n..-1];
      

      【讨论】:

      • 它工作正常。 undefs 在@source 没有值的位置进入@last_n,这对于“获取最后N 个元素”的含义的一些并非完全不合理的语义是正确的。
      • @Schwern:我很想知道是什么让你感到惊讶。是负整数的算术吗?希望条件表达式是显而易见的。
      • @Borodin 已经九年了,但我猜是因为3..1 不起作用没有考虑-3..-1
      • @Schwern:哈,这就是我的猜测,而且似乎至少有四个人同意你的看法。但是九年?自从编写 Perl 之后肯定没有,而且可能自从进行整数算术之后就没有。
      【解决方案3】:
      @a = (a .. z);
      @last_five = @a[ $#a - 4 .. $#a ];
      say join " ", @last_five;
      

      输出:

      v w x y z

      【讨论】:

        【解决方案4】:

        简单,没有数学:

        @a = reverse @a;
        @a = splice(@a, 0, $elements_to_keep);
        @a = reverse @a;
        

        【讨论】:

          【解决方案5】:

          TMTOWTDI,但我认为这更容易阅读(但从@source中删除了元素):

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

          如果你不确定@source 至少有$n 元素:

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

          【讨论】:

          • 从原始数组中删除元素。数组切片将它们留在原地,这很可能是想要的。
          【解决方案6】:

          由于@a 在标量上下文中给出了数组 a 的长度,并且因为 @a == $#a + 1(除非 $[ 设置为非零),所以可以从第 $n 个(从零开始计数)到 to 获取切片@a[$n..@a-1] 的最后一个元素 -- #tmtowtdi。

          【讨论】:

            猜你喜欢
            • 2014-01-26
            • 2011-04-10
            • 1970-01-01
            • 2014-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            相关资源
            最近更新 更多