2017-10-13 9 views
4

キャプチャグループで変数regexを作成すると、全体の一致はOKですが、キャプチャグループはNilです。Perl 6正規表現の変数とキャプチャグループ

my $str = 'nn12abc34efg'; 
my $atom =/\d ** 2 /; 
my $rgx =/($atom) \w+ ($atom) /; 

$str ~~/$rgx/; 
say ~$/; # 12abc34 
say $0; # Nil 
say $1; # Nil 

私は$rgxを回避するためにプログラムを変更する場合、すべてが期待どおりに動作:

Regex object coerced to string (please use .gist or .perl to do that) 

私たちに何かを伝えます:

my $str = 'nn12abc34efg'; 

my $atom =/\d ** 2 /; 
my $rgx =/($atom) \w+ ($atom) /; 

$str ~~/($atom) \w+ ($atom) /; 
say ~$/; # 12abc34 
say $0; # 「12」 
say $1; # 「34」 
+2

興味深い質問です。なぜこのようなことが起こるのか分かりませんが、 '$ rgx'を名前付き正規表現にすることができます。 '私の正規表現rgx {($ atom)\ w +($ atom)}'です。 '$ str ~~/ /'の後には、これがあります。 $ [0]は最初のキャプチャグループを表します(たとえば)。 –

+1

関連項目[変数をPerl 6の正規表現に挿入する方法は?](https://stackoverflow.com/q/40883160/2173773) –

+0

ありがとう!!名前付き正規表現について知らなかった。 –

答えて

5

あなたのコードでは、コンパイラは次の警告を与えます正規表現は文字列として扱われるべきではありません。正規表現を入れ子にするには2つのより適切な方法があります。私は/ $rgx /に一致していないよ

my $str = 'nn12abc34efg'; 
my Regex $atom =/\d ** 2 /; 
my Regex $rgx =/(<$atom>) \w+ (<$atom>) /; 
$str ~~ $rgx; 

注:まず、あなたはアサーション内のサブ正規表現(<>)を含めることができます。それはある正規表現を別の正規表現の中に入れている。ちょうど$rgxと一致してください。

より良い方法は、名前付き正規表現を使用することです。次のように​​と正規表現を定義すると、$<atom>[0]$<atom>[1]としてマッチグループにアクセスできるようになります:

my regex atom { \d ** 2 }; 
my $rgx =/<atom> \w+ <atom> /; 
$str ~~ $rgx; 
+1

完璧な答えをありがとう! p6の正規表現の構文、特に '<>'の使用についての私の理解はむしろあいまいです。 –

+1

@evb喜んで助けました。私は実際に元のコードがなぜ機能しなかったのか分かりません。 3つの正規表現がどのように構成されているかが原因であると推測します。ネストされた正規表現がマッチするとマッチグループが設定されていないかどうか疑問です。おそらくラクドのバグです。ネストは他の2つのバリエーションのマッチを解除しないからです。しかし、コンパイラが私たちに警告したという事実は、私の本のフックから外すことができます。 – piojo

+0

私は '(<$atom>)'で2番目の解決策を試しましたが、それでもうまくいきません。 '$ 0'と' $ 1'はともに 'Nil'です。 –

4

キー観測が$str ~~/$rgx /;「は正規表現の内側の正規表現」であるということです。 $rgxを一致させ、$0$1を自身のMatchオブジェクト内に設定しますが、周囲の一致オブジェクト内にその情報を格納する場所がないため、表示できませんでした。例をあげれば明らかです。

my $str = 'nn12abc34efg'; 
my $atom =/\d ** 2 /; 
my $rgx =/($atom) \w+ ($atom) /; 

$str ~~/$0=$rgx /; 
say $/; 

$0の内容に注意してください。別の例として、適切な名前を付けてみましょう:

my $str = 'nn12abc34efg'; 
my $atom =/\d ** 2 /; 
my $rgx =/($atom) \w+ ($atom) /; 

$str ~~/$<bits-n-pieces>=$rgx /; 
say $/; 
+1

ありがとうございます!はい、私は第一の変種で '$ 0'と書きました。 問題は適切なマッチオブジェクトがないことでした... –

関連する問題