2012-02-28 19 views
11

मैं एक पर्ल स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो पाइप डेटा पढ़ता है, फिर उपयोगकर्ता को उस डेटा के आधार पर इनपुट के लिए संकेत देता है। निम्न स्क्रिप्ट, prompt_for_action, मैं क्या करने की कोशिश कर रहा हूँ:क्या मैं पर्ल में एसटीडीआईएन पर पाइप इनपुट पढ़ने के बाद उपयोगकर्ता इनपुट के लिए संकेत दे सकता हूं?

#!/usr/bin/perl 

my @hosts =(); 
while (<>) { 
    my $host = $_; 
    $host =~ s/\n//; # strip newlines 
    push(@hosts, $host); 
} 

for my $host (@hosts) { 
    print "Do you want to do x with $host ? y/n: "; 
    chomp(my $answer = <>); 
    print "You said `$answer`.\n"; 
} 

लेकिन जब मैं इसे चलाने के उपयोगकर्ता इनपुट के लिए कोई प्रतीक्षा नहीं है, यह सिर्फ मुझे टाइप करने के लिए की प्रतीक्षा किए बिना के माध्यम से चल रही है:

$ echo "test1.example.com 
> test2.example.com" | ./prompt_for_action 
Do you want to do x with test1.example.com ? y/n: You said ``. 
Do you want to do x with test2.example.com ? y/n: You said ``. 

अगर मैं STDIN से मेरे डेटा को पढ़ने नहीं है ...

#!/usr/bin/perl 

my @hosts = ('test1.example.com', 'test12.example.com'); 

for my $host (@hosts) { 
    print "Do you want to do x with $host ? y/n: "; 
    chomp(my $answer = <>); 
    print "You said `$answer`.\n"; 
} 

तो स्क्रिप्ट ठीक काम करता है:

$ ./prompt_for_action 
Do you want to do x with test1.example.com ? y/n: y 
You said `y`. 
Do you want to do x with test12.example.com ? y/n: n 
You said `n`. 

क्या एसटीडीआईएन को पाइपिंग है और फिर उपयोगकर्ता इनपुट के लिए संकेत दे रहा है? यदि हां, तो कैसे?

+1

यह अविश्वसनीय है कि पर्ल सिंटैक्स हाइलाइटिंग सिस्टम को तोड़ने पर कितना अच्छा है। – sidyll

उत्तर

11

यूनिक्स-वाई सिस्टम पर, आप पढ़ने के लिए /dev/tty छद्म फ़ाइल खोल सकते हैं।

while (<STDIN>) { 
    print "from STDIN: $_"; 
} 
close STDIN; 

# oops, need to read something from the console now 
open TTY, '<', '/dev/tty'; 
print "Enter your age: "; 
chomp($age = <TTY>); 
close TTY; 
print "You look good for $age years old.\n"; 
+0

धन्यवाद! टीटीई एक आकर्षण की तरह काम करता है। –

+0

मैं बस STDIN को बंद करने में सक्षम था, फिर: STDIN खोलें, "<", "/ dev/tty", क्या ऐसा कोई कारण है कि आपको ऐसा नहीं करना चाहिए? ऐसा लगता है कि जहां तक ​​मैं कह सकता हूं कि इसका कोई दुष्प्रभाव नहीं था। स्पष्ट रूप से इस तरह के 'बहादुरी' प्रोग्रामिंग को बड़े कार्यक्रमों के लिए सलाह नहीं दी जाती है लेकिन छोटे उपकरण ठीक से ठीक होना चाहिए? – osirisgothra

-2

एक बार जब आप एसटीडीआईएन के माध्यम से कुछ पाइप करते हैं, तो आपके पूर्व एसटीडीआईएन (कीबोर्ड इनपुट) को पाइप द्वारा प्रतिस्थापित किया जा रहा है। तो मुझे नहीं लगता कि यह संभव है।

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

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