如何删除数组的前五个元素?
Posted
技术标签:
【中文标题】如何删除数组的前五个元素?【英文标题】: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,听听听听!
【参考方案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 ' '
,此解决方案将中断。
很好的发现。我会努力解决这个问题以上是关于如何删除数组的前五个元素?的主要内容,如果未能解决你的问题,请参考以下文章