[erlang-questions] Strange ets:select behaviour

Magnus Henoch <>
Thu Dec 11 15:59:16 CET 2008

"Maxim Treskin" <> writes:

> But with this MatchSpec I have error:
> ()7> ets:select(controllers, [{{{'$1', '$2', '$3'}, '$4'}, [{'==', '$1',
> {192,168,138,73}}, {is_pid, '$4'}], ['$4']}]).
> ** exception error: bad argument
>      in function  ets:select/2
>         called as ets:select(controllers,
>                              [{{{'$1','$2','$3'},'$4'},
>                                [{'==','$1',{192,168,138,73}},{is_pid,'$4'}],
>                                ['$4']}])
> Is it means that impossible to use tuples in MatchSpec guards?

Not impossible, but you have to write it as either {{192,168,138,73}} (a
nested tuple) or {const, {192,168,138,73}}.  From "Match specifications
in Erlang", http://www.erlang.org/doc/apps/erts/match_spec.html#1.3 :

  In the MatchHead part, all literals (except the variables noted above)
  are interpreted as is. In the MatchCondition/MatchBody parts, however,
  the interpretation is in some ways different. Literals in the
  MatchCondition/MatchBody can either be written as is, which works for
  all literals except tuples, or by using the special form {const, T},
  where T is any Erlang term. For tuple literals in the match_spec, one
  can also use double tuple parentheses, i.e., construct them as a tuple
  of arity one containing a single tuple, which is the one to be
  constructed. The "double tuple parenthesis" syntax is useful to
  construct tuples from already bound variables, like in {{'$1',

You might find it easier not to write match specifications manually,
instead using ets:fun2ms/1.

Magnus Henoch, 
Erlang Training and Consulting

More information about the erlang-questions mailing list