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 *)
命令行语法:关键字是以 - 开头的字符字符串。选项是单独的关键字或后跟一个参数。关键字的类型有:Unit、Bool、Set、Clear、String、Set_string、Int、Set_int、Float、Set_float、Tuple、Symbol、Rest、Rest_all 和 Expand。
Unit、Set 和 Clear 关键字不带参数。
Rest 或 Rest_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 |
(* | 使用单元参数调用函数 | *) |
| |
Bool of |
(* | 使用布尔参数调用函数 | *) |
| |
Set of |
(* | 将引用设置为 true | *) |
| |
Clear of |
(* | 将引用设置为 false | *) |
| |
String of |
(* | 使用字符串参数调用函数 | *) |
| |
Set_string of |
(* | 将引用设置为字符串参数 | *) |
| |
Int of |
(* | 使用整数参数调用函数 | *) |
| |
Set_int of |
(* | 将引用设置为整数参数 | *) |
| |
Float of |
(* | 使用浮点数参数调用函数 | *) |
| |
Set_float of |
(* | 将引用设置为浮点数参数 | *) |
| |
Tuple of |
(* | 根据 spec 列表获取多个参数 | *) |
| |
Symbol of |
(* | 获取其中一个符号作为参数,并使用该符号调用函数 | *) |
| |
Rest of |
(* | 停止解释关键字,并使用每个剩余参数调用函数 | *) |
| |
Rest_all of |
(* | 停止解释关键字,并使用所有剩余参数调用函数 | *) |
| |
Expand of |
(* | 如果要处理的剩余参数的形式为 | *) |
描述与关键字关联的行为的具体类型。
typekey =string
typedoc =string
typeusage_msg =string
typeanon_fun =string -> unit
val parse : (key * spec * doc) list -> anon_fun -> usage_msg -> unitArg.parse speclist anon_fun usage_msg 解析命令行。speclist 是三元组 (key, spec, doc) 的列表。key 是选项关键字,它必须以 '-' 字符开头。spec 给出选项类型以及在命令行中找到此选项时要调用的函数。doc 是此选项的一行描述。anon_fun 在匿名参数上调用。 spec 和 anon_fun 中的函数按其参数在命令行中出现的顺序调用。
如果发生错误,Arg.parse 将退出程序,并在标准错误输出中打印如下错误消息
usage_msgdoc 字符串。注意: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 参数是一个引用,可以在解析期间更新。此功能的一个典型用法是解析以下形式的命令行
options,其中选项列表取决于子命令参数的值。val parse_argv : ?current:int ref ->
string array ->
(key * spec * doc) list -> anon_fun -> usage_msg -> unitArg.parse_argv ~current args speclist anon_fun usage_msg 将数组 args 解析为命令行。它使用并更新 ~current(如果提供)或 Arg.current 的值。您必须在调用 parse_argv 之前设置它。current 的初始值是数组中程序名称(参数 0)的索引。如果发生错误,Arg.parse_argv 会引发 Arg.Bad,并将错误消息作为参数。如果给出选项 -help 或 --help,Arg.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
spec 或 anon_fun 中的函数可以使用错误消息引发 Arg.Bad 来拒绝无效参数。Arg.Bad 也会由 Arg.parse_argv 在发生错误时引发。
val usage : (key * spec * doc) list -> usage_msg -> unitval 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 arrayArg.read_arg file 从文件 file 中读取以换行符结尾的命令行参数。
val read_arg0 : string -> string array与 Arg.read_arg 相同,但假设以空字符结尾的命令行参数。
val write_arg : string -> string array -> unitArg.write_arg file args 将参数 args 以换行符结尾写入文件 file 中。如果 args 中的任何参数包含换行符,请改用 Arg.write_arg0。
val write_arg0 : string -> string array -> unit与 Arg.write_arg 相同,但使用空字符作为终止符而不是换行符。