我想遍历一个数组并检查某些元素是否等于特定条件。
例如,我想删除包含"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
,除非我设置一个变量来存储它。
答案 0 :(得分:15)
如果您想删除元素,则更好的工具是grep
:
@array = grep { !/O/ } @array;
从技术上讲,可以使用for
循环,但你必须跳过一些箍来完成它,或者复制到另一个数组:
my @result;
for (@array) {
if (/O/) {
push @result, $_;
}
}
您应该知道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";
}
答案 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;