我一直在玩原子分裂并且遇到字符串问题。输入数据将始终是由一些字母和一些数字组成的原子,例如ms444
,r64
或min1
。由于函数lists:splitwith/2
采用列表,因此首先将原子转换为列表:
24> lists:splitwith(fun (C) -> is_atom(C) end, [m,s,4,4,4]).
{[m,s],[4,4,4]}
25> lists:splitwith(fun (C) -> is_atom(C) end, atom_to_list(ms444)).
{[],"ms444"}
26> atom_to_list(ms444).
"ms444"
我想将这些字母与数字分开,并且在使用列表时我已经成功地做到了这一点,但是因为我从一个原子开始,我得到一个“字符串”作为结果放入我的splitwith
功能...
它是将字典中的每个项目解释为字符串还是正在进行的操作?
答案 0 :(得分:9)
您可能希望查看字符串模块文档:
http://www.erlang.org/doc/man/string.html
您可能会对以下功能感兴趣:
tokens(String, SeparatorList) -> Tokens
答案 1 :(得分:1)
由于Erlang中的字符串只是list()
integer()
,因此当项目为atom()
时,如果它实际上是integer()
,则会有趣的测试。如果更改测试以查找它起作用的字母:
29> lists:splitwith(fun (C) -> (C >= $a) and (C =< $Z) end, atom_to_list(ms444)).
{"ms","444"}
答案 2 :(得分:1)
erlang中的一个原子是一个命名常量,而不是一个变量(或者不像变量是一种命令式语言)。 你真的不应该以动态方式创建原子(也就是说,不要在运行时将事物转换为原子)
它们更多地用于模式匹配并发送recive代码。
Pid ! {matchthis, X}
recive
{foobar,Y} -> doY(Y);
{matchthis,X} -> doX(X);
Other -> doother(Other)
end
像X这样的变量可以设置为原子。例如,X = if 1 == 1 - &gt;好;是的 - &gt;失败结束。我可能会受到想象力不足的困扰,但我想不出你想解析原子的方法。你应该负责你写的原子而不是list_to_atom
(CharIntegerList)。
您是否可以更全面地了解您想要完成的任务?
答案 3 :(得分:0)
Erlang中的“字符串”不是原始类型:它只是整数()的list()。因此,如果要将字母与数字“分开”,则必须与字符的整数表示进行比较。