Как использовать STDIN при использовании ARGF? - PullRequest
2 голосов
/ 12 сентября 2011

Я хочу создать скрипт, в который я могу передать список: 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 ]

1 голос
/ 13 сентября 2011

После прочтения и просмотра Ruby-Docs я нашел способ.Мне нужно открыть новый поток ввода-вывода, поскольку ARGF закрыто, как указано в кулачке.

#!/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

Возможно, это не лучшая практика, но работает для меня сейчас и не должно быть темой этой темы..

0 голосов
/ 12 сентября 2011

Вы не можете использовать ARGF, если хотите использовать STDIN. STDIN - это просто список файлов, а затем он закрывается (это делает ваша оболочка, а не ruby, поэтому вы не можете управлять).

0 голосов
/ 12 сентября 2011

если список является именем файла и содержит номер строки, которую вы хотите использовать в своем скрипте, попробуйте запустить скрипт script.rb, который следует следующей команде.

ruby script.rb list

примечание: список должен быть файлом, в котором у вас есть числовые строки, для которых вы предполагаете задать опцию. Также, пожалуйста, поделитесь своими результатами после этого !!!

...