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

如何在Erlang中将负数作为命令行参数传递,erlang,Erlang,我有一个命令行程序,它接受两个数字作为参数,我这样运行它: erl -noshell -s weight bmi 3 9 erl -eval "foo:start(-1)" 但我不知道如何处理负数。我尝试将它们作为字符串传递,使用-extra等。根据文档,似乎Erlang将以连字符开头的所有内容都解释为标志: 任何以字符-连字符开头的参数都被解释为标志 问题是:如何让Erlang考虑,例如,10作为一个数字,而不是一个标志?< /P> erl -noshell -s weight bmi -

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

erl -noshell -s weight bmi 3 9
erl -eval "foo:start(-1)"
但我不知道如何处理负数。我尝试将它们作为字符串传递,使用-extra等。根据文档,似乎Erlang将以连字符开头的所有内容都解释为标志:

任何以字符-连字符开头的参数都被解释为标志

问题是:如何让Erlang考虑,例如,10作为一个数字,而不是一个标志?< /P>
erl -noshell -s weight bmi -10 9
-s标志用于非常简单的API调用,例如-s foo start调用foo:start,也可能传递单个参数作为模式标志或类似的调用,例如-s foo start test调用foo:starttest。-s标志将所有参数转换为原子,因此不适合传递整数。您可以使用-run标志执行相同的操作,但将参数作为字符串传递,例如-run foo start/tmp/将调用foo:start/tmp/,但要传递整数或其他数据类型,您必须自己解析字符串。 最简单、最灵活的方法是使用-eval标志,如下所示:

erl -noshell -s weight bmi 3 9
erl -eval "foo:start(-1)"
然后可以执行任何Erlang表达式,系统将为您解析这些值。如果要使用特殊字符,请确保在shell命令中使用单引号而不是双引号。

s标志用于非常简单的API调用,例如-s foo start调用foo:start,也可以将单个参数作为模式标志传递,或者类似的-s foo start test调用foo:starttest。-s标志将所有参数转换为原子,因此不适合传递整数。您可以使用-run标志执行相同的操作,但将参数作为字符串传递,例如-run foo start/tmp/将调用foo:start/tmp/,但要传递整数或其他数据类型,您必须自己解析字符串。 最简单、最灵活的方法是使用-eval标志,如下所示:

erl -noshell -s weight bmi 3 9
erl -eval "foo:start(-1)"

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

您也可以使用其他字符并将其转换为-,例如

并援引它:

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

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

并援引它:

$ erl -noshell -run sum main 3 ~5 -s init stop
-2
但是我不知道如何处理负数 作为字符串传递,带有-extra等

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

在外壳中:

1> c(weight).
在命令行中:

~/erlang_programs$ erl -noshell -s weight bmi -extra -9
-9
-8
$ erl -noshell -s weight bmi -extra -9 abc
[[45,57],[97,98,99]]
把负数放在第一个标志之前或之后-对我不起作用

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

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

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

~/erlang_programs$ erl -noshell -s weight bmi -extra -9
-9
-8
$ erl -noshell -s weight bmi -extra -9 abc
[[45,57],[97,98,99]]
init:get_plain_参数返回参数列表。第一个参数是列表[45,57],它可以用速记符号-9创建;第二个参数是列表[97,98,99],它可以用简写符号abc创建。此外,一个列表/字符串可以转换为一个具有list\u to\u integer的整数。整数45是连字符的ascii码,整数57是字符9的ascii码。list_to_integer足够聪明,可以处理负号。类似地,整数97、98、99是字符a、b、c的ascii码

但是我不知道如何处理负数 作为字符串传递,带有-extra等

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

在外壳中:

1> c(weight).
在命令行中:

~/erlang_programs$ erl -noshell -s weight bmi -extra -9
-9
-8
$ erl -noshell -s weight bmi -extra -9 abc
[[45,57],[97,98,99]]
把负数放在第一个标志之前或之后-对我不起作用

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

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

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

~/erlang_programs$ erl -noshell -s weight bmi -extra -9
-9
-8
$ erl -noshell -s weight bmi -extra -9 abc
[[45,57],[97,98,99]]
init:get_plain_参数返回参数列表。第一个参数是列表[45,57],它可以用速记符号-9创建;第二个参数是列表[97,98,99],它可以用简写符号abc创建。此外,一个列表/字符串可以转换为一个具有list\u to\u integer的整数。整数45是连字符的ascii码,整数57是字符9的ascii码。list_to_integer足够聪明,可以处理负号。类似地,整数97、98、99是字符a、b、c的ascii码