2016-11-24 60 views
3

好的,我正在學習perl6,我正在嘗試做一些非常簡單的事情:使用語法根據操作對象更改匹配的文本。但是我失敗了,我不知道爲什麼。請原諒我這樣簡單的問題。我不在技術或編程行業。所以,請耐心等待,好嗎?perl6要替換的語法

我想將「jan」更改爲01,將「feb」更改爲02;那麼簡單:

grammar month { 
    regex TOP { (\s* <mon> \s*)+ } 
    proto regex mon {*} 
    regex mon:sym<jan> { <sym> } 
    regex mon:sym<feb> { <sym> } 
} 
class monAct { 
    method TOP ($/) { 
    make $<mon>.made; 
    } 
    method mon:sym<jan> ($/) { make "01"; }; 
    method mon:sym<feb> ($/) { make "02"; }; 
} 
my $m = month.parse("jan feb jan feb", actions => monAct.new); 
say $m.made; # it says Nil instead of "01 02 01 02" that I want; 

那麼,我在這裏做錯了什麼?謝謝。

+0

請注意你的行動是無狀態的,你可以通過對象類型'monAct',而不是實例'monAct.new'到'.parse ' – Christoph

回答

3

<mon>的作用域爲捕獲組,而不是TOP規則。你可以索引匹配對象得到它,但它可能是更容易使用非捕獲組,而不是:

regex TOP { [\s* <mon> \s*]+ } 

此外,由於+量詞,你不會得到一個匹配的對象,但一個列表。您可以使用>>map得到的有效載荷,例如

method TOP ($/) { make $<mon>>>.made } 
+0

非常感謝Christoph!當我更改正則表達式TOP使用非捕獲組而不更改相應的方法TOP時,它表示「方法」未找到類'Array'的調用者「。正如你所說的,當我改爲方法TOP後,它就起作用了。謝謝。 – lisprogtor