如何在 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 码
我有一个接受两个数字作为参数的命令行程序,我 运行 它是这样的:
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
.