Dr.*_*son 2 erlang erlang-escript
我真的不明白命令行参数如何与escripts一起使用.从联机帮助页中,我了解到参数作为字符串列表传递给main/1.如何解析传递给main的参数?
考虑以下:
#!/usr/bin/env escript
usage() ->
io:format("Usage: ~s <port#>~n",[escript:script_name()]),
halt(1).
main([]) ->
usage();
main(Args)->
io:format("Starting test server on port #~s~n",[Args]).
Run Code Online (Sandbox Code Playgroud)
一个简单的测试,只用一个参数看起来很好.
./test_server.erl 17001
Starting test server on port #17001
Run Code Online (Sandbox Code Playgroud)
如果我传入多个参数怎么办?
./test_server.erl 17001 8 9 abc
Starting test server on port #1700189abc
Run Code Online (Sandbox Code Playgroud)
那不是我想要的.我尝试在空格字符上拼出字符串:
....
ArgsList = string:tokens(Args, " "),
io:format("Length: ~w~n",[length(ArgsList)]),
....
Run Code Online (Sandbox Code Playgroud)
产量长度:1
length/1 是一个内置函数,您可以使用它:
io:format("Length: ~p~n", [length(Args)])
Run Code Online (Sandbox Code Playgroud)
Args是一个字符串列表.此调用(使用~p格式):
io:format("Starting test server on port #~p~n", [Args]).
Run Code Online (Sandbox Code Playgroud)
会产生结果:
./test_server.erl 17001 8 9 abc
Starting test server on port #["17001","8","9","abc"]
Run Code Online (Sandbox Code Playgroud)
如果您正在使用~s,Erlang会将其解释为字符串(或IO列表,实际上),并使用连接的所有元素进行打印.
要逐个打印所有参数,请尝试此操作而不是io:format/2调用:
[io:format("~s~n", [A]) || A <- Args].
Run Code Online (Sandbox Code Playgroud)