Erlang escript中的case表达式

时间:2017-01-15 10:08:41

标签: linux erlang

我正在测试我的erlang escript,escript的内容是这样的:

#!/usr/bin/env escript
main([Action]) ->
    case Action of
        start -> start();
        stop -> stop()
    end;
main(_) ->
    usage().

usage() ->
    io:format("usage: factorial integer\n"),
    halt(1).

start() -> io:format("Start.~n").
stop() -> io:format("Stop.~n").

但是当我尝试运行escript时,我遇到了这个问题:

./escript start
escript: exception error: no case clause matching "start"

是什么导致了这个问题?参数的格式是错误的吗?

1 个答案:

答案 0 :(得分:1)

命令行参数作为字符串传递给main/1,而不是原子,因此您需要匹配"start""stop",而不是startstop

...
main([Action]) ->
    case Action of
        "start" -> start();
        "stop" -> stop()
    end;
...

除非您的实际代码更复杂/不同,否则您还可以直接在函数子句中匹配["start"]["stop"]

main(["start"]) -> start();
main(["stop"]) -> stop();
main(_) ->
    usage().

这会为usage()调用./escript foo,同时原始脚本会崩溃,这可能是您想要的,也可能不是。