Ruby方法变量声明

时间:2015-04-27 02:06:48

标签: ruby class methods

我正在尝试定义解析apache日志文件的方法,并提取ip地址,URL,每小时请求和错误代码。我已经让一切都在方法之外工作了,但是当我试图将这些代码放入方法中时,我不断收到错误消息“堆栈级别太深”。这是有问题的代码。

   class CommonLog

    def initialize(logfile)
        @logfile = logfile
    end

    def readfile
         @readfile = File.readlines(@logfile).map { |line|
    line.split()
  }
  @readfile = @readfile.to_s.split(" ")
    end

    def ip_histogram
        @ip_count = 0
        @readfile.each_index { |index|
            if (@readfile[index] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ )
                puts @readfile[index]
                puts @ip_count += 1
            end
        }
    end

    def url_histogram
        url_count = 0 
        cleaned_file.each_index { |index|
            if (cleaned_file[index] =~ /\/{1}(([a-z]{4,})|(\~{1}))\:{0}\S+/ )
                puts cleaned_file[index]
                puts url_count += 1
            end
        }
    end

    def requests_per_hour
    end

    def sorted_list
    end

end

my_file = CommonLog.new("test_log")
cleaned_file = my_file.readfile
puts cleaned_file.ip_histogram

1 个答案:

答案 0 :(得分:0)

问题似乎在于CommonLog#readfile方法:

def readfile
  @readfile = File.readlines(@logfile).map { |line|
    line.split()
  }
  @readfile = readfile.to_s.split(" ")
end

请注意,在readfile的实现中,您的调用readfile是递归的吗?执行时,它从文件中读取行,映射它们并将结果分配给@readfile;然后它调用readfile并且该方法再次开始执行;这种情况会持续下去,直到你因为太多的递归方法调用而导致堆栈爆炸。

我假设你的意思是:

@readfile = @readfile.to_s.split(" ")