2015-04-27 188 views
0

我試圖定義方法來解析通過apache日誌文件,並拉IP地址,URL,每小時的請求和錯誤代碼。我已經在方法之外使用了所有的東西,但是當試圖將這些代碼放入方法中時,我總是收到錯誤消息「堆棧層太深」。這是有問題的代碼。Ruby方法變量聲明

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

您的代碼太長,你的解釋不夠。 「方法」是什麼意思?你是指HTTP方法還是Ruby方法?哪部分代碼是?你可以減少你的代碼,只有相關的代碼保留下來嗎?另外,您是否可以在輸入文件中包含兩到三個示例行,以便我們可以自己測試您的代碼? – Amadan

回答

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(" ") 
+0

謝謝!這解決了問題,但現在我有一個新的錯誤未定義的方法'ip_histogram'爲#(NoMethodError) 我更新了原始問題中的代碼。 – EnduranceMan