昨天我给我的学生写了一个小小的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)
但是这个更正的版本也行不通.我阅读了缓冲文档并使用各种设置进行了播放.如果我设置NoBuffering或LineBuffering,我的程序正常工作.最后,我打印出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
编辑:谢谢大家的有用答案.
我接受了大火给出的答案,他给了我一个isatty的暗示(3).我再次浏览了System.IO文档并找到了hIsTerminalDevice函数,我可以检查句柄的连接.
为了记录,这是我的最终计划:
{-# OPTIONS_GHC -W #-}
import System.IO
main = do
hSetBuffering …Run Code Online (Sandbox Code Playgroud) 昨天我写了一个小子程序来解析我的/ 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正则表达式匹配的主机名.
问题是,为什么我必须$name在map表达式中单独写?如果我不写,请回到整行.变量是否评估其值?
在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)