如何将erlang记录从字符串表示转换回记录

如何将erlang记录从字符串表示转换回记录,erlang,Erlang,下面允许将元组或对象转换回erlang中的对象: {ok, Tokens, _} = erl_scan:string("{'abc',123}."), {ok, X} = erl_parse:parse_term(Tokens). 但当您将记录表示为字符串时,例如: -record(myrecord,{firstname,lastname,age}). ... RecString = "#myrecord{firstname='john',lastname='doe',age=22}.", {

下面允许将元组或对象转换回erlang中的对象:

{ok, Tokens, _} = erl_scan:string("{'abc',123}."),
{ok, X} = erl_parse:parse_term(Tokens).
但当您将记录表示为字符串时,例如:

-record(myrecord,{firstname,lastname,age}).
...
RecString = "#myrecord{firstname='john',lastname='doe',age=22}.",
{ok, Tokens, _} = erl_scan:string(RecString),
{ok, X} = erl_parse:parse_term(Tokens).
。。。上述操作将失败,并显示以下消息:

**异常错误:右侧值{error,{1,erl_parse,[“前面的语法错误:,[]]}不匹配


关于如何实现这一目标的想法?谢谢。

首先您必须记住,记录不是作为数据类型存在的,内部记录是元组,其中第一个元素是记录的名称。因此,根据您的记录定义:

-record(myrecord,{firstname,lastname,age}).
正在使用创建记录

#myrecord{firstname='john',lastname='doe',age=22}
将产生元组

{myrecord,john,doe,22}
它只包含实际数据。这是记录的定义方式,请参阅

第二点是,记录是纯编译时的语法结构,编译器在元组操作中对其进行转换。因此,记录的定义并不存在于任何地方,例如数据。只有编译器知道记录定义。所以当你打印一条记录时,你看到的只是元组。但是,您可以在shell中定义记录,以便在shell中使用记录语法,请参见中的

因此,从这个意义上讲,您不能真正地将记录转换为字符串表示形式。您可以解析字符串,但这只返回抽象语法,而不是您想要的语法。它们是表达式,因此您需要以
结束字符串,并使用
erl\u parse:exprs/1


希望这有帮助。你想干什么?或者更确切地说,你为什么要这么做?

谢谢你的澄清。实际上,我在字符串表示后有点,但忘记在上面的示例中写入。它仍然没有解析。让我解释一下……字符串不是来自记录本身,它是由Java对象在Java应用程序上构造的。我创建了一个Java方法“toErlangRecord()”,它将Java对象的getter方法转换为Erlang记录。字符串是#rec{x='a'}。然后将其作为消息从Erlang进程中获取,然后构建一个记录。我试图使用记录作为模式,而不是json或xml。据我所知,您所描述的是不可能的。查看或选择json、bson、xml、msgpack……基于上面的好建议,为了总结我的发现,我选择采用dict类型的proplist,因为它提供了本机(元组列表)方法,并且模块允许以简单的方式通过键访问数据。更好的选择是orddict,但要从另一个项目构建它,必须按升序定义键,这在非erlang环境中不是很灵活。更多关于dict或orddict的详细信息,请点击此处