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.