Thread Modulempfehlung für Suchfunktion (38 answers)
Opened by bianca at 2010-07-11 08:58

topeg
 2010-07-19 15:11
#139925 #139925
User since
2006-07-10
2611 articles
BenutzerIn

user image
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)

View full thread Modulempfehlung für Suchfunktion