如何将字符串表示形式的erlang记录转换回记录

时间:2013-02-17 19:31:11

标签: 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}.",
{ok, Tokens, _} = erl_scan:string(RecString),
{ok, X} = erl_parse:parse_term(Tokens).

......上述内容将失败并显示以下消息:

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

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

1 个答案:

答案 0 :(得分:4)

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

-record(myrecord,{firstname,lastname,age}).

使用

创建记录
#myrecord{firstname='john',lastname='doe',age=22}

会导致元组

{myrecord,john,doe,22}

只包含实际数据。这是记录的定义方式,请参阅here

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

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

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