Как документация, на которую вы ссылаетесь,
m/abc/; # a regex that is immediately matched against $_
rx/abc/; # a Regex object
/abc/; # a Regex object
[...] Пример различия между m/ /
и / /
операторами:
my $match;
$_ = "abc";
$match = m/.+/; say $match; say $match.^name; # OUTPUT: «「abc」Match»
$match = /.+/; say $match; say $match.^name; # OUTPUT: «/.+/Regex»
Таким образом, /.../
возвращает объект Regex
, который можно передать как значение и использовать для последующего сопоставления несколько раз, а m/.../
возвращает объект Match
, сразу выполнивший сопоставление. Когда вы печатаете объект Match
, вы получаете результат совпадения, а когда вы печатаете объект Regex
, вы получаете текстовое представление регулярного выражения. Использование m/.../
в Perl 6 позволяет получить доступ к неявному объекту Match
, $/
:
Результаты совпадения хранятся в переменной $/
и также возвращаются из совпадения. Результат имеет тип Match
, если совпадение было успешным; в противном случае это Nil
.
Различие сравнимо с re.compile
в Python против re.match
/ re.search
, и аналогичное различие существует в Perl 5, где вы можете хранить и повторно использовать регулярное выражение с qr/.../
против m/.../
и /.../
для прямого сопоставления. Как указывает @raiph, не все вхождения m/.../
и /.../
приводят к прямому соответствию. И наоборот, Perl 5 прекомпилирует литеральные (статические) регулярные выражения , даже если это явно не требуется. (Предположительно, Perl 6 также выполняет эту оптимизацию.)