Script to run against stdin if no arg; otherwise input file =ARGV[0]

后端 未结 3 2105
广开言路
广开言路 2020-12-31 21:14

This works quite nicely - just wondered if there are any improvements to shorten it ?

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


        
相关标签:
3条回答
  • 2020-12-31 21:25

    You can eliminate the first five lines entirely.

    From Pickaxe

    $<: 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]

    Therefore:

    print $<.read
    

    Kernel.gets is shorthand for $<.gets, so:

    while s = gets
      puts s
    end
    
    0 讨论(0)
  • Only ARGV ? works for me, "r" normally default so can skip it, and File.new() may be same to File(), So

    input = ARGV ? $< : File.new(ARGV[0])
    
    0 讨论(0)
  • 2020-12-31 21:47

    then and ; are optional

    also you can use the ternary operator:

    input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")
    
    0 讨论(0)
提交回复
热议问题