在Erlang ETS中存储列表

时间:2014-12-19 03:41:45

标签: list erlang ets

我试图在ETS中插入一个列表以便稍后退出,出于某种原因,它说这是一个糟糕的arg。我不确定我是否错误插入。

是否无法在ETS中插入列表?

违规行为ets:insert(table, [{parsed_file, UUIDs}])

以下是代码:

readUUID(Id, Props) ->
    fun () -> 
        %%TableBool = proplists:get_value(table_bool, Props, <<"">>),
        [{_, Parsed}] = ets:lookup(table, parsed_bool),
        case Parsed of
          true  ->
            {uuids, UUIDs} = ets:lookup(table, parsed_bool),
            Index = random:uniform(length(UUIDs)),
            list_to_binary(lists:nth(Index, UUIDs));
          false -> 
            [{_, Dir}] = ets:lookup(table, config_dir),
            File = proplists:get_value(uuid_file, Props, <<"">>),
            UUIDs = parse_file(filename:join([Dir, "config", File])),
            ets:insert(table, [{parsed_file, {uuids, UUIDs}}]),
            ets:insert(table, [{parsed_bool, true}]),
            Index = random:uniform(length(UUIDs)),
            list_to_binary(lists:nth(Index, UUIDs))
        end
    end.

parse_file(File) ->
  {ok, Data} = file:read_file(File),
  parse(Data, []).

parse([], Done) ->
  lists:reverse(Done);

parse(Data, Done) ->
  {Line, Rest} = case re:split(Data, "\n", [{return, list}, {parts, 2}]) of
                   [L,R] -> {L,R};
                   [L]   -> {L,[]}
                 end,
  parse(Rest, [Line|Done]).

2 个答案:

答案 0 :(得分:2)

如果您使用类似

的内容在同一个proc中创建表
ets:new(table, [set, named_table, public]).
那时你应该没问题。默认权限受到保护,只有创建进程才能写入。

答案 1 :(得分:1)

关于我对仅包含元组的ets表的评论,以及ets:lookup/2在代码中返回以下行的注释:

        {uuids, UUIDs} = ets:lookup(table, parsed_bool),

将始终生成错误,因为ets:lookup/2会返回一个列表。上述3行的呼叫可能会成功。您似乎正尝试使用密钥tableparsed_bool中进行2次查找,并期望得到2种不同类型的答案:{_, Parsed}{uuids, UUIDs}。请记住,ETS不提供键值表,而是提供元组表,其中一个元素(默认为第一个元素)是键,而ets:lookup/2返回带有该键的元组列表。你可以取回多少取决于桌子的属性。

查看ETS tables的文档。