我想创建一个循环,我遍历一个数组中的所有元素(@ array1),如果在另一个数组(@ array2)中找到相同的元素,我想要第三个数组的值(@ array3) )将相同的索引添加到第一个数组并从第三个数组中删除。我试过这种方式,但if语句的行在单位化值上运行,并且它永远循环。
foreach my $elem1 (@array1){
my $i = 0;
while ($i < scalar @array2){
if($array2[$i]==$elem1){
push (@array1, $array3[$i]);
delete $array2[$i];
}
else{
$i++;
}
}
}
答案 0 :(得分:1)
问题是如果元素匹配,你不会增加$ i。删除else
。
答案 1 :(得分:1)
嗯,这是处理问题的一种方法(在某种程度上我理解你想做什么)。每当您需要回答有关成员资格的问题时,您可能希望使用哈希值。
use strict;
use warnings;
my @array1 = ( 11, 22, 33, 44);
my @array2 = ( 11, 2, 3, 44, 5, 44);
my @array3 = (-11, -2, -3, -44, -5, -444);
# Keep track of every value in @array1.
my %vals = map { $_ => 1 } @array1;
my @keep_indexes;
# Go through @array2, either adding the corresponding
# value in @array3 to @array1 or storing the array index.
for my $i (0 .. $#array2) {
if ($vals{$array2[$i]}){
push @array1, $array3[$i];
}
else {
push @keep_indexes, $i;
}
}
# Rebuild @array3 from the indexes that we stored.
# Change this to @array2 if you want to delete from that array instead.
@array3 = map $array3[$_], @keep_indexes;
print join(' ', @array1), "\n"; # 11 22 33 44 -11 -44 -444
print join(' ', @array2), "\n"; # 11 2 3 44 5 44
print join(' ', @array3), "\n"; # -2 -3 -5
我不喜欢这段代码,所以这里有一些注意事项:
@array1
,@array2
等),那么您就会感到困惑。您需要更好的变量名称,或者更可能的是更好的数据结构。答案 2 :(得分:0)
您正在删除array2中的元素,而不是问题中所述的array3。我认为删除操作将数组元素设置为undef
。下一次循环它会检查现在{$ 1}}的相同元素对$ elem。因此错误。然后它一次又一次地做同样的事。