Служебные преобразования символов
Проблема
Некоторые символы выводимой строки (апострофы, запятые и т. д.) требуется преобразовать к
специальному виду. Предположим, вы конструируете форматную строку для
sprintf и хотите преобразовать символы % в %%.
Решение
Воспользуйтесь подстановкой, которая снабжает префиксом \ или удваивает каждый преобразуемый символ:
# Обратная косая черта
$var =~ s/([CHARLIST])/\\$1/g;
# Удвоение
$var =~ s/([CHARLIST])/$1$1/g;
Комментарий
В приведенных выше решениях $var — модифицируемая переменная, a CHARLIST — список
преобразуемых символов, который может включать служебные комбинации типа \t или \n.
Если преобразуется всего один символ, можно обойтись без скобок:
$string =~ s/%/%%/g;
Преобразования, выполняемые в следующем примере, позволяют подготовить строку для передачи
командному интерпретатору. На практике преобразование символов ' и " еще не сделает произвольную
строку полностью безопасной для командного интерпретатора. Правильно собрать весь список
символов так сложно, а риск так велик, что для запуска программ лучше воспользоваться списковыми формами
system и
ехес
— в этом случае вы вообще избегаете взаимодействия с интерпретатором.
$string = q(Mom said, "Don't do that.");
$string =~ s/(['"])/\\$1/g;
Две обратные косые черты в секции заменителя были использованы потому, что эта секция
интерпретируется по правилам для строк в кавычках. Следовательно, чтобы получить одну
обратную косую черту, приходится писать две. Приведем аналогичный пример для VMS DCL, где дублируются
все апострофы и кавычки:
$string = q(Mom said, "Don't do that.");
$string =~ s/(['"])/$1$1/g;
С командными интерпретаторами Microsoft дело обстоит еще сложнее. В DOS и Windows COMMAND.COM
работает с кавычками, но не с апострофами; не имеет представления о том, как поступать с обратными
апострофами, а для превращения кавычек в литерал используется обратная косая черта. Почти все
бесплатные или коммерческие Unix-подобные интерпретаторы для Windows пытаются исправить эту удручающую ситуацию.
Кроме того, можно определить интервал с помощью символа -, а затем инвертировать его с помощью
символа ~. Следующая команда преобразует все символы, не входящие в интервал от А до Z:
$string =~ s/([^A-Z])/\\$1/g;
Для преобразования всех неалфавитных символов следует воспользоваться метасимволами \Q и \Е
или функцией
quotemeta.
Например, следующие команды эквивалентны:
$string = "this \Qis a test!\E";
$string = "this is\\ a\\ test!";
$string = "this " . quotemeta("is a test!");
См. такжеОписание оператора
s/// и функции
quotemeta
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|