WikiDer > Синдром наклонной зубочистки
В компьютерное программирование, наклонившись зубочистка синдром (LTS) - это ситуация, в которой цитируемое выражение становится нечитаемым, поскольку оно содержит большое количество escape-символы, обычно обратная косая черта (""), избежать коллизия разделителей.[1][2]
Официальный Perl документация[3] ввел термин в более широкое употребление; там фраза используется для описания обычные выражения тот матч Unix-стилевые пути, в которых элементы разделены косой чертой /
. Косая черта также используется в качестве разделителя регулярных выражений по умолчанию, поэтому, чтобы использовать их буквально в выражении, они должны быть экранированы с помощью назадслэш , что приводит к частым скрытым косым чертам, представленным как
/
. Если удвоить, как в URL-адресах, это дает //
для сбежавшего //
. Подобное явление происходит для ДОС/Windows пути, где обратная косая черта используется в качестве разделителя пути, требуя двойной обратной косой черты - тогда это может быть повторно-escaped для регулярного выражения внутри экранированной строки, требуя
\
чтобы соответствовать одиночной обратной косой черте. В крайних случаях, например, регулярное выражение в экранированной строке, соответствие Единое соглашение об именах путь (который начинается ) требует 8 обратных косых черт
\\
из-за двойного экранирования двух обратных косых черт.
LTS присутствует во многих языках программирования и во многих ситуациях, в том числе в шаблонах, соответствующих Унифицированные идентификаторы ресурсов (URI) и в программах, выводящих цитируемый текст. Много Quines попадают в последнюю категорию.
Пример шаблона
Рассмотрим следующее регулярное выражение Perl, предназначенное для сопоставления URI, которые идентифицируют файлы в паб
справочник FTP сайт:
м / ftp: // [^ /] * / pub //
Perl, как sed перед этим решает эту проблему, позволяя многим другим символам быть разделителями для регулярного выражения. Например, следующие три примера эквивалентны приведенному выше выражению:
m {ftp: // [^ /] * / pub /} m # ftp: // [^ /] * / pub / # m! ftp: // [^ /] * / pub /!
Или этот общий перевод для преобразования обратной косой черты в прямую:
tr / ///
может быть легче понять, если написать так:
tr {} {/}
Пример цитируемого текста
Программа Perl для печати тега ссылки HTML, где URL и текст ссылки хранятся в переменных. $ url
и $ text
соответственно может выглядеть так. Обратите внимание на использование обратной косой черты для экранирования двойных кавычек в кавычках:
Распечатать "<а href="$ url">$ text</а>";
Использование одинарных кавычек для разделения строки невозможно, поскольку Perl не расширяет переменные внутри строк в одинарных кавычках. Код ниже, например, будет нет работать по назначению:
Распечатать ' $ text '
С использованием printf
функция жизнеспособное решение для многих языков (Perl, C, PHP):
printf('% s ', $ url, $ text);
В qq
Оператор в Perl позволяет использовать любой разделитель:
Здесь документы особенно хорошо подходят для многострочных струнных; однако здесь документы Perl не позволяли отступ до v5.26[4]. В этом примере показан синтаксис Perl:
Распечатать <<HERE_IT_ENDS;<a href="$url">$text</a>HERE_IT_ENDS
Другие языки
C #
В C # язык программирования обрабатывает LTS с помощью @
символ в начале строковых литералов, перед начальными кавычками, например
нить Путь файла = @ "C: FooBar.txt";
а не требовать иначе:
нить Путь файла = "C: Foo Bar.txt";
C ++
В C ++ 11 стандартные дополнения сырые струны:
стандартное::нить Путь файла = р"(C: FooBar.txt)";
Если строка содержит символы )"
можно использовать необязательный разделитель, например d
в следующем примере:
стандартное::регулярное выражение повторно{ р"d (s / "([^"] *) "/ '1' / г) d" };
Идти
Идти указывает, что строка является необработанной, с помощью обратная кавычка как разделитель:
s := `C: FooBar.txt`
Необработанные строки могут содержать любой символ, кроме обратных кавычек; в необработанной строке нет кода выхода для обратной кавычки. Необработанные строки также могут охватывать несколько строк, как в этом примере, где строки s
и т
эквивалентны:
s := `Строка,охватывает нескольколинии.т := «Строка, состоящая из нескольких строк».
Python
Python имеет аналогичную конструкцию с использованием р
:
Путь файла = р"C: FooBar.txt"
Их также можно использовать вместе с тройными кавычками:
пример = р"" "Первая строка:" C: FooBar.txt "Вторая строка: ничего "" "
Рубин
Рубин использует одинарную кавычку для обозначения необработанной строки:
Путь файла = 'C: FooBar.txt'
Он также имеет литералы процентов регулярных выражений с выбором разделителя, например Perl:
% r {ftp: // [^ /] * / pub /}% r # ftp: // [^ /] * / pub / #% r! ftp: // [^ /] * / pub /!
Ржавчина
Ржавчина использует вариант р
префикс:[5]
"x52";// Рr "x52";// x52r # "" foo "" #;// "фу"r ## "foo #" # bar "##;// foo # "# бар
Буквальный начинается с р
за которым следует любое количество #
, за которым следует один "
. Дальше "
содержащиеся в литерале считаются частью литерала, если за ним не следует по крайней мере столько же #
как используется после открытия р
.
Scala
Scala позволяет использовать тройные кавычки, чтобы избежать путаницы:
вал Путь файла = "" "C: FooBar.txt" ""вал pubPattern = "" "ftp: // [^ /] * / pub /" ""р
Тройные кавычки также позволяют использовать многострочные строки, как показано здесь:
вал текст = """Первая линия,вторая линия."""
Сед
Сед регулярные выражения, особенно те, которые используют оператор «s», очень похожи на Perl (sed является предшественником Perl). Разделителем по умолчанию является «/», но можно использовать любой разделитель; по умолчанию используется «s / regexp / replacement /», но «s: regexp: replace:» также является допустимой формой. Например, чтобы сопоставить каталог «pub» (как в примере Perl) и заменить его на «foo», по умолчанию (экранирование косой черты) будет
s / ftp: // [^ /] * / pub // foo /
Использование восклицательного знака ("!") В качестве разделителя вместо этого дает
s!ftp://[^/]*/паб/!фу!
Смотрите также
Рекомендации
- ^ Энди Лестер, Ричард Фоли (2005). Профессиональная отладка Perl. Энди Лестер, Ричард Фоли. п. 176. ISBN 1-59059-454-1.
- ^ Дэниел Гольдман (февраль 2013 г.). Полное руководство по sed. EHDP Press. ISBN 978-1-939824-00-4.
- ^ перлоп на perldoc.perl.org.
- ^ Документы с отступом
- ^ необработанные строковые байтовые литералы на rust-lang.org.