【发布时间】:2015-04-14 19:46:30
【问题描述】:
我完全是 erlang 菜鸟,我只想看看我拥有的特定表中有什么。我只想从特定表中“选择 *”开始。我看到的示例,例如official documentation,都有我并不真正想要的列限制。我真的不知道如何形成 MatchHead 或 Guard 来匹配任何东西(又名“*”)。
非常感谢您提供关于如何从表格中取出所有内容的非常简单的入门教程!
【问题讨论】:
我完全是 erlang 菜鸟,我只想看看我拥有的特定表中有什么。我只想从特定表中“选择 *”开始。我看到的示例,例如official documentation,都有我并不真正想要的列限制。我真的不知道如何形成 MatchHead 或 Guard 来匹配任何东西(又名“*”)。
非常感谢您提供关于如何从表格中取出所有内容的非常简单的入门教程!
【问题讨论】:
最简单的方法大概是mnesia:dirty_match_object:
mnesia:dirty_match_object(foo, #foo{_ = '_'}).
也就是说,匹配表foo 中的所有内容,即foo 记录,而不管字段的值如何(每个字段都是'_',即通配符)。请注意,由于它使用记录构造语法,因此它只能在包含记录定义的模块中工作,或者在评估 rr(my_module) 以使记录定义可用后在 shell 中工作。
(我预计 mnesia:dirty_match_object(foo, '_') 可以工作,但失败并出现 bad_type 错误。)
要用select 来做,这样称呼它:
mnesia:dirty_select(foo, [{'_', [], ['$_']}]).
这里,MatchHead 是 _,即匹配任何东西。守卫是[],一个空列表,即没有额外的限制。结果规范为['$_'],即返回整条记录。有关匹配规范的更多信息,请参阅match specifications chapter of the ERTS user guide。
如果表达式太深并且在 shell 中打印了 ...,您可以通过评估 rp(EXPRESSION) 要求 shell 打印整个内容。 EXPRESSION 可以是再次调用函数,也可以是v(-1) 表示前一个表达式返回的值,或者v(42) 表示前面带有shell 提示符42> 的表达式返回的值。
【讨论】:
* 1: record muc_room undefined。如果我这样做mnesia:system_info(tables).,那么muc_room 在列表中。
... 缩写了一些数据有没有办法将结果转储到文件中?还是防止缩写?另外,谢谢你的描述。为什么结果规范中有$ 而匹配规范中没有?
$的信息,请参阅erlang.org/doc/apps/erts/match_spec.html。
mnesia:select 文档提到了 erts 匹配规范但没有链接,我找不到它。
例如,您可以使用qlc:
F = fun() ->
Q = qlc:q([R || R <- mnesia:table(foo)]),
qlc:e(Q)
end,
mnesia:transaction(F).
【讨论】:
** exception error: no match of right hand side value #Fun<erl_eval.20.82930912>。当然,我已经用一张真实的桌子替换了foo。我不明白错误消息告诉我什么:(
F。先在shell中输入f(F).。
F = ... 不会取代 F。谢谢。