如果你正在尋找一個只有一個單詞性格的差異,你可以使用一些技巧。首先,比較兩個詞並計算不同的字符數,使用此:
($word1^$word2) =~ tr/\0//c
這確實一個stringwise獨家或兩個詞;無論字符是否相同,都會產生「\ 0」;如果它們不相同,則會導致非「\ 0」。 tr在其補足計數模式下計算差異。其次,注意到單詞的前半部分或後半部分必須完全匹配,根據單詞的前半部分和後半部分將單詞分爲哈希,從而減少需要檢查給定單詞的其他單詞的數量。
這種方法應該只有兩倍或三倍所有字符串的內存(加上一點開銷);可以通過將\$word
和$$_
用於輸出中的grep和分類映射$$ _,@match,以某種速度爲代價將其減少至內存的一至兩倍。
如果單詞長度相同,則可以刪除散列的頂層,並使用兩個不同的散列用於單詞的開始和結尾。
use strict;
use warnings;
use autodie;
my %strings;
my $filename = shift or die "no filename provided\n";
open my $fh, '<', $filename;
while (my $word = readline $fh) {
chomp $word;
push @{ $strings{ 'b' . length $word }{ substr($word, 0, length($word)/2)} }, $word;
push @{ $strings{ 'e' . length $word }{ substr($word, length($word)/2)} }, $word;
}
seek $fh, 0, 0;
while (my $word = readline $fh) {
chomp $word;
my @match = grep 1 == ($word^$_) =~ tr/\0//c, @{ $strings{ 'b' . length $word }{ substr($word, 0, length($word)/2) } }, @{ $strings{ 'e' . length $word }{ substr($word, length($word)/2) } };
if (@match) {
print "$word - " . join(' ', sort @match) . "\n";
}
else {
print "$word\n";
}
}
請注意,這隻查找替換,而不是插入,刪除或換位。
告訴我們更多關於您的實際數據;這些真正的單詞的長度變化很大嗎?或者它們是固定的還是有限的長度範圍或使用一組字符? – ysth 2014-12-07 06:48:54
你每行只有一個單詞,你想比較每個單詞與文件中的每一個單詞? – ysth 2014-12-07 06:49:43
和「AABA」和「AAAB」不符合我對單個字符不匹配的定義;這是一個錯誤?如果不是,你的定義是什麼? – ysth 2014-12-07 07:05:58