4

ファイルからの入力を標準入力として、シェルおよびスタンドアロンで実行されている erlang プログラムにパイプする方法は?

ファイルがhr.erlあり、シェルからコンパイルします。を使用して stdin からの入力を受け入れる関数がありますio:fread()。一致{ok, [0]}した場合に終了するガード付きのケース式を作成しました。の代わりに0、実際には である必要がありますeof

  1. シェルで実行しているときに eof を送信する方法は?
  2. inp.txt各行に値1 2 3を持つファイルがあります0<パイプ演算子を使用して渡すにはどうすればよいですか? のようなものはありerl -hr <inp.txtますか?シェル内で標準入力にパイプできますか。

これまでの私のプログラムは次のとおりです(を含むように更新されましたeof)。

-module(hr).
-export([main/0]).    

r(L) ->
    case io:fread("", "~d") of
        eof -> 
            io:format("eof~n", []),
            ok;
        {ok, [0]} ->
            io:format("terminate~n", []),
            lists:reverse(L);
        {ok, [N]} ->
            io:format("inp ~p~n", [N]),
            r([N|L])
    end.

main() -> r([]).

シェルから

1> c(hr).
{ok,hr}
2> hr:main().
1
inp 1
2
inp 2
3
inp 3
0
terminate
[1,2,3]

ありがとう。

4

3 に答える 3

3

これは Erlang FAQ の 1 つです。

http://www.erlang.org/faq/how_do_i.html#id49435

于 2013-10-28T19:47:13.163 に答える
2

私が知っている Erlang の最速の行指向 IO については、こちらを参照してください。-noshellおよび-noinputコマンド ライン パラメータの使用法に注意してください。キー部分は

read() ->
   Port = open_port({fd, 0, 1}, [in, binary, {line, 256}]),
   read(Port, 0, [], []).

read(Port, Size, Seg, R) ->
  receive
    {Port, {data, {eol, <<$>:8, _/binary>> = Line}}} ->
      read(Port, Size + size(Line) + 1, [],
        [iolist_to_binary(lists:reverse(Seg, [])) | R]);
    {Port, {data, {eol, Line}}} ->
      read(Port, Size + size(Line) + 1, [Line | Seg], R);
    {'EXIT', Port, normal} ->
      {Size, [list_to_binary(lists:reverse(Seg, [])) | R]};
    Other ->
      io:format(">>>>>>> Wrong! ~p~n", [Other]),
      exit(bad_data)
  end.

編集: 行指向の IO は R16B http://erlang.org/pipermail/erlang-questions/2013-February/072531.htmlで修正されたため、このトリックはもう必要ないことに注意してください。

EDIT2 : fixed を使用した回答file:read_line/1があります。

于 2013-10-29T07:16:57.297 に答える
1

escriptを使用すると、入力をパイプできます。main(_)モジュールまたはエクスポート情報なしで、関数を使用して、つまりescript互換性のある方法で erlang プログラムを作成します。cat次に、 likeを使用して入力をパイプできます

cat inp.txt | escript hr.erl

これは機能し、プログラムは に遭遇すると終了しeofます。しかし、リダイレクト演算子を使用すると機能しない理由はまだわかりません<

于 2013-10-29T15:33:24.537 に答える