如何在 Erlang 中将负数作为命令行参数传递

How to pass negative number as a command line argument in Erlang

我有一个接受两个数字作为参数的命令行程序,我 运行 它是这样的:

erl -noshell -s weight bmi 3 9

但我不知道如何处理负数。我试图将它们作为字符串传递,使用 -extra 等。根据文档,Erlang 似乎将所有以连字符开头的内容解释为标志:

Any argument starting with character - (hyphen) is interpreted as a flag

所以问题是:如何让 Erlang 考虑,例如,-10 作为一个数字,而不是一个标志?

erl -noshell -s weight bmi -10 9

-s 标志用于非常简单的 API 调用,例如 -s foo start(调用 foo:start()),并且可能传递单个参数作为模式标志或类似的,比如 -s foo start test(调用 foo:start(test))。 -s 标志将所有参数转换为原子,因此它不适合传递整数。您可以使用 -run 标志来做同样的事情,但将参数作为字符串传递,例如-run foo start /tmp/ 将调用 foo:start("/tmp/"),但要传递整数或其他数据类型,您必须自己解析字符串。 最简单和最灵活的方法是使用 -eval 标志,如下所示:

erl -eval "foo:start(-1)"

然后你可以执行任何Erlang表达式,系统会为你解析这些值。如果要使用特殊字符,请确保在 shell 命令中使用单引号而不是双引号。

您也可以使用不同的字符并将其翻译成 -,例如

-module(sum).
-export([main/1]).

main([X,Y|_]) ->
    io:format("~B~n", [list_to_integer(maybe_negate(X))
                       + list_to_integer(maybe_negate(Y))]).

maybe_negate([First|Rest]) ->
    case First of
        $~ ->
            [$-|Rest];
        _AnyOther -> [First|Rest]
    end.

并调用它:

$ erl -noshell -run sum main 3 ~5 -s init stop
-2

But I can't figure it out how to process negative numbers(tried to pass as strings, with -extra etc.

下面是如何使用 -extra 标志的示例:

-module(weight).
-compile(export_all).

bmi() ->
    [First|_Rest] = init:get_plain_arguments(),
    FirstAsInt = list_to_integer(First),
    io:format("~w~n", [FirstAsInt]),
    io:format("~w~n", [FirstAsInt + 1]).

在shell中:

1> c(weight).

在命令行:

~/erlang_programs$ erl -noshell -s weight bmi -extra -9
-9
-8

before the first flag-- 之后输入负数对我不起作用。

如果您尝试以下代码,事情可能会更清楚:

-module(weight).
-compile(export_all).

bmi() ->
    Args = init:get_plain_arguments(),
    io:format("~w~n", [Args]).

在命令行:

$ erl -noshell -s weight bmi -extra -9 abc
[[45,57],[97,98,99]]

init:get_plain_arguments() returns 参数列表。第一个 arg 是列表 [45,57],可以用 shorthand 符号 "-9" 创建;第二个参数是列表 [97,98,99],可以用 shorthand 表示法 "abc" 创建。此外,list/string 可以用 list_to_integer() 转换为整数。整数 45 是连字符的 ascii 码,整数 57 是字符 9 的 ascii 码。 list_to_integer() 足够聪明,可以处理负号。同样,整数 97,98,99 是字符 a,b,c.

的 ascii 码