Your problem is that there is way too much nesting within your
methods.  You lost track of which "end" maps to which "do" and "begin"
in numerous places.  As a general rule, if you're nesting more than
two levels deep within a method, you just made your method a lot more
difficult to maintain.  The below version fixes your nesting issues
(but does not correct them for maintainability).

require 'socket'
require 'timeout'

  class Scanner

     def initialize
        @hosts,@ports = Array($*)
     end

     def portarrange
        case @ports
          when /^.+[..]/
             @ports = @ports.split("..")
             @ports = @ports[0].to_i..@ports[1].to_i
          when /^.+[,]/
             @ports = @ports.split(",")
          else
             @ports = Array(@ports)
          end
     end

     def hostarrange
        case @hosts
          when /^.+[,]/
             @hosts = @hosts.split(",")
          else
             @hosts = Array(@hosts)
          end
     end

    def output(state,port)
       printed = false
       portsfile = File.new("ports", "r")
       scanpat = "^.+ #{port}/tcp"
       begin
         portsfile.each_line do |line|
           if line =~ Regexp.new(scanpat)
             puts "#{state}    : #{line}"
             printed = true
           end
           puts "#{state}    : #{port}" if printed == false
         end
       ensure
       portsfile.close
       end
    end

    def scanning(hosts,ports)
      hosts.each do |host|
        begin
          puts "scanning #{host}:"
          ports.each do |port|
            begin
              Timeout::timeout(10){TCPSocket.new(host, port)}
            rescue Timeout::Error
              output("filtered",port)
            rescue
              output("closed",port)
            else
              output("open",port)
            end
          end
        end
      end
    end
end

#####################  code  start  #####################

puts "no arguments past,correct usage:\nruby #{$0} [hosts] [ports]\n"
if
!ARGV[1]

my_scanner = Scanner.new

hosts = my_scanner.hostarrange
ports = my_scanner.portarrange
=begin
puts "debugging: "
puts hosts
puts ports
# everything alright until here
=end
my_scanner.scanning(hosts,ports)

#####################      eof      #####################