2

我有一个打算使用以下命令运行的 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)?

例如,在 C 中,inint main(int argc, char *argv[]) { ... }总是argv[0]包含程序的名称。如何在 Erlang 中获取程序的名称?

4

1 回答 1

5

来自 erlang escript 文档

要检索脚本的路径名,请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命令的路径。

为什么路径名用双引号括起来?如何将其移除?

在 erlang 中,该术语"a"是 list 的简写符号[97]。同样,该术语"erlang_programs/myescript.erl"是 list 的简写[101, 114, ...108]。每次看到 shell 打印出带有双引号的内容时,您都必须对自己重复一遍。shell 输出双引号字符串而不是它们真正代表的列表这一事实是 shell 的一个可怕特性,并且给初学者和有经验的 erlanger 等人带来了无数的困惑。“嘿,让我们打印出学生在最后三项测试中的原始分数,它们是[97,98,99]

9> io:format("Student scores: ~p~n", [[97,98,99]]).
Student scores: "abc"
ok

汪汪汪??!

以下是一些删除输出引号的方法:

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
于 2019-02-24T02:23:44.907 回答