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

zfciruhq  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(180)

I have a command line program that accepts two numbers as arguments, and I run it like this:

erl -noshell -s weight bmi 3 9

But I can't figure out how to process negative numbers. I've tried to pass them as strings, with -extra etc. It seems that Erlang, according to the documentation, interprets everything that starts with a hyphen as a flag:
Any argument starting with character - (hyphen) is interpreted as a flag
So the question is: how to make Erlang consider, for example, -10 as a number, not a flag?

erl -noshell -s weight bmi -10 9
gc0ot86w

gc0ot86w1#

但是我不知道如何处理负数(试图以字符串的形式传递,使用-extra等)。
下面是如何使用-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()返回一个参数列表。第一个参数是列表[45,57],可以用简写"-9"创建;第二个参数是列表[97,98,99],它可以使用简写符号"abc"创建。此外,使用list_to_integer()可以将列表/字符串转换为整数。整数45是连字符的ascii代码,整数57是字符9的ascii代码。list_to_integer()足够智能,可以处理负号。类似地,整数97,98,99是字符a,b,c的ascii代码。

krugob8w

krugob8w2#

-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命令中使用单引号而不是双引号。

mccptt67

mccptt673#

您也可以使用不同的字符并将其转换为-,例如:

-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

相关问题