Ruby枚举有意外的第二个过程

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

这让我发疯了。我正在尝试使用.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.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]