2012-02-09 22 views
8

मैं हास्केल में एक यूआरएलव्यू क्लोन लिखने की कोशिश कर रहा हूं। कार्यक्रम एक संदेश (एसटीडीआईएन के माध्यम से पाइप) पढ़ता है, सभी यूआरएल निकालता है और उपयोगकर्ता को उनमें से एक का चयन करने के लिए कहता है।मैं हास्केल में stdin कैसे रीसेट करूं?

संदेश पढ़ने के बाद, एसटीडीआईएन स्पष्ट रूप से ईओएफ तक पहुंचता है। अजगर में, मैं इस

message = sys.stdin.read() 
sys.stdin = open('/dev/tty') 
selected_index = raw_input('Which URL to open? ') 

तरह STDIN रीसेट मैं हास्केल में एक ही कैसे प्राप्त होगा?

उत्तर

7

जहाँ तक मुझे पता के रूप में वहाँ कोई रास्ता नहीं है "फिर से सौंप" करने के लिए है में निर्मित हास्केल में stdin, लेकिन आप अन्यथा /dev/tty के लिए एक नया संभाल खोल सकते हैं। अपने अजगर कोड का एक सीधा अनुवाद की तरह

import System.IO 

main = do 
    message <- getContents 
    tty <- openFile "/dev/tty" ReadMode 
    putStr "Which URL to open? " 
    url <- hGetLine tty 
    ... 
8

आप हास्केल में stdin संभाल नहीं बदल सकते हैं कुछ होगा। अजगर में, sys.stdin चर केवल एक हैंडल करने के लिए अंक, इसलिए जब आप यह एक नई फ़ाइल हैंडल के साथ बदलें, पुराने stdinसंभाल अभी भी बना हुआ है, लेकिन sys.stdinचर अब फ़ाइल संभाल सकते हैं।

System.IO.stdin हैंडल हैस्सेल में अपरिवर्तनीय है (जैसा कि कई अन्य चर हैं, या मुझे मूल्य कहना चाहिए), आप हास्केल में भी वही काम नहीं कर सकते हैं।

आप क्या कर सकते हैं एक नई संभाल, और उपयोग कि टर्मिनल से पढ़ने के लिए संभाल के साथ /dev/tty फ़ाइल खोलने के लिए है। आप stdin पर किसी भी हैंडल पर उसी ऑपरेशन का उपयोग कर सकते हैं। बस System.IO आयात करें, और हर बार जब आप कुछ इनपुट प्राप्त करने के लिए foo ... का उपयोग करेंगे, तो इसके बजाय hFoo handle ... का उपयोग करें।

import System.IO 

-- ... 
newstdin <- openFile "/dev/tty" ReadMode 
-- Instead of normal getLine; just prepend "h" and pass the handle 
line <- hGetLine newstdin 

मत भूलना hClose के लिए एक कॉल के साथ अपने नए संभाल बंद करने के लिए: उदाहरण के लिए, टर्मिनल से एक लाइन को पढ़ने के लिए, इस कोड का उपयोग!

संबंधित मुद्दे