小编pas*_*sja的帖子

Haskell默认io缓冲

昨天我给我的学生写了一个小小的xinetd练习:做一个反向回音程序.

为了学习新东西,我试图实现一个Haskell解决方案.琐碎的main = forever $ interact reverse行为不起作用.我仔细检查了这个问题并做了更正后的版本:

import Control.Monad
import System.IO

main = forever $ interact revLines

revLines = unlines . map (reverse) . lines 
Run Code Online (Sandbox Code Playgroud)

但是这个更正的版本也行不通.我阅读了缓冲文档并使用各种设置进行了播放.如果我设置NoBufferingLineBuffering,我的程序正常工作.最后,我打印出stdin和stdout的默认缓冲模式

import System.IO

main = do 
  hGetBuffering stdin >>= print 
  hGetBuffering stdout >>= print
Run Code Online (Sandbox Code Playgroud)

我有BlockBuffering Nothing(如果我运行从我的xinetd的程序echo "test" | nc localhost 7),但是从CLI我有LineBuffering

  • xinetd tcp服务和cli程序有什么区别,关于缓冲?
  • 如果我想用两种运行方法编写一个工作程序,我是否必须手动设置缓冲?

编辑:谢谢大家的有用答案.

我接受了大火给出的答案,他给了我一个isatty的暗示(3).我再次浏览了System.IO文档并找到了hIsTerminalDevice函数,我可以检查句柄的连接.

为了记录,这是我的最终计划:

{-# OPTIONS_GHC -W #-}

import System.IO

main = do
  hSetBuffering …
Run Code Online (Sandbox Code Playgroud)

haskell buffering xinetd

13
推荐指数
2
解决办法
2705
查看次数

拆分内部地图如何工作?

昨天我写了一个小子程序来解析我的/ etc/hosts文件并从中获取主机名.

这是子程序:

sub getnames {
    my ($faculty, $hostfile) = @_;
    open my $hosts ,'<', $hostfile;
    my @allhosts = <$hosts>;
    my $criteria = "mgmt." . $faculty;
    my @hosts = map {my ($ip, $name) = split; $name} grep {/$criteria/} @allhosts; # <-this line is the question              
    return @hosts;
}
Run Code Online (Sandbox Code Playgroud)

我打电话给它getnames('foo','/etc/hosts')并找回了与mgmt.foo正则表达式匹配的主机名.

问题是,为什么我必须$namemap表达式中单独写?如果我不写,请回到整行.变量是否评估其值?

perl split map

2
推荐指数
1
解决办法
213
查看次数

修复haskell中破坏的utf8编码

在SO人员的帮助下,我成功地在haskell中实现了一个简单的rss下载器.但仍有一个问题:如何修复Feed项标题的破碎编码?这是最小的工作示例:

import Control.Monad
import Control.Applicative
import Network.HTTP
import Text.Feed.Import
import Text.Feed.Query
import Text.Feed.Types
import Data.Maybe
import qualified Data.ByteString as B
import Network.URI (parseURI, uriToString)
import Codec.Binary.UTF8.String (decodeString, encodeString)

getTitleAndUrl :: Item -> (Maybe String, Maybe String)
getTitleAndUrl item = (getItemTitle item, getItemLink item)

downloadUri :: (Maybe String,Maybe String) -> IO ()
downloadUri (Just title,Just link) = do
  item <- get link
  B.writeFile title item
    where
      get url = let uri = case parseURI url of
                      Nothing …
Run Code Online (Sandbox Code Playgroud)

haskell utf-8 character-encoding

0
推荐指数
1
解决办法
430
查看次数

标签 统计

haskell ×2

buffering ×1

character-encoding ×1

map ×1

perl ×1

split ×1

utf-8 ×1

xinetd ×1