强大的命令行参数解析模块Arguments

如果你要写命令行的程序,D语言Tango库的Arguments模块是必用的。这个模块的使用并不复杂,但使用时还是有一些地方要注意的。D语言目前的现状就是教程比较少,很多时候必须自己去读源代码。

我把Tango库通过svn工具导出到本地,发现example\system\arguments.d是个示例模块,可惜的是这个模块的代码是过时的,还是要到Arguments模块中去读源代码。

https://www.d-programming-language-china.org/tango-arguments-jiao-cheng/

下面是个示例程序.

//by D语言中国   https://www.d-programming-language-china.org/

import tango.util.Arguments;
import tango.io.Stdout;
//for isDigits,  http://dwin.d-programming-language-china.org/
import dwin.text.Unicode;  
import Path = tango.io.Path;

void main()
{
    auto args = new Arguments();
    bool digitsValidation(char[][] args, out char[] invalidArg)
    {
        if(!isDigits(args[0]))
        {
            invalidArg = args[0];
            Stdout.formatln("not a number: {}", args[0]);
            return false;
        }
        return true;
    }
    //要先设定参数值的数目,否则validation无效    
    args.define("port").parameters(1).validation(&digitsValidation);
    try
    {
        args.parse(["--port", "50");
    }
    catch(Exception e)
    {
        Stdout.formatln("error {}", e.msg);
    }
}

先定义好校验参数的函数,如digitsValidation, 在绑定校验参数时,要先设定参数值的数目,否则validation无效,这是一个技巧。D语言Tango的Arguments模块的其他一些功能,你可以自己去读源代码。

要注意的是,现在Arguments还不完善,还有不少bug, 比如,你定义一个argument required,在命令中没有包括这个argument时,会引发exception: Argument is required but was not discovered, 并没有报告是哪个argument, 这样就不太实用。现在,我的做法是这样检测:

如果不带parameter, 可以用

if(args.contains("argument"))
{
    //do something
}

如果带parameter, 就要这样用:

if(args.parameters["argument"].length)
{
    //do something
}

暂时就这样做吧。Tango模块太多了,有一些Bug修复比较慢些。

本文环境:DMD 1.037, D语言库DWin    http://dwin.d-programming-language-china.org/ 0.38, Tango 0.997

https://www.d-programming-language-china.org/tango-arguments-jiao-cheng/
强大的命令行参数解析模块Arguments