2012-02-13 6 views
2

私のコードで何が問題になっていますか? FileNameArrayは再利用されていますか?「既に初期化された定数」警告の原因は何ですか?

f.rb:17:警告:Rubyの変数名の大文字小文字が区別されるには、すでに初期化され、一定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 
+1

(それが大文字であるため)FileNameArrayは一定であり、あなたはループでそれを定義しています。 –

+0

@AlexD私はちょうどRubyから始めています。そして、資本化がConstantを作成するものであるという小さな情報が非常に有益です。 –

答えて

2

。ローカル変数はlower case characterで始まる必要があります。定数 - 大文字です。

FileNameArrayからfileNameArrayに名前を変更してください。

また、globは、1ループと12ダースのLOCを節約できる高度な表現を採用しています。あなたのケースでは、この表現のようなものになります。あなたはRubyの初心者であるかもしれない

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

+0

ありがとう、それは動作します! :) – Acc

+0

Dir.glob( "/ home/product/00 [0-9]/*/*。txt")を使用すると、ループが最初に非常に遅くなります。ファイル名を他のプロセスに渡しますか? – Acc

+0

あなたはそれを測定しましたか?また、99個のフォルダがないのに20個のforループがglobを99回呼び出す場合、それは正しくありません –

5

を、私はダウンに注意することは...ルビーのように

(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 

ポイントを同じコードを書き直してみましたあなたは$記号で始まる変数を使用する場合は、Rubyで

  1. 、それがglobal variableとしています。したがって、必要な場合にのみ$findを使用してください。
  2. ルビーでconstant variablecapital letterで始まり、通常はNOTとなります。これにより、プログラムのエラーが発生している可能性があります。
  3. (1..99) 1から99
に値を返す、 Rangeクラスのインスタンスを作成するために使用されるリテラル
関連する問題