Как я могу определить, является ли список просто строкой или списком строк? - PullRequest
5 голосов
/ 10 сентября 2009

У меня есть переменная, которая может содержать список строк или просто строку. Есть хороший способ сказать, с каким я имею дело?

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

В любом случае я хочу использовать соответствующие биты.

Ответы [ 3 ]

5 голосов
/ 10 сентября 2009

То, как вы это делаете, во многом зависит от того, что вы планируете делать с результатом, или, скорее, от того, как вы планируете это делать. Так что если вас интересуют биты:

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

или если вы не заинтересованы в том, чтобы на самом деле разделить строку / список строк, которые вы можете сделать:

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

Правильно ли я вас понял здесь? Я не вставил никакого кода, чтобы фактически проверить, что строки должны быть строками, это должно было быть сделано ранее. альтернативный вариант - при создании этой строки / списка строк всегда помещать ее в один из форматов.

1 голос
/ 08 апреля 2017

Эрланг реализует различные функции для проверки, является ли список плоским списком в модуле io_lib.

Один хороший выбор для проверки ваших конкретных IP-строк - io_lib: latin1_char_list (Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: latin1_char_list / 1 Реализация функции:

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.

Если вы хотите проверить плоские списки Юникода, вы можете использовать io_lib: char_list (Term) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: char_list / 1 реализация функции:

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.

Проверьте документацию модуля io_lib для других подобных функций.

Обратите внимание, что если какая-либо новая функция erlang отсутствует в текущей версии erlang, поддерживаемой вашим проектом, вы можете просто скопировать реализацию, предоставляемую новыми версиями erlang, и добавить их в собственный модуль. Найдите последнюю версию исходного кода erlang / lib / * / src и просто получите новые функции, которые вам нужны.

1 голос
/ 10 сентября 2009

Я иногда пишу что-то вроде:

case X of
    [List|_] when is_list(List) ->
        list_of_lists;
    List when is_list(List) ->
        list;
    _ ->
        not_a_list
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...