2015-10-10 53 views
0

我只需要計算兩個字符串之間的不匹配。假設:兩個字符串之間perl計數不匹配

my $s1 = "ATCG"; 
my $s2 = "ATTG"; 

這應該給:1作爲不匹配。無需找到位置或錯配。

我正在尋找快速的方法。我認爲分裂成數組和循環匹配或使用substr匹配每個位置可能會很慢,因爲需要檢查超過十億對。謝謝

+0

兩個輸入的長度是否相同?如果沒有,「ABCD」和「ACD」的區別是1還是別的?即使如此,「ABCDEF」和「ACDEFB」的區別是2,5還是別的? – hobbs

+0

如果你同意的東西多一點http://search.cpan.org/dist/Text-Levenshtein/lib/Text/Levenshtein.pm – Sobrique

回答

4

只是XOR兩個字符串在一起。結果中的每個NUL字符表示兩個字符串中字符相同的位置。

my ($s1, $s2) = qw(ATCG ATTG); 

my $count = ($s1^$s2) =~ tr/\0//c; 

print "$count\n"; # Prints "1" 

注意:如果你要反覆比較字符串,通過它和一個到你比較它與utf8::downgrade就是確保^一樣快,因爲它可以。

utf8::downgrade($s1); # Change the internal format in which 
utf8::downgrade($s2); # the strings are stored to speed up $s1^$s2. 

如果任一字符串包含U + 00FF以上的UNICODE字符,這是無用/浪費的。

+0

很好的答案你可以在代碼中共享'^'的使用,它是如何作品。? – mkHun

+1

XOR是一個按位運算符,用於發現位對之間的差異。所以它成爲一個用1位來計算字節的問題,或者那些不完全由零位組成的問題。 – ikegami

+0

感謝誰做了編輯 – ikegami

相關問題