Erlang читать стандартный ввод писать стандартный вывод

Я пытаюсь изучить erlang через interviewstreet. Я только учу язык, так что почти ничего не знаю. Мне было интересно, как читать со стандартного ввода и писать на стандартный вывод.

Я хочу написать простую программу, которая пишет "Hello World!" количество раз, полученных в stdin.

Итак, со стандартным вводом:

6

Напишите на стандартный вывод:

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

В идеале я буду читать стандартный ввод по одной строке за раз (хотя в данном случае это всего одна цифра), поэтому я думаю, что буду использовать get_line. Это все, что я знаю на данный момент.

Благодарность

Спасибо


person GTDev    schedule 03.06.2012    source источник


Ответы (2)


Вот еще одно решение, возможно, более функциональное.

#!/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).
person tofcoder    schedule 03.06.2012

Вот мой шанс. Я использовал esscript, поэтому его можно запустить из командной строки, но его можно легко поместить в модуль:

#!/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) ].

Если вы не хотите использовать понимание списка, это подход, аналогичный последней строке кода, с использованием lists:foreach и той же последовательности:

    % 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)
    ).
person marcelog    schedule 03.06.2012