2012-06-03 12 views
8

Sto cercando di imparare Erlang attraverso interviewstreet. Sto imparando la lingua ora, quindi non conosco quasi nulla. Mi stavo chiedendo come leggere da stdin e scrivere su stdout.Erlang leggere stdout stdin scrittura

Voglio scrivere un semplice programma che scrive "Ciao Mondo!" il numero di volte ricevuto in stdin.

Quindi, con ingresso stdin:

6 

Scrivi stdout:

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

Idealmente mi leggerà l'una linea stdin alla volta (anche se è solo una cifra in questo caso) in modo Penso che userò get_line. Questo è tutto ciò che so per ora.

grazie

Grazie

risposta

19

Ecco un'altra soluzione, forse più funzionale.

#!/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 per coda ricorsione! – marcelog

1

Ecco il mio colpo a questo. Ho usato EScript in modo che possa essere eseguito da linea di comando, ma può essere messo in un modulo facilmente:

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

Se non volete usare una lista di comprensione, questo è un approccio simile per l'ultimo linea di codice, utilizzando le liste: foreach e la stessa sequenza:

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