Ruby枚举有意外的第二个过程
这让我发疯了。我正在尝试使用.do | one | of |…end循环浏览电子邮件,但插入一条无害语句会破坏枚举 这里是一个几乎独立的片段。与require net/imap一样,身份验证信息设置在前面Ruby枚举有意外的第二个过程,ruby,imap,enumeration,Ruby,Imap,Enumeration,这让我发疯了。我正在尝试使用.do | one | of |…end循环浏览电子邮件,但插入一条无害语句会破坏枚举 这里是一个几乎独立的片段。与require net/imap一样,身份验证信息设置在前面 imap = Net::IMAP.new(IMAP_server) imap.authenticate('LOGIN', IMAP_login, IMAP_pass) imap.select(IMAP_folder) [1,2,3,5].each do |mnum| #message_ids
imap = Net::IMAP.new(IMAP_server)
imap.authenticate('LOGIN', IMAP_login, IMAP_pass)
imap.select(IMAP_folder)
[1,2,3,5].each do |mnum|
#message_ids = imap.search(['SUBJECT', 'NETGEAR R7000 Log']).each do |mnum|
puts(mnum)
msg = imap.fetch(mnum, 'BODY[TEXT]')
msg[0].values[1]['BODY[TEXT]'].each_line do |full_entry|
line = String.new(full_entry)
recType = line[/^\[.*\] /]
# recType = recType.tr('[]','')
puts recType
end
puts
puts
end
当我循环遍历消息ID号时,它工作正常,但我用文字数组替换了该语句,以消除潜在的问题源
用注释掉的.tr语句运行它会产生预期的结果,如:
1
[DHCP IP: (192.168.1.9)]
[DoS attack: FIN Scan]
[DHCP IP: (192.168.1.8)]
[Admin login]
[Admin login failure]
[Admin login]
[DHCP IP: (192.168.1.7)]
[DHCP IP: (192.168.1.5)]
[Time synchronized with NTP server]
[Internet connected]
2
[LAN access from remote]
[LAN access from remote]
[LAN access from remote]
[UPnP set event: Public_UPNP_C3]
[UPnP set event: Public_UPNP_C3]
[UPnP set event: Public_UPNP_C3]
…
现在,取消对.tr行的注释,以删除括号,它将贯穿第一次迭代,但是:
1
DHCP IP: (192.168.1.9)
DoS attack: FIN Scan
DHCP IP: (192.168.1.8)
Admin login
Admin login failure
Admin login
DHCP IP: (192.168.1.7)
DHCP IP: (192.168.1.5)
Time synchronized with NTP server
Internet connected
Traceback (most recent call last):
4: from /Users/jan/bin/MassageNetgear.rb:39:in `<main>'
3: from /Users/jan/bin/MassageNetgear.rb:39:in `each'
2: from /Users/jan/bin/MassageNetgear.rb:43:in `block in <main>'
1: from /Users/jan/bin/MassageNetgear.rb:43:in `each_line'
/Users/jan/bin/MassageNetgear.rb:45:in `block (2 levels) in <main>': undefined method `tr' for nil:NilClass (NoMethodError)
所以,不知何故,把这一条语句放进去会导致mnum的第二次迭代失败。它甚至没有为第二次迭代打印2。回溯中的第45行是新插入的语句,但它甚至没有那么远!在内部循环中添加另一个puts作为第一条语句没有任何作用
我以前做过这样的工作,将一堆包含路由器日志消息的电子邮件连接起来,但后来我修改了代码,不知怎的,我把它弄坏了!我剪切并重新键入了问题陈述,认为其中可能存在不可见的内容,但我使用的是BBEdit,它显示了这些内容
请指出我在做什么蠢事
谢谢 nil打印为空字符串,因此可能实际上有最后一行与regexp不匹配,并且打印为空字符串。在这种情况下,tr将失败,因为nil实际上没有tr方法
您可以使用条件赋值,如果recType为falsy,则不会执行右侧赋值
recType = line[/^\[.*\] /]
recType &&= recType.tr('[]','')
puts recType
或者,如果您想实际将其视为一个空字符串,只需无条件地对其调用
nil以空字符串形式打印,因此可能实际上有最后一行与regexp不匹配,并以空字符串形式打印。在这种情况下,tr将失败,因为nil实际上没有tr方法
您可以使用条件赋值,如果recType为falsy,则不会执行右侧赋值
recType = line[/^\[.*\] /]
recType &&= recType.tr('[]','')
puts recType
或者,如果您想实际将其视为一个空字符串,只需无条件地对其调用
谢谢这就解决了问题。奇怪的是,前面的PUT没有打印…可能是因为它被缓冲了,而堆栈跟踪只是在没有缓冲的情况下被泵出。它们确实转到不同的流PUT到stdout,堆栈跟踪到stderr,所以打印它们时可能存在争用条件。Doh!我应该知道。。。多年来一直在攻击C,但Ruby已经有好几天了……我一拿到15分就给你投票!很高兴我能帮上忙!快乐的黑客!Ruby是一门很棒的语言谢谢这就解决了问题。奇怪的是,前面的PUT没有打印…可能是因为它被缓冲了,而堆栈跟踪只是在没有缓冲的情况下被泵出。它们确实转到不同的流PUT到stdout,堆栈跟踪到stderr,所以打印它们时可能存在争用条件。Doh!我应该知道。。。多年来一直在攻击C,但Ruby已经有好几天了……我一拿到15分就给你投票!很高兴我能帮上忙!快乐的黑客!Ruby是一门很棒的语言如果您只需要括号之间的零件,请使用捕获组,例如线[/^\[.\]/,1]如果您只需要括号之间的零件,请使用捕获组,例如线[/^\[.\]/,1]