2016-11-25 40 views
4

我想提取一個正則表達式的名字,但~~似乎想分配給一個不可變的容器。爲什麼這樣?我做錯了什麼?爲什麼perl6正則表達式~~試圖分配給不可變容器?

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

「~~」運算符將分配給當前處於範圍內的$ /變量。這樣你可以寫''你好「~~ /../;說$ /',它會給你'他'。 – timotimo

+1

我現在明白了;但有沒有比我有更簡單的方法:class rsAct {方法TOP($ /){make「姓氏是:」〜$ .made; } 方法ptName($ /){ \t my $ nameStr = $ /。Str; \t my $ lastName; \t if $ nameStr.match(/ \「( +)。* \,。* \」/) - > $/{ \t $ lastName = $/[0] .Str; \t} \t make $ lastName; } } my $ m = findReplace.parse($ test,actions => rsAct.new); 說$ m.made; – lisprogtor

相關問題