[Haskell] 我写了个读取 ini 格式配置文件的简单模块

发布于 2022-08-11 10:21:51 字数 4885 浏览 16 评论 8

暂时只能读取,还不能修改,不过对付简单的应用程序应该够用了。
我还在继续完善,但已经迫不及待想要和大家交流一下了。

  1. module IniConfig
  2.   where
  3. import Data.Map hiding(map)
  4. import Text.ParserCombinators.Parsec
  5. -- 整个配置文件是一个小节名称到内容的哈希
  6. type IniConfig = Map String ConfigSection
  7. -- 一个小节是一个 key value 哈希
  8. type ConfigSection = Map String String
  9. -- 读一个配置文件小节
  10. readConfigSection         :: ConfigSection -> Parser ConfigSection
  11. readConfigSection section = do
  12.       key <- many1 alphaNum <?> "key"
  13.       spaces
  14.       char '='
  15.       spaces
  16.       value <- (many1 $ noneOf "rn") <?> "value"
  17.       many1 newline
  18.       readConfigSection $ insert key value section
  19.   <|> return section
  20.   <?> "config section"
  21. -- 读配置文件
  22. readConfig = parseFromFile (readConfig' empty)
  23. readConfig' :: IniConfig -> Parser IniConfig
  24. readConfig' config = do
  25.       sectionName <- between  (char '[')
  26.                               (char ']') $
  27.                               many1 (alphaNum <?> "config section name")
  28.       many1 newline
  29.       configSection <- readConfigSection empty
  30.       readConfig' ( insert sectionName configSection config )
  31.   <|> return config
  32.   <?> "app config"
  33. -- 取配置文件信息
  34. getConfig :: IniConfig -> String -> String -> String
  35. getConfig config section key = (config!section) ! key
  36. -- 打印读取到的配置(测试用)
  37. printConfig :: IniConfig -> IO ()
  38. printConfig config    = do
  39.   mapM_ (showSection) $ keys config
  40.   where showSection name = do
  41.           putStrLn $ name ++ ":"
  42.           let section = config ! name
  43.           mapM_ (showPairs section) $ keys section
  44.         showPairs section key = do
  45.         putStrLn $ "t" ++ key ++ " = " ++ section ! key

复制代码

  1. -- 主程序
  2. module Main where
  3. import System.Environment
  4. import IniConfig
  5. main = do
  6.   args <- getArgs
  7.   ret <- readConfig $ (args++["config.ini"]) !! 0
  8.   case ret of
  9.     Left err      -> print err
  10.     Right config  -> do printConfig config
  11.                         putStrLn $ getConfig config "Person1" "Name"

复制代码

  1. flw@Sleeper:~/study$ cat config.ini
  2. [Person1]
  3. Name= flw
  4. Age =23
  5. Message=彪哥 永远 二十三
  6. [Person2]
  7. Name = foo
  8. Age = 22
  9. Message = just for test
  10. flw@Sleeper:~/study$ runhaskell ttt.hs
  11. Person1:
  12.         Age = 23
  13.         Message = 彪哥 永远 二十三
  14.         Name = flw
  15. Person2:
  16.         Age = 22
  17.         Message = just for test
  18.         Name = foo
  19. flw
  20. flw@Sleeper:~/study$ cp config.ini app.ini
  21. flw@Sleeper:~/study$ runhaskell ttt.hs app.ini
  22. Person1:
  23.         Age = 23
  24.         Message = 彪哥 永远 二十三
  25.         Name = flw
  26. Person2:
  27.         Age = 22
  28.         Message = just for test
  29.         Name = foo
  30. flw
  31. flw@Sleeper:~/study$

复制代码

[ 本帖最后由 flw 于 2008-10-29 22:32 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

江湖彼岸 2022-08-18 09:23:39

原帖由 MMMIX 于 2008-10-30 16:53 发表

你用 happy haskell 做关键词就可以找到了 :wink:

我一开始以为 happy 是个语言……没想到是和 Haskell 相关的……

沙沙粒小 2022-08-18 08:57:46

原帖由 flw 于 2008-10-30 14:54 发表

我都不知道 happy 是什么,不如你来做个介绍吧?
我 google 了一下,发现这个词汇实在是太常见了,根本找不到想要的信息。

你用 happy haskell 做关键词就可以找到了 :wink:

望笑 2022-08-18 08:31:59

大家一起学习,互相讨论。
我也正打算看这个呢。

因为看清所以看轻 2022-08-18 08:08:22

原帖由 drunkedcat 于 2008-10-30 15:13 发表

噢。好吧,我其实也只是知道一点点。

happy 是 haskell 下的语法分析器,就像 yacc 在 C 中的地位一样。就是用 BNF (巴克斯范式) 来分析语法结构的。甚至于它的语法都和 yacc 是类似的。

另, yacc ...

好东西!看了一下,确实和 yacc 的语法很像。
以后有空了研究一下。

我纯我任性 2022-08-17 13:52:29

原帖由 flw 于 2008-10-30 14:54 发表

我都不知道 happy 是什么,不如你来做个介绍吧?
我 google 了一下,发现这个词汇实在是太常见了,根本找不到想要的信息。

噢。好吧,我其实也只是知道一点点。

happy 是 haskell 下的语法分析器,就像 yacc 在 C 中的地位一样。就是用 BNF (巴克斯范式) 来分析语法结构的。甚至于它的语法都和 yacc 是类似的。

另, yacc 的 linux 开源实现叫 bison.

友欢 2022-08-17 12:10:30

原帖由 drunkedcat 于 2008-10-30 13:57 发表
版主觉得与 happy 相比有何优劣呢?正想研究一下 happy.

我都不知道 happy 是什么,不如你来做个介绍吧?
我 google 了一下,发现这个词汇实在是太常见了,根本找不到想要的信息。

枫林﹌晚霞¤ 2022-08-16 07:34:32

原帖由 drunkedcat 于 2008-10-30 13:57 发表
版主觉得与 happy 相比有何优劣呢?正想研究一下 happy.

你可以用 happy 实现下类似功能,然后和 flw 的实现比较下。

岁月静好 2022-08-14 13:19:13

版主觉得与 happy 相比有何优劣呢?正想研究一下 happy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文