2012-06-03 18 views
8

Próbuję dowiedzieć się erlang przez interviewstreet. Właśnie uczę się języka, więc nie wiem prawie nic. Zastanawiałem się, jak czytać ze standardowego wejścia i pisać na standardowe wyjście.Erlang odczytać stdin napisać stdout

Chcę napisać prosty program, który pisze "Hello World!" liczba razy odebrana w standardzie.

Więc z wejścia stdin:

6 

napisać do stdout:

Hello World! 
Hello World! 
Hello World! 
Hello World! 
Hello World! 
Hello World! 

Idealnie Przeczytam stdin jednej linii na raz (choć jest to tylko jedna cyfra w tym przypadku), więc Myślę, że będę używać get_line. To wszystko, co wiem na razie.

dzięki

Dzięki

Odpowiedz

19

Oto kolejne rozwiązanie, może bardziej funkcjonalne.

#!/usr/bin/env escript 

main(_) -> 
    %% Directly reads the number of hellos as a decimal 
    {ok, [X]} = io:fread("How many Hellos?> ", "~d"), 
    %% Write X hellos 
    hello(X). 

%% Do nothing when there is no hello to write 
hello(N) when N =< 0 -> ok; 
%% Else, write a 'Hello World!', and then write (n-1) hellos 
hello(N) -> 
    io:fwrite("Hello World!~n"), 
    hello(N - 1). 
+1

+1 dla rekursji ogonowej! – marcelog

1

Oto mój strzał w niego. Użyłem escript dzięki czemu może być uruchamiany z linii poleceń, ale można go umieścić w module łatwo:

#!/usr/bin/env escript 

main(_Args) -> 
    % Read a line from stdin, strip dos&unix newlines 
    % This can also be done with io:get_line/2 using the atom 'standard_io' as the 
    % first argument. 
    Line = io:get_line("Enter num:"), 
    LineWithoutNL = string:strip(string:strip(Line, both, 13), both, 10), 

    % Try to transform the string read into an unsigned int 
    {ok, [Num], _} = io_lib:fread("~u", LineWithoutNL), 

    % Using a list comprehension we can print the string for each one of the 
    % elements generated in a sequence, that goes from 1 to Num. 
    [ io:format("Hello world!~n") || _ <- lists:seq(1, Num) ]. 

Jeśli nie chcesz korzystać z listy ze zrozumieniem, to podobne podejście do ostatniego wiersz kodu, używając list: foreach i tej samej sekwencji:

% Create a sequence, from 1 to Num, and call a fun to write to stdout 
    % for each one of the items in the sequence. 
    lists:foreach(
     fun(_Iteration) -> 
      io:format("Hello world!~n") 
     end, 
     lists:seq(1,Num) 
    ). 
0
% Enter your code here. Read input from STDIN. Print output to STDOUT 
% Your class should be named solution 

-module(solution). 
-export([main/0, input/0, print_hello/1]). 

main() -> 
    print_hello(input()). 

print_hello(0) ->io:format(""); 
print_hello(N) -> 
    io:format("Hello World~n"), 
    print_hello(N-1). 
input()-> 
    {ok,[N]} = io:fread("","~d"), 
N.