2017-07-14 101 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)