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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables