【问题标题】:perl list subset rangeperl 列表子集范围
【发布时间】:2014-10-06 07:25:51
【问题描述】:

在我问的另一个问题中,我试图找到一种从列表中获取子集列表(或数组)的方法,认为这可以通过切片或拼接来完成。使用数组,它就像这样微不足道:

@arr[2 .. $#arr]

获取一个数组,该数组具有从索引 2 处的元素开始到末尾的所有相同元素(即跳过前 2 个元素)。但是,如何使用列表来做到这一点,您不能使用类似 $#arr 的东西(因为列表没有名称)。那么问题来了,是否可以在不使用复制到数组或使用多行代码的情况下用列表来做这样的事情?是否有一些简单的符号来提取到达列表 end 的任意长度列表(无需事先知道列表的长度)?换句话说,是这样的:

(1,2,3,4,5,6,7)[1 .. -1];

(这显然行不通)得到

(2,3,4,5,6,7)

这样的符号或函数是否存在(对于列表)?

【问题讨论】:

  • 我不相信它是内置的,但是你可以把它写成一个很短的函数。
  • 您可以创建一个匿名数组引用并采用splice 例如:print "$_\n" for splice( [ (1,2,3,4,5,6,7) ], 1 );
  • @jaypal,复制每一个标量。我的版本只为每个标量复制一个 C 指针。
  • @ikegami 你是对的。已经投票给你的答案。 :) 还有很多东西要学。
  • 只是好奇你为什么要首先这样做。用例是什么?

标签: perl list


【解决方案1】:
sub { @_[1..$#_] }->( 1,2,3,4,5,6,7 )

【讨论】:

  • ... 或者你可以使函数更短和匿名,并在同一个表达式中调用它。聪明:)
  • @ikegami:太酷了!我的第一个想法是perl -e 'print +(1,2,3,4,5,6,7)[1..sub{~~@_}->(1,2,3,4,5,6,7)]'
  • @Gnouc,重复生成列表的表达式是一个非常糟糕的主意。它容易出错,并且实际的列表生成器可能很昂贵并且可能有副作用。
  • @ikegami:是的,我知道。这就是为什么我不发布答案。只是为了强调你的答案有多聪明!
  • 哇!凉爽的!我不知道你可以用潜艇做到这一点。谢谢!在我接受这个作为答案之前,我会等待看看其他人是否有不同的方法。
【解决方案2】:

概括一下 ikegami 的解决方案:

my @a = (1,2,3,4,5,6,7);
my @b = sub { @_[1..$#_] }->(@a);

b 现在是 (2,3,4,5,6,7)

** 您也可以使用 splice() 以更直接的方式执行此操作:**

my @c = @a;
splice (@c, 0, 1, ());

c 现在是 (2,3,4,5,6,7)

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2021-10-26
    • 2017-01-28
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多