Perl - замена метасимволов регулярными выражениями

У меня проблемы при замене метасимволов с помощью регулярных выражений. Фраза, которую я хочу, чтобы регулярные выражения заменяли метасимвол:

ley+sobre+propiedad+literaria+1847

И код, который я использую, приведен ниже:

$file =~ s/\+/\s/; # --> Replace the +

Но, похоже, он заменяет только первый метасимвол, и в результате получается:

leysobre+propiedad+literaria+1847

Что я должен использовать?

3 ответа

Решение
  1. \s является классом символов и не является допустимым экранированием для строк. Вторая часть замещения берется как строка.
  2. Чтобы заменить все вхождения ("глобально"), используйте /g включить замену.
  3. Односимвольные транслитерации также могут использовать tr/// оператор.

Предполагая, что вы хотите заменить + пробелом:

tr/+/ /;

или же

s/\+/ /g;

Если вы хотите декодировать URL-адреса:

use URL::Encode 'url_decode';
my $real_filename = url_decode $file;

См. Документацию для URL:: Encode для получения дополнительной информации.

Ваша проблема не связана с метасимволами. Замена s/// заменяет только первое вхождение шаблона, если не указано заменить все из них /g вариант.

КСТАТИ, \s интерпретируется как простой s в запасной части. Если ты хочешь \s, вы должны указать \\s для обратной косой черты (как в двойных кавычках). Таким образом, результат на самом деле

leyssobre+propiedad+literaria+1847

Обратите внимание на двойной s,

Использовать s/\+/ /g заменить глобально.

Другие вопросы по тегам