Эрланг читать стандартный ввод стандартный вывод писать
Я пытаюсь узнать Эрланг через interviewstreet. Я только учу язык, так что почти ничего не знаю. Мне было интересно, как читать из stdin и писать в stdout.
Я хочу написать простую программу, которая пишет " Hello World!"количество раз, полученных в stdin.
Итак, с вводом stdin:
6
написать в stdout:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
В идеале я буду читать stdin по одной строке за раз (хотя это просто одна цифра в этом случае), поэтому я думаю, что буду использовать get_line. Пока это все, что я знаю.
спасибо
спасибо
3 ответов
вот еще одно решение, возможно, более функциональное.
#!/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).
вот мой шанс. Я использовал escript, поэтому его можно запустить из командной строки, но его можно легко поместить в модуль:
#!/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)
).
% 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.