Warum bekomme ich Treffer anzeigt, obwohl der Ausdruck nicht matchen kann?
Inhalt:
Problem
In einer Schleife werden verschiedene Werte mit einem Regulären Ausdruck überprüft. Dabei wird mir immer
ein Treffer angegeben, der in dem Wert gar nicht existiert. Zum Beispiel
my @array = qw(Dies ist ein Treffer);
for my $value ( @array ){
$value =~ /(.t)/;
print $1,"\n";
}
Ausgabe:
st
st
st
Dabei kommt das "st" in "ein" und "Treffer" gar nicht vor. Was mache ich falsch??
Lösung
Die Variable $1 (oder eine andere $#-Variable) wird nicht zurückgesetzt. Das heißt: Ist einmal ein Treffer vorhanden, wird $1 mit dem Treffer "gefüllt". Dieser Wert bleibt bis zum nächsten Treffer eines Regulären Ausdrucks erhalten.
Umgehen kann man die Problematik so:
Lösung 1 (mit "if"):
my @array = qw(Dies ist ein Treffer);
for my $value ( @array ){
if( $value =~ /(.t)/ ){
print $1,"\n";
}
}
Lösung 2 (eine weitere Variable):
my @array = qw(Dies ist ein Treffer);
for my $value ( @array ){
my ($test) = $value =~ /(.t)/;
print $test,"\n";
}
Bei der Lösung 2 muss man aufpassen, dass bei eingeschaltetem warnings eine Warnmeldung mit "uninitialized value" kommt.
Ansonsten ist Lösung 2 meist übersichtlicher, jedoch lässt es sich bei s/// nicht anwenden.
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff