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 -> unit
Arg.parse speclist anon_fun usage_msg
解析命令行。speclist
是三元组 (key, spec, doc)
的列表。key
是选项关键字,它必须以 '-'
字符开头。spec
给出选项类型以及在命令行中找到此选项时要调用的函数。doc
是此选项的一行描述。anon_fun
在匿名参数上调用。 spec
和 anon_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
参数是一个引用,可以在解析期间更新。此功能的一个典型用法是解析以下形式的命令行
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
或 --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 -> unit
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
相同,但使用空字符作为终止符而不是换行符。