我不是程序员,而是发现自己编写了一些简单的Ruby。我需要用一个IP地址列表填充一个数组,10.13.203.3,10.13.204.3等。
我知道我可以将范围扩展为这样的数组,但是如何将其转换为我的IP地址模式呢?
a =* (3..10)
#=> [3, 4, 5, 6, 7, 8, 9, 10]
我以为我需要进行字符串插值,并以某种方式将其反馈到不同的数组中。但我真的不确定并且不能正确使用谷歌搜索,因为这感觉像是一件普通的事情。
答案 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)