7

我想遍历一个数组并检查某些元素是否等于特定条件。例如,我想删除包含的元素"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,除非我设置一个变量来存储它。

4

3 回答 3

18

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

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

从技术上讲,可以使用for循环,但是您必须跳过一些圈才能做到这一点,或者复制到另一个数组:

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

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

for (@array) { print $_, "\n"; }        # perl style, with elements
for (my $x = 0; $x <= $#array; $x++) {  # C-style, with indexes
  print $array[$x], "\n";
}
于 2013-07-20T12:42:06.953 回答
2

顺便说一句,您仍然可以使用foreach-stylefor循环来处理和删除元素 - <em>而不必构建一个全新的数组......

只需从头到尾向后工作:

#!/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;
于 2020-03-13T17:51:14.670 回答
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;
于 2019-07-30T10:07:30.223 回答