1. ets:match/2
根据匹配模式 Pattern 匹配 ETS 表 Tab 里的对象数据。
一个匹配模式也许包含的项值有:绑定部分(Erlang 项),‘_’ 可以匹配任何 Erlang 项,和匹配变量:‘$N’(N>=0)
函数将返回一个匹配每个对象数据的元素的列表,每个元素是一个绑定变量模式的有序列表。
1> ets:new(my_table, [set, named_table]).
my_table
2> ets:insert(my_table, {person, "Alice"}).
true
3> ets:insert(my_table, {person, "Bob"}).
true
4> ets:insert(my_table, {person, "Charlie"}).
true
5> ets:insert(my_table, {age, 30}).
true
6> ets:insert(my_table, {age, 25}).
true
7> ets:match(my_table, {'_', "Alice"}).
[]
8> ets:match(my_table, {'_', "ACharlie"}).
[]
9> ets:match(my_table, {'_', "Charlie"}).
[[]]
10> ets:match(my_table, {'_', Charlie}).
* 1: variable 'Charlie' is unbound
%% 匹配到了最后插入的人名字为什么返回的是一个空数组
11> ets:match(my_table, {'_', "Charlie"}).
[[]]
12> ets:match(my_table, {'_', "Alice"}).
[]
13> ets:match(my_table, {'_', "Bob"}).
[]
14> ets:insert(my_table, {person, "Zheng"}).
true
15> ets:match(my_table, {'_', "Charlie"}).
[]
16> ets:match(my_table, {'_', "Zheng"}).
[[]]
为了更好的展示效果这次我们采用bag类型的表
19> Tab1 = ets:new(ets_tab, [named_table, set]),
ets:insert(Tab1, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]),
ets:match(Tab1, '$1').
[[{rufsen,dog,7}],[{ludde,dog,5}],[{brunte,horse,5}]]
20> ets:match(Tab1, {_,_,7}).
* 1: variable '_' is unbound
21> ets:match(Tab1, {'_','_',7}).
[[]]
22> ets:match(Tab1, {'_','_',1}).
[]
23> ets:match(Tab1, {'_','_',5}).
[[],[]]
24> ets:match(Tab1, {'_',dog,5}).
[[]]
25> ets:match(Tab1, {'_',dog,7}).
[[]]
%%当我们开始使用变量来匹配时便不是空数组了
26> ets:match(Tab1, {'$1',dog,7}).
[[rufsen]]
27> ets:match(Tab1, {'$1','$2',7}).
[[rufsen,dog]]
看到这个例子,我带盖知道什么原因了:
- ’ _ ‘可以匹配任何 Erlang 项但是,’ _ ‘对应位置的值不会出现在结果的数组里面,要想对应的值出现在结果数组里面则需要使用’$1’,'$2’这种变量来匹配
最后我们再来试一下直接匹配对应的值
37> Tab = ets:new(ets_tab, [named_table, bag]).
ets_tab
38> ets:insert(Tab, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]).
true
39> ets:match(Tab, {'_', '$1', '$2'}).
[[dog,7],[dog,5],[horse,5]]
40> ets:match(Tab, {rufsen, '$1', '$2'}).
[[dog,7]]
41> ets:match(Tab, {'_', '$1', 5}).
[[dog],[horse]]
42>
这样也是可以的,但是一定要是变量匹配的值才会出现在结果列表里面
2. ets:match/3 与 ets:match/1
match(Tab, Pattern, Limit) -> {[Match], Continuation} | $end_of_table
跟 ets:match/2 一样,都是根据匹配模式 Pattern 匹配表 Tab 里的对象数据,但是 ets:match/3 只返回 Limit 条的匹配数据。返回结果里还同时返回变量 Continuation,这可作为下一次调用 ets:match/1 方法的参数来获取下一批的匹配数据,这比使用 ets:first/1 和 ets:next/2 方法遍历获取表里的对象数据会更快,更有效率。
如果表为空,则返回 ‘$end_of_table’。
1> Tab = ets:new(ets_tab, [named_table, bag]),
ets:insert(Tab, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]),
{Match, _Continuation} = ets:match(Tab, '$1', 2),
Match.
[[{ludde,dog,5}],[{brunte,horse,5}]]
2> _Continuation.
{ets_tab,229,2,#Ref<0.2639193521.1568276481.141293>,[],0}
3> ets:match(_Continuation).
{[[{rufsen,dog,7}]],'$end_of_table'}
4> Continuation01 = ets:match(_Continuation).
{[[{rufsen,dog,7}]],'$end_of_table'}
5> Continuation02 = ets:match(Continuation01).
** exception error: bad argument
in function ets:match/1
called as ets:match({[[{rufsen,dog,7}]],'$end_of_table'})
6>
``