[quote=micross,12.01.2006, 18:45]@Crian
Siehst du da noch ein if geschrieben?
[/quote]
scheint ein missverstaendnis zu sein, je nachdem, ob man nur den if-befehl oder (vielleicht etwas schlampig) if allgemeiner sieht (also auch unless, or, and, ...)
[quote=micross,12.01.2006, 18:45]@Crian
@Strat
Du schreibst:
$1 wird durch den nicht erfolgreichen match nicht geleert, sondern es bleibt der inhalt vom letzten erfolgreichen match drinnen stehen.
Mein Kommentar:
Genau das ist das Problem. Aber wie verhält sich denn dann $& ?
$& wird doch auch mit dem Treffer gefüllt wenn eine Übereinstimmung besteht! Aber es gibt auch nichts aus wenn es nichts gefunden hat! Auch nicht den Wert den es in einen vorherigen Match schon mal gespeichert hat.
Mein Fehler war wohl diese beiden Systemvariablen eins zu eins zu vergleichen. Die Beiden verhalten sich doch dann unterschiedlich da $1 wirklich dafür gedacht ist den Wert zu behalten.
[/quote]
$& ist eigentlich nur (noch?) in Perl, weil es sie auch in anderen sprachen gibt (z.B. sed); aber das bietet so viele performancenachteile, dass man es nicht verwenden sollte. Aber das wird fuer jede Regex gesetzt, waehrend $1, $2 usw. nur dann gesetzt werden, wenn die regex erfolgreich ist und was gecaptured wird.
$1, $2, $3 bis $9 sind recht nett, aber ohne ueberpruefung auf einen match meist wertlos. haeufig sieht man
if ($irgendwas =~ /(blabla)/) {
print "ok: $1\n";
}
wenn man mehr werte herausholen will, ist wohl der weg ueber das rueckgabearray der einfachste, z.B.
my ($val1, $val2, $val3) = $string =~ /(.)(.)(.)/;
wenn der match nicht erfolgreich ist, sind $val1-$val3 einfach leer.
(achtung: falle:
my $value = "abcde" =~ /(de)/;
print $value, "\n";
gibt vermutlich nicht das aus, was man auf den ersten blick erwartet; dafuer ist ein listenkontext besser:
my ($value) = "abcde" =~ /(de)/;
print $value, "\n";