如何在电子脚本程序中获取程序名称?

时间:2019-02-24 01:07:39

标签: erlang command-line-arguments erlang-escript

我有一个打算使用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中获得程序的名称?

1 个答案:

答案 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