Below is an Erlang program which read integers from the standard input and outputs them in reverse order. escript provides scripting support for short Erlang programs which can also take command line arguments.
#!/usr/bin/env escript
%hr.erl
r(L) ->
case io:fread("", "~d") of
eof ->
io:format("Reverse List: ~p~n", [L]),
ok;
{ok, [N]} ->
r([N|L])
end.
main(_) -> r([]).
I have inputs in a file in.txt
.
4
5
6
0
1
2
To pass it the Erlang program we can use the pipe |
operator with cat
.
cat in.txt | escript hr.erl
Reverse List: [2,1,0,6,5,4]
It is a normal practice to use the redirection operator <
to send input as stdin taken from a file. But for some reasons, it's not working as intended with Erlang programs. The above program does not terminate if used with the redirection operator. It's the same case when using the command erl -noshell -s hr main < in.txt
with exported module and function main/0
. Of course, Erlang is not meant to be used like this. But still, it would be nice if we could. Instead of redirection, we can use pipe to send in the input which works correctly.