Этот фрагмент кода должен пересекать массив IP-адресов и проверяет, открыт ли порт.Ruby Array Печатает как строку
class Ranger
def initialize(port,file)
@port = port
@file = file
@arr = []
end
def regex(f)
reg = IO.read(f)
reg.scan /(?:\d{1,3}\.){3}\d{1,3}/
end
def fileread
if File.exists?(@file)
@arr << regex(@file).to_s
begin
@arr.each do |ip|
sock = Socket.new(:INET, :STREAM)
sockaddr = Socket.sockaddr_in(@port, ip.to_i)
puts "Host: #{ip}:#{@port} Open" if sock.connect(sockaddr)
next
end
rescue Errno::ECONNREFUSED
false
end
end
end
конец
код, кажется, почти полностью работает, за исключением одной вещи. Он печатает текст успеха i.e «Host: # {ip}: # {@ port} Open». Проблема заключается в том, что он печатает весь массив, где # {ip}, например: ["xx.xx.xx.xx", "xx.xx.xx.xx", "xx.xx.xx.xx" ]: 22 Открыть.
Кажется, что-то связано с .to_s и .to_i в скрипте, но это не будет работать без них.
Какой выходной сигнал вы ожидаете? 'ip' - это массив, а' @ arr' - массив массивов. EDIT: На самом деле '@ arr' является массивом строковых представлений массивов. –
Вместо этого попробуйте' @arr.flatten.each do | ip | '. 'scan' всегда возвращает массив, поэтому' @ arr' представляет собой массив массивов. – BroiSatse