2016-11-24 2 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

ノートを取得するには>>またはmapを使用することができますする '.parse ' – Christoph

答えて

3

<mon>は、TOPルールではなく、キャプチャグループにスコープが設定されています。あなたはマッチオブジェクトへのインデックスそれを得るために、それは代わりに、非キャプチャグループを使用する方が簡単でしょうができます、あなたはシングルマッチオブジェクトを

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

+数量詞による取得することはできませんが、リスト。あなたの行動はステートレスであるため、あなただけのタイプのオブジェクトの代わりにインスタンスの `` monAct` monAct.new`を渡すことができますが、ペイロードで例えば

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

ありがとう、クリストフ!対応するメソッドTOPを変更せずに非キャプチャグループを使用するように正規表現TOPを変更したとき、「クラス 'Array」のinvocantで「メソッド'が見つかりません」と表示されます。あなたが上記の方法TOPに変更した後、それは働いた。ありがとう。 – lisprogtor

関連する問題