對於初學者,$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