Проблема с:
my regex a { || @b }
say $line ~~ m:i/ <a> /
В том, что a
является регулярным выражением, отвечающим за сопоставление значений в @b
, и оно не скомпилировано с :i
.
InРегулярные выражения Perl6 - это код, вы не можете изменить работу регулярного выражения на таком расстоянии.
Тогда есть еще одна проблема с:
my regex a { :i || @b }
Это действительно скомпилировано как:
my regex a {
[ :i ]
||
[ @b ]
}
Это совпадение ignorecase[nothing]
, а если это не удастся (не удастся), сопоставьте одно из значений в @b
.
Единственная причина использования || @…
заключается в том, чточто он соответствует значениям в @…
в том порядке, в котором они определены.
> my @c = < abc abcd foo >;
> say 'abcd' ~~ / || @c /
「abc」
Я думаю, что в большинстве случаев было бы лучше, если бы он просто использовал семантику |
по умолчанию.
> my @c = < abc abcd foo >;
> say 'abcd' ~~ / | @c /
「abcd」
> say 'abcd' ~~ / @c /
「abcd」
Так что тогда все будет работать так, как вы хотите:
my regex a { :i @b }
То есть <a>|<b>
будет соответствовать любому самому длинному начальному выражению.Хотя <a>||<b>
сначала попытается <a>
, а если это не удастся, он попытается <b>
.
Если вы действительно хотите семантику ||
, любой из них будет работать:
my regex a { || :i @b }
my regex a { :i [|| @b] }
Следующее не имеет ||
семантики.
На самом деле ||
ничего не делает.
my regex a { || [:i @b] }
Это то же самое, что и эти:
my regex a { | :i @b }
my regex a { :i @b }