对于初学者,$a =~ /$b/
不检查是否相等。你需要
$second_hash_array[$j]{geneID} =~ m/^\Q$first_hash_array[$i]{geneID}\E\z/
或者干脆
$second_hash_array[$j]{geneID} eq $first_hash_array[$i]{geneID}
了点。
其次,
for my $i (0 .. $#first_hash_array) {
... $first_hash_array[$i] ...
}
可以写得更简洁的
for my $first (@first_hash_array) {
... $first ...
}
下就行了是
for my $second (@second_hash_array) {
if (...) {
push @subset, $second;
}
}
可以多次添加$second
至@subset
。你要么需要添加last
# Perform the push if the condition is true for any element.
for my $second (@second_hash_array) {
if (...) {
push @subset, $second;
last;
}
}
或移动push
圈外
# Perform the push if the condition is true for all elements.
my $flag = 1;
for my $second (@second_hash_array) {
if (!...) {
$flag = 0;
last;
}
}
if ($flag) {
push @subset, $second;
}
取决于你想要做什么的。
要从阵列中删除,可以使用splice
。但是从数组中移除会混淆所有索引,所以最好将数组向后迭代(从最后一个索引到第一个索引)。
它不仅复杂,而且价格昂贵。每次拼接时,阵列中的所有后续元素都需要移动。
更好的方法是过滤元素并将结果元素分配给数组。
my @new_first_hash_array;
for my $first (@first_hash_array) {
my $found = 0;
for my $second (@second_hash_array) {
if ($first->{geneID} eq $second->{geneID}) {
$found = 1;
last;
}
}
if ($found) {
push @new_first_hash_array, $first;
}
}
@first_hash_array = @new_first_hash_array;
通过迭代反复@second_hash_array
是不必要昂贵。
my %geneIDs_to_keep;
for (@second_hash_array) {
++$geneIDs_to_keep{ $_->{geneID} };
}
my @new_first_hash_array;
for (@first_hash_array) {
if ($geneIDs_to_keep{ $_->{geneID} }) {
push @new_first_hash_array, $_;
}
}
@first_hash_array = @new_first_hash_array;
最后,我们可以替换for
有grep
给下面的简单而有效的答案:
my %geneIDs_to_keep;
++$geneIDs_to_keep{ $_->{geneID} } for @second_hash_array;
@first_hash_array = grep $geneIDs_to_keep{ $_->{geneID} }, @first_hash_array;
感谢回答,我不能肯定,但我认为其实这个删除我想要什么,并保持我想要去什么勒特。如果我想只保留first_hash_array中的哈希值,并使用与其他second_hash_array匹配的geneID,则不应该如此:'my%geneIDs_to_keep; ++ $ geneIDs_to_keep {$ _-> {geneID}} for @second_hash_array;'为了得到我想保留的ID,然后像'my @ new_array = grep $ geneIDs_to_keep {$ _-> {geneID}},@ first_hash_array;'? – Ward9250
另外,如果你有时间,你能扩展最后的代码块吗?对于我的新手理解,我可以看到前两行创建了一个散列,其中所有的geneID都将被删除/保留,方法是遍历数组中的每个散列并从每个散列获取geneID,使用循环和默认变量。对我来说最后一行更难以理解。我在这里查看grep页面:http://perldoc.perl.org/functions/grep.html。给定一个简单的例子'@foo = grep {!/ ^#/} @bar;'这是'!geneIDs_to_delete {$ _-> {geneID}}'我很难解释。 – Ward9250
再读一遍,最后一行迭代遍历,'@ first_hash_array'设置'$ _',所以例如'$ _-> {geneID}'部分变成'ID_002',如果那是'geneID' 'first_hash_array'的元素,然后剩下的变成'grep!$ geneIDs_to_delete {ID_002}',用于测试ID_002是否在要删除的基因列表中? – Ward9250