Erlang:如何将标准输入从文件传输到erlang程序并匹配eof?

5 erlang stdin pipe eof

如何将文件中的输入作为标准输入传输到在 shell 中运行以及独立运行的 erlang 程序?

我有一个文件hr.erl,我从 shell 编译它。其中有一个函数使用 接受来自 stdin 的输入io:fread()。我写了一个带有守卫的 case 表达式,如果它匹配,{ok, [0]}它应该终止。相反0,我实际上需要它eof

  1. 在 shell 中运行时如何发送 eof?
  2. 我有一个文件,每一行都有inp.txt1 2 3和。0如何使用<管道运算符传递它?有类似的东西erl -hr <inp.txt吗?我可以将其通过管道传输到 shell 内的标准输入吗?

这是到目前为止我的程序(更新为包括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([]).
Run Code Online (Sandbox Code Playgroud)

来自外壳

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

谢谢。

小智 1

使用escript时我能够通过管道输入。编写没有模块或导出信息的 erlang 程序,使用main(_)函数,即以escript兼容的方式。然后我们可以使用管道cat输入

cat inp.txt | escript hr.erl
Run Code Online (Sandbox Code Playgroud)

这有效并且程序在遇到 时终止eof。但我仍然不知道为什么使用重定向运算符时它不起作用<