Da du ja sagtest das du nur die Anzahl brauchst, dann würde ich soetwas machen, ohne die Schleifen, und dem zwischen Hash, der dich ja anscheind nicht Interessiert.
$string = "Hier sollte jetzt ein langer String sein, der auch hallo welt enthält. Wenn er nicht Hallo Welt enthält ist das auch nicht schlimm. weltstein sollte aber nicht gefunden werden.";
@woerter = qw/hallo welt/;
$woerter = join "|", @woerter;
$anz = () = $string =~ m/\b(?:$woerter)\b/g;
In $anz ist dann die gefunde Anzahl der Wörter enthalten. In diesem Fall wäre das "2". Wenn Groß- und Kleinschreibung egal ist, dann kannst du bei der Regex noch die Option /i hinzufügen, was dann die "richtige" Anzahl von 4 findet.
Allerdings ist eine Alternative mit 300 Elementen wohl alles andere als performant.
@strat
Quotemy $re = join ("|", @array);
...
...$string =~ m/($re)/g....
Das ist leider etwas falsch. Den er möchte ja die Wörter finden. Du machst zwar alles in einer Alternative. Allerdings überprüfst du nicht auf Wörter. Wenn wie bei mir nach "hallo" und "welt" gesucht wird, aber die begrenzer "\b" fehlen würde, dann würden 5 Treffer ausgegegeben werden, da "welt" auch auf "Weltstein" gematcht hat, was es ja eben nicht soll.
EDIT:
Ups, ganz überlesen dass du dich dich ja schon im Nachhinein verbessert hattest.
Die Option /o sollte man schon nehmen, da ein String in der Regex evauliert wird, und bei jedem durchlauf überprüft werden muss ob sich der String nicht verändert hat. Da der evaluierte String sich ja nicht ändert, gibt es keinen Grund gegen /o. Bei meiner version ist /o egal, da die Regex nicht in einer schleife vorkommt, und somit keine Überprüfungen stattfinden.
--------------------------------------
Ansonsten müssen für study besondere Anforderungen existieren, damit sich der mehraufwand von study erstmal lohnt.
1) Es darf in der Regex keine /i Option vorkommen. Wenn dies vorkommt hat Study keine Wirkung
2) Es darf keine Substitution benutzt werden, sobald der Suchstring einmal verändert wurde, hat study ebenfalls keine Wirkung.
3) Es müssen literale Elemente in der Regex vorkommen. Diese Literale dürfen aber ebenfalls nicht innerhalb von (?i) oder (?i:) vorkommen. Kommen keine Literalen Elemente vor. Bringt Study auch nichts.
4) Study verbraucht ca. 4 mal mehr Speicher als der String groß ist. Daher sollte man Study niemals auf sehr kleine Strings anwenden. Da die Listenerzeugung mit Study mehr Performance kostet als das Suchen
5) Bei großen Strings kann es enorme Vorteile bringen. Allerdings auch nur dann wenn man sehr viele unterschiedliche Regexe nacheinander auf den String anwendet, ohne den String zu verändern. Erst dann hat man einen Vorteil der Listenerzeugung von Study. Je mehr matches man auf den gleichen String macht, desto mehr lohnt sich study, bei weniger wird der Aufwand von study größer als der Performance Gewinn den es erzielen soll.
6) Study bringt nur absolut dann etwas bei einer Regex wenn ein bestimmter Literaler Text vorkommen [b]muss[\b]. Wenn alles nur alternativen, oder alles Optional ist, bringt es ebenfalls nicht. Zeichenklassen fallen ebenfalls weg. Weiterhin muss dieser Literaler Text herausgestellt werden. Also die Regex Engine muss erkennen können, dass dieser Text vorkommen muss. Das hat etwas mit dem schreiben der Regex zu tun.
Hier nochmal ein Zitat von Jeffrey E. F. Friedl wann study etwas bringt. Besser könnte ich es nicht beschreiben.
Quotestudy ist dann von Nutzen, wenn ein großer Suchstring immer wieder abgesucht werden muss, ohne daß er dazwischen verändert wird. Ein gutes Beispiel ist das Filterprogramm, das ich beim Erstellen dieses Buches benutzt habe. Ich habe das Buch in einer selbstgezimmerten Sprache geschrieben, die durch diesen Filter in SGML übersetzt wird (das SGML wird danach in troff und schließlich PostScript umgesetzt). In diesem Filter wird jedes Kapitel zu einem einzigen String (dieses Kapitel ist etwa 475 Kilobyte groß). Auf diesen String wird eine große Anzahl von Tests angewandt, die ungültige Formatierungen erkennen sollen. Diese Tests verändern den Text nicht, sie prüfen nur; und sie suchen meist nach literalen Strings - das ist die Situation, die auf study zugeschnitten ist.
Aus dem buch Reguläre Ausdrücke. 2 Auflage Seite. 370.
Auser der größe des Strings (die ich ja nicht weiß) trifft aber kein einzige Sache zu die entscheident ist ob study Performance Vorteile erbringen könnte. Und selbst wenn die größe des Strings stimmen würde, würde study in diesem Fall nichts bringen.
EDIT: Regex und join optimiert.\n\n
<!--EDIT|sid burn|1146777327-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de