2017-07-14 124 views
3

我正在使用下面的代码片断来解析命令行参数并将它们存储在一个表中。如何在NIM中通过命令行正确传递参数?

var args = initTable[string, string]() 
for kind, key, val in getopt(): 
    args.add(key,val) 

但是,它只能如果我在命令行

./mytool -i=somefile.txt 

通过=在这种情况下,args{i: somefile.txt},这就是我想要的(关键字:值对)。

但是,如果我使用./mytool -i somefile.txt然后args{somefile.txt: , i: },这绝对不是我所期望的(两个键和没有值)。

什么是不使用=来解析参数的正确方法?

这里的样,在两种情况下键和Val打印输出:

$ ./diceof -a=ACTGCTGTGTGCACAGTGTCACGTGT -b=ACTGCTGTGTGCACAGTGTCACGTGa 
kind:cmdShortOption 
key :a 
val :ACTGCTGTGTGCACAGTGTCACGTGT 
kind:cmdShortOption 
key :b 
val :ACTGCTGTGTGCACAGTGTCACGTGa 


$ ./diceof -a ACTGCTGTGTGCACAGTGTCACGTGT -b ACTGCTGTGTGCACAGTGTCACGTGa 
kind:cmdShortOption 
key :a 
val : 
kind:cmdArgument 
key :ACTGCTGTGTGCACAGTGTCACGTGT 
val : 
kind:cmdShortOption 
key :b 
val : 
kind:cmdArgument 
key :ACTGCTGTGTGCACAGTGTCACGTGa 
val : 

当然,如果val发现我可以检查,如果不添加下一个key作为前一个val。但我正在寻找更优雅的解决方案。

+2

你应该检查'kind',这很重要。打印出来,你会看到。 – dom96

+0

这是我的观点,为什么我需要添加'='来解析正确的?避免使用'='来正确解析参数的最好方法是什么? –

+0

没有办法,AFAIK就是这个解析器的工作原理。您可以使用其他软件包(如docopt.nim)代替实现此目的。 – dom96

回答

1

基础上documentation的parseopt2和commandeer讨论的问题(见#10),parseopt2只能用=:设置键的值,除此之外,我不知道是否有一个“适当“的方式来解析选项值。

Commandeer通过检查下一个标记是否是cmdArgument并指定值来处理键和值由空格分隔的选项。

var nextToken = cliTokens.pop() 
if nextToken.kind == parseopt2.cmdArgument: 
    try: 
    assign(nextToken.key) 
    except ValueError: 
    exitWithErrorMessage(getCurrentExceptionMsg()) 
    else: 
    cliTokens.add(nextToken)