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],"r");
end
...
# Do something with the input here, for example:
input.each_line do |line|
puts line
end
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
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])
then
and ;
are optional
also you can use the ternary operator:
input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")