2012-06-03 21 views
8

Tôi đang cố gắng tìm hiểu erlang qua interviewstreet. Tôi chỉ học ngôn ngữ bây giờ vì vậy tôi biết hầu như không có gì. Tôi đã tự hỏi làm thế nào để đọc từ stdin và viết để stdout.Erlang đọc stdin write stdout

Tôi muốn viết một chương trình đơn giản viết "Hello World!" số lần nhận được trong stdin.

Vì vậy, với thiết bị nhập chuẩn đầu vào:

6 

Viết thư cho stdout:

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

Lý tưởng nhất là tôi sẽ đọc stdin một dòng tại một thời điểm (mặc dù nó chỉ là một chữ số trong trường hợp này) để Tôi nghĩ rằng tôi sẽ sử dụng get_line. Đó là tất cả những gì tôi biết bây giờ.

nhờ

Cảm ơn

Trả lời

19

Đây là giải pháp khác, có thể hoạt động nhiều hơn.

#!/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 cho đệ quy đuôi! – marcelog

1

Dưới đây là bắn của tôi lúc đó. Tôi đã sử dụng escript để nó có thể được chạy từ dòng lệnh, nhưng nó có thể được đưa vào một mô-đun dễ dàng:

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

Nếu bạn không muốn sử dụng một danh sách hiểu biết, đây là một cách tiếp cận tương tự như cuối cùng dòng mã, bằng cách sử dụng danh sách: foreach và cùng một chuỗi:

% 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. 
Các vấn đề liên quan