3

下面 Ruby 代码的预期操作如下:

  1. 将命令行命名的文件 ARGV[0] 写入 old
  2. 创建该文件的新临时副本
  3. 循环直到用户给出输入
  4. 删除临时文件

当我硬编码等于 hello.c 的旧代码时,do 循环中的超时按我的预期工作:它等待 3 秒以等待来自键盘的输入,如果没有给出输入救援块并重复。

当我将 old 设置为 ARGV[0](也是 hello.c)时,将 fp 分配给 hello.c 的第一行,并且代码会跳出循环。

我如何运行它:

user@cpu live$ ruby test.rb hello.c 
hello.c
#include <stdio.h>
user@cpu live$

编码:

#!/usr/bin/env ruby

require 'timeout'

old = ARGV[0].chomp
puts old  # sanity check
# old = 'hello.c'
new = 'tmp_' + old
`cp #{old} #{new}`

fp = nil
loop do
  begin
    Timeout::timeout(3) { fp = gets }
    puts fp  # sanity check
    break if (fp)
  rescue Timeout::Error
    # ...
  end
end

`rm #{new}`

我不明白为什么从命令行读取与硬编码文件名有什么不同。

感谢您提供的任何帮助。谢谢。

4

1 回答 1

3

检查文档

如果Kernel.gets看到ARGV已设置,它将使用它们作为文件名来提供而不是从stdin读取。所以使用一个显式:$stdin.gets

于 2011-10-12T21:32:56.813 回答