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

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"