Как получить имя программы в программе escript?
У меня есть программа Erlang, предназначенная для запуска с использованием escript
:
% filename: myscript.erl
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n", [Args]).
Когда я бегу escript myscript.erl 123 456
, это напечатано:
Args: ["123","456"]
Это хорошо, но где название программы (т.е. myscript.erl
)?
В С, например, в int main(int argc, char *argv[]) { ... }
, argv[0]
всегда содержит название программы. Как я могу получить название программы на Erlang?
1 ответ
Чтобы получить путь к сценарию, позвоните
escript:script_name()
из вашего сценария (путь обычно, но не всегда, абсолютный).
Вот оно в действии:
myescript.erl:
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n~p~n", [Args, escript:script_name()]).
В оболочке bash:
~/erlang_programs$ escript myescript.erl 123 456
Args: ["123","456"]
"myescript.erl"
а также:
~/erlang_programs$ cd
~$ escript erlang_programs/myescript.erl 123 456
Args: ["123","456"]
"erlang_programs/myescript.erl"
Таким образом, несмотря на то, что говорят документы, я получаю путь относительно каталога, из которого я выпускаю escript
команда, или, что то же самое, путь, который я передаю escript
команда.
Почему путь заключен в двойные кавычки? Как это можно удалить?
В эрланге термин "a"
это сокращенная запись списка [97]
, Точно так же термин "erlang_programs/myescript.erl"
сокращение для списка [101, 114, ...108]
, Вы должны повторять это для себя каждый раз, когда видите, что оболочка распечатывает что-то с двойными кавычками. Тот факт, что оболочка выводит строки в двойных кавычках вместо списков, которые они действительно представляют, является ужасной особенностью оболочки и приводит к неописуемому замешательству как для начинающих, так и для опытных эрлангеров. "Эй, давайте распечатать исходные оценки студента по последним трем тестам, которые были [97,98,99]
:
9> io:format("Student scores: ~p~n", [[97,98,99]]).
Student scores: "abc"
ok
Wtf??!
Вот несколько способов удалить кавычки для вывода:
1) При выводе с io:format/2
Вы можете использовать управляющую последовательность ~ s:
s
: Печатает аргумент со строковым синтаксисом. Аргументом является... iolist(), бинарный () или atom()... Символы печатаются без кавычек.
Например:
1> io:format("~s~n", ["hello"]).
hello
ok
2>
(В комментариях к этому списку добавлен кредит!)
2) Вы можете преобразовать список (например, "abc") в атом:
~$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G)
1> list_to_atom("a").
a
2> list_to_atom([97]).
a
3> "a" =:= [97].
true