1
我想在Perl中實現Knuth Morris Pratt algorithm。以下是我的代碼,我將該算法的Perl第一版中的Mastering Algorithms引用。當我運行代碼時,它會打印-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1。我哪裏錯了?Knuth Morris Pratt Perl中的算法實現
代碼:
#!/usr/local/bin/perl
#text
my $seq = "babacbadbbac";
#pattern
my $motif = "acabad";
#pass the text and pattern to knuth_morris_pratt subroutine
my @res = knuth_morris_pratt($seq, $motif);
#print the result
print "The resulting array is:";
print "@res";
#computation of the prefix subroutine
sub knuth_morris_pratt_next
{
my($P) = @_; #pattern
use integer;
my ($m, $i, $j) = (length $P, 0, -1);
my @next;
for ($next[0] = -1; $i < $m;) {
# Note that this while() is skipped during the first for() pass.
while ($j > -1 && substr($P, $i, 1) ne substr($P, $j, 1)) {
$j = $next[$j];
}
$i++;
$j++;
$next[$i] = substr($P, $j, 1) eq substr($P, $i, 1) ? $next[$j] : $j;
}
return ($m, @next); # Length of pattern and prefix function.
}
#matcher subroutine
sub knuth_morris_pratt
{
my ($T, $P) = @_; # Text and pattern.
use integer;
my ($m,@next) = knuth_morris_pratt_next($P);
my ($n, $i, $j) = (length($T), 0, 0);
#my @next;
my @val;
my $k=0;
while ($i < $n)
{
while ($j > -1 && substr($P, $j, 1) ne substr($T, $i, 1))
{
$j = $next[$j];
}
$i++;
$j++;
if($j>=$m)
{
$val[$k]= $i - $j; # Match.
}
else
{
$val[$k]=-1; # Mismatch.
}
$k++;
}
return @val;
}
你試過用'perl -d your_script.pl'來調試它嗎? – mvp 2013-05-11 19:27:55
它說:從perl5db.pl版本1.33加載DB例程 編輯器支持可用。 輸入h或'h h'尋求幫助,或者'man perldebug'尋求更多幫助。 main::(q1.pl:3):\t my $ seq =「babacbadbbac」; DB <1> – 2013-05-11 19:37:44
太棒了。現在調試它。 'B Num' - 設置斷點。 'r' - 啓動程序。 'c' - 繼續。 'p $ var' - 打印變量值。 'n' - 執行下一行。 ''' - 跳進程序。 '' - 重複上一個命令。 'l' - 打印 –
mvp
2013-05-11 19:40:39