stringtranslate.com

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

В компьютерном программировании синдром наклоненной зубочистки ( LTS ) — это ситуация, в которой выражение в кавычках становится нечитаемым, поскольку оно содержит большое количество escape-символов , обычно обратных косых черт ("\"), чтобы избежать столкновения разделителей . [1] [2]

Официальная документация Perl [3] ввела этот термин в более широкое использование; там эта фраза используется для описания регулярных выражений , соответствующих путям в стиле Unix , в которых элементы разделяются косой чертой /. Косая черта также используется в качестве разделителя регулярных выражений по умолчанию, поэтому, чтобы ее можно было использовать в выражении буквально, ее необходимо экранировать обратной косой чертой \, что приводит к частым экранированным косым чертам, представленным как \/. При удвоении, как в URL-адресах, получается \/\/экранированный //. Аналогичное явление происходит для путей DOS / Windows , где обратная косая черта используется в качестве разделителя путей, требуя двойную обратную косую черту – затем ее можно повторно экранировать для регулярного выражения внутри экранированной строки, требующей соответствия одиночной обратной косой черте. В крайних случаях, таких как регулярное выражение в экранированной строке, для соответствия пути по унифицированному соглашению об именах (который начинается ) требуется 8 обратных косых черт, поскольку 2 обратных косых черты являются двойными экранированными.\\\\\\\\\\\\\\\\

LTS появляется во многих языках программирования и во многих ситуациях, в том числе в шаблонах, соответствующих унифицированным идентификаторам ресурсов (URI), и в программах, выводящих текст в кавычках. Многие куайны попадают в последнюю категорию.

Пример шаблона

Рассмотрим следующее регулярное выражение Perl, предназначенное для сопоставления URI, идентифицирующих файлы в pubкаталоге FTP -сайта:

м / ftp:\/\/[^\/]*\/pub\/ /

Perl, как и до него sed , решает эту проблему, позволяя использовать множество других символов в качестве разделителей регулярного выражения. Например, следующие три примера эквивалентны приведенному выше выражению:

м{ftp://[^/]*/pub/}m#ftp://[^/]*/pub/#m!ftp://[^/]*/pub/!

Или этот общий перевод для преобразования обратной косой черты в косую черту:

тр /\\/ \ //

может быть легче понять, если написать так:

тр { \\ }{ / }

Пример цитируемого текста

Программа Perl для печати тега ссылки HTML, где URL-адрес и текст ссылки хранятся в переменных $urlи $textсоответственно, может выглядеть следующим образом. Обратите внимание на использование обратной косой черты для экранирования символов в двойных кавычках:

напечатайте "<a href=\"$url\">$text</a>" ; 

Использование одинарных кавычек для разделения строки невозможно, поскольку Perl не расширяет переменные внутри строк, заключенных в одинарные кавычки. Например, приведенный ниже код не будет работать должным образом:

напечатайте '<a href="$url">$text</a>' 

Использование этой printfфункции является жизнеспособным решением на многих языках (Perl, C , PHP ):

printf ( '<a href="%s">%s</a>' , $url , $text );  

Оператор qqв Perl допускает использование любого разделителя:

напечатайте qq{<a href="$url">$text</a>} ; print qq|<a href="$url">$text</a>| ; print qq(<a href="$url">$text</a>) ;   

Здесь документы особенно хорошо подходят для многострочных строк; однако в документах Perl до версии 5.26 не допускались правильные отступы . [4] В этом примере показан синтаксис Perl:

напечатать << HERE_IT_ENDS ; <a href="$url">$text</a> HERE_IT_ENDS 

Другие языки

С#

Язык программирования C# обрабатывает LTS, используя символ @в начале строковых литералов перед начальными кавычками, например

строка filePath = @"C:\Foo\Bar.txt" ;   

вместо того, чтобы требовать иного:

строка filePath = "C:\\Foo\\Bar.txt" ;   

С++

Стандарт C++11 добавляет необработанные строки :

std :: string filePath = R " ( C:\Foo\Bar.txt ) " ;   

Если строка содержит символы )", можно использовать необязательный разделитель, как dв следующем примере:

std :: регулярное выражение re { R " d( s/"\([^"]*\)"/'\1'/g )d " };   

Идти

Go указывает, что строка является необработанной, используя обратный апостроф в качестве разделителя:

s := `C:\Foo\Bar.txt`  

Необработанные строки могут содержать любые символы, кроме обратных кавычек; для обратной кавычки в необработанной строке нет escape-кода. Необработанные строки также могут занимать несколько строк, как в этом примере, где строки sи tэквивалентны:

s := `Строка, занимающая несколько строк.` t := "Строка,\ns занимающая несколько\n строк."    

Питон

Python имеет аналогичную конструкцию, используя r:

filePath  =  r "C:\Foo\Bar.txt"

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

example  =  r """Первая строка: "C:\Foo\Bar.txt" Вторая строка: ничего"""

Рубин

Ruby использует одинарную кавычку для обозначения необработанной строки:

filePath = 'C:\Foo\Bar.txt'  

Он также имеет процентные литералы регулярных выражений с выбором разделителя, например Perl:

% r {ftp://[^/]*/pub/} % r #ftp://[^/]*/pub/# % r !ftp://[^/]*/pub/!

Ржавчина

Rust использует вариант префикса r: [5]

" \x52 " ; // Р р"\x52" ; // \x52 r#""foo""# ; // "foo" r##"foo #"# bar"## ; // foo #"# bar    

Литерал начинается с rлюбого числа #, за которым следует один ". Дальнейшие элементы ", содержащиеся в литерале, считаются частью литерала, если за ним не следует хотя бы столько же символов, #сколько использовано после открытия r. Таким образом, строковый литерал, открытый с помощью, r#"не может иметь "#в своем содержимом.

Скала

Scala позволяет использовать тройные кавычки, чтобы избежать путаницы:

val filePath = """C:\Foo\Bar.txt""" val pubPattern = """ftp://[^/]*/pub/""" r      

Тройные кавычки также позволяют использовать многострочные строки, как показано здесь:

val text = """Первая строка, вторая строка."""   

Сед

Регулярные выражения Sed , особенно те, которые используют оператор «s», очень похожи на Perl (sed — предшественник Perl). Разделителем по умолчанию является «/», но можно использовать любой разделитель; по умолчанию — , но это также допустимая форма. Например, чтобы найти каталог «pub» (как в примере Perl) и заменить его на «foo», по умолчанию (без косых черт) используетсяs/regexp/replacement/s:regexp:replacement:

s / ftp:\/\/[^\/]*\/pub\/ / foo /

Вместо этого использование восклицательного знака ("!") в качестве разделителя дает

с ! ftp://[^/]*/pub/ ! фу !

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

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

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