2014-08-28 57 views
0

这段代码应该循环遍历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 

的代码看起来几乎完全工作,除了一两件事。它打印出成功文本,即“主机:#{ip}:#{@ port}打开”。问题在于它打印出#{ip}所在的整个数组,如下所示:[“xx.xx.xx.xx”,“xx.xx.xx.xx”,“xx.xx.xx.xx” ]:22打开。

这似乎与脚本中的.to_s和.to_i有关,但如果没有这些脚本,它将无法工作。

+0

您希望输出什么? 'ip'是一个数组,而'@arr'是一个阵列数组。编辑:其实,'@ arr'是数组的字符串表示的数组 – 2014-08-28 23:11:15

+0

尝试'@arr.flatten.each do | ip |'来代替。 'scan'总是返回一个数组,所以'@ arr'是一个数组数组。 – BroiSatse 2014-08-28 23:11:17

回答

0

从我所看到的你只添加一件事的@arr变量...

@arr << regex(@file).to_s 

正则表达式()调用string.scan()返回一个数组(大概是你的IP地址3

你那么数组转换为字符串,并追加到@arr的字符串。

无论你想

@arr = regex(@file) # replace 

@arr += regex(@file) # concatenate 
+0

这是完美的谢谢你。 + =运算符,以及删除.to_s和.to_i修复了这个问题。 – user3408678 2014-08-29 00:01:02