Flu*_*lux 2 erlang command-line-arguments erlang-escript
我有一个要使用escript以下命令运行的 Erlang 程序:
% filename: myscript.erl
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n", [Args]).
Run Code Online (Sandbox Code Playgroud)
当我运行时escript myscript.erl 123 456,会打印:
Args: ["123","456"]
Run Code Online (Sandbox Code Playgroud)
这很好,但是程序的名称(即myscript.erl)在哪里?
在C语言中,例如int main(int argc, char *argv[]) { ... },argv[0]总是包含程序的名称。如何在 Erlang 中获取程序的名称?
来自 erlang escript 文档:
要检索脚本的路径名,请
escript:script_name()从您的脚本中调用(路径名通常但不总是绝对的)。
这是在行动:
myescript.erl:
-export([main/1]).
main(Args) ->
io:format("Args: ~p~n~p~n", [Args, escript:script_name()]).
Run Code Online (Sandbox Code Playgroud)
在 bash shell 中:
~/erlang_programs$ escript myescript.erl 123 456
Args: ["123","456"]
"myescript.erl"
Run Code Online (Sandbox Code Playgroud)
和:
~/erlang_programs$ cd
~$ escript erlang_programs/myescript.erl 123 456
Args: ["123","456"]
"erlang_programs/myescript.erl"
Run Code Online (Sandbox Code Playgroud)
因此,不管文档怎么说,我都会得到一个相对于我发出escript命令的目录的路径,或者相当于我提供给escript命令的路径。
为什么路径名被双引号包围?怎么才能去掉?
在 erlang 中,该术语"a"是 list 的简写[97]。同样,该术语"erlang_programs/myescript.erl"是 list 的简写[101, 114, ...108]。每次看到 shell 用双引号打印出一些东西时,你必须对自己重复一遍。shell 输出双引号字符串而不是它们真正代表的列表的事实是 shell 的一个可怕的特性,并且会导致初学者和有经验的 erlangers 都无法解释的困惑。“嘿,让我们打印出学生在最后三项测试中的原始分数,它们是[97,98,99]:
9> io:format("Student scores: ~p~n", [[97,98,99]]).
Student scores: "abc"
ok
Run Code Online (Sandbox Code Playgroud)
噗??!
以下是一些删除输出引号的方法:
1) 当用 输出时io:format/2,可以使用控制序列~s:
s: 使用字符串语法打印参数。参数是...一个iolist()、一个binary()或一个atom()...打印的字符不带引号。
例如:
1> io:format("~s~n", ["hello"]).
hello
ok
2>
Run Code Online (Sandbox Code Playgroud)
(功劳归于评论中的那一项!)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |