WikiDer > Синдром наклонной зубочистки

Leaning toothpick syndrome

В компьютерное программирование, наклонившись зубочистка синдром (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 позволяет использовать любой разделитель:

Распечатать qq { $ text };Распечатать qq |  $ text  |;Распечатать qq ( $ text );

Здесь документы особенно хорошо подходят для многострочных струнных; однако здесь документы 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://[^/]*/паб/!фу!

Смотрите также

Рекомендации

  1. ^ Энди Лестер, Ричард Фоли (2005). Профессиональная отладка Perl. Энди Лестер, Ричард Фоли. п. 176. ISBN 1-59059-454-1.
  2. ^ Дэниел Гольдман (февраль 2013 г.). Полное руководство по sed. EHDP Press. ISBN 978-1-939824-00-4.
  3. ^ перлоп на perldoc.perl.org.
  4. ^ Документы с отступом
  5. ^ необработанные строковые байтовые литералы на rust-lang.org.