Hilfe zum Verständnis der globalen Flagge in Perl

8
___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ qstnhdr ___ Hilfe zum Verständnis der globalen Flagge in Perl ___ answer6969334 ___

Bei Verwendung in einem Listenkontext bewirkt %code% , dass %code% alle Übereinstimmungen zurückgibt. Bei Verwendung in einem skalaren Kontext bewirkt %code% , dass %code% bei jeder Verwendung eine Übereinstimmung zurückgibt, und schlägt fehl (gibt undef zurück), wenn keine Übereinstimmungen mehr vorhanden sind, bevor am Anfang der Zeichenfolge erneut begonnen wird. (Sie können dies verhindern, indem Sie %code% verwenden.) Sie können auch die Funktion %code% verwenden, um die Position zu finden oder festzulegen, an der die Übereinstimmung beginnen soll.

Ohne %code% , %code% gibt immer die gleiche Übereinstimmung zurück. Dies entspricht der Einstellung von %code% auf %code% jedes Mal. (In einem Listenkontext gibt %code% stattdessen eine Liste der Captures zurück.)

    
___ answer6969281 ___

Mit dem Modifizierer %code% merkt sich die Zeichenfolge den Ort ihrer letzten Übereinstimmung, sodass Sie in einer while-Schleife eine Übereinstimmung mit einem %code% anfordern und alle Übereinstimmungen finden können.

Ohne die %code% beginnen Sie jedes Mal neu und finden immer die erste Übereinstimmung.

In Ihrem Fall haben Sie mit dem %code% beim ersten Mal 3,2 erreicht, aber beim zweiten Versuch, eine Übereinstimmung zu finden, gab es keine Übereinstimmungen mehr.

Ohne die %code% kannst du %code% eine Zillion Mal aufrufen und du wirst immer die erste Übereinstimmung finden.

    
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___
scientist.rahul 06.08.2011, 22:00
quelle

2 Antworten

10

Mit dem Modifizierer g merkt sich die Zeichenfolge den Ort ihrer letzten Übereinstimmung, sodass Sie in einer while-Schleife eine Übereinstimmung mit einem g anfordern und alle Übereinstimmungen finden können.

Ohne die g beginnen Sie jedes Mal neu und finden immer die erste Übereinstimmung.

In Ihrem Fall haben Sie mit dem g beim ersten Mal 3,2 erreicht, aber beim zweiten Versuch, eine Übereinstimmung zu finden, gab es keine Übereinstimmungen mehr.

Ohne die g kannst du getFloat() eine Zillion Mal aufrufen und du wirst immer die erste Übereinstimmung finden.

    
Ray Toal 06.08.2011, 22:11
quelle
8

Bei Verwendung in einem Listenkontext bewirkt /g , dass =~ alle Übereinstimmungen zurückgibt. Bei Verwendung in einem skalaren Kontext bewirkt /g , dass =~ bei jeder Verwendung eine Übereinstimmung zurückgibt, und schlägt fehl (gibt undef zurück), wenn keine Übereinstimmungen mehr vorhanden sind, bevor am Anfang der Zeichenfolge erneut begonnen wird. (Sie können dies verhindern, indem Sie /gc verwenden.) Sie können auch die Funktion pos($text) verwenden, um die Position zu finden oder festzulegen, an der die Übereinstimmung beginnen soll.

Ohne /g , =~ gibt immer die gleiche Übereinstimmung zurück. Dies entspricht der Einstellung von pos($text) auf undef jedes Mal. (In einem Listenkontext gibt =~ stattdessen eine Liste der Captures zurück.)

    
Neil 06.08.2011 22:20
quelle

Tags und Links