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/2
sans 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
Enregistrer un commentaire