2013-01-03 87 views
0

我想在MNESIA table中使用標準格式{{Y,M,D},{H,Min,Sec}}中的erlang datetime值作爲記錄目的,並且能夠通過與恆定的開始和結束時間元組比較來選擇日誌條目。Erlang與元組比較的匹配

似乎matchspec guard編譯器以某種方式混淆了帶警戒子表達式的元組值。評估ets:match_spec_compile(MatchSpec)失敗的

MatchSpec = [ 
{ 
{'_','$1','$2'} 
, 
[ 
{'==','$2',{1,2}} 
] 
, 
['$_'] 
} 
] 

但是當我比較$2與任何非元組值成功。

是否存在匹配警衛無法比較元組值的限制?

+1

您的數據如何存儲在Mnesia?記錄是什麼樣的? – rvirding

+0

問題解決了,謝謝。我現在可以使用像erlang:now()或calendar:local_time()這樣的值作爲記錄字段並對它們進行過濾。沒有仔細閱讀matchspecs文檔。 – user1945673

回答

2

我相信答案是在使用元組時使用雙括號(請參閱http://www.erlang.org/doc/apps/erts/match_spec.html#id69408的變量和字面值部分)。因此,要使用一個元組在matchspec表達,請用括號是元組,如,

{'==','$2',{{1,2}}} 

所以,如果我理解正確你的榜樣,你會

22> M=[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}]. 
[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}] 

23> ets:match_spec_run([{1,1,{1,2}}],ets:match_spec_compile(M)). 
[{1,1,{1,2}}] 

24> ets:match_spec_run([{1,1,{2,2}}],ets:match_spec_compile(M)). 
[] 

編輯:(抱歉編輯你的答案,但這是以可讀的形式得到我的評論最簡單的方法) 是的,這是必須完成的。獲得匹配規格的更簡單的方法是使用(僞)函數ets:fun2ms/1,其將文字樂趣作爲參數並返回匹配規格。所以

10> ets:fun2ms(fun ({A,B,C}=X) when C == {1,2} -> X end). 
[{{'$1','$2','$3'},[{'==','$3',{{1,2}}}],['$_']}] 

殼識別ets:fun2ms/1。欲瞭解更多信息,請參閱ETS documentation。 Mnesia使用與ETS相同的匹配規格。