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

use*_*116 5 perl

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

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

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

TLP*_*TLP 17

如果要删除元素,更好的工具是grep:

@array = grep { !/O/ } @array;
Run Code Online (Sandbox Code Playgroud)

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

my @result;
for (@array) {
    if (/O/) {
        push @result, $_;
    }
}
Run Code Online (Sandbox Code Playgroud)

你应该知道for并且foreach是别名,他们做同样的事情.您正在考虑的是C风格的语法:

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