Есть ли разница между m и rx? - PullRequest
0 голосов
/ 01 мая 2018

Они, кажется, используются взаимозаменяемо в документации . Есть ли разница, даже в намерениях?

1 Ответ

0 голосов
/ 01 мая 2018

Как документация, на которую вы ссылаетесь,

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 также выполняет эту оптимизацию.)

...