ARGV, STDIN and gets

J

Joe Williams

I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first
(http://www.ruby-doc.org/core/classes/Kernel.html#M005996). Is there a
way around this so that I can pass in arguments and listen on stdin as
well. Running the script without args works perfectly. What I am doing
currently looks something like the following:

var1 = ARGV[0]
var2 = ARGV[1]
var3 = gets

Any advice would be helpful.

Thanks.
-Joe
 
N

Nobuyoshi Nakada

Hi,

At Sat, 25 Apr 2009 07:43:28 +0900,
Joe Williams wrote in [ruby-talk:334959]:
I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first

Kernel#gets is not a method to read from stdin.

Use $stdin.gets.
 
J

Joel VanderWerf

Joe said:
I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first
(http://www.ruby-doc.org/core/classes/Kernel.html#M005996). Is there a
way around this so that I can pass in arguments and listen on stdin as
well. Running the script without args works perfectly. What I am doing
currently looks something like the following:

var1 = ARGV[0]
var2 = ARGV[1]
var3 = gets

Any advice would be helpful.

Thanks.
-Joe

Kernel#gets reads from ARGF, which, if there's anything in ARGV, is read
from those files. So you can clear from ARGV first, if you want the
option of passing your file as the 3rd arg instead of stdin.

$ cat tt.rb
var1 = ARGV.shift
var2 = ARGV.shift
var3 = gets
p [var1, var2, var3]

$ cat data
this is some text
$ ruby tt.rb foo bar data
["foo", "bar", "this is some text\n"]
$ ruby tt.rb foo bar
type some input
["foo", "bar", "type some input\n"]
 
J

Joe Williams

ARGV.shift works perfectly, should have thought of that.

Thanks!

-Joe


Joel said:
Joe said:
I am running into an issue where I have a script that takes two
command line arguments and reads from stdin. It seems that gets is
not getting to stdin because it is hitting ARGV first
(http://www.ruby-doc.org/core/classes/Kernel.html#M005996). Is there
a way around this so that I can pass in arguments and listen on stdin
as well. Running the script without args works perfectly. What I am
doing currently looks something like the following:

var1 = ARGV[0]
var2 = ARGV[1]
var3 = gets

Any advice would be helpful.

Thanks.
-Joe

Kernel#gets reads from ARGF, which, if there's anything in ARGV, is
read from those files. So you can clear from ARGV first, if you want
the option of passing your file as the 3rd arg instead of stdin.

$ cat tt.rb
var1 = ARGV.shift
var2 = ARGV.shift
var3 = gets
p [var1, var2, var3]

$ cat data
this is some text
$ ruby tt.rb foo bar data
["foo", "bar", "this is some text\n"]
$ ruby tt.rb foo bar
type some input
["foo", "bar", "type some input\n"]
 
P

Prakash Murthy

Nobuyoshi said:
Hi,

At Sat, 25 Apr 2009 07:43:28 +0900,
Joe Williams wrote in [ruby-talk:334959]:
I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first

Kernel#gets is not a method to read from stdin.

Use $stdin.gets.

Thanks Nobuyoshi!

I used $stdin.gets. instead of gets. and that solved the problem I was
facing!
 
D

Daniel C.

Prakash Murthy wrote in post #929972:
Nobuyoshi said:
Hi,

At Sat, 25 Apr 2009 07:43:28 +0900,
Joe Williams wrote in [ruby-talk:334959]:
I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first

Kernel#gets is not a method to read from stdin.

Use $stdin.gets.

Thanks Nobuyoshi!

I used $stdin.gets. instead of gets. and that solved the problem I was
facing!

The solution is more very easy, like this:

var2 = ARGV[1].clone
ARGV.clear
var3 = gets

its work! not need STDIN! :) no error more.
 
R

Robert Klemme

Prakash Murthy wrote in post #929972:
Nobuyoshi said:
Hi,

At Sat, 25 Apr 2009 07:43:28 +0900,
Joe Williams wrote in [ruby-talk:334959]:
I am running into an issue where I have a script that takes two command
line arguments and reads from stdin. It seems that gets is not getting
to stdin because it is hitting ARGV first

Kernel#gets is not a method to read from stdin.

Use $stdin.gets.

Thanks Nobuyoshi!

I used $stdin.gets. instead of gets. and that solved the problem I was
facing!

The solution is more very easy, like this:

var2 = ARGV[1].clone
ARGV.clear
var3 = gets

its work! not need STDIN! :) no error more.

Why do you clone when the next thing that you do is clearing ARGV?
That seems superfluous.

For one argument I would do

arg = ARGV.shift or abort "ERROR: need at least one argument"

For more arguments I'd probably do

arg1, arg2 = ARGV.slice! 0, 2
abort "Need two arguments!" unless arg2

gets # reads stdin or from file if there are more arguments

If there is a need for more complex argument processing I would use
OptionParser anyway.

OptionParser.new do |opts|
...
end.parse! ARGV # removes options

Kind regards

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

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top