En programación informática , el síndrome del palillo inclinado ( LTS ) es la situación en la que una expresión entre comillas se vuelve ilegible porque contiene una gran cantidad de caracteres de escape , generalmente barras invertidas ("\"), para evitar la colisión de delimitadores . [1] [2]
La documentación oficial de Perl [3] introdujo el término a un uso más amplio; allí, la frase se utiliza para describir expresiones regulares que coinciden con rutas de estilo Unix , en las que los elementos están separados por barras diagonales /
. La barra diagonal también se utiliza como delimitador de expresión regular predeterminado, por lo que para usarse literalmente en la expresión, debe escaparse con una barra diagonal inversa\
, lo que lleva a frecuentes barras diagonales escapadas representadas como \/
. Si se duplica, como en las URL, esto da \/\/
como resultado un //
. Un fenómeno similar ocurre para rutas de DOS / Windows , donde la barra diagonal inversa se utiliza como separador de ruta, lo que requiere una barra diagonal inversa doble ; esta se puede volver a escapar para una expresión regular dentro de una cadena escapada, lo que requiere que coincida con una sola barra diagonal inversa. En casos extremos, como una expresión regular en una cadena escapada, que coincida con una ruta de Convención de nomenclatura uniforme (que comienza con ) requiere 8 barras diagonales inversas debido a que 2 barras diagonales inversas se escapan cada una dos veces.\\
\\\\
\\
\\\\\\\\
LTS aparece en muchos lenguajes de programación y en muchas situaciones, incluso en patrones que coinciden con los identificadores uniformes de recursos (URI) y en programas que generan texto entrecomillado. Muchas quines caen en la última categoría.
Considere la siguiente expresión regular de Perl destinada a hacer coincidir los URI que identifican archivos en el pub
directorio de un sitio FTP :
m / ftp:\/\/[^\/]*\/pub\/ /
Perl, al igual que sed antes, resuelve este problema permitiendo que muchos otros caracteres sean delimitadores de una expresión regular. Por ejemplo, los tres ejemplos siguientes son equivalentes a la expresión dada anteriormente:
m{ftp://[^/]*/pub/}m#ftp://[^/]*/pub/#m!ftp://[^/]*/pub/!
O esta traducción común para convertir barras invertidas en barras diagonales:
es /\\/ \ //
Puede ser más fácil de entender si se escribe así:
tr { \\ }{ / }
Un programa Perl para imprimir una etiqueta de enlace HTML, donde la URL y el texto del enlace se almacenan en variables $url
y $text
respectivamente, podría verse así. Observe el uso de barras invertidas para escapar de los caracteres de comillas dobles entre comillas:
imprimir "<a href=\"$url\">$texto</a>" ;
No es posible utilizar comillas simples para delimitar la cadena, ya que Perl no expande las variables dentro de cadenas entre comillas simples. El código siguiente, por ejemplo, no funcionaría como se esperaba:
imprimir '<a href="$url">$texto</a>'
El uso de la printf
función es una solución viable en muchos lenguajes (Perl, C , PHP ):
printf ( '<a href="%s">%s</a>' , $url , $texto );
El qq
operador en Perl permite cualquier delimitador:
imprimir qq{<a href="$url">$texto</a>} ; imprimir qq|<a href="$url">$texto</a>| ; imprimir qq(<a href="$url">$texto</a>) ;
Los documentos aquí son especialmente adecuados para cadenas de varias líneas; sin embargo, los documentos aquí de Perl no permitían una sangría adecuada antes de la versión v5.26. [4] Este ejemplo muestra la sintaxis de Perl:
imprimir << AQUÍ_TERMINA ; <a href="$url">$texto</a> AQUÍ_TERMINA
El lenguaje de programación C# maneja LTS mediante el uso del @
símbolo al comienzo de los literales de cadena, antes de las comillas iniciales, por ejemplo
cadena rutaDeArchivo = @"C:\Foo\Bar.txt" ;
en lugar de exigir de otro modo:
cadena rutaDeArchivo = "C:\\Foo\\Bar.txt" ;
El estándar C++11 agrega cadenas sin formato :
std :: string rutaDeArchivo = R " ( C:\Foo\Bar.txt ) " ;
Si la cadena contiene los caracteres )"
, se puede utilizar un delimitador opcional, como d
en el siguiente ejemplo:
std :: expresión regular re { R " d( s/"\([^"]*\)"/'\1'/g )d " };
Go indica que una cadena es simple utilizando la comilla invertida como delimitador:
s := `C:\Foo\Bar.txt`
Las cadenas sin formato pueden contener cualquier carácter excepto acentos graves; no existe un código de escape para los acentos graves en una cadena sin formato. Las cadenas sin formato también pueden abarcar varias líneas, como en este ejemplo, donde las cadenas s
y t
son equivalentes:
s := `Una cadena que abarca varias líneas.` t := "Una cadena que abarca varias líneas."
Python tiene una construcción similar que utiliza r
:
rutaArchivo = r "C:\Foo\Bar.txt"
También se pueden utilizar junto con comillas triples:
ejemplo = r """Primera línea: "C:\Foo\Bar.txt" Segunda línea: nada"""
Ruby utiliza comillas simples para indicar una cadena sin formato:
rutaDeArchivo = 'C:\Foo\Bar.txt'
También tiene literales de porcentaje de expresiones regulares con opción de delimitador como Perl:
% r {ftp://[^/]*/pub/} % r #ftp://[^/]*/pub/# % r !ftp://[^/]*/pub/!
Rust utiliza una variante del r
prefijo: [5]
" \x52 " ; // R r"\x52" ; // \x52 r#""foo""# ; // "foo" r##"foo #"# barra"## ; // foo #"# barra
El literal comienza con r
seguido de cualquier número de #
, seguido de uno "
. Los demás "
contenidos en el literal se consideran parte del literal, a menos que vayan seguidos de al menos tantos #
como los utilizados después del r
. Por lo tanto, un literal de cadena abierto con r#"
no puede tener "#
en su contenido.
Scala permite el uso de comillas triples para evitar confusiones:
val rutaDeArchivo = """C:\Foo\Bar.txt""" val patrónDePub = """ftp://[^/]*/pub/""" r
Las comillas triples también permiten cadenas de varias líneas, como se muestra aquí:
val text = """Primera línea, segunda línea."""
Las expresiones regulares de sed , en particular las que utilizan el operador "s", son muy similares a las de Perl (sed es un predecesor de Perl). El delimitador predeterminado es "/", pero se puede utilizar cualquier delimitador; el valor predeterminado es , pero también es una forma válida. Por ejemplo, para hacer coincidir un directorio "pub" (como en el ejemplo de Perl) y reemplazarlo por "foo", el valor predeterminado (escapando las barras) ess/regexp/replacement/
s:regexp:replacement:
s / ftp:\/\/[^\/]*\/pub\/ / foo /
El uso de un signo de exclamación ("!") como delimitador da como resultado
s ! ftp://[^/]*/pub/ ! foo !