2016-11-25 1 views
4

Ich versuche, den ersten Namen in einer Regex zu extrahieren, aber ~~ scheint zu einem unveränderlichen Container zuzuordnen. Warum? Was habe ich falsch gemacht?Warum versucht Perl6 regex ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

my $test= ' "DOE , JOHN" '; 

grammar findReplace { 
    regex TOP   { \s* <ptName> \s* } 
    regex ptName   { <aName> } 
    regex aName   { \" .+? \" } 
} 

class rsAct { 
    method TOP ($/) { make "last name is: " ~ $<ptName>.made; } 
    method ptName ($/) { 
     my $nameStr = $/.Str; 
     if $nameStr ~~ m/ \" (<alpha>+) .* \, .* \"/{ 
      my $lastName = $/[0]; # I want $/[0] sub-string of outer $/ 
      make $lastName; 
    } 
    } 
} 

my $m = findReplace.parse($test, actions => rsAct.new); 
say $m.made; 

und der Fehler ich bekam, war dies:

Cannot assign to a readonly variable or a value 
    in method ptName at shit.pl line 13 
    in regex ptName at shit.pl line 5 
    in regex TOP at shit.pl line 4 
    in block <unit> at shit.pl line 20 

ich eine Unterkette der äußeren $/zu bekommen versuchen, die ein Muster übereinstimmt; Warum sollte es eine Aufgabe sein?

Vielen Dank für Ihre Hilfe !!!

+0

Sie sollten 'token' oder' rule' die meiste Zeit verwenden, nicht 'regex' –

Antwort

2

Sie verwenden den Operator ~~ in einer Funktion, die bereits $/ als Argument definiert hat. Argumente sind standardmäßig schreibgeschützt, daher schlägt die Zuweisung fehl.

Es sollte ausreichen, if $nameStr.match(/your regex/) -> $/ { ... } anstelle des ~~ Operators zu verwenden. Sie erhalten eine neue $/ innerhalb des Blocks, die das gewünschte Trefferergebnis haben wird.

+0

Danke timotimo. Aber ich habe bereits das äußere $/in einer neuen Variable $ nameStr gespeichert und ich arbeitete mit dieser neuen Variable. Und was versucht ~~ zuzuordnen? und was zuweisen? (zu $ nameStr?) Mein begrenztes Verständnis macht Dinge merkwürdig. – lisprogtor

+0

wird der Operator '~~' der Variablen '$/'zugewiesen, die sich gerade im Bereich befindet. Auf diese Weise können Sie einfach "Hallo" ~~ /../ schreiben; sag $/'und es gibt dir' er'. – timotimo

+1

Ich habe es jetzt; Aber gibt es einen einfacheren Weg als das, was ich habe: class rsAct { Methode TOP ($ /) {make "Nachname ist:" ~ $ .made; } Methode ptName ($ /) { \t my $ nameStr = $ /. Str; \t mein $ lastName; \t wenn $ nameStr.match (/ \ "( +). * \,. * \" /) -> $/{ \t $ lastName = $/[0] .Str; \t} \t make $ lastName; } } meine $ m = findReplace.parse ($ test, Aktionen => rsAct.new); sagen $ m.made; – lisprogtor