2011-11-07 7 views
10

En Erlang, cuando tiene una lista de caracteres imprimibles, es una cadena, pero una cadena también es una lista de elementos y todas las funciones de una lista se pueden aplicar a una cadena. Idealmente, la estructura de datos: string no existe en erlang.

Parte de mi código necesita estar seguro de que algo no es solo una lista, sino una cadena. (Una cadena real). Necesita separar listas, por ej. [1,2,3,a,b,"josh"], de una cadena, p. "Muzaaya". La expresión de protección is_list/1 dirá true para ambas cadenas y listas. No existe una protección como is_string/1 y, por lo tanto, esto significa que necesito un fragmento de código para asegurarme de que mis datos sean una cadena. Una cadena en este caso es una lista de solo imprimible (alfabético, ambos casos, superior e inferior), y puede contener números, por ejemplo, "Muzaaya2536 618 Joshua". Necesito un fragmento de código (Erlang) que verifique por mí y se asegure de que la variable sea una cadena, no solo una lista. graciasdiferenciar una cadena de una lista en Erlang

+0

Vea también http://stackoverflow.com/questions/2479713/determining-if-an-item-is-a-string-or-a-list-in-erlang – legoscia

Respuesta

23

usted tiene dos funciones en el módulo io_lib que pueden ser útiles: io_lib:printable_list/1io_lib:printable_unicode_list/1 y que ponen a prueba si el argumento es una lista de imprimibles latin1 o Unicode caracteres respectivamente.

+1

gracias @rvirding, ¡esta es una solución más estándar! –

5

utilizando el isprint (3) definición de los caracteres imprimibles -

isprint(X) when X >= 32, X < 127 -> true; 
isprint(_) -> false. 

is_string(List) when is_list(List) -> lists:all(fun isprint/1, List); 
is_string(_) -> false. 

usted no será capaz de utilizarlo como un guardia, sin embargo.

+0

Gracias @ butter71, esto funciona muy bien también ! –

+0

Esto funciona para el conjunto de caracteres Latin1, pero podría ser importante tener en cuenta que rechazará los códigos de caracteres Unicode. – goncalotomas

Cuestiones relacionadas