【问题标题】:How do I remove the first five elements of an array?如何删除数组的前五个元素?
【发布时间】:2011-07-05 02:34:02
【问题描述】:
@array = qw(one two three four five six seven eight);
<Some command here>
print @array;

【问题讨论】:

  • Perl 的数组处理非常深入。您不一定需要销毁数组才能对其进行操作。这只是例如print join("\n", @array[5..$#array]), $/;
  • 太补充了 Ashley 所说的,我几乎从来没有发现需要从数组中删除元素,除非我将它用作堆栈。我怀疑你可以改进你的代码,以便不添加五个元素(如果它们是不必要的),或者像 Ashley 的示例中那样使用数组切片来获取你需要的元素而不破坏数组。跨度>
  • 一个非常简单的问题,6 个不同的工作答案和计数。你只需要喜欢 perl :)
  • @Cyber​​-Guard Design,听听听听!

标签: arrays perl list


【解决方案1】:

这里有几种方法,按照愚蠢程度递增的顺序:

使用slice

@array = @array[ 5 .. $#array ];

使用splice

splice @array, 0, 5;

使用shift

shift @array for 1..5;

使用grep

my $cnt = 0;
@array = grep { ++$cnt > 5 } @array;

使用map

my $cnt = 0;
@array = map { ++$cnt < 5 ? ( ) : $_ } @array;

我敢肯定,黑客比我想出的更愚蠢的方法要好得多。 :)

【讨论】:

  • 我喜欢地图解决方案,它很整洁
  • 我不明白地图是如何工作的,我想我应该问一个问题。
  • Map 将循环通过@array,并且仅在循环通过前五个元素后将元素分配回数组。三元条件和$cnt 变量用于评估我们是否已经遍历了这五个元素。
  • 我还是不明白:如果 $cnt 小于 5 则列出,否则 $_ = 什么?
  • @friedo => 如果按增加的愚蠢度排序,则将前两个示例转置。 splice 是执行此操作的操作,并且可以有效地执行此操作。自分配数组切片必须复制每个切片元素,并且在最坏的情况下需要2*n 空间来这样做。事实上,我可能会将它放在重复班次示例的下方。
【解决方案2】:

您正在寻找 splice 内置函数:

splice @array, 0, 5;

【讨论】:

    【解决方案3】:

    splice @array, 0, 5; 会做到的。

    【讨论】:

    • splice 仅适用于数字。不适用于数组中的字符串元素
    【解决方案4】:

    作为对friedo 答案的评论并展示酷炫的新声明state,这里使用grep,friedo 的map 模仿。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use feature 'state';
    
    my @array = qw(one two three four five six seven eight);
    
    my @new_array = grep {state $count; ++$count > 5} @array;
    
    print "$_\n" for @new_array; 
    

    【讨论】:

      【解决方案5】:

      我刚刚意识到你只需要最后一个字符串,所以不需要循环

         my $_ = "@array"; s|(?:.*?\s){5}||;say;
      

      顺便说一句,这可能是效率最低的方法,只是玩得开心:)

      【讨论】:

      • 致反对者:虽然这不是“最好”的方法,但我的代码仍然有效,您应该意识到我提供的答案只是作为上述“更”正确解决方案的另一种选择.
      • 我没有投反对票,但我的猜测是因为如果@array 的任何元素包含空格或$" ne ' ',此解决方案将中断。
      • 很好的发现。我会努力解决这个问题
      猜你喜欢
      • 2012-04-01
      • 2014-10-21
      • 2014-05-13
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多