模块 Arg

module Arg: sig .. end

命令行参数解析。

此模块提供了一种通用机制,用于从程序的命令行中提取选项和参数。例如

     let usage_msg = "append [-verbose] <file1> [<file2>] ... -o <output>"
     let verbose = ref false
     let input_files = ref []
     let output_file = ref ""

     let anon_fun filename =
       input_files := filename::!input_files

     let speclist =
       [("-verbose", Arg.Set verbose, "Output debug information");
        ("-o", Arg.Set_string output_file, "Set output file name")]

     let () =
       Arg.parse speclist anon_fun usage_msg;
       (* Main functionality here *)

命令行语法:关键字是以 - 开头的字符字符串。选项是单独的关键字或后跟一个参数。关键字的类型有:UnitBoolSetClearStringSet_stringIntSet_intFloatSet_floatTupleSymbolRestRest_allExpand

UnitSetClear 关键字不带参数。

RestRest_all 关键字将命令行的其余部分作为参数。(下面有更多解释。)

其他所有关键字都将命令行上的下一个单词作为参数。为了与 GNU getopt_long 兼容,也允许使用 keyword=arg。没有以关键字开头的参数称为匿名参数。

示例(假设 cmd 是命令名称)

  • cmd -flag           (一个单元选项)
  • cmd -int 1          (一个带参数 1 的整数选项)
  • cmd -string foobar  (一个带参数 "foobar" 的字符串选项)
  • cmd -float 12.34    (一个带参数 12.34 的浮点数选项)
  • cmd a b c           (三个匿名参数:"a""b""c"
  • cmd a b -- c d      (两个匿名参数和一个带两个参数的 rest 选项)

Rest 获取一个函数,该函数会对每个剩余的命令行参数重复调用。 Rest_all 获取一个函数,该函数会调用一次,并传入所有剩余参数的列表。

请注意,如果 Rest 关键字后面没有参数,则根本不会调用该函数,而 Rest_all 关键字的函数则会使用空列表进行调用。


type spec = 
| Unit of (unit -> unit) (*

使用单元参数调用函数

*)
| Bool of (bool -> unit) (*

使用布尔参数调用函数

*)
| Set of bool ref (*

将引用设置为 true

*)
| Clear of bool ref (*

将引用设置为 false

*)
| String of (string -> unit) (*

使用字符串参数调用函数

*)
| Set_string of string ref (*

将引用设置为字符串参数

*)
| Int of (int -> unit) (*

使用整数参数调用函数

*)
| Set_int of int ref (*

将引用设置为整数参数

*)
| Float of (float -> unit) (*

使用浮点数参数调用函数

*)
| Set_float of float ref (*

将引用设置为浮点数参数

*)
| Tuple of spec list (*

根据 spec 列表获取多个参数

*)
| Symbol of string list * (string -> unit) (*

获取其中一个符号作为参数,并使用该符号调用函数

*)
| Rest of (string -> unit) (*

停止解释关键字,并使用每个剩余参数调用函数

*)
| Rest_all of (string list -> unit) (*

停止解释关键字,并使用所有剩余参数调用函数

*)
| Expand of (string -> string array) (*

如果要处理的剩余参数的形式为 ["-foo""arg"] @ rest,其中 "foo" 注册为 Expand f,则处理参数 "arg" @ rest。仅在 parse_and_expand_argv_dynamic 中允许。

*)

描述与关键字关联的行为的具体类型。

type key = string 
type doc = string 
type usage_msg = string 
type anon_fun = string -> unit 
val parse : (key * spec * doc) list -> anon_fun -> usage_msg -> unit

Arg.parse speclist anon_fun usage_msg 解析命令行。speclist 是三元组 (key, spec, doc) 的列表。key 是选项关键字,它必须以 '-' 字符开头。spec 给出选项类型以及在命令行中找到此选项时要调用的函数。doc 是此选项的一行描述。anon_fun 在匿名参数上调用。 specanon_fun 中的函数按其参数在命令行中出现的顺序调用。

如果发生错误,Arg.parse 将退出程序,并在标准错误输出中打印如下错误消息

  • 错误原因:未知选项、无效或缺少参数等。
  • usage_msg
  • 选项列表,每个选项后跟相应的 doc 字符串。注意:doc 字符串为空的选项将不会包含在列表中。

为了让用户能够指定以 - 开头的匿名参数,例如在 speclist 中包含 ("-"String anon_fun, doc)

默认情况下,parse 识别两个单元选项,-help--help,它们将打印 usage_msg 和选项列表到标准输出,并退出程序。您可以通过在 speclist 中指定您自己的 -help--help 选项来覆盖此行为。

val parse_dynamic : (key * spec * doc) list ref ->
anon_fun -> usage_msg -> unit

Arg.parse 相同,只是 speclist 参数是一个引用,可以在解析期间更新。此功能的一个典型用法是解析以下形式的命令行

  • command subcommand options,其中选项列表取决于子命令参数的值。
val parse_argv : ?current:int ref ->
string array ->
(key * spec * doc) list -> anon_fun -> usage_msg -> unit

Arg.parse_argv ~current args speclist anon_fun usage_msg 将数组 args 解析为命令行。它使用并更新 ~current(如果提供)或 Arg.current 的值。您必须在调用 parse_argv 之前设置它。current 的初始值是数组中程序名称(参数 0)的索引。如果发生错误,Arg.parse_argv 会引发 Arg.Bad,并将错误消息作为参数。如果给出选项 -help--helpArg.parse_argv 会引发 Arg.Help,并将帮助消息作为参数。

val parse_argv_dynamic : ?current:int ref ->
string array ->
(key * spec * doc) list ref ->
anon_fun -> string -> unit

Arg.parse_argv 相同,只是 speclist 参数是一个引用,可以在解析期间更新。参见 Arg.parse_dynamic

val parse_and_expand_argv_dynamic : int ref ->
string array ref ->
(key * spec * doc) list ref ->
anon_fun -> string -> unit

Arg.parse_argv_dynamic 相同,只是 argv 参数是一个引用,可以在解析 Expand 参数期间更新。参见 Arg.parse_argv_dynamic

val parse_expand : (key * spec * doc) list -> anon_fun -> usage_msg -> unit

Arg.parse 相同,只是允许使用 Expand 参数,并且不会更新 Arg.current 引用。

exception Help of string

当用户请求帮助时,由 Arg.parse_argv 引发。

exception Bad of string

specanon_fun 中的函数可以使用错误消息引发 Arg.Bad 来拒绝无效参数。Arg.Bad 也会由 Arg.parse_argv 在发生错误时引发。

val usage : (key * spec * doc) list -> usage_msg -> unit

Arg.usage speclist usage_msg 将包含有效选项列表的错误消息打印到标准错误输出。这与 Arg.parse 在发生错误时打印的消息相同。speclistusage_msgArg.parse 中的相同。

val usage_string : (key * spec * doc) list -> usage_msg -> string

返回 Arg.usage 在使用相同参数时将打印的消息。

val align : ?limit:int ->
(key * spec * doc) list -> (key * spec * doc) list

通过在第一个对齐分隔符(制表符或,如果找不到制表符,则为空格)处插入空格来对齐文档字符串,根据关键字的长度。如果要对齐整个字符串,请在文档字符串中使用对齐分隔符作为第一个字符。对应于 Symbol 参数的文档字符串在下一行对齐。

limit:关键字和消息长度超过 limit 的选项将不会用于计算对齐。
val current : int ref

正在处理的参数在 Sys.argv 中的位置。您可以更改此值,例如强制 Arg.parse 跳过某些参数。Arg.parse 使用 Arg.current 的初始值作为参数 0(程序名称)的索引,并从下一个元素开始解析参数。

val read_arg : string -> string array

Arg.read_arg file 从文件 file 中读取以换行符结尾的命令行参数。

val read_arg0 : string -> string array

Arg.read_arg 相同,但假设以空字符结尾的命令行参数。

val write_arg : string -> string array -> unit

Arg.write_arg file args 将参数 args 以换行符结尾写入文件 file 中。如果 args 中的任何参数包含换行符,请改用 Arg.write_arg0

val write_arg0 : string -> string array -> unit

Arg.write_arg 相同,但使用空字符作为终止符而不是换行符。