2

コマンドライン引数が escript でどのように機能するかよくわかりません。マンページから、引数が文字列のリストとして 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]).

簡単なテストで、1 つの引数だけですべてがうまくいくように見えます。

  ./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 リスト) として解釈し、すべての要素を連結して出力​​します。

すべての引数を 1 つずつ出力するには、io:format/2呼び出しの代わりにこれを試してください。

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