Perl 6のような代替が与えられた場合/(foo|foobar|foobaz)/
、3 つのうちどれが最初に使用されるかについて何らかの約束をしますか? もしそうなら、ドキュメントのどこでその約束をしますか?
関連する質問を参照してください現在 (5.8 および 5.10) の Perl は、使用される順序の変更について何らかの約束をしていますか? .
Perl 6のような代替が与えられた場合/(foo|foobar|foobaz)/
、3 つのうちどれが最初に使用されるかについて何らかの約束をしますか? もしそうなら、ドキュメントのどこでその約束をしますか?
関連する質問を参照してください現在 (5.8 および 5.10) の Perl は、使用される順序の変更について何らかの約束をしていますか? .
簡単に言うと、代替案は (少なくとも概念的には) 並行して一致する必要があり、最も長い一致が勝ちます。連続した交替が必要な場合は、二重バー || を使用できます。これは | と同様に左から右の順序を約束します。Perl 5 正規表現で行います。
S05言う
そのために、Perl 6 のすべての正規表現は、その「純粋な」パターンをそのアクションから区別し、最初のトークン パターンのリストを返すことができる必要があります (「純粋な」部分によって呼び出されるサブルールのトークン パターンを推移的に含む)。ただし、従来の正規表現では許可されていない自己参照が含まれるため、サブルールを複数回含めることはできません)。| を使用した論理的交互作用 次に、これらのリストの 2 つ以上を取得し、最長のトークン プレフィックスに一致する代替にディスパッチします。これは、字句的に最初に来る代替案である場合とそうでない場合があります。
ただし、2 つの選択肢が同じ長さで一致する場合は、特異性によって最初に同点が解消されます。最長の固定文字列で始まる選択肢が勝ちます。つまり、完全一致は、文字クラスを使用した一致よりも近いと見なされます。それがうまくいかない場合は、2 つの方法のいずれかで引き分けになります。代替の文法が異なる場合、標準の MRO (メソッド解決順序) によって、どちらを最初に試行するかが決定されます。代替が同じ文法ファイルにある場合、テキスト的に前の代替が優先されます。(文法のルールが複数のファイルで定義されている場合、順序は定義されておらず、間違ったルールが最初に試行された場合に失敗を強制するために、明示的なアサーションを使用する必要があります。)
これは、Perl 5 で行われた約束とは大きく異なるようです。