Аргументы сценария Erlang
-
14-11-2019 - |
Вопрос
Я не совсем понимаю, как аргументы командной строки работают со сценариями.Из справочной страницы я понимаю, что аргументы передаются в виде списка строк в 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
Решение
длина (л)
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:format/2
вызов:
[io:format("~s~n", [A]) || A <- Args].