【问题标题】:How to merge IP addresses and ignore wrong IP addresses Ruby如何合并 IP 地址并忽略错误的 IP 地址 Ruby
【发布时间】:2017-04-26 17:12:17
【问题描述】:

我有一组包含子网的数组,其中一个子网是错误的(缺少一个八位字节),我想合并它们并忽略错误的。

我有以下代码:

subnets = ["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24","159.8.57/22"]

require 'netaddr'

subnet.each do |net|
  begin
  merged_subnets = NetAddr.merge(net)
  rescue ArgumentError => error
    puts error
  end
  puts merged_subnets
end 

这段代码给了我以下输出:

149.62.168.0/24
134.247.2.0/24
One of the provided CIDR addresses raised the following errors: 159.8.57 is invalid (IPv4 requires (4) octets).

然而,我所期待的是:

 149.62.168.0/24
 134.247.2.0/24
 159.226.92.0/24
 One of the provided CIDR addresses raised the following errors: 159.8.57 is invalid (IPv4 requires (4) octets).

我不明白为什么子网 159.226.92.0/24 没有出现在输出中。

【问题讨论】:

  • 从技术上讲,应该是subnets = [ ["149..."], [ ... ], ... ],其中有周围的外部方括号。您在那里拥有的东西有效,但它具有误导性。您实际上是在创建一个数组数组。 flatten 可以帮助遍历所有单个元素。

标签: arrays ruby merge ip


【解决方案1】:

您的代码有多个错误。

  • subnets 数组的初始化不一致。最后一个值在同一个子数组中有两个子网:["159.226.92.0/24","159.8.57/22"] 是导致您看到的错误的数组,因此它会丢弃两个值,这就是为什么您在最终结果中看不到 159.226.92.0/24。李>
  • 您正在迭代 subnet,这是一个错字,我相信您的意思是 subnets
  • 每次迭代都会覆盖merged_subnets

我修复了代码:

subnets = ["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24"], ["159.8.57/22"]

require 'netaddr'

merged_subnets = []

subnets.each do |net|
  begin
    merged_subnets << NetAddr.merge(net)
  rescue ArgumentError => error
    puts error
  end
end

merged_subnets 现在是[["149.62.168.0/24"], ["134.247.2.0/24"], ["159.226.92.0/24"]]

【讨论】:

  • 谢谢@DiegoSalazar,是的subnet 是一个错字。我从 YAML 文件中获取子网,一些 YAML 有多个子网,这就是为什么最后一个数组有两个子网,而不是像其他两个一样的一个。但我会尝试将它们分开,以达到所需的输出!谢谢!
【解决方案2】:

159.226.92.0/24 没有出现在输出中,因为您调用了NetAddr#merge

NetAddr#merge 获取您的数组(在本例中为["159.226.92.0/24","159.8.57/22"]),解析数组中的每个地址,然后合并解析的地址。在伪 Ruby 中,应该是这样的:

def merge(ary)
    parsed = []
    for addr in ary do
        parsed << parse(addr)
    end

    merge_parsed(parsed)
end

如您所见,如果对parse(addr) 的调用失败,则整个方法将失败并引发错误,不返回任何结果。由于159.226.92.0/24 位于地址无效159.8.57/22 的子网数组中,因此对整个数组的merge 调用失败,您不会得到任何结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2018-12-16
    • 2012-05-27
    • 2014-05-08
    • 2017-12-05
    • 2014-02-23
    • 2014-06-01
    相关资源
    最近更新 更多