سؤال

لا أفهم حقًا كيف تعمل وسيطات سطر الأوامر مع البرامج النصية.من صفحة الدليل، أفهم أنه يتم تمرير الوسائط كقائمة من السلاسل إلى 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].
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top