¿Cómo puedo determinar si una lista es solo una cadena o una lista de cadenas?

StackOverflow https://stackoverflow.com/questions/1406173

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo una variable que puede contener una lista de cadenas o solo una cadena. ¿Hay una buena manera de saber de qué tipo estoy tratando?

"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"]

En cualquier caso, quiero usar los bits involucrados.

¿Fue útil?

Solución

La forma en que lo haga depende mucho de lo que planee hacer con el resultado o, más bien, de cómo planee hacerlo. Así que si estás interesado en los bits:

case MyVar of
    [First|Rest] when is_list(First) -> ... First,Rest ...;
    _ -> ... MyVar ...
end

o si no está interesado en separar realmente la cadena / lista de cadenas que podría hacer:

if is_list(hd(MyVar)) -> ... ;
   true -> ...
end

¿Te he entendido correctamente aquí? No he introducido ningún código para comprobar realmente que lo que deberían ser cadenas en realidad son cadenas, esto debería haberse hecho antes. una alternativa sería generar esta cadena / lista de cadenas para colocarla siempre en uno de los formatos.

Otros consejos

A veces escribo algo como:

case X of
    [List|_] when is_list(List) ->
        list_of_lists;
    List when is_list(List) ->
        list;
    _ ->
        not_a_list
end

Erlang implementa diferentes funciones para probar si una lista es una lista plana en el módulo io_lib.

Una buena opción para verificar sus cadenas IP en particular es io_lib: latin1_char_list (Término) http://erlang.org/doc/man/io_lib.html#latin1_char_list- 1

la implementación de la función io_lib: latin1_char_list / 1 es:

latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 ->
      latin1_char_list(Cs);
latin1_char_list([]) -> true;
latin1_char_list(_) -> false.

Si desea probar las listas planas de Unicode, puede usar io_lib: char_list (Término) http://erlang.org/doc/man/io_lib.html#char_list- 1

io_lib: char_list / 1 implementación de la función es:

char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800;
       is_integer(C), C > 16#DFFF, C < 16#FFFE;
       is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
    char_list(Cs);
char_list([]) -> true;
char_list(_) -> false.

Consulte la documentación del módulo io_lib para otras funciones similares.

Observe que si falta alguna nueva función erlang en su versión de erlang compatible con el proyecto actual, simplemente puede copiar la implementación que proporcionan las nuevas versiones de erlang y agregarlas a su propio módulo. Busque el último código fuente de erlang / lib / * / src y simplemente obtenga las nuevas funciones que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top