[Haskell] 我写了个读取 ini 格式配置文件的简单模块
暂时只能读取,还不能修改,不过对付简单的应用程序应该够用了。
我还在继续完善,但已经迫不及待想要和大家交流一下了。
- module IniConfig
- where
- import Data.Map hiding(map)
- import Text.ParserCombinators.Parsec
- -- 整个配置文件是一个小节名称到内容的哈希
- type IniConfig = Map String ConfigSection
- -- 一个小节是一个 key value 哈希
- type ConfigSection = Map String String
- -- 读一个配置文件小节
- readConfigSection :: ConfigSection -> Parser ConfigSection
- readConfigSection section = do
- key <- many1 alphaNum <?> "key"
- spaces
- char '='
- spaces
- value <- (many1 $ noneOf "rn") <?> "value"
- many1 newline
- readConfigSection $ insert key value section
- <|> return section
- <?> "config section"
- -- 读配置文件
- readConfig = parseFromFile (readConfig' empty)
- readConfig' :: IniConfig -> Parser IniConfig
- readConfig' config = do
- sectionName <- between (char '[')
- (char ']') $
- many1 (alphaNum <?> "config section name")
- many1 newline
- configSection <- readConfigSection empty
- readConfig' ( insert sectionName configSection config )
- <|> return config
- <?> "app config"
- -- 取配置文件信息
- getConfig :: IniConfig -> String -> String -> String
- getConfig config section key = (config!section) ! key
- -- 打印读取到的配置(测试用)
- printConfig :: IniConfig -> IO ()
- printConfig config = do
- mapM_ (showSection) $ keys config
- where showSection name = do
- putStrLn $ name ++ ":"
- let section = config ! name
- mapM_ (showPairs section) $ keys section
- showPairs section key = do
- putStrLn $ "t" ++ key ++ " = " ++ section ! key
复制代码
- -- 主程序
- module Main where
- import System.Environment
- import IniConfig
- main = do
- args <- getArgs
- ret <- readConfig $ (args++["config.ini"]) !! 0
- case ret of
- Left err -> print err
- Right config -> do printConfig config
- putStrLn $ getConfig config "Person1" "Name"
复制代码
- flw@Sleeper:~/study$ cat config.ini
- [Person1]
- Name= flw
- Age =23
- Message=彪哥 永远 二十三
- [Person2]
- Name = foo
- Age = 22
- Message = just for test
- flw@Sleeper:~/study$ runhaskell ttt.hs
- Person1:
- Age = 23
- Message = 彪哥 永远 二十三
- Name = flw
- Person2:
- Age = 22
- Message = just for test
- Name = foo
- flw
- flw@Sleeper:~/study$ cp config.ini app.ini
- flw@Sleeper:~/study$ runhaskell ttt.hs app.ini
- Person1:
- Age = 23
- Message = 彪哥 永远 二十三
- Name = flw
- Person2:
- Age = 22
- Message = just for test
- Name = foo
- flw
- flw@Sleeper:~/study$
复制代码
[ 本帖最后由 flw 于 2008-10-29 22:32 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我一开始以为 happy 是个语言……没想到是和 Haskell 相关的……
你用 happy haskell 做关键词就可以找到了 :wink:
大家一起学习,互相讨论。
我也正打算看这个呢。
好东西!看了一下,确实和 yacc 的语法很像。
以后有空了研究一下。
噢。好吧,我其实也只是知道一点点。
happy 是 haskell 下的语法分析器,就像 yacc 在 C 中的地位一样。就是用 BNF (巴克斯范式) 来分析语法结构的。甚至于它的语法都和 yacc 是类似的。
另, yacc 的 linux 开源实现叫 bison.
我都不知道 happy 是什么,不如你来做个介绍吧?
我 google 了一下,发现这个词汇实在是太常见了,根本找不到想要的信息。
你可以用 happy 实现下类似功能,然后和 flw 的实现比较下。
版主觉得与 happy 相比有何优劣呢?正想研究一下 happy.