Thread Modulempfehlung für Suchfunktion
(38 answers)
Opened by bianca at 2010-07-11 08:58
Hier ein Beispiel eines einfachen rekursiven Parser.
Er macht nichts weiter als ein @list=split " ", $text. Aber man kann noch relativ leicht nachvollziehen, wie ein rekursiv Parser arbeitet. Code (perl): (dl
)
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #!/usr/bin/perl use strict; use warnings; # Prototyp Definition # nur Damit der Code schön ist :-) sub split_text($$); # zu parsender Text my $text="das ist ein Text"; # Parser starten und Ergebnis lesen my @liste=split_text('',$text); # Ergebnis ausgeben print join("|",@liste)."\n"; ######################################################################## ######################################################################## # Rekursive Funktion. sub split_text($$) { # Element das geprüft wurde my $last=shift; # zu prüfender Text my $text=shift; # Es können auch weitere Werte übergeben werden, # wie die verschachtelungstiefe oder Eigenschaften, # aus dem Vorherigen Elemnt, # welches das parsen des Nächsten beeinflusst. # liste mit den gefundenden Elementen my @elements=(); # ist Noch Text zu Parsen? if(length($text)>0) { # Das Zerlegen zusammen mit dem Prüfen ist eine "Regel" # Hier haben wir nur eine, die auch nicht komplex ist # Hier würde das "Top-Bottom" Greifen. # Mit einer Möglichst allgemeinen Regel würde Ein großer Teil "heraus gemommen" # und an weitere Regeln weiter geleitet, # die daraus dann die Gewünschten Informationen holen # Ein spezifischen Teil aus dem zu parsenden Text herausschneiden # Hier ist es ein Zeichen, es kann aber auch mehr sein # Das ganze kann auch eine komplexe Funktion sein my $char=substr($text,0,1,''); # Den gewonnenen Teil auf bestimmte Eigenschaften untersuchen # Hier testen ob es eine Leerzeichen und damit ein "Worttrenner" ist if($char eq ' ') { # Den geparsten Teil Der Liste der gefunden Elemente hinzufügen push(@elements,$last); # Aufräumen # Hier "$last" leeren Damit das Nächte wort darin abgelegt werden kann $last=''; } # Wenn das Zeichen noch zu dem Wort gehört, # an Das bisherige Wort anhängen else { $last.=$char; } # Sich selber mit den veränderten Parametern aufrufen # und das Ergebnis der liste der Gefunden Elemente hinzufügen push(@elements,split_text($last,$text)); } # Es ist nichts mehr zu parsen # ist noch ein geparstes Element vorhanden, # das in Die Liste aufgenommen werden muss? elsif(length($last)) { push(@elements,$last); } # Ergebnis zurückliefern return @elements; } Die Idee ist wie folgt: Nehme den Text nimmt davon das erste Zeichen und schaue ob es sich um eine Leerzeichen handelt. Wenn nicht füge das Zeichen einem String an, welches das unvollständige Wort enthält und rufe die Funktion wider auf mit dem unvollständigen Wort und dem zu parsenden Text. Wenn es ein Leerzeichen ist, dann ist im String für das Unvollständige Wort ein vollständiges, welches der Liste der vollständigen Wörter hinzu gefügt und danach aus dem String für das unvollständige Wort gelöscht wird. Danach wird die Funktion wieder aufgerufen um ein weiteres Wort zu parsen. Bitte korrigiert mich wenn ich Daneben liege. EDIT: Code war unvollständig, Entschuldigung. Last edited: 2010-07-19 18:21:34 +0200 (CEST) |