2

我真的不明白命令行参数如何与 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]).

一个简单的测试,只需一个参数,一切看起来都很好。

  ./test_server.erl 17001
   Starting test server on port #17001

如果我传入多个参数怎么办?

  ./test_server.erl 17001 8 9 abc
   Starting test server on port #1700189abc

那不是我想要的。我尝试在空格字符上拆分字符串:

  ....
  ArgsList = string:tokens(Args, " "),
  io:format("Length: ~w~n",[length(ArgsList)]),
  ....

产量长度:1

4

1 回答 1

7

长度(L)

length/1是一个内置函数,您可以按原样使用:

io:format("Length: ~p~n", [length(Args)])

精氨酸

Args是一个字符串列表。此调用(使用~p格式):

io:format("Starting test server on port #~p~n", [Args]).

会产生结果:

./test_server.erl 17001 8 9 abc
Starting test server on port #["17001","8","9","abc"]

如果您正在使用~s,Erlang 会将其解释为字符串(实际上是 IO 列表),并且会打印出所有连接的元素。

要一一打印出所有参数,请尝试以下方法而不是io:format/2调用:

[io:format("~s~n", [A]) || A <- Args].
于 2011-02-15T20:58:00.680 回答