Bernhard,
vorsicht!
Die $1 bezieht sich nur direkt auf das, was vorher in der RE gesucht wurde.
Soll heißen, die Klammern sind eine Art "Markierung" dafür, daß das was dazwischen gesucht/gefunden wurde, in der Variable $1 gespeichert wird.
Wenn du in der RE jetzt mehrere Klammern hast, wird von Links nach Rechts die Inhalte der Klammer-Markierungen in den Variablen $1..$n gespeichert. Dies ist aber nicht bei der Rückkehr der Funktion gesichert!!!
Du kannst statt $1 auch \1 als Backreferenz benutzen. Aber ich habe mir in Perl das $1 angewöhnt, da es besser in Perl paßt.
Wenn du eine Backreferenz aber direkt in der Suche benutzen willst, MUSST du sogar \1..\n nehmen!
Beispiel
m/\d*(\w*) \1/
Soll heißen, schaue, ob am Anfang keine oder beliebig viel Zahlen stehen (\d*) und merke dir danach (dafür die Klammern), wenn es vorkommt, ob kein oder beliebig viele Alpha-Numerische Zeichen (inkl. Unterstrich) vorkommen (\w*) und benutze diese gefundenen Alpha-Numerischen Zeichen nach dem nächsten Leerzeichen wieder als Such-String (Backreference = \1).
In diesem Fall MUSS man wie gesagt \1 als Backreference nehmen und darf nicht $1 benutzen.
Backreferences sind auch praktisch um einen String durch einen enthaltenen Teil-String zu ersetzen.
Beispiel:
Code:
$TestString = 'Dies ist ein Test für Backreference';
$TestString =~ s/.* (\bTest).*/$1/
print $TestString, "\n";
Und? Was kommt da bei raus???
Wenn man direkt nach Klammern suchen will, muß man diese mit Backslash als Meta-Zeichen maskieren.
/\(.*\)/
Bei SED ist es wiederum anders, da muß man die Klammern mit Backslash maskieren, wenn man sie als Backreferens einsetzt.
Das hat mich am Anfang ganz schön durcheinander gebracht und ich habe es immer verwechselt...
Wenn du also oben nach dem Funktionsaufruf die Zeile bearbeiten willst, benutze die Index-Variable $FoundLine. Deshalb hab ich sie vorrausschauend hinzugefügt!
Code:
if ( $TextLine )
{
$ValueText = $DerText[$FoundLine];
# Mach was mit $ValueText...
}
else
{
print 'Nix gefunden', "\n";
}
Gruß
Robert
[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]
[Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]
Lesezeichen