2012-06-03 22 views
8

interviewstreet aracılığıyla erlang'i öğrenmeye çalışıyorum. Şimdi dili öğreniyorum, böylece neredeyse hiçbir şey bilmiyorum. Stdin'den okumayı ve stdout yazmayı merak ediyordum.Erlang stdin'i okuyun stdout

"Merhaba Dünya!" Yazan basit bir program yazmak istiyorum. stdin'de alınan zaman sayısı.

6 

Yaz Stdout'a:

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

İdeal (sadece bir basamak bu durumda olsa bile) bir defada Stdin bir satır okuyacak o kadar Yani Stdin girişli

Ben get_line kullanacağımı düşünüyorum. Şimdilik bildiğim tek şey bu.

sayesinde

Teşekkür

cevap

19

İşte başka bir çözüm, belki daha işlevsel.

#!/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). 
kuyruk özyinelemenin için
+1

+1! – marcelog

1

İşte o benim atış. o komut satırından çalıştırılabilir yüzden escript kullandım, ancak kolayca bir modül içine konabilir: Bir liste anlama kullanmak istemiyorsanız

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

, bu son benzer bir yaklaşımdır kod satırını kullanarak, listeler: foreach ve aynı sıra:

% 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.