Perl setzt bei regulären Ausdrücken Treffer-Variablen nicht zurück
Werden z.B. innerhalb einer Schleife verschiedene Elemente mit Hilfe eines regulären Ausdrucks ausgewertet, so werden im Falle eines Nicht-Treffers die Treffer-Variablen nicht zurückgesetzt.
use strict;
use warnings;
my @albums = (
'The Phantom Agony',
'Design Your Universe',
'The Holographic Principle'
);
foreach my $album (@albums) {
$album =~ /(Universe)/;
if (defined $1) { print "match: $1 -> '$album'\n"; }
}
Auf den ersten Blick wäre zu erwarten, daß lediglich eine Zeile als Ergebnis ausgegeben wird, tatsächlich sind dies aber zwei:
match: Universe -> 'Design Your Universe'
match: Universe -> 'The Holographic Principle'
Die Ursache liegt in der überhaupt nicht durchgeführten Überprüfung des Ergebnisses des regulären Ausdrucks, die korrekt so aussehen muss:
use strict;
use warnings;
my @albums = (
'The Phantom Agony',
'Design Your Universe',
'The Holographic Principle'
);
foreach my $album (@albums) {
if ($album =~ /(Universe)/) {
print "match: $1 -> '$album'\n"; }
}
Dann erscheint auch - wie ursprünglich erwartet - als Ergebnis nur eine Zeile:
match: Universe -> 'Design Your Universe'
Notiz an mich selbst: eine korrekte Behandlung von Abfrageergebnissen erspart eine aufwendige Fehlersuche.