Erlang filter list using lists:keyfind partial string -


i new erlang

i have list as:

list = [[{name, <<"redcar1">>}, {turbo, true}], [{name, <<"redcar2">>}, {turbo, true}], [{name, <<"greencard">>}, {turbo, false}]]. 

now want filter "red" cars

i tried using:

filtercar() ->   myf = fun(list) ->     case lists:keyfind(name, 1, list) of       {name, <<"red", _rest/binary>>} ->         true:       _ ->         false     end   end,   myf. 

then

lists:filter(myf, list), 

it works perfectly.

now want create generic function filter, like:

myfilter(value, list) ->   case lists:keyfind(name, 1, list) of     {name, <<value, _rest/binary>>} ->       true;     _ ->       false   end. 

but when try execute function got [] empty list.

i sure problem when try pass value because if replace

 {name, <<value, _rest/binary>>} 

with

{name, <<"red", _rest/binary>>} 

it works.

my aim find string start car in ignore case.

you need indicate 2 more things use general value in binary: it's binary, , size of binary.

filtercar(value) when is_binary(value) ->     myf = fun(list) ->                   size = byte_size(value),                   case lists:keyfind(name, 1, list) of                       {name, <<value:size/binary, _rest/binary>>} ->                           true;                       _ ->                           false                   end           end,     myf. 

first changed filterguard take 1 argument, value, pattern want for. use guard on function ensure value binary. inside internal fun first retrieve size of value via byte_size/1, need can set expected field size in matching binary. leads key change, <<value:size/binary, _rest/binary>>: set expected size of value field, , define binary field.

with change in place, can apply list variable, passing <<"red">> value:

1> lists:filter(filtercar(<<"red">>), list). [[{name,<<"redcar1">>},{turbo,true}],  [{name,<<"redcar2">>},{turbo,true}]] 

Comments

Popular posts from this blog

java - Date formats difference between yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd'T'HH:mm:ssXXX -

c# - Get rid of xmlns attribute when adding node to existing xml -