2

私は変数を持っています:

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

2つの特定のケースでパターンマッチングを試みています。

外側の構造に似たものがどこにあるか-単純に[]内側に何かが入っている私は試し[ _ ]ましたが、行きませんか?

次に、<<"10">>または<<"112">>または<<"52">>が表示された場合など、内部の特定のパターンについては、実際の右側を使用します。データを原子に変換します。基本的に、<< "10">>または<<"112">>または<<"52">>はフィールドであり、データの右側にあります。

[<<"10">>, _ ] 私はまだ行かないようなステートメントを試しまし た

残りのコードは次のとおりです。

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.

注意として、メッセージはタプルとして送信されません。Data=とまったく同じです。

誰かが私を正しい方向に導くことができますか?

ありがとう、おやすみなさい!-B

アップデート

さて、私は今、私は暖かくなっていると思います、私は入ってくるものは何でもパターンマッチしなければなりません。

だから私が言ったら

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

そして、私はフィールド<<"112">>にパターンマッチすることを探していました

112などは常に112と言いますが、Gen2067はいつでもデータを変更でき、変数に格納されます。

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.

身近に感じますが、100%ではありません

-B

4

1 に答える 1

2

Update OPは、関数に引数を渡そうとしており、メッセージを送信しようとはしていません。

名前が示すように、receiveブロックはプロセスに送信されたメッセージを受信して​​処理するために使用されます。引数を指定して呼び出すdataReceivedと、メッセージの待機に進みます。メッセージが送信されないため、メッセージは際限なく待機し続けます。現在のコードで何かを実行したい場合は、関数を生成し、プロセスIDを取得してから、プロセスIDにメッセージを送信する必要があります。

おそらく、引数がメッセージではなくパターン一致である関数が必要です。

このようなもの:

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]).

ちなみに、2番目のパターンは3番目のパターンのスーパーセットであるため、3番目のパターン[X] when is_list(X)は決して一致しません。一致するもの[X] when is_list(X)は常に一致する[X]ため、3番目の一致句がトリガーされることはありません。

元の回答

私はあなたの質問を理解できません。関数にメッセージを送信しようとしていますか、それとも引数を渡していますか?

これは、メッセージを送信する場合にリストのリストを照合する方法についての部分的な回答です。

-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.

receiveブロックの最初の句を見てください。[X] when is_list(X)内部リストを名前にバインドしXます。私はあなたが提供した価値でそれをテストしました、Dataそしてそれは働きました。

%% 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> 
于 2010-08-12T09:33:54.103 に答える