ruby - 哈希表中的多个匹配项

标签 ruby parsing duplicates

在 coursera 中学习 Ruby(2.5 版)。 目的是在 ruby​​ 简单解析器上编写,它将计算哪个 IP 主机负责 apache 日志中最多的查询。

Apache 日志:

    87.99.82.183 - - [01/Feb/2018:18:50:06 +0000] "GET /favicon.ico HTTP/1.1" 404 504 "http://35.225.14.147/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"
    87.99.82.183 - - [01/Feb/2018:18:50:52 +0000] "GET /secret.html HTTP/1.1" 404 505 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"

ruby 代码:

    class ApacheLogAnalyzer

      def initialize
        @total_hits_by_ip = {}
      end

      def analyze(file_name)
        ip_regex = /^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/
        file = File.open(file_name , "r")
        file.each_line do |line|
          count_hits(ip_regex.match(line))
        end
      end

      def count_hits(ip)
        if ip
          if @total_hits_by_ip[ip]
            @total_hits_by_ip[ip] += 1
          else
            @total_hits_by_ip[ip] = 1
          end
        end
      end

结果如下:

      {#<MatchData "87.99.82.183">=>1, #<MatchData "87.99.82.183">=>1}

结果包含重复项(它应该包含一个值为 2 的键“87.99.82.183”)。问题出在哪里?

最佳答案

在您的情况下,结果包含重复项,因为散列键是不同的对象但具有相同的值。看看这个例子:

a = "hello world foo".match(/he/) # => #<MatchData "he">
b = "hello world bar".match(/he/) # => #<MatchData "he">
a == b # => false

例如,您可以只用字符串替换散列键,以绝对避免这种情况:

class ApacheLogAnalyzer
  def analyze(file_name)
    File.open(file_name).each_line.inject(Hash.new(0)) do |result, line|
      ip = line.split
      hash[ip] += 1
      result
    end
  end
end

关于ruby - 哈希表中的多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603010/

相关文章:

java - 为什么组合多个 ArrayList 时会出现重复项?

ruby - 从 ruby​​ 哈希中的匹配键检索值的更好方法

ruby-on-rails - Rails 3::config/initializers 每个环境都有单独的目录

ruby - 重构以减少重复

ruby-on-rails - ruby on rails 使用 sass 自动加载语法错误

parsing - 如何在 Music21 中为独奏钢琴读取 midi/musicxml 文件,其中一个声音中可以同时有多个音符?

java - 从文件中读取不可打印的字符

MYSQL 重复行的复杂更新

Python - ElementTree 库 - 按属性值搜索树

sql - 基于两列删除重复项