【问题标题】:How to use STDIN when ARGF was used?使用 ARGF 时如何使用 STDIN?
【发布时间】:2011-11-15 06:48:39
【问题描述】:

我想创建一个脚本,我可以通过管道将列表输入: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

感谢您为我指明正确方向的任何提示。

【问题讨论】:

    标签: ruby io stdin


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        ruby script.rb list
        

        注意:列表应该是一个文件,其中有你想询问选项的数字行。另外,请分享你的输出!!!

        【讨论】:

        • 好吧,如果调用 ruby script.rb item1 item2 itemNcat somefile.txt | ruby script.rbruby script.rb &lt; somefile.txt 或其他什么,我不希望它有所作为。或者你想说什么?
        • 抱歉,我现在不能深入了解它,但与您的问题相关,请尝试所有命令,将“puts ARGF.to_io.inspect”放入脚本中。它将为“ruby script.rb somefile.txt”返回 FILE 对象,并将为其他命令返回 IO 对象(somefile.txt | ruby​​ script.rb 或 ruby​​ script.rb
        猜你喜欢
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多