2016-11-30 5 views
4

概要05では、Perl 6は変数を正規表現に補間しませんが、外部変数をパターンに関連付けることができます。ドキュメントでは、私が知る限り、この機能について言及していません。私は人々はまだ何らかの形で文字列からパターンを構築したいと思うので、それがうまくいくかどうか不思議です。Perl 6正規表現に変数を挿入するにはどうしたらいいですか?

ここで何が起こったかを示すプログラムです。私はそれが起こるはずのものなのか、誰かが意図したものなのかどうかはわかりません。私はパターンに変数を挿入します。 $r.perlとすると、変数名が表示されます。次に、パターンを適用して一致させます。変数の値を変更します。今度はパターンが一致しません。それを他の何かに変更して、再び一致させてください:

my $target = 'abcdef'; 

my $n = 'abc'; 
my $r = rx/ (<$n>) /; 

# the smart match like this doesn't return a Match object 
# https://rt.perl.org/Ticket/Display.html?id=126969 
put 'rx// directly: ', 
    $target ~~ $r 
     ?? "Matched $0" !! 'Misssed'; 

# now, change $n. The same $r won't match. 
$n = 'xyz'; 

put 'rx// directly: ', 
    $target ~~ $r 
     ?? "Matched $0" !! 'Misssed'; 

# now, change back $n. The same $r does match. 
$n = 'ab'; 
put 'rx// directly: ', 
    $target ~~ $r 
     ?? "Matched $0" !! 'Misssed'; 

これが正常に実行された場合は、それです。ドキュメントはここでは軽いので、テスト(事実上仕様)は、このような長距離の動作に洗練されていません。私はunperly見つける私はコピーの上に閉じて(そしておそらく私は$nであるものに応じて表示さよりも多くの作業)するために余計な作業を行うことができ

、:

my $r = do { 
    my $m = $n; 
    rx/ <$m> /; 
    }; 

しかし、私はまだしたいのですがパターンを「ファイナライズ」する方法がある(ああ私の神様、私はちょうど/oに戻ってくるように頼んだ)。おそらくRegexの方法。私は人々がこの機能を探すだろうと思う。

my $r = rx/ .... /.finalize; # I wish! 

または、Perl 6はこの種のことを行うにははるかに良い方法を持っています。私は古い学校の考えに満ちています。 Perl 6は正規表現の代わりに規則を持っています。実際には、このすべての背後にパーサーがあります。私はtokenまたはruleを定義するといいかもしれないと思ったが、私は同じ問題に遭遇したと思う。私はサブルール工場を持つべきものを見ません。

これを行うには別の方法がありますか?

+0

...あなたは<{...}>構文を経由して、より複雑な補間を行うことができますことに注意してください、例えば

/ <{ BEGIN compute-string-once-at-compile-time }>/ 

が、私はそれが問題を解決するために使用することができるかが表示されません変数フィールドをパラメータとして受け入れるサブルーチンとしてそれを取り除くと、clunkyとは見えません。私はPerl 6のコードの中にこの解決法を使ってきました。私は現在、それを行うより良い方法はないと思います。 – smls

+0

私はこれがあなたが求めているものではないことを知っていますが、変数*は実際にPerl6正規表現で補間しますが、サブ正規表現ではなくリテラル文字列として扱われます。あなたの例では、 'rx/$ n /'や 'rx /" $ n "/'を使って同じ結果を得ることができます。 (同じ一致/不足動作を含む) – mscha

+0

あなたは間違った次元を見ている。私は変数の現在の値を必要とし、後の値は必要としません。あなたが与えた例でさえそれはしません。 –

答えて

3

クロージャを使用する代わりに、EVALで正規表現を作成することもできます。

これら2つの間違いない解決策に加えて、私もブランクを描いています。 「コピーの上に閉じて」ソリューション

+0

<>で関数を呼び出すことができるはずですが、テストではまだ動作していないことに気付きました。 –

+1

現在のRakudo、cf 'sub foo {" foo "};と動作するはずです。 my $ r =/<{foo}> /; "foo" ~~/<$r> /; ' - しかし、あなたはまだ私に直交した問題のように見えるデータを添付する方法を見つけ出す必要があります... – Christoph

関連する問題