RegEx auf Liste oder Liste von RegEx

02/02/2010 - 19:59 von Paolo Peruzzi | Report spam
Hallo.

Ich möchte ein Wort mit einer Liste von Wörtern (URLs) vergleichen.
Normalerweise würde ich die Liste als Hash ablegen und fragen:

if ($hash{$word})

Nun soll aber über eine RegEx gefragt werden, z.B. /.*$_/
Gemàß FAQ [1] ist es schneller, die gesamte Liste als RegEx
vorzukompilieren und in ein Array zu legen:

@patterns = map { qr/\b$_\b/i } qw( foo bar baz );

Irgendwie sieht mir das wie eine doppelte Datenhaltung aus, da die
Wortliste bereits vorliegt. Außerdem muss von Anfang bis Ende die RegEx-
Liste durchlaufen und angewendet werden.
Gibt es keine Möglichkeit nach der Art $hash{$word} indiziert (und
schnell) zuzugreifen, nur mit der Methodik einer RegEx wie /.*$_/ ?

Gruß,
Paolo

[1] http://perldoc.perl.org/perlfaq6.ht...tly-match-
many-regular-expressions-at-once?
 

Lesen sie die antworten

#1 Frank Seitz
02/02/2010 - 21:07 | Warnen spam
Paolo Peruzzi wrote:

Ich möchte ein Wort mit einer Liste von Wörtern (URLs) vergleichen.
Normalerweise würde ich die Liste als Hash ablegen und fragen:

if ($hash{$word})



Das ist ein falsches Konzept: Wenn $word dein Suchwort ist,
liefert $hash{$word} dir *nicht* die Liste aller Hash-Werte, die
$word enthalten.

Nun soll aber über eine RegEx gefragt werden, z.B. /.*$_/
Gemàß FAQ [1] ist es schneller, die gesamte Liste als RegEx
vorzukompilieren und in ein Array zu legen:

@patterns = map { qr/\b$_\b/i } qw( foo bar baz );

Irgendwie sieht mir das wie eine doppelte Datenhaltung aus, da die
Wortliste bereits vorliegt.



Dieser Schritt kompiliert die Pattern. Das spart Rechenaufwand,
kostet auf der anderen Seite aber Speicher.

Außerdem muss von Anfang bis Ende die RegEx-
Liste durchlaufen und angewendet werden.



Ja klar. Alternativ könntest du die Pattern mit | verodern,
aber eine Schleife brauchst du in jedem Fall.
Wenn die Suchwörter lediglich Wörter sind, keine Regulàren Ausdrücke,
ist substr() sicherlich die effizienteste Operation.

Gibt es keine Möglichkeit nach der Art $hash{$word} indiziert (und
schnell) zuzugreifen, nur mit der Methodik einer RegEx wie /.*$_/ ?



Wie gesagt, falsches Konzept, siehe oben.

Grüße
Frank
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Blog: http://www.fseitz.de/blog

Ähnliche fragen