2017-03-03 79 views
1

下面是一個程序示例,該程序採用一個可選參數a,該參數的默認值爲換行符。該程序僅打印唯一參數的值。因此,在調用程序不帶參數或-a '\n'應該給予相同的值,但它並不:使用optparse-appative從命令行參數中讀取換行符

$ ./myProg 


$ ./myProg -a '\n' 
\n 

的問題是,當它的命令行參數讀取,換行字符轉義。是否有可能使這兩個調用行爲相同?

import Options.Applicative 

data Options = Options String 

optsParser :: Parser Options 
optsParser = Options 
    <$> strOption 
     (short 'a' 
     <> metavar "A" 
     <> value "\n") 

opts :: IO Options 
opts = execParser $ info (helper <*> optsParser) (fullDesc) 

main = do 
    Options a <- opts 
    putStrLn $ a 

回答

5

問題不在於換行符被轉義;問題在於你首先沒有換行符。

就shell而言,'\n'實際上是一個雙字符字符串(反斜槓,n),這就是傳遞給你的程序的東西。

如何通過在命令行上面值換行符取決於你的shell,但請嘗試以下操作:

$ ./myProg -a ' 
> ' 

(該>在那裏是次要的shell提示下鍵入的內容是返回

或者在bash:

$ ./myProg -a $'\n' 
+0

很好的說明。有沒有簡單的方法讓optparse將命令行參數給出的「\ n」解釋爲換行符? –

+0

@GuillaumeChérel你必須自己做,並實現自己的轉義語法。 – melpomene