2016-11-25 9 views
4

정규식에서 이름을 추출하려고하지만 ~~ 변경할 수없는 컨테이너에 할당하려는 것 같습니다. 왜 그렇게? 나는 무엇을 잘못 했는가?왜 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; 

과 내가 가진 오류이 있었다 : 나는 패턴과 일치하는 외부 $의 /의 하위 문자열을 얻기 위해 노력하고

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 

; 왜 ~ ~ 과제가 될까?

도움 주셔서 감사합니다.

+0

대부분의 경우'token'이나'rule'을 사용해야합니다.'regex'가 아닙니다. –

답변

2

$/이 이미 인수로 정의 된 함수에서 ~~ 연산자를 사용하고 있습니다. 인수는 기본적으로 읽기 전용이므로 할당이 실패합니다.

~~ 연산자 대신 if $nameStr.match(/your regex/) -> $/ { ... }을 사용하면 충분합니다. 원하는 결과를 얻을 수있는 블록 안에 신선한 $/이 생깁니다.

+0

timotimo에 감사드립니다. 그러나 나는 이미 새로운 변수 $ nameStr에 외부 $를 저장했고이 새로운 변수로 작업하고있었습니다. 그리고 ~~ 할당하려고합니까? 무엇에 할당할까요? ($ nameStr에?) 나의 제한된 이해는 일을 이상하게 만든다. – lisprogtor

+0

'~~'연산자는 현재 범위에있는'$ /'변수에 할당합니다. 그렇게하면 "hello"~~ /../를 쓸 수 있습니다. $ /'라고 말하면'그가'줄 것입니다. – timotimo

+1

나는 그것을 지금 얻었다; 하지만 내가 가지고있는 것보다 쉬운 방법이 있습니다 : class rsAct { method TOP ($ /) { "성을 다음과 같이하십시오 :"~ $ .made; } 메서드 ptName ($ /) { \t my $ nameStr = $ /. Str; \t my $ lastName; \t $ nameStr.match (/ \ "( +). * \,. * \"/) -> $/{ \t $ lastName = $/[0] .Str; \t} \t make $ lastName; } } my $ m = findReplace.parse ($ test, actions => rsAct.new); say $ m.made; – lisprogtor