Perl setzt bei regulären Ausdrücken Treffer-Variablen nicht zurück

14. September 2022 · Programmierung · andreas · Kein Kommentar

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.