1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#!/usr/bin/perl use strict; use warnings; use interger; # Allgemein: # w /P = Wort oder Muster (Pattern) # i = Anfangposition des Suchwortes s im Text t # j = Position im Suchwort (Länge des Präfixes) # t =Text # n = Länge des Textes # s = Suchtwort # m = Länge des Suchwortes # s = Suchwort # m= Länge des Suchwortes # Berechnung der Präfix sub ermorde_Knuth_next{ my($P)=@_; # das Muster my ($m;$i,$j)=(lenght $P,0,-1); my @next; # Array for ($next[0] = -1; $i < $m; ) { 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,@net); # Länge des Musters und der Prefix Funktion } #Matcher sub ermorde_Knuth { my ( $T, $P ) = @_; # Text und Muster. my $m = ermorde_Knuth_next( $P ); my ( $n, $i, $j ) = ( length($T), 0, 0 ); my @next; while ( $i < $n ) { while ( $j > -1 && substr( $P, $j, 1 ) ne substr( $T, $i, 1 ) ) { $j = $next[ $j ]; } $i++; $j++; return $i - $j if $j >= $m; # Match - Hurra wir haben einen Treffer. } return -1; # Mismatch - Shit - daneben getroffen. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#!/usr/bin/perl -w use strict; use warnings; # Berechnung des Präfix ###### sub ermorde_Knuth_next{ my($P)=@_; # das Muster use integer; my$m=(0..lenght($P)-1); my$i=0; my$j=-1; my @next; # Array for ($next[0] = -1; $i < $m; ) { 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); # Länge des Musters und der Prefix Funktion } ############################################## # ######## Matcher sub ermorde_Knuth { my ( $T, $P ) = @_; # Text und Muster. use integer; my $m = ermorde_Knuth_next( $P ); #knuth_morris_pratt_next my ( $n, $i, $j ) = (length($T), 0, 0 ); my @next; while ( $i < $n ) { while ( $j > -1 && substr( $P, $j, 1 ) ne substr( $T, $i, 1 ) ) { $j = $next[ $j ]; } $i++; $j++; return $i - $j if $j >= $m; # Match - Hurra wir haben einen Treffer. } return -1;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#!/usr/bin/perl -w use strict; use warnings; # Berechnung des Präfix ###### sub ermorde_Knuth_next{ my($P)=@_; # das Muster use integer; my$m=(0..lenght($P)-1); my$i=0; my$j=-1; my @next; # Array for ($next[0] = -1; $i < $m; ) { 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); # Länge des Musters und der Prefix Funktion } ############################################## #Matcher sub ermorde_Knuth { my ( $T, $P ) = @_; # Text und Muster. use integer; my $m = ermorde_Knuth_next( $P ); #knuth_morris_pratt_next my ( $n, $i, $j ) = (length($T), 0, 0 ); my @next; while ( $i < $n ) { while ( $j > -1 && substr( $P, $j, 1 ) ne substr( $T, $i, 1 ) ) { $j = $next[ $j ]; } $i++; $j++; return $i - $j if $j >= $m; # Match - Hurra wir haben einen Treffer. } return -1;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use Getopt::Long; my $filename = ""; my $pattern = ""; my $result = GetOptions ("file=s" => \$filename, # string "pattern=s" => \$pattern); # flag ); my $text; # Daten einlesen open (my $fh, "<", $filename) or die "ERROR: File $filename not opened: $!\n"; while ($text = <$fh>) { # zeilenweise Text aus Datei $filename einlesen my $ret = ermorde_Knuth($text, $pattern); if ($ret != -1) { print "Treffer $ret von $pattern in $text\n"; } } close($fh) or die "ERROR: File $filename not closed: $!\n";