我想用OCaml中的参数解析命令行选项。
标准库的模块Arg
似乎可以完成我需要的所有工作,并且有一些教程可以解释如何使用这个模块。
我的问题是,当缺少选项的参数时,他们似乎都会分享同样的奇怪行为。例如,使用./a.out -d
从this example执行程序会产生以下输出:
./a.out: option '-d' needs an argument.
usage: ./a.out [-b] [-s string] [-d int]
-b : set somebool to true
-s : what follows -s sets some string
-d : some int parameter
-help Display this list of options
--help Display this list of options
./a.out: ./a.out: option '-d' needs an argument.
usage: ./a.out [-b] [-s string] [-d int]
-b : set somebool to true
-s : what follows -s sets some string
-d : some int parameter
-help Display this list of options
--help Display this list of options
.
usage: ./a.out [-b] [-s string] [-d int]
-b : set somebool to true
-s : what follows -s sets some string
-d : some int parameter
-help Display this list of options
--help Display this list of options
我无法找出错误/用法信息被打印三次的原因。这也发生在我在网上找到的所有其他代码示例中。这是Arg
模块中的问题,还是在这些示例中以某种方式未正确使用?
答案 0 :(得分:3)
我已经设法用OCaml 4.04.2重现了这个bug,但没有用4.02.3重现,所以看起来那里会出现某种回归。
所以,你可以做的一件事是坚持使用旧版本的OCaml,但我不建议这样做。
相反,您可以使用其他标准库,例如Jane Street' Core
。它有一个名为Command
的模块,它允许您编写命令行界面,就像您尝试运行的那样。
此模块的详尽教程可用here。
例如,以下是Rosetta使用Command
:
open Core
let spec =
let open Command.Spec in
empty
+> flag "-b" (no_arg) ~doc:"Sets some flag"
+> flag "-s" (optional_with_default "" string) ~doc:"STRING Some string parameter"
+> flag "-d" (optional_with_default 0 int) ~doc:"INTEGER Some int parameter"
let command =
Command.basic
~summary:"My awesome CLI"
spec
(fun some_flag some_string some_int () ->
printf " %b '%s' %d\n" some_flag some_string some_int
)
let () =
Command.run command
编辑:此错误已知且is going to be fixed in OCaml 4.05。