如何确定列表是仅仅是字符串还是字符串列表?

时间:2009-09-10 16:00:55

标签: erlang

我有一个变量,可以包含字符串列表或只是一个字符串。有没有一种好方法可以说出我正在处理什么?

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

在任何一种情况下,我都想使用相关的位。

4 个答案:

答案 0 :(得分:5)

如何做到这一点很大程度上取决于您打算如何处理结果,或者更倾向于您计划如何执行此操作。所以,如果你对这些位感兴趣:

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

或者如果你对实际拆分你可以做的字符串/字符串列表不感兴趣:

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

我在这里理解你了吗?我没有放任何代码来实际检查字符串实际上应该是字符串,这应该早点完成。 另一种方法是在生成此字符串/字符串列表时始终将其置于其中一种格式中。

答案 1 :(得分:1)

我有时会写一些类似的东西:

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

答案 2 :(得分:1)

Erlang实现了不同的函数来测试列表是否是模块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.

如果要测试平面unicode列表,可以使用 io_lib:char_list(期限) 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源代码,只需获取所需的新功能。

答案 3 :(得分:0)

如果需要在函数头中确定此区别,则可以通过这种方法在警卫队中找出这一区别:

1> S = "lofa".
2> T = ["hehe", "miez"].

3> is_list(S).
true
4> is_list(T).
true

Erlang字符是整数,

5> hd(S). % => 108    
6> Y = "よし". % => [12424,12375]

因此,要检查字符串输入

7> (fun
7>     ([H|_] = L) when erlang:is_integer(H) -> yay;
7>     (_) -> nono
7>  end
7> )(S).
yay

8> (fun([H|_] = L) when erlang:is_integer(H) -> yay; (_) -> nono end)(T).
nono

我个人认为上述版本比

更直观
9> (fun([H|_] = L) when not(erlang:is_list(H)) -> yay; (_) -> nono end)(Y).
yay
10> (fun([H|_] = L) when not(erlang:is_list(H)) -> yay; (_) -> nono end)(T).
nono