使用 lists:keyfind 部分字符串的 Erlang 过滤器列表
Erlang filter list using lists:keyfind partial string
我几乎是新手 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
开头的所有字符串。
您只需要再指明两件事即可在您的二进制文件中使用通用值:它是一个二进制文件,以及该二进制文件的大小。
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
中,我们首先通过 byte_size/1
检索 Value
的大小,以便我们可以在匹配的二进制文件中设置预期的字段大小。这导致关键的变化,即<<Value:Size/binary, _Rest/binary>>
:我们设置了Value
字段的预期大小,我们将其定义为binary
字段。
进行此更改后,我们可以成功将其应用于您的 List
变量,将 <<"red">>
传递给 Value
:
1> lists:filter(filterCar(<<"red">>), List).
[[{name,<<"redCar1">>},{turbo,true}],
[{name,<<"redCar2">>},{turbo,true}]]
我几乎是新手 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
开头的所有字符串。
您只需要再指明两件事即可在您的二进制文件中使用通用值:它是一个二进制文件,以及该二进制文件的大小。
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
中,我们首先通过 byte_size/1
检索 Value
的大小,以便我们可以在匹配的二进制文件中设置预期的字段大小。这导致关键的变化,即<<Value:Size/binary, _Rest/binary>>
:我们设置了Value
字段的预期大小,我们将其定义为binary
字段。
进行此更改后,我们可以成功将其应用于您的 List
变量,将 <<"red">>
传递给 Value
:
1> lists:filter(filterCar(<<"red">>), List).
[[{name,<<"redCar1">>},{turbo,true}],
[{name,<<"redCar2">>},{turbo,true}]]