3

以下のRubyコードの意図された操作は次のとおりです。

  1. コマンドラインで指定されたファイルであるARGV[0]を古いものに書き込みます
  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それが設定されている場合は、 stdinARGVから読み取る代わりに、フィードするファイル名としてそれらを使用します。したがって、expicit を使用します。$stdin.gets

于 2011-10-12T21:32:56.813 に答える