2009-10-09 16 views
5

¿Existe un equivalente a Perl """ en Erlang?Delimitación de cadenas en Erlang

Me gustaría poder definir una secuencia bastante larga, llena de comillas dobles, sin que escapen todas y cada una de ellas. ¿Es eso posible?

No dude en hacérmelo saber si estoy haciendo mal.

Gracias!

+1

Escapar es probablemente más seguro, aunque solo sea más fácil de entender para el programador que lo sigue. –

Respuesta

3

Básicamente no hay otra manera de hacerlo. Las sugerencias presentadas aquí funcionan pero parecen más complejas que la solución directa, y menos claras.

+0

Gracias. Tengo que aceptar que todas las soluciones hasta ahora solo complican las cosas. –

1

Creo que su mejor opción es poner su cadena de doble línea llena en dos líneas en un archivo separado, y luego leerlo con el nuevo archivo: read_line, concatenando las líneas en el arranque de su aplicación.

O si quieres tener un über-mess, puedes combinar esto con parse-transform. Puede colocar sus cadenas en el código fuente, comentadas y cuando se invoca la transformación de análisis sintáctico, abre el archivo de origen, lee el texto de los comentarios, concatenan y reemplazan. Ejemplo:

... 
Len = erlang:length("MY_FAKE_STRING_13"), 
%% This is my "double-qouted" 
%% "multi-line" string; 
%% you know what I mean ;) 

... 

En su transformación de análisis, busca cadenas que comiencen por MY_FAKE_STRING. Cuando encuentre uno, abra el código fuente de su módulo y lea las líneas hasta que llegue a la misma cadena. Luego lea su fuente línea por línea hasta que reciban comentarios, y concatenarlos. Al llegar a la primera línea vacía (o sin comentarios), tiene su cadena, que puede devolver en lugar de la cadena falsa.

+1

Por favor, no use transformadas de parseo para esto. Además de hacer que el código sea totalmente ilegible, tampoco son muy triviales. Tiene diez veces más sentido usar archivos de texto externos en este caso. –

+0

Estoy de acuerdo, pero la desventaja del archivo externo es que necesita modificar su código para poder leer el archivo una sola vez. Por ejemplo, intente reescribir httpd_utils: reason_phrase() para usar archivos externos. Además, la actualización del código no es trivial, porque necesita invocar una relectura del archivo externo si desea cambiar el texto, etc. – Zed

+0

Esta solución es demasiado compleja. – Christian

3

¿Qué tal esto:

1> atom_to_list('He said "hello" and then she answered "hi".'). 
"He said \"hello\" and then she answered \"hi\"." 

Se puede definir una macro para abreviar atom_to_list para mejorar la legibilidad.

+1

Esto tiene el mismo inconveniente que la solución de archivo externo. Modifique su código para hacer la conversión una vez (a menos que la conversión constante de átomo a título sea aceptable). También de esta manera los caracteres de nueva línea en su cadena se vuelven dependientes del sistema operativo, por lo que puede tener problemas con Erlangs que se ejecutan en diferentes sistemas operativos hablando entre ellos. – Zed

1

guardar el texto en archivo separado

2

En primer lugar me gustaría decir que el tener la cita tal cadena no es una mala idea para futuras versiones de Erlang. Pero no estoy conteniendo la respiración para que llegue. Python hace un buen uso de ellos como cadenas doc de múltiples líneas "no encasilladas".

Si estaba lo suficientemente molesto por la necesidad de escapar de las comillas y las barras diagonales, buscaría una macro transformadora en mi editor para hacerlo por mí en la selección de texto actual. O tal vez simplemente implementarlo con una expresión regular en sed para cortar la pasta. :)

$ echo 'Testing a "robust" way to \quote\ things.' | sed -e 's/[\\"]/\\&/g' 
Testing a \"robust\" way to \\quote\\ things.