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

UtilFaqSubForm edit

Titel Warum bekomme ich Treffer anzeigt, obwohl der Ausdruck nicht matchen kann?
Autor
Bereich FaqRegulaereAusdruecke
Tags
Topic revision: 2008-08-16, ChristophBussenius
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.