2010-08-12 5 views
1

J'ai une variable:ERLANG - Pattern Matching

Data = [[<<>>, 
[<<"10">>,<<"171">>], 
[<<"112">>,<<"Gen20267">>], 
[<<"52">>,<<"20100812-06:32:30.687">>]] 

Je suis en train de match de modèle pour deux cas particuliers ..

Un monde où tout ce qui ressemble à la structure extérieure - simplement [] rien à l'intérieur va, j'ai essayé [ _ ] mais pas aller?

La deuxième, pour un modèle spécifique à l'intérieur, comme quand je vois un < < « 10 » >> ou < < « 112 » >> ou < < « 52 » >> alors je vais prendre le côté droit qui est les données réelles dans un atome. Fondamentalement le < < "10" >> ou < < "112" >> ou < < "52" >> sont les champs, le côté droit les données.

J'ai essayé des déclarations comme [<<"10">>, _ ] toujours pas aller

Voici le reste du code:

dataReceived(Message) -> 
    receive 
     {start} -> 
      ok; 

     [ _ ] -> %%No go 
      io:format("Reply 1 = ~p~n", [Message]); 

       [<<"10">>, _ ] -> %%No go 
      io:format("Reply 1 = ~p~n", [Message]) 


    end. 

Comme une note du message n'est pas envoyé comme tuple est exactement comme Data =

Quelqu'un peut-il me conduire dans la bonne direction?

Merci et bonne nuit! -B

MISE À JOUR

Ok maintenant je pense Im obtenir plus chaud, je dois tout correspondant au critère entre en jeu.

Donc, si je devais dire

Message = = [[<<>>], 
[<<"10">>,<<"171">>], 
[<<"112">>,<<"Gen20267">>], 
[<<"52">>,<<"20100812-06:32:30.687">>]] 

Et j'étais recherche d'un motif correspondant au champ < < "112" >>

Comme le 112 va toujours dire 112, mais le Gen2067 peut changer à n'importe quel moment .. ce sont les données, il sera stocké dans une variable.

loop() -> 
receive 
    [_,[<<"112">>, Data], _] when is_list(X) -> %% Match a list inside another. 
     ?DEBUG("Got a list ~p~n", [X]), 
     loop(); 
    _Other -> 
     ?DEBUG("I don't understand ~p~n", [_Other]), 
     loop() 
end. 

Je me sens proche im, mais pas à 100%

-B

+0

@ user417896: Je crois que vous confondez les arguments et les messages. Voir ma réponse mise à jour. –

Répondre

2

Mise à jour OP tente de passer un argument à la fonction et ne pas envoyer des messages.

Comme son nom l'indique, le bloc receive est utilisé pour recevoir et traiter les messages envoyés à un processus. Lorsque vous appelez dataReceived avec un argument, il attend les messages. Comme aucun message n'est envoyé, il continuera à attendre indéfiniment. Étant donné le code actuel, si vous voulez qu'il fasse quelque chose, vous devrez générer la fonction, obtenir l'ID du processus, puis envoyer un message à l'ID du processus.

Vous avez probablement besoin d'une fonction où l'argument est adapté et non modèle messages.

Quelque chose comme ceci:

dataReceived([Message]) when is_list(Message) -> 
    io:format("Got a list as arg ~p~n", [Message]); 
dataReceived(_Other) -> 
    io:format("Unknown arg ~p~n", [_Other]). 

D'un côté note de votre troisième motif [X] when is_list(X) ne correspondra jamais que le deuxième motif est un surensemble du troisième. Tout ce qui correspond à [X] when is_list(X) correspondra toujours à [X] et, par conséquent, votre troisième clause de correspondance ne sera jamais déclenchée.

Réponse originale

Je ne suis pas sûr que je comprends votre question. Essayez-vous d'envoyer un message à la fonction ou passez-vous un argument?

Ceci est une réponse partielle sur la façon de faire correspondre une liste de listes dans le cas où vous êtes envoyer un message.

-module(mtest). 
-export([run/0]). 

-ifdef(debug). 
-define(DEBUG(Format, Args), io:format(Format, Args)). 
-else. 
-define(DEBUG(Format, Args), void). 
-endif. 

loop() -> 
receive 
    [X] when is_list(X) -> %% Match a list inside another. 
     ?DEBUG("Got a list ~p~n", [X]), 
     loop(); 
    _Other -> 
     ?DEBUG("I don't understand ~p~n", [_Other]), 
     loop() 
end. 

Jetez un oeil à la première clause du bloc receive. [X] when is_list(X) liera la liste interne au nom X. Je l'ai testé avec la valeur de Data que vous avez fourni et cela a fonctionné.

%% From the shell. 
1> c(mtest, {d, debug}). 
{ok,mtest} 
2> Pid = mtest:run(). 
<0.40.0> 
3> Data = [[<<>>, [<<"10">>,<<"171">>], [<<"112">>,<<"Gen20267">>], [<<"52">>,<<"20100812-06:32:30.687">>]]]. 
[[<<>>, 
    [<<"10">>,<<"171">>], 
    [<<"112">>,<<"Gen20267">>], 
    [<<"52">>,<<"20100812-06:32:30.687">>]]] 
4> Pid ! Data. 
[[<<>>, 
    [<<"10">>,<<"171">>], 
    [<<"112">>,<<"Gen20267">>], 
    [<<"52">>,<<"20100812-06:32:30.687">>]]] 
Got a list [<<>>, 
      [<<"10">>,<<"171">>], 
      [<<"112">>,<<"Gen20267">>], 
      [<<"52">>,<<"20100812-06:32:30.687">>]] 
5>