正規表現の$ /と$¢の違いは何ですか?


11

タイトルが示すように、違いは何である$/とは?それらは常に同じ値を持っているように見えます:

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

どちらも同じ値のMatchオブジェクトになります。どちらを使用する場合のロジックは何ですか?

回答:


11

変数$/は最新の一致を指し、変数は最新の最も外側の一致を指します。上記のような最も基本的な正規表現では、それはまったく同じものになる可能性があります。ただし、.rakuメソッドの出力からわかるように、Matchオブジェクトには他のMatchオブジェクトが含まれている可能性があります(これは、使用$<foo>または$1キャプチャーで取得したものです)。

代わりに、定量化されたキャプチャを使用して次の正規表現があるとします

/ ab (cd { say $¢.from, " ", $¢.to } ) + /

実行すると、「abcdcdcd」と照合すると、次の出力が表示されます。

0 2
0 4
0 6

しかし、使用をからに変更$/すると、異なる結果が得られます。

2 2
4 4
6 6

(これ.toが少しずれているように見える理由.posは、キャプチャブロックが終了するまで更新されないためです。)

つまり、常に最終一致オブジェクト(つまり$final = $text ~~ $regex)を参照するため、完全一致が完了した後と同じように、正規表現内の複雑なキャプチャツリーをトラバースできます。上記の例では、$¢[0]最初の一致、$¢[1]2番目の一致などを参照します。

正規表現コードブロックの内部では$/、最も近い一致を参照します。上記の場合、それは内部( )の一致であり、他の一致についても、元の一致の開始についてもわかりません( )。ブロックの開始のみです。したがって、より複雑な正規表現を与えます:

/ a $<foo>=(b $<bar>=(c)+ )+ d /

と言うことで、すべてのfooトークンを$¢を使用していつでもアクセスできます$¢<foo>。を使用してbar、特定のトークンにアクセスできます。のキャプチャ内にコードブロックを挿入すると、またはを使用してトークンにアクセスできますが、他のにはアクセスできません。foo$¢<foo>[0]<bar>foobar$<bar>$/<bar>foo


1
おお!私は、docの「主な違いを解釈$/し、スコープである:後者は唯一の正規表現内の値ました」を意味するためには、同じように、単に痕跡トレースたCursorです。私があなたの答えを読んだとき$*TOP私はA可能な改善で作成したものだと思いましたか?SO に対する私の回答のセクション「繰り返される任意のキャラクターをキャプチャグループと照合するために追加の変数が必要な理由/方法は?」しかし、と入れ替える私の試み$*TOP失敗しました。その答えの私のポイントを理解していますか?あなたはそれを機能させることができますか?
レイフ

Raiph:つまり、文法では、トークンごとに更新されるので$*TOP := $¢TOPトークンで言う必要がありますが、$*TOPもちろんvarの必要性がなくなるわけではありません。トップレベルで試合を参照できるのは素晴らしいことだと思います。問題は、最終的には、まだ特定する問題です。位置/ハッシュの一致がpostでmatchオブジェクトにポストするときです。使用時—トークンごと—の結果は、定義により、囲んでいる{ }ブロックが検出されるとすぐにポストされます。
user0721090601

私にとって興味深いのは、の開発Binexにおいて、一致した結果に遭遇した直後にそれをポストすることは、計算上、これ以上悪いことはないということです。1日の終わりに、キャッシュリスト/ハッシュにプッシュ/ポップするか、マッチのリスト/ハッシュにプッシュ/ポップします。ただし、LTMのコアで使用される可能性がある、私が気付いていないある種の内部スピードアップがある場合があります({ }LTMの目的でトークンが終了するため、実行/テストされる可能性が高くなります)|グループ内のトークンの残りの部分)
user0721090601

ああ。私は動的であるという結論にジャンプしました、そしてそれがうまくいかなかったとき驚いた。しかし、ペニーは今やそれが語彙的であるということを落としました。私があなたが「最も外側の」という言葉の使用を考えると推測でき、そしてあなたが説明するように、各ルールの最初に確立されているからです。
レイフ

そのため、iiuc、ルールの開始時に、元の入力文字列内の一致するエンジンのカーソル位置を記録する新しい一致オブジェクトが作成されますが、それ以外の場合は空です。(右?)そして、そして$/、それが進むにつれて、ルールが一致し、キャプチャ何、これを記録し、同じオブジェクト、つまりこの新しいマッチオブジェクトにバインドされています。次に、照合が進行する間、この全体的な照合オブジェクトにバインドされたまま$/ですが、新しい照合オブジェクトが作成されるたびに再バインドされるため、言うまでもなく、常に最新の照合オブジェクトに対応します。正しい?
レイフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.