gets bug?

S

Shea Martin

<snip>
if ARGV.size > 0
puts "first arg is #{ARGV[0]}"
end
puts "enter text"
ans = gets
puts "you said #{ans}"
</snip>

Run this code, as ./test.rb. Then run it with an command line arg, like
"./test.rb -x". And you will get an error like this:

"test.rb:3:in `gets': No such file or directory - -x (Errno::ENOENT)"

The fix I have found, is to change gets to $stdin.gets. I saw some
traffic on the mailing list archives regarding this, but no resolution.

Is this expected behaviour?
ruby -v is: ruby 1.8.3 (2005-09-21) [sparc-solaris2.10]

Thanks,

~S
 
J

James Edward Gray II

<snip>
if ARGV.size > 0
puts "first arg is #{ARGV[0]}"
end
puts "enter text"
ans = gets
puts "you said #{ans}"
</snip>

Run this code, as ./test.rb. Then run it with an command line arg,
like "./test.rb -x". And you will get an error like this:

"test.rb:3:in `gets': No such file or directory - -x
(Errno::ENOENT)"

The fix I have found, is to change gets to $stdin.gets. I saw some
traffic on the mailing list archives regarding this, but no
resolution.

Is this expected behaviour?

Yes it is. Kernel.gets() reads from files specified as command-line
options or STDIN, if none were given. This makes it easy to write
Unix-style filters.

You can always shift the option out of ARGV before calling gets()
with something like:

if ARGV.first == "-x"
ARGV.shift
# ...
end

Hope that helps.

James Edward Gray II
 
G

Gary Watson

Shea said:
<snip>
if ARGV.size > 0
puts "first arg is #{ARGV[0]}"
end
puts "enter text"
ans = gets
puts "you said #{ans}"
</snip>

Run this code, as ./test.rb. Then run it with an command line arg, like
"./test.rb -x". And you will get an error like this:

"test.rb:3:in `gets': No such file or directory - -x (Errno::ENOENT)"

The fix I have found, is to change gets to $stdin.gets. I saw some
traffic on the mailing list archives regarding this, but no resolution.

Is this expected behaviour?
ruby -v is: ruby 1.8.3 (2005-09-21) [sparc-solaris2.10]

Thanks,

~S

I've run into this problem before as well, somebody pointed me to the ri
documentation on Kernel#gets, it says the following.

Returns the next line from the list of files in +ARGV+, or from standard
input if no files are present on the command line. Returns +nil+ at end
of file.

Hope this helps.
 
R

Robert Klemme

James said:
<snip>
if ARGV.size > 0
puts "first arg is #{ARGV[0]}"
end
puts "enter text"
ans = gets
puts "you said #{ans}"
</snip>

Run this code, as ./test.rb. Then run it with an command line arg,
like "./test.rb -x". And you will get an error like this:

"test.rb:3:in `gets': No such file or directory - -x
(Errno::ENOENT)"

The fix I have found, is to change gets to $stdin.gets. I saw some
traffic on the mailing list archives regarding this, but no
resolution.

Is this expected behaviour?

Yes it is. Kernel.gets() reads from files specified as command-line
options or STDIN, if none were given. This makes it easy to write
Unix-style filters.

You can always shift the option out of ARGV before calling gets()
with something like:

if ARGV.first == "-x"
ARGV.shift
# ...
end

I'd prefer to use OptionParser.parse! for this - but otherwise totally
agree.

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,738
Latest member
JinaMacvit

Latest Threads

Top