新手问题 为何提示该方法未定义

ynopeeb · 2015年10月09日 · 最后由 lb563 回复于 2015年10月11日 · 2454 次阅读

我想实现一个简单的小程序,读取文件中的域名,打印出来第一条解析记录 (CNAME 或者 A 记录)。 例如,有一个 test.txt 文件,里面有如下域名 baidu.com google.com

希望输出 => baidu.com. 30 IN A 220.181.57.217 => google.com. 199 IN A 64.233.189.101

我的代码如下:

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

require 'net/dns'
filename = ARGV[0]
file = File.open(filename)

file.each_line do |line|
    dig_dns("#{line}")[0]
end
   file.close

def dig_dns(url)
    packet = Net::DNS::Resolver.start(url)
    packet.answer
end

执行之后,总是提示方法未定义,求解~

chongfu.rb:11:in `block in <main>': undefined method `dig_dns' for main:Object (NoMethodError)
    from chongfu.rb:10:in `each_line'
    from chongfu.rb:10:in `<main>'

把 dig_dns 方法定义放上最前面才行。Ruby 是解释型语言,不像 C 有预编译过程。

#1 楼 @lyfi2003 感谢回复,把方法放到前面之后,确实没有上面的报错了,但是程序还是没通。

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

require 'net/dns'

def dig_dns(url)
    packet = Net::DNS::Resolver.start("#{url}")
    packet.answer
end

filename = ARGV[0]
file = File.open(filename)

file.each_line do |line|
    p dig_dns("#{line}")[0]
end

file.close

修改之后,执行提示「参数错误」,没看出来错在哪里,能否指点一下?

/Library/Ruby/Gems/2.0.0/gems/net-dns-0.8.0/lib/net/dns/resolver.rb:1227:in `valid?': Invalid domain name i.yousjz.com (ArgumentError)
        from /Library/Ruby/Gems/2.0.0/gems/net-dns-0.8.0/lib/net/dns/resolver.rb:1132:in `make_query_packet'
        from /Library/Ruby/Gems/2.0.0/gems/net-dns-0.8.0/lib/net/dns/resolver.rb:968:in `query'
        from /Library/Ruby/Gems/2.0.0/gems/net-dns-0.8.0/lib/net/dns/resolver.rb:871:in `search'
        from /Library/Ruby/Gems/2.0.0/gems/net-dns-0.8.0/lib/net/dns/resolver.rb:134:in `start'
        from chongfu.rb:10:in `dig_dns'
        from chongfu.rb:20:in `block in <main>'
        from chongfu.rb:19:in `each_line'
        from chongfu.rb:19:in `<main>'

解决了,虽然丑陋,但是至少能运行了:)

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

require 'net/dns'

def dig_dns(url)
    packet = Net::DNS::Resolver.start("#{url}")
    packet.answer
end

filename = ARGV[0]
file = File.open(filename)

file.each_line do |line|
    p dig_dns(line.split("\n")[0])[0]
end
   file.close

嗯,刚才我也试了一下,应该是参数里有回车之类不能解析。我是用了 line.strip。如果是 windows 还会有\r需要去掉

#4 楼 @africwildman 确实是的,有回车,我是先转成数据,把域名单独提取出来。

#5 楼 @blacktulip 非常感谢,这个方法简洁多了。

@ynopeeb 为什么不把这些数据做成 json 文件呢?这样解析就方便多了

#8 楼 @lb563 你是说把原始数据转换成 json,然后处理么?

#9 楼 @ynopeeb 是这么回事的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号