Мне было интересно, когда следует использовать s///
над tr///
при работе с регулярными выражениями в Perl?
Какая разница между tr///и s///при использовании регулярного выражения в Perl?
Ответ 1
s///
для подстановки:
$string =~ s/abc/123/;
Это заменит первый "abc", найденный в $string
, на "123".
tr///
для транслитерации:
$string =~ tr/abc/123/;
Это заменит все вхождения "a" внутри $string
на "1", все вхождения "b" с "2" и все вхождения "c" в "3".
Ответ 2
tr///
не является оператором регулярного выражения. Он подходит (и быстрее, чем s///
) для подстановок одного символа с другим одиночным символом или (с модификатором d
), заменяя один символ нулевыми символами.
s///
следует использовать для чего-то более сложного, чем узкие варианты использования tr
.
Ответ 3
От perlop: Операторы с котировками и цитатами
Обратите внимание, что tr не выполняет регулярные классы символов выражения, такие как \ d или [: lower:]. Оператор tr является не эквивалентно утилите tr (1). Если вы хотите сопоставить строки между нижние/верхние регистры, см. lc и uc, и в общем случае рассмотрим использование s оператора, если вам нужно выражения.