2011-10-12 33 views
3

下面的Ruby代码的预期操作如下:改变的行为得到,从命令行读出时,在红宝石

  1. 写入ARGV [0],名为在命令行上的文件,以老
  2. ,直到用户提供了输入
  3. 删除临时文件,

创建该文件

  • 环的一个新的临时副本当我硬编码老等于hello.c,do循环内的Timeout按我所期望的那样工作:它等待3秒从键盘输入,如果没有输入,则输入rescue块并重复。

    当我设置旧的等于ARGV [0](也是hello.c)时,fp被分配到hello.c的第一行,代码突破循环。

    我如何运行它:

    [email protected] live$ ruby test.rb hello.c 
    hello.c 
    #include <stdio.h> 
    [email protected] 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}` 
    

    我不明白为什么在命令行中读取会比硬编码的文件名有什么不同。

    我很感激您可以给予的任何帮助。谢谢。

  • 回答

    3

    检查docs

    如果Kernel.gets看到那ARGV设置,它使用它们作为文件名来 饲料,而不是从标准输入阅读。所以使用expicit:$stdin.gets

    +0

    我应该深入挖掘。这解决了它,谢谢。 – user992236