正規表現のさまざまな側面をチェックし、テストしている間、私は奇妙な「incosistent」行動つまずきました。私は正規表現でいくつかのコードを使用しようとしていたが、同じ動作を無効コード・ブロックを使用しても適用されます。特に、私はほとんどを動かし、私が入れ替わったときに試合結果の違いだったもの:X修飾子:対グラムを。
次のコードスニペットは、「一貫性のない」行動を示しています。
コードブロックせずに最初:
use v6.d;
if "test1 test2 test3 test4" ~~ m:g/ (\w+) / {
say ~$_ for $/.list;
}
結果:
test1
test2
test3
test4
次いで:修飾子Gコードブロック:
use v6.d;
if "test1 test2 test3 test4" ~~ m:g/ (\w+) {} / {
say ~$_ for $/.list;
}
結果:
test4
そして最後に付きます。x修飾子とコードブロック
use v6.d;
if "test1 test2 test3 test4" ~~ m:x(4)/ (\w+) {} / {
say ~$_ for $/.list;
}
結果:
test1
test2
test3
test4
私は3つの結果が同じであることが期待が、私は否定的驚きました。
この動作に関する任意の説明がありますか?
(より多くのテストとコード洞窟探検の後に書き換え。)
これはバグのように私(そしておそらくあなた)に見えます。$/
何とか使用しているときkiboshedなっている:g
と、埋め込まれたブロック。
この回答カバー:
問題の中でゼロ
コンパイラのソースコードを見てみます
問題キューの検索および/または新規発行を申請
問題の中でゼロ
my &debug = {;} # start off doing no debugging
$_ = 'aa';
say m / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
say $/ if m / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
say m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
say $/ if m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
say m:g / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
say $/ if m:g / {debug 1} 'a' {debug 2} /; debug 3; # 「a」 <--- Uhoh
今作るdebug
有益な何かを言うと、(正規表現副詞なし)最初のペアを実行します。
&debug = { say $_, $/.WHICH } # Say location of object bound to `$/`
say m / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
# 1Match|66118928
# 2Match|66118928
# 「a」
# 3Match|66118928
say $/ if m / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
# 1Match|66119072
# 2Match|66119072
# 「a」
# 3Match|66119072
どちらの場合も同じシンプルな結果。一致プロセスが作成Match
同じものを持つオブジェクトとスティック。
今、2つのバリエーション:x(2)
副詞:
say m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66119936
# 2Match|66119936
# 1Match|66120080
# 2Match|66120080
# 1Match|66120224
# (「a」 「a」)
# 3List|67612624
say $/ if m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66120368
# 2Match|66120368
# 1Match|66120512
# 2Match|66120512
# 1Match|66120656
# (「a」 「a」)
# 3List|67612672
この時間は、一致プロセスが作成されMatch
、それが第三に一致するように失敗する前にワンパス、第二のパスのための第2のマッチオブジェクト、及び第三のパスの最後に第三の一致オブジェクトのためにそれを持つオブジェクトとスティックを'a'
(従って対応debug 2
doesnの」トンと呼ばれます)。終わりにm.../.../
呼び出し、それが作成したList
オブジェクトを、結合していることに$/
。
我々は2の最初の実行次の:g
例:
say m:g / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66119216
# 2Match|66119216
# 1Match|66119360
# 2Match|66119360
# 1Match|66119504
# (「a」 「a」)
# 3Match|66119504
同様x:(2)
の場合、我々は三回目をしようとすると失敗します。しかし、試合プロセスがないではない返すList
代わりに、Match
オブジェクト。そして、それは3回目のパスで作成したものです。(どの私を驚か。)
最後に、「Uhoh」の場合があります。
say $/ if m:g / {debug 1} 'a' {debug 2} /; debug 3; # 「a」 <--- Uhoh
# 1Match|66119648
# 2Match|66119648
# 1Match|66119792
# 2Match|66119792
# 「a」
# 3Match|66119792
驚くべきことに、予想される第3のパスは起動しないように表示されます。
コンパイラのソースコードを見てみます
これは、関連するソースコードを探求することは有益であろうというもっともらしいです。それは、あなたや他の読者を対象としますと、ケースには、これはバグとどのような私の書き込みがそれを固定誰かに関心のある場合には、私はここでそのことについて書きます。
生成されたASTノードへの正規表現リードのコードブロックAfaict ここで先にバインド操作を行うブロック内の文の挿入サブノードこと。
:op('bind'),
QAST::Var.new( :name('$/'), :scope('lexical') ),
QAST::Op.new(
QAST::Var.new( :name('$¢'), :scope('lexical') ),
:name('MATCH'),
:op('callmethod')
)
上記の私のリードは、それがコードを挿入することであること結合する語彙$/
の結果にシンボル.MATCH
語彙にバインドされたオブジェクトにメソッド呼び出し$¢
の直前のブロック内のコードを実行するシンボル。
ドキュメントは、持っているのセクションを$¢
。私は文を引用します:
主な違い
$/
とは、$¢
スコープである。後者は、[A]の正規表現値内部を有します
私はなぜ疑問に残っています$¢
が存在し、他にどのような違いがあります。
上を移動...
私はあります見楽レベル.MATCH
。しかし、それはほとんど何もありません。だから私は、関連のコードがあると推定こちら。
この時点で、私は一時停止します。私は後で編集でさらに続ける場合があります。
問題キューの検索および/または新規発行を申請
誰かが数日中に答えが何を示してきたことはバグではありません、またはすでにバグ、そして公正十分として提出されていることを実証して起動した場合。
それ以外の場合は、発行キューの独自の検索を行うこと、および/またはあなたが最も適切な(/ rakudo / rakudo /問題へのデフォルト)を考慮どんな問題キューに新しい問題を開始するご検討ください。
私はすでに、私はこの答えを書くの一環として、もっともらしく関連すると思われる4つのgithub.com発行キューを検索しました:
私は私が(「公開」「グローバル」と)既存の問題発見かもしれないと期待していること二つのキーワードで検索しました。一致の問題は、関連ませんでした。おそらく、あなたはまた、あなたがファイラが使用するかもしれないと思うことを、他のキーワードを探すことができます。
あなたが問題を提出した場合は、あなたのテストを追加することを検討してください、またはあなたがそれを行う方法を知っていれば、鉱山や他のいくつかの変種は、標準的なローストのテストケースに変換します。