Frage

Ich verstehe nicht wirklich, wie Befehlszeilenargumente mit Eskripten funktionieren.Der Manpage entnehme ich, dass die Argumente als Liste von Zeichenfolgen an main/1 übergeben werden.Wie kann ich die an main übergebenen Argumente analysieren?

Folgendes berücksichtigen:

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

Ein einfacher Test und mit nur einem Argument sieht alles gut aus.

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

Was ist, wenn ich mehrere Argumente übergebe?

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

Das ist nicht das, was ich wollte.Ich habe versucht, die Zeichenfolge anhand des Leerzeichens aufzuteilen:

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

Liefert Länge:1

War es hilfreich?

Lösung

Länge (L)

length/1 ist eine integrierte Funktion, die Sie unverändert verwenden können:

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

Argumente

Args ist eine Liste von Zeichenfolgen.Dieser Anruf (mit ~p als Format):

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

Würde das Ergebnis ergeben:

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

Wenn Sie verwenden ~s, Erlang interpretiert es als Zeichenfolge (oder eigentlich als E/A-Liste) und diese wird mit allen verketteten Elementen gedruckt.

Um alle Argumente einzeln auszudrucken, versuchen Sie dies anstelle von io:format/2 Anruf:

[io:format("~s~n", [A]) || A <- Args].
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top