2015-08-07 15 views
9

Tôi đang làm việc trên một Erlang. Làm thế nào tôi có thể vượt qua các tham số dòng lệnh cho nó?Làm cách nào để chuyển đối số dòng lệnh tới chương trình Erlang?

Chương trình File-

-module(program). 
-export([main/0]). 

main() -> 
    io:fwrite("Hello, world!\n"). 

lệnh Compilation:

erlc Program.erl 

Thực hiện Command-

erl -noshell -s program main -s init stop 

tôi cần phải vượt qua đối số qua thực hiện lệnh và muốn truy cập chúng bên trong chính được viết bằng chính chương trình.

Trả lời

12
$ cat program.erl 
-module(program). 
-export([main/1]). 

main(Args) -> 
    io:format("Args: ~p\n", [Args]). 
$ erlc program.erl 
$ erl -noshell -s program main foo bar -s init stop 
Args: [foo,bar] 
$ erl -noshell -run program main foo bar -s init stop 
Args: ["foo","bar"] 

Nó được ghi chép lại trong erl man page.

Tôi khuyên bạn nên sử dụng escript vì mục đích này vì nó có lời gọi đơn giản hơn.

+0

Cảm ơn Hynek ... tuyệt vời –

+0

Thật kỳ lạ, tôi nhận được [foo, bar] không ["foo", "bar"] – quantumpotato

+0

@quantumpotato: Lưu ý '-run'. Theo trang 'erl', _All đối số được chuyển thành chuỗi. Bạn đang sử dụng phiên bản nào? Thậm chí sau đó nó sẽ là một lỗi vì điều này không nên thay đổi phiên bản thành phiên bản. Nó sẽ phá vỡ các kịch bản hiện có. –

2

Đây không thực sự là tham số dòng lệnh, nhưng nếu bạn muốn sử dụng biến môi trường, thì mô-đun os có thể hữu ích. os:getenv() cung cấp cho bạn danh sách tất cả các biến môi trường. os:getenv(Var) cung cấp cho bạn giá trị của biến dưới dạng chuỗi hoặc trả về false nếu Var không phải là biến môi trường.

Các biến này phải được đặt trước khi bạn khởi động ứng dụng.

tôi luôn luôn sử dụng một thành ngữ như thế này để bắt đầu (trên bash-shell):

export PORT=8080 && erl -noshell -s program main 
3

Nếu bạn muốn "có tên là" lập luận, với các giá trị mặc định có thể, bạn có thể sử dụng dòng lệnh này (từ một Appli đồ chơi tôi thực hiện):

erl -pa "./ebin" -s lavie -noshell -detach -width 100 -height 80 -zoom 6 

lavie: bắt đầu làm gì khác hơn là khởi động ứng dụng erlang :

-module (lavie). 

-export ([start/0]). 

start() -> application:start(lavie). 

mà lần lượt khởi động ứng dụng, nơi tôi được xác định giá trị mặc định cho tham số, đây là app.src (cốt thép xây dựng):

{application, lavie, 
[ 
    {description, "Le jeu de la vie selon Conway"}, 
    {vsn, "1.3.0"}, 
    {registered, [lavie_sup,lavie_wx,lavie_fsm,lavie_server,rule_wx]}, 
    {applications, [ 
        kernel, 
        stdlib 
       ]}, 
    {mod, { lavie_app, [200,50,2]}}, %% with default parameters 
    {env, []} 
]}. 

sau đó, trong mã ứng dụng, bạn có thể sử dụng init: get_argument/1 để nhận giá trị được liên kết với mỗi tùy chọn nếu nó được xác định trong dòng lệnh.

-module(lavie_app). 

-behaviour(application). 

%% Application callbacks 
-export([start/2, stop/1]). 

%% =================================================================== 
%% Application callbacks 
%% =================================================================== 

start(_StartType, [W1,H1,Z1]) -> 
    W = get(width,W1), 
    H = get(height,H1), 
    Z = get(zoom,Z1), 
    lavie_sup:start_link([W,H,Z]). 

stop(_State) -> 
    % init:stop(). 
    ok. 

get(Name,Def) -> 
    case init:get_argument(Name) of 
     {ok,[[L]]} -> list_to_integer(L); 
     _ -> Def 
    end. 

Chắc chắn phức tạp hơn đề xuất @Hynek, nhưng nó giúp bạn linh hoạt hơn và tôi thấy dòng lệnh ít đục.

Các vấn đề liên quan