Advanced ETS Pattern Matching

Erik Reitsma (ELN) Erik.Reitsma@REDACTED
Tue Jan 7 09:14:58 CET 2003


> Does anyone know if ETS can support pattern matching on "the > rest of a list of terms" if the key is a list of terms?

Yes, it does in the cases you describe.

> Examples:
>
> Given keys:
>
> [a,b,c,d]
> [a,b,c]
> [a,b]

 
Eshell V5.2  (abort with ^G)
1> T=ets:new(my_table,[]).
11
2> ets:insert(T,[{[a,b,c,d],1},{[a,b,c],2},{[a,b],3}]).
true

> Find all three with the following pattern:
>
> [a,'*']

3> ets:match(T,{[a|'$1'],'$2'}).
[[[b,c,d],1],[[b],3],[[b,c],2]]

> Find the last two with this pattern:
>
> [a,b,'*']

If '*' means zero or more elements, it would match all keys:

4> ets:match(T,{[a,b|'$1'],'$2'}).
[[[c,d],1],[[],3],[[c],2]]

If it matches one or more elements, I have to add another element:

5> ets:match(T,{[a,b,'$3'|'$1'],'$2'}).
[[[d],1,c],[[],2,c]]

> Find [a,b] with this pattern:
>
> ['_',b]

6> ets:match(T,{['$1',b],'$2'}).       
[[a,3]]

It seems to work fine.

Regards,
*Erik.



More information about the erlang-questions mailing list