Erlang过滤器列表使用列表:keyfind部分字符串

时间:2015-09-21 09:56:47

标签: erlang

我对Erlang

几乎是新手

我有一个列表:

List = [[{name, <<"redCar1">>}, {turbo, true}], [{name, <<"redCar2">>}, {turbo, true}], [{name, <<"greenCard">>}, {turbo, false}]].

现在我要过滤所有"red"汽车

我尝试使用:

filterCar() ->
  MyF = fun(List) ->
    case lists:keyfind(name, 1, List) of
      {name, <<"red", _Rest/binary>>} ->
        true:
      _ ->
        false
    end
  end,
  MyF.

然后

lists:filter(MyF, List),

效果很好。

现在我想创建一个通用函数来过滤,例如:

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

但是当我尝试执行此功能时,我总是[]空列表。

我确定问题是当我尝试传递Value因为我替换

 {name, <<Value, _Rest/binary>>}

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

有效。

我的目标是在忽略大小写中找到以car开头的所有字符串。

1 个答案:

答案 0 :(得分:2)

你只需要指出另外两件事就可以在你的二进制文件中使用一般值:它是二进制文件,以及二进制文件的大小。

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.

首先我们更改filterGuard以获取一个参数Value,这是我们想要查找的模式。我们在函数上使用保护来确保Value是二进制。在内部fun内,我们首先通过Value检索byte_size/1的大小,这是我们需要的,以便我们可以在匹配的二进制文件中设置预期的字段大小。这会导致密钥更改,即<<Value:Size/binary, _Rest/binary>>:我们设置Value字段的预期大小,并将其定义为binary字段。

通过此更改,我们可以成功将其应用于您的List变量,并将<<"red">>传递给Value

1> lists:filter(filterCar(<<"red">>), List).
[[{name,<<"redCar1">>},{turbo,true}],
 [{name,<<"redCar2">>},{turbo,true}]]