Подтвердить что ты не робот

Различия между m/PATTERN/и/PATTERN/in perl

Существует ли какая-либо техническая разница между следующими сегментами кода в perl? Кажется, они ведут себя одинаково.

my $str = "A cat is red";

if($str =~ /cat/) {
    print "Matches\n";
}

против

my $str = "A cat is red";

if($str =~ m/cat/) {
    print "Matches\n";
}

Разница в этом коде - это "m" в строке 3. Почему кто-то пропускает или не пропускает "m"?

4b9b3361

Ответ 1

Смотрите документацию RegExp Quote-Like Operators: они идентичны. m "версия" позволяет использовать в качестве разделителя другие символы вместо /. Но кроме этого никакой разницы.

Ответ 2

Нет никакой разницы.

/.../ сокращен для m/.../, так же как '...' является коротким для q'...', а "..." является коротким для qq"...".

Если вы собираетесь использовать разделитель по умолчанию (/ для соответствия регулярных выражений, ' для строковых литералов с одной кавычкой и " для строковых литералов с двойными кавычками), вы можете опустить ведущую букву ( с).

Указание ведущей буквы (букв) позволяет вам изменить разделитель.

/.../      m/.../     m!...!     m{...}        Match operator
'...'      q'...'     q!...!     q{...}        Single-quoted string literal
"..."      qq"..."    qq!...!    qq{...}       Double-quoted string literal

Это может быть полезно для уменьшения экранирования. Например,

/^http:\/\//

более ясен, когда записывается как

m{^http://}

В противном случае "m", "q" или "qq" обычно опускаются. "s", "tr" и "qw" необязательны.

Все это описано в perlop.