如何在foreach循环中删除数组元素?

时间:2013-07-20 12:30:24

标签: perl

我想遍历一个数组并检查某些元素是否等于特定条件。 例如,我想删除包含"O"的元素,所以我可以这样做..

@Array = ("Apple","Orange","Banana");
for ($i=0 ; $i <= $#Array ; $i++) {
    if( index($Array[$i],"O") >= 0 ) {
        splice(@Array,$i,1);
    }
}

但如果我想使用foreach循环替换for循环,我该怎么办?因为在foreach循环中,没有索引所以我不能使用splice,除非我设置一个变量来存储它。

3 个答案:

答案 0 :(得分:15)

如果您想删除元素,则更好的工具是grep

@array = grep { !/O/ } @array;

从技术上讲,可以使用for循环,但你必须跳过一些箍来完成它,或者复制到另一个数组:

my @result;
for (@array) {
    if (/O/) {
        push @result, $_;
    }
}

您应该知道forforeach是别名,它们完全相同。您正在考虑的是C风格的语法:

for (@array) { print $_, "\n"; }        # perl style, with elements
for (my $x = 0; $x <= $#array; $x++) {  # C-style, with indexes
  print $array[$x], "\n";
}

答案 1 :(得分:0)

如果您的for循环除了删除元素以外还执行其他操作,则可以执行以下操作:

@Array = ("Apple","Orange","Banana");
@del = ();
for my $i (0..$#Array) {
    # do your stuff
    unshift @del, $i if ($Array[$i] eq "Orange");
}
map { splice @Array, $_, 1 } @del;

答案 2 :(得分:0)

顺便说一句,您仍然可以使用foreach样式的for循环来处理和删除元素- 无需构建一个全新的数组...

从头到尾地 向后 工作:

#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

my @fruits = qw< Apple Orange Banana >;

for my $index ( reverse 0 .. $#fruits ) {
    my $item = $fruits[$index];

    if ( $item =~ /^O/ ) {
        # Do something...
        say "Removing #$index: $item";

        # Remove the current item... 
        splice @fruits => $index, 1;
    }
}

或者,按照TMTOWTDI的精神:

say "Removing #$_: " . splice @fruits => $_, 1
  for grep $fruits[$_] =~ /^O/, reverse 0 .. $#fruits;