Erlang ets:选择子列表

Posted

技术标签:

【中文标题】Erlang ets:选择子列表【英文标题】:Erlang ets:select sublist 【发布时间】:2021-01-19 03:05:13 【问题描述】:

在 Erlang 中有没有办法在 ets 表上创建一个选择查询,它将获取所有包含搜索文本的元素?

ets:select(Table,
  [ %% Match spec for select query
      '_', #movie_datagenre = "Drama" ++ '_' , _ = '_',  % Match pattern
      [],                                                    % Guard
      ['$_']                                                 % Result
  ]) ;

这段代码只给了我开始(=前缀)和所需文本(文本=“戏剧”)的数据,但问题是我还需要包含数据的结果,像这个例子:

#movie_datagenre = "动作、剧情"

我试图把守卫换成那样的东西-

'_', #movie_datagenre = '$1', _='_', [string:str('$1', "Drama") > 0] ...

但问题是它不是一个合格的守卫表达式。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

这是不可能的。您需要将数据结构设计为可被保护表达式搜索,例如:


-record(movie_data, genre, name).
-record(genre, comedy, drama, action).

example() ->
    Table = ets:new('test', [keypos,2]),
    ets:insert(Table, #movie_dataname  = "Bean",
                                  genre = #genrecomedy = true),
    ets:insert(Table, #movie_dataname  = "Magnolia",
                                  genre = #genredrama = true),
    ets:insert(Table, #movie_dataname  = "Fight Club",
                                  genre = #genredrama = true, action = true),
    ets:select(Table,
               [#movie_datagenre = #genredrama = true, _ = '_', _ = '_',
                 [],
                 ['$_']
                ]).

【讨论】:

但是说我想看蝙蝠侠的所有电影,我每次都需要搜索特定的标题......所以没有办法这样做,除非我将ETS转换为列表并使用列表推导? @OmerLux:没错。 那么如果我需要使用列表,那么在函数的参数中传递什么更有效(在内存和运行时间方面)?列表还是 ETS 表?

以上是关于Erlang ets:选择子列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Erlang/Elixir 中的 ets 集中选择一个随机元素?

如何在erlang中匹配子字符串忽略大小写

有没有办法浏览 erlang 术语存储 (ETS)

从 ets:lookup() 中提取值 - Erlang

Erlang ETS 内存碎片

Erlang ets插入多个表