Что вызывает предупреждение «уже инициализированная константа»? - PullRequest
3 голосов
/ 13 февраля 2012

Что не так с моим кодом? 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

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Вы можете быть новичком в рубине, я пытался переписать тот же код рубиновым способом ...

(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. В рубине, если выиспользуйте переменную с префиксом $, она принимается за global variable.Поэтому используйте $find, только если это необходимо.
  2. В ruby ​​constant variable начинается с capital letter, обычно мы НЕ должны изменять постоянное значение.Это могло вызвать ошибку в вашей программе.
  3. (1..99) - это литерал, используемый для создания экземпляра класса Range , который возвращает значения от 1 до 99
3 голосов
/ 13 февраля 2012

В случае имени переменной в Ruby имеет значение.Локальные переменные должны начинаться с символа нижнего регистра .Константы - в верхнем регистре.

Итак, попробуйте переименовать FileNameArray в fileNameArray.

Кроме того, glob принимает расширенные выражения, которые могут сэкономить один цикл и дюжинуLOCs.В вашем случае это выражение должно выглядеть примерно так:

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

...