我有一个打算使用escript
运行的Erlang程序:
% filename: myscript.erl
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n", [Args]).
当我运行escript myscript.erl 123 456
时,将显示以下内容:
Args: ["123","456"]
这很好,但是程序的名称(即myscript.erl
)在哪里?
在C中,例如,在int main(int argc, char *argv[]) { ... }
中,argv[0]
始终包含程序的名称。如何在Erlang中获得程序的名称?
答案 0 :(得分:4)
来自erlang escript docs:
要检索脚本的路径名,请调用
escript:script_name()
从脚本中删除(路径名通常是绝对路径,但并非总是绝对路径)。
这里正在起作用:
myescript.erl:
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n~p~n", [Args, escript:script_name()]).
在bash shell中:
~/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
命令的路径。
为什么路径名用双引号引起来?如何将其删除?
在erlang中,术语"a"
是列表[97]
的简写形式。同样,术语"erlang_programs/myescript.erl"
是列表[101, 114, ...108]
的简写。每当您看到外壳打印出带有双引号的内容时,都必须对自己重复一遍。 Shell输出双引号的字符串而不是它们真正代表的列表,这是Shell的一个可怕特征,并给初学者和经验丰富的语言爱好者带来了难以置信的困惑。 “嘿,让我们打印出最近三个测试的学生原始分数,分别是[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(),binary()或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