4

私のコードの何が問題になっていますか?FileNameArray再利用されていますか?

f.rb:17:警告:すでに初期化された定数FileNameArray

number = 0
while number < 99
  number = number + 1
  if number <= 9
    numbers = "000" + number.to_s
  elsif
    numbers = "00" + number.to_s
  end
  files = Dir.glob("/home/product/" + numbers + "/*/*.txt")
    files.each do |file_name|
    File.open(file_name,"r:utf-8").each do | txt |
      if txt =~ /http:\/\//
        if txt =~ /static.abc.com/ or txt =~ /static0[1-9].abc.com/
        elsif
        $find = txt
        FileNameArray = file_name.split('/')
        f = File.open("error.txt", 'a+')
        f.puts FileNameArray[8], txt , "\n"
        f.close
        end
      end
    end
  end
end
4

2 に答える 2

5

ruby 初心者かもしれませんが、同じコードを ruby​​ 風に書き直してみました...

(1..99).each do |number|
  Dir.glob("/home/product/" + ("%04d" % numbers) + "/*/*.txt").each do |file_name|
    File.open(file_name,"r:utf-8").each do | txt |
      next unless txt =~ /http:\/\//
      next if txt =~ /static.abc.com/ || txt =~ /static0[1-9].abc.com/        

      $find = txt
      file_name_array = file_name.split('/')
      f = File.open("error.txt", 'a+')
      f.puts file_name_array[8], txt , "\n"
      f.close      
    end
  end
end

注意点、

  1. rubyでは、$シンボルを前に付けた変数を使用すると、global variable. したがって$find、必要な場合にのみ使用してください。
  2. Ruby では a でconstant variable始まりcapital letter、通常、定数値を変更することは想定されていません。これにより、プログラムでエラーが発生した可能性があります。
  3. (1..99)Rangeクラスのインスタンスを作成するために使用されるリテラルで、1 から 99 までの値を返します
于 2012-02-13T10:44:17.290 に答える
3

Ruby の変数名では大文字と小文字が区別されます。ローカル変数は小文字で始める必要があります。定数 - 大文字。

ということで、リネームFileNameArrayしてみてくださいfileNameArray

また、glob1 つのループと多数の LOC を節約できる高度な式を使用します。あなたの場合、この式は次のようになります。

Dir.glob("/home/product/00[0-9][0-9]/*/*.txt")

于 2012-02-13T09:15:44.980 に答える