【问题标题】:How to pass negative number as a command line argument in Erlang如何在 Erlang 中将负数作为命令行参数传递
【发布时间】:2020-02-22 04:17:21
【问题描述】:

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

erl -noshell -s weight bmi 3 9

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

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

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

erl -noshell -s weight bmi -10 9

【问题讨论】:

    标签: erlang


    【解决方案1】:

    但我不知道如何处理负数(试图 作为字符串传递,带有 -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]).
    

    在外壳中:

    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 代码。

    【讨论】:

      【解决方案2】:

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

      -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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2015-10-30
          • 2018-04-29
          • 2013-07-15
          • 2015-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-07
          • 2016-10-10
          相关资源
          最近更新 更多