2010-01-06 7 views
7

यह काफी अच्छी तरह से काम करता है - बस आश्चर्य हुआ कि क्या इसे कम करने के लिए कोई सुधार है?कोई तर्क नहीं अगर stdin के खिलाफ चलाने के लिए स्क्रिप्ट; अन्यथा इनपुट फ़ाइल = एआरजीवी [0]

input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r") 

उत्तर

18

आप पूरी तरह से पहले पांच लाइनों को खत्म कर सकते हैं।

कुदाल से मिट्टी खुरपना

से

$<: An object that provides access to the concatenation of the contents of all the files given as command-line arguments or $stdin (in the case where there are no arguments). $< supports methods similar to a File object: binmode, close, closed?, each, each_byte, each_line, eof, eof?, file, filename, fileno, getc, gets, lineno, lineno=, path, pos, pos=, read, readchar, readline, readlines, rewind, seek, skip, tell, to_a, to_i, to_io, to_s, along with the methods in Enumerable. The method file returns a File object for the file currently being read. This may change as $< reads through the files on the command line. [r/o]

इसलिए

:

print $<.read 

Kernel.gets $ < .gets के लिए आशुलिपि, इसलिए है:

while s = gets 
    puts s 
end 
+2

पर अपडेट किया गया है, इसके अलावा, आप 'ARGF' का उपयोग कर सकते हैं, क्योंकि यह' 8 <'के लिए उपनाम है। – kejadlen

+0

हाँ - यह बहुत अच्छा काम करता है - यह मुझे आश्चर्यचकित करता है कि मैं इसे पकड़ने के लिए पहली बार सर्कल में क्यों गया। मुझे लगता है कि यह शायद थोड़ा अजीब (लेकिन अच्छा) व्यवहार की वजह से है कि यदि आप बिना तर्क के 'ruby myscript.rb' चलाते हैं, तो स्क्रिप्ट बस बाहर निकलती है - अधिकांश प्रोग्राम (उदाहरण के लिए यूनिक्स पर निश्चित रूप से) बैठेंगे और प्रतीक्षा करेंगे stdin: तो मुझे लगता है कि मुझे लगता है कि मुझे वहां कुछ लागू करना था - लेकिन वास्तव में (विवरण के लिए धन्यवाद) रूबी दुभाषिया कुछ काफी उपयोगी और काफी चालाक (हमेशा की तरह) करता है! धन्यवाद। – monojohnny

+0

मैं आपके साथ ठीक हूँ। मैं अभी भी इन छोटी छोटी रूबी चालों के लिए उपयोग (और खोज) कर रहा हूं। –

2

then और ; वैकल्पिक

भी आप त्रिगुट ऑपरेटर का उपयोग कर सकते हैं File(), तो

input = ARGV ? $< : File.new(ARGV[0]) 
+0

महान - +1 - लेकिन मैं मतदान अन्य जवाब के रूप में यह भी छोटा है! अच्छी पुरानी रूबी! – monojohnny

3

केवल ARGV ? मेरे लिए काम करता है, "r" सामान्य रूप से तो डिफ़ॉल्ट इसे छोड़ सकते हैं, और File.new() एक ही हो सकता है:

if (ARGV[0].nil?) then 
    input=$< 
else 
    input=File.new(ARGV[0],"r"); 
end 

... 
# Do something with the input here, for example: 
input.each_line do |line| 
    puts line 
end 
+0

इस तरह: धन्यवाद! – monojohnny

+0

+1, मुझे फ़ाइल के बारे में पता नहीं था() :) – makevoid

+0

फ़ाइल ("foo") अब काम नहीं कर रहा है (रूबी 2.3.1): NoMethodError: मुख्य के लिए अपरिभाषित विधि 'फ़ाइल': ऑब्जेक्ट। –

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