我有一个变量,可以包含字符串列表或只是一个字符串。有没有一种好方法可以说出我正在处理什么?
"192.168.1.18" vs. ["192.168.1.18", "192.168.1.19"]
在任何一种情况下,我都想使用相关的位。
答案 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