Question

Je ne comprends pas vraiment comment les arguments de ligne de commande fonctionnent avec les escriptations. D'après la page Man, je comprends que les arguments sont passés comme une liste de chaînes à la main / 1. Comment puis-je analyser les arguments transmis à la main?

Considérer ce qui suit:

#!/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]).

Un test simple et tout semble bon avec un seul argument.

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

Qu'en est-il si je passe dans plusieurs arguments?

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

Ce n'est pas ce que je voulais. J'ai essayé de spliter la chaîne sur le personnage de l'espace:

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

Longueur des rendements: 1

Était-ce utile?

La solution

longueur (l)

length/1 est une fonction intégrée que vous pouvez utiliser tel quel:

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

Args

Args est une liste de chaînes. Cet appel (en utilisant ~p comme format):

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

Donnerait le résultat:

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

Si vous utilisez ~s, Erlang l'interprète comme une chaîne (ou une liste d'IO, vraiment) et cela est imprimé avec tous les éléments concaténés.

Pour imprimer tous les arguments un par un, essayez ceci au lieu du io:format/2 appel:

[io:format("~s~n", [A]) || A <- Args].
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top