如何使用IP地址模式填充数组

时间:2017-03-13 19:37:46

标签: arrays ruby

我不是程序员,而是发现自己编写了一些简单的Ruby。我需要用一个IP地址列表填充一个数组,10.13.203.3,10.13.204.3等。

我知道我可以将范围扩展为这样的数组,但是如何将其转换为我的IP地址模式呢?

a =* (3..10)
#=> [3, 4, 5, 6, 7, 8, 9, 10]

我以为我需要进行字符串插值,并以某种方式将其反馈到不同的数组中。但我真的不确定并且不能正确使用谷歌搜索,因为这感觉像是一件普通的事情。

3 个答案:

答案 0 :(得分:5)

您可以使用IPAddr类,特别是方法IPAddr::new

我编写了一个方法来获取三个参数,即第一个IP,下一个IP和要生成的IP总数,同时保持第一个和第二个IP之间的差异。

require 'ipaddr'

def gen_ips(ip_start, ip_next, number)     
  ips, ipn = [ip_start, ip_next].map { |ip| IPAddr.new(ip) }
  (ips..IPAddr.new("255.255.255.255")).
    step(ipn.to_i-ips.to_i).
    lazy.
    map { |ip| ip.to_s }.first(number)
end

gen_ips("10.13.203.3", "10.13.204.3", 6)
  # => ["10.13.203.3", "10.13.204.3", "10.13.205.3", "10.13.206.3",
  #     "10.13.207.3", "10.13.208.3"] 
gen_ips("10.13.254.250", "10.13.254.252", 6)
  #=> ["10.13.254.250", "10.13.254.252", "10.13.254.254", "10.13.255.0",
  #    "10.13.255.2", "10.13.255.4"]

第二个示例显示当下一个IP在前一组中滚动一个数字时会发生什么。

我使用Enumerable#lazy将枚举数转换为惰性,因此只要计算了first(number)映射的元素,就会调用number(而不是等到枚举器生成了范围IPAddr('255.255.255.255'))中的最后一个。

答案 1 :(得分:3)

(203..210).inject([]) { |ar, i| ar << "10.13.#{i}.3" }
# [
#   "10.13.203.3",
#   "10.13.204.3",
#   "10.13.205.3",
#   "10.13.206.3",
#   "10.13.207.3",
#   "10.13.208.3",
#   "10.13.209.3"
#   "10.13.210.3"
# ]

参考文献:

答案 2 :(得分:3)

您正在寻找map

范围为struct,因此您可以在其上调用enumerables。而且它也更简单易懂:

map

会给你:

(203..210).map { |i| "10.13.#{i}.3" }