Ruby gsub повторяется по ip-адресу

#ruby

#ruby

Вопрос:

Предполагается, что моя программа отслеживает каждый ip-адрес и сопоставляет их со случайным, затем переходит к gsub всех IP-адресов с рандомами. Однако мой gsub работает с местами, в которых нет IP-адреса (он добавляется к задней части URL-адреса с набором цифр, где он добавляет ip-адрес перед цифрами), или когда он заменяет ip-адрес, он заменяет его несколько раз.

v — случайная строка, подобная "https://10.110.0.100/html/1202234"

Что, когда это выполняется, превращается в

 https://227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95227.95.94.95/html/227.95.94.952227.95.94.952234
  
 ipsRand = Hash[]
ips = v.scan(/(bd{1,3}.d{1,3}.d{1,3}.d{1,3}b)/)
ips.each { |x|
if ips.length > 0
    ips.each { |x|
        if !ipsRand.key?(x)
            ip = "%d.%d.%d.%d" % [rand(256), rand(256), rand(256), rand(256)]
            ipsRand["#{x}"] = ip
            v.gsub!(/#{x}/, ip) 
        else
            v.gsub!(/#{x}/, ipsRand["#{x}"])
        end 
    }
end
  

Не совсем уверен, что здесь делать, когда я меняю /#{x} местами регулярное выражение, используемое для сканирования ip-адреса, gsub работает просто отлично, но тогда я не могу сопоставить каждый ip-адрес с правильным случайным.

Ответ №1:

Это намного проще, если вы используете хэш со значением по умолчанию:

 ips_rand = Hash.new do |h, k|
  h[k] = '%d.%d.%d.%d' % [rand(256), rand(256), rand(256), rand(256)]
end
  

Этот хэш будет создавать новый случайный IP-адрес при каждом его вызове (с неизвестным IP-адресом) и повторно использовать его впоследствии (при вызове с известным IP-адресом).

Кроме того, он может быть передан напрямую gsub :

 PATTERN = /bd{1,3}.d{1,3}.d{1,3}.d{1,3}b/

a = 'https://10.110.0.100/foo/bar'
b = 'https://10.110.0.100/baz/qux'
c = 'https://20.220.0.200/quux'

a.gsub(PATTERN, ips_rand) #=> "https://213.19.202.167/foo/bar"
b.gsub(PATTERN, ips_rand) #=> "https://213.19.202.167/baz/qux"
c.gsub(PATTERN, ips_rand) #=> "https://26.21.120.130/quux"
  
 ips_rand
#=> {"10.110.0.100"=>"213.19.202.167", "20.220.0.200"=>"26.21.120.130"}