【问题标题】:How to get all elements from index N to the end from an anonymous Perl array?如何从匿名 Perl 数组中获取索引 N 到末尾的所有元素?
【发布时间】:2011-12-25 16:51:39
【问题描述】:

在 Perl 5 中,当我们有一个命名数组时,例如@a,从索引$N 开始获取元素很简单,只需一点slicing

my @result = @a[$N..$#a];

是否有一种标准方法可以对匿名数组执行相同操作,而无需显式提供长度? IE。可以这样吗:

my @result = (0,1,2,3,4,5)[2..5];

或者,更具体地说,这个:

my @result = (0,1,2,3,4,5)[$N..5];

被转换为不需要明确上限的东西?也许是一些晦涩难懂的 Perl 语法?也许是切丁而不是切片?

PS:我已经把它写成一个函数——我正在寻找一种更独立的方法。

【问题讨论】:

  • 如果你想将(0,1,2,3,4,5)的匿名数组分割成2 3 4 5,那么为什么不首先写(2,3,4,5)呢?
  • @Blagovest Buyukliev:因为我的起始索引是可变的。我编辑了我的问题以反映这一要求。
  • 什么是“匿名数组”? :-)
  • 匿名数组和列表在 Perl 中也是完全不同的东西。 thkala 这里有一个列表,而不是匿名数组。
  • 我想知道为什么perl不支持@a[$i..-1]语法,而它支持在[...]中使用,而不是-1作为结束索引的多个切片,为什么?

标签: arrays perl


【解决方案1】:

你可以splice它:

@result = splice @{[0..$M]}, $N;  # return $N .. $M

【讨论】:

  • 啊,这绝对有效!我试过splice,但不能完全正确。 +1
【解决方案2】:

如果将数组 ref 设置为主题,则无需为数组 ref 命名:

子返回_array_ref {[1 .. 5]} 我的@slice = 映射@$_[$n .. $#$_] => 返回_array_ref;

或者,如果您正在使用列表:

子返回列表 {1 .. 5} 我的@slice = sub {@_[$n .. $#_]}->(returns_list);

【讨论】:

    【解决方案3】:

    我认为 mob 的 splice 是最好的选择,但本着选择的精神:

    my @result = reverse ((reverse 0..5)[0..$N+1]);
    

    这将返回与上例相同的结果:

    my @result = (0..5)[$N..5];
    

    【讨论】:

    • 这将返回$N+1 项目,但您需要$#{anonymous_array}-$N 项目。
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-02-10
    • 2012-02-16
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多