وسيطات Erlang escript
-
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، حقًا) ويتم طباعتها مع كل العناصر المتسلسلة.
لطباعة جميع الوسائط واحدة تلو الأخرى، جرب هذا بدلاً من io:format/2
يتصل:
[io:format("~s~n", [A]) || A <- Args].
لا تنتمي إلى StackOverflow