タイトルが示すように、違いは何である$/
とは$¢
?それらは常に同じ値を持っているように見えます:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
どちらも同じ値のMatchオブジェクトになります。どちらを使用する場合のロジックは何ですか?
タイトルが示すように、違いは何である$/
とは$¢
?それらは常に同じ値を持っているように見えます:
my $text = "Hello world";
$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;
どちらも同じ値のMatchオブジェクトになります。どちらを使用する場合のロジックは何ですか?
回答:
変数$/
は最新の一致を$¢
指し、変数は最新の最も外側の一致を指します。上記のような最も基本的な正規表現では、それはまったく同じものになる可能性があります。ただし、.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>
foo
bar
$<bar>
$/<bar>
foo
$¢
は、トークンごとに更新されるので$*TOP := $¢
、TOP
トークンで言う必要がありますが、$*TOP
もちろんvarの必要性がなくなるわけではありません。トップレベルで試合を参照できるのは素晴らしいことだと思います。問題は、最終的には、まだ特定する問題です。位置/ハッシュの一致がpostでmatchオブジェクトにポストするときです。使用時$¢
—トークンごと—の結果は、定義により、囲んでいる{ }
ブロックが検出されるとすぐにポストされます。
Binex
において、一致した結果に遭遇した直後にそれをポストすることは、計算上、これ以上悪いことはないということです。1日の終わりに、キャッシュリスト/ハッシュにプッシュ/ポップするか、マッチのリスト/ハッシュにプッシュ/ポップします。ただし、LTMのコアで使用される可能性がある、私が気付いていないある種の内部スピードアップがある場合があります({ }
LTMの目的でトークンが終了するため、実行/テストされる可能性が高くなります)|
グループ内のトークンの残りの部分)
$¢
は動的であるという結論にジャンプしました、そしてそれがうまくいかなかったとき驚いた。しかし、ペニーは今やそれが語彙的であるということを落としました。私があなたが「最も外側の」という言葉の使用を考えると推測でき、そしてあなたが説明するように、各ルールの最初に確立されているからです。
$¢
そして$/
、それが進むにつれて、ルールが一致し、キャプチャ何、これを記録し、同じオブジェクト、つまりこの新しいマッチオブジェクトにバインドされています。次に、照合が進行する間、$¢
この全体的な照合オブジェクトにバインドされたまま$/
ですが、新しい照合オブジェクトが作成されるたびに再バインドされるため、言うまでもなく、常に最新の照合オブジェクトに対応します。正しい?
$/
し、$¢
スコープである:後者は唯一の正規表現内の値ました」を意味するためには、$¢
同じように、単に痕跡トレースたCursor
です。私があなたの答えを読んだとき$¢
、$*TOP
私はA可能な改善で作成したものだと思いましたか?SO に対する私の回答のセクション「繰り返される任意のキャラクターをキャプチャグループと照合するために追加の変数が必要な理由/方法は?」しかし、と入れ替える私の試み$*TOP
は$¢
失敗しました。その答えの私のポイントを理解していますか?あなたはそれを機能させることができますか?