Scope von $1

21/12/2010 - 11:30 von Ferry Bolhar | Report spam
Hallo,

ich bin bei der Verwendung regulàrer Ausdrücke auf ein Verhalten
gestoßen, das ich mir nicht erklàren kann. Es làsst sich wie folgt
darstellen:

my $line = 'ADVGRW_SMS_112233';
$line =~ /(SMS_\d+)/;
print "$1";
$line = '';
$line =~ /(SMS_\d+)/;
print "$1";

Die erste Ausgabe liefert korrekt "SMS_112233";

Erstaunlicherweise hat $1 aber auch nach der Abarbeitung des zweiten
regulàren Ausdrucks denselben Wert, obwohl die Variable $line leer
ist, d.h., sie enthàlt keinerlei Zeichen, die auf den regulàren Ausdruck
angewendet werden könnten.

Ich war bis jetzt der Ansicht, dass $1 bei jeder Regex neu gesetzt
oder gelöscht wird, je nachdem, ob etwas Passendes gefunden wird
oder nicht.Da im Ausdruck eine Anzahl an Zeichen gefordert wird,
diese aber im Suchstring nicht gefunden werden können, sollte $1
doch eigentlich undefiniert sein, oder nicht?

Oder stehe ich da mal wieder auf der Leitung und übersehe etwas
Offensichtliches?

Gruß aus Wien,

Ferry

Ing. Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf@wien.gv.at
 

Lesen sie die antworten

#1 Christian Kirsch
21/12/2010 - 11:53 | Warnen spam
Ferry Bolhar schrieb:
Hallo,

ich bin bei der Verwendung regulàrer Ausdrücke auf ein Verhalten
gestoßen, das ich mir nicht erklàren kann. Es làsst sich wie folgt
darstellen:

my $line = 'ADVGRW_SMS_112233';
$line =~ /(SMS_\d+)/;
print "$1";
$line = '';
$line =~ /(SMS_\d+)/;
print "$1";

Die erste Ausgabe liefert korrekt "SMS_112233";

Erstaunlicherweise hat $1 aber auch nach der Abarbeitung des zweiten
regulàren Ausdrucks denselben Wert, obwohl die Variable $line leer
ist, d.h., sie enthàlt keinerlei Zeichen, die auf den regulàren Ausdruck
angewendet werden könnten.



Weshalb das Match scheitert und $1 unveràndert bleibt.

Aus "perldoc perlre":

"The numbered match variables ($1, $2, $3, etc.) and the related punctu-
ation set ($+, $&, $`, $', and $^N) are all dynamically scoped until
the end of the enclosing block or until the next successful match,
whichever comes first. (See "Compound Statements" in perlsyn.)

NOTE: failed matches in Perl do not reset the match variables, which
makes it easier to write code that tests for a series of more specific
cases and remembers the best match.


Ich war bis jetzt der Ansicht, dass $1 bei jeder Regex neu gesetzt
oder gelöscht wird, je nachdem, ob etwas Passendes gefunden wird
oder nicht.



Was eben ein Irrtum war.

Oder stehe ich da mal wieder auf der Leitung und übersehe etwas
Offensichtliches?



"Offensichtlich" im Sinne von "dokumentiert" - ja. "Offensichtlich" im
Sinne von "intuitiv" - nein.

Ähnliche fragen