correspondance de modèle de clé de cartes erlang

Je suis nouveau sur erlang, j'ai une carte comme #{"a/.+":"v1", "b/c/.+": "v2"}

Je veux obtenir une valeur par clé d'entrée comme "a/d" pour correspondre à "a/.+" et obtenir "v1".

Il est facile de déterminer quand la clé est exactement et la clé d'entrée est regex, comment puis-je l'implémenter.


Solution du problème

Dans ce cas, vous n'êtes pas obligé d'utiliser map. L'idée est d'utiliser regex pour trouver quelle clé correspond à l'entrée, puis de renvoyer la valeur mappée. La version non optimisée utilise re:run/2sans compiler le modèle.

L1 = [{"a/.+", "v1"}, {"b/c/.+", "v2"}],
LResult1 = lists:foldl(fun({K, V}, ListIn) ->
Match = re:run("a/d", K),
case Match of
nomatch -> ListIn;
_ -> ListIn ++ [{K, V}]
end
end,
[],
L1
),
case LResult1 of
[] ->
no_matching_rule;
_ ->
Hd1 = hd(LResult1),
{K1, V1} = Hd1,
V1
end.

La version optimisée peut être obtenue en compilant le modèle regex une fois avant de les utiliser.

{ok, Mp1} = re:compile("a/.+"),
{ok, Mp2} = re:compile("b/c/.+"),
L2 = [{Mp1, "v1"}, {Mp2, "v2"}],
LResult2 = lists:foldl(fun({K, V}, ListIn) ->
Match = re:run("a/d", K),
case Match of
nomatch -> ListIn;
_ -> ListIn ++ [{K, V}]
end
end,
[],
L2
),
case LResult2 of
[] ->
no_matching_rule;
_ ->
Hd2 = hd(LResult2),
{K2, V2} = Hd2,
V2
end.

Coller l'un des codes ci-dessus dans le shell Erlang donnera "v1".

Le code ci-dessus suppose qu'une entrée peut avoir plusieurs modèles correspondants, mais seul le premier sera imprimé en sortie.

Commentaires

Posts les plus consultés de ce blog

Comment signer la connexion OKEx API version 5 avec websockets ?

Comment convertir une interface{} qui est vraiment une tranche de types dont le genre est reflect.Int32 en tranche de int32 ?

Comment cloner uniquement un sous-répertoire d'un référentiel Git ?