使用ARGF时如何使用STDIN?

时间:2011-09-12 11:45:10

标签: ruby io stdin

我想创建一个脚本,我可以将列表输入:cat list | ruby script.rb我知道我可以使用ARGF来完成此操作并且它可以正常工作。但是我想再次迭代每一行,并根据决定对其进行一些操作。但是当我使用STDIN.gets时,当我输入内容时,我甚至不会被要求输入。

这就是我现在所拥有的

#!/usr/bin/env ruby
# encoding: utf-8

items = []

ARGF.each_with_index do |line, index|
  items << line
end

items.each_with_index do |item, index|
  puts "What to do with #{item}? (1,2,3)"
  case STDIN.gets
  when 1
    puts "one"
  when 2
    puts "two"
  when 3
    puts "three"
  end
end

感谢任何暗示我指向正确方向的提示。

3 个答案:

答案 0 :(得分:1)

阅读并浏览Ruby-Docs一段时间后,我找到了一种方法。我需要打开一个新的IO-Stream,因为ARGF已经被cam指出关闭。

#!/usr/bin/env ruby

ARGF.each_with_index do |line, index|
  puts "#{index}: #{line}"
end

fd = IO.sysopen("/dev/tty", "w+")
IO.open(fd, "w+") do |io|
  puts "Enter something:"
  puts "You entered: #{io.gets}"
end

可能不是最佳实践,但现在对我有用,不应成为该主题的主题。

答案 1 :(得分:0)

如果您也希望能够使用STDIN,则无法使用ARGF。 STDIN只是文件列表,然后它被关闭(这是你的shell执行此操作,而不是ruby,所以你无法控制)。

答案 2 :(得分:-1)

如果list是一个文件名,并且它包含你想在脚本中使用的行号,那么请尝试运行script.rb以下命令。

ruby script.rb list

注意:列表应该是一个文件,其中您有数字行,您可以选择询问它。另外,请在分享后输出!!!