【问题标题】:String splitting problems in ErlangErlang中的字符串拆分问题
【发布时间】:2010-12-13 00:21:26
【问题描述】:

我一直在玩弄原子的分裂,但遇到了字符串的问题。输入数据总是由一些字母和一些数字组成的原子,例如ms444r64min1。由于函数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 函数中。 ..

它是将列表中的每个项目解释为字符串还是发生了什么?

【问题讨论】:

  • 你能澄清你的原始字符串的结构吗?固定宽度,总是一组连续的数字,等等。
  • 这是一个糟糕的原子用例。除非您发现自己处于根本无法控制输入内容的情况,否则需要“拆分原子”表明其余代码存在结构性问题。这就是为什么它们一开始就被称为“原子”。至少非常这些应该是元组:'ms444' 应该是{ms, 444}

标签: erlang


【解决方案1】:

erlang 中的 atom 是命名常量而不是变量(或者不像命令式语言中的变量)。 你真的不应该以动态方式创建原子(也就是说,不要在运行时将事物转换为原子)

它们更多地用于模式匹配和发送接收代码。

Pid ! {matchthis, X}


recive
{foobar,Y} -> doY(Y);
{matchthis,X} -> doX(X);
Other -> doother(Other)
end

一个变量,比如 X 可以设置为一个原子。例如 X=if 1==1 -> ok; true -> 失败结束。我的想象力可能很差,但我想不出你为什么要解析原子。你应该负责你写的原子而不是使用list_to_atom(CharIntegerList)。

您能否详细介绍一下您希望完成的工作?

【讨论】:

  • 我正在做的是解析已编译为 erlang 的 ASN1 规范,其中某些枚举已被转换为原子,例如 ms480,这意味着发送之间应该有 480 毫秒的延迟某个信号。
  • 啊。我想不可能做到“任何其他方式”。 (对于我来说,以 ms480 而不是 {ms,480} 的方式将规范作为原子似乎有点奇怪,但我们都是主人的奴隶。)所以发生的事情是有人将文本解析为原子,你把原子和将它们转换为字符串,然后拆分它们,然后我想您将“480”转换为数字。
【解决方案2】:

由于 Erlang 中的字符串只是 integer() 中的 list(),因此如果项目是 atom() 而实际上是 integer(),则会进行有趣的测试。如果将测试更改为查找字母,它会起作用:

29> lists:splitwith(fun (C) -> (C >= $a) and (C =< $Z)  end, atom_to_list(ms444)).
{"ms","444"}

【讨论】:

  • 这里不需要使用atom_to_list/1。只需写“ms444”(带引号),你会得到一个字符串(整数列表)。
  • 同意,但是如果所讨论的原子是一个变量,就像在一个真实的程序中一样,它看起来很不稳定。那它还能用吗?
  • 是的,ms444 是一个原子。
【解决方案3】:

您可能想查看字符串模块文档:

http://www.erlang.org/doc/man/string.html

您可能会对以下功能感兴趣:

tokens(String, SeparatorList) -> Tokens

【讨论】:

  • 不,行不通,我需要完整的所有字符。里面没有“一次性”字符。
【解决方案4】:

Erlang 中的“字符串”不是原始类型:它只是整数()的列表()。因此,如果您想将字母与数字“分开”,则必须与字符的整数表示进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多