Kommt nicht vor. Ist eine von mir selbst generierte Datei. Ich kann von gewissen Voraussetzungen also ausgehen.
Schön für Dich - das vereinfacht die Sache.
dann denke ich, Du willst diesen Wert analysieren mit dem regular expression
Ich will da eigentlich nichts analysieren sondern nur den Text herausbekommen.
Ja, aber diese beiden Vorgänge sind in Perl nicht voneinander zu trennen, wie Du gleich sehen wirst.
if ($htmltext =~ /<a[^>]>(.*?)</a>/i)
Ist das noetig? ich weiss ja mit SICHERHEIT, dass es sich um einen Link in HTML handelt.
Mag sein. Aber Perl weiß es nicht. Und erst durch das Analysieren findet Perl die Stellen, an denen es die Zeichenkette herausschneiden soll ...
{
my $linktext = $1;
Wo ist jetzt dieses $1 her?
Bezieht sich das auf den Ausdrueck in der Klammer?
Ganz genau.
Die in runden Klammern umschlossenen Ausdrücke werden den impliziten Variablen $1, $2 usw. zugewiesen - hätte ich die Klammern weggelassen, dann wäre das direkte Ergebnis des "if" dasselbe gewesen, aber ohne diesen Seiteneffekt (der in Deinem Falle gerade erwünscht ist).
Wie sieht das dann ohne If aus?
Du kannst wohl auch einfach
$htmltext =~ /<a[^>*]>(.*?)</a>/i;
ohne "if" drum herum schreiben.
Aber nach meiner Erfahrung hat eine "this can't happen:"-Meldung im "else"-Zweig des "if" noch nie geschadet, und CPU-Zeit kostet sie auch fast keine. Für mich gehört es zum guten programmierstil, so etwas abzufragen (und im Quelltext zu dokumentieren, daß es "eigentlich" nie vorkommen kann). Du kannst ja an anderer Stelle im Programm einen Fehler einbauen - etwa beim Generieren Deiner Links - und würdest ihn dann hier netterweise gefunden bekommen.
(Das "i" am Ende macht die Sache case-insensitiv wegen des "a" im Tag;
Aso.
Und wenn ich weiss, dass das a immer klein ist, dann ist das ja nicht noetig ...
... und *das* würde die Suche dann schneller machen.
(Kein Wunder, denn bei case-insensitiver Suche muß Perl fast immer zwei Zeichen für den nächsten Vergleich ausprobieren statt nur eines. Das kannst Du im Archiv-Suchskript selbst ausprobieren.)
das "?" macht den regular expression weniger gierig, weil Du ja mehrere Treffer haben könntest.)
Ja, ist was dran. Also mit ? gibt's dann tatsaechlich nur den ersten Treffer?!
Ohne "?" ist jeder regular expression "gierig", versucht also, ein möglichst großes Stück zu matchen. Mit ihm ist er nicht gierig und versucht, ein möglichst kleines Stück zu matchen.
Probiere es aber trotzdem erst mal aus ...
Bedenke, daß Du damit *nur* den *ersten* Treffer innerhalb Deines Textes bekommst -
Genau das will ich!
Dachte ich mir - mit zwei Stücken hättest Du wenig anfangen können. ;-)
Meine 'Lösung' ist nicht idiotensicher: Es könnte sein, daß jemand innerhalb des HREF-Wertes in "" eingeschlossen ein ">"-Zeichen verwendet ... :-(((
Nein nein, ich kann davon ausgehen, dass das eher nicht vorkommen wird.
Glück gehabt - Du willst also die einfachste aller Lösungen.