यह मुझे पागल बना रहा है। मैं ".each do | one_of|…end" का उपयोग करके ईमेल संदेशों के माध्यम से लूप करने का प्रयास कर रहा हूं, लेकिन एक सहज कथन डालने से गणना टूट जाती है।

यहाँ एक लगभग-स्टैंड-अलोन स्निपेट है। प्रमाणीकरण जानकारी तुरंत पहले सेट की गई है, जैसा कि "नेट/इमैप की आवश्यकता है"

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

यह काम कर रहा था (और नहीं) जब मैं संदेश आईडी नंबरों के माध्यम से लूपिंग कर रहा था, लेकिन मैंने संभावित समस्या स्रोत को खत्म करने के लिए उस कथन को एक शाब्दिक सरणी के साथ बदल दिया।

इसे ".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" भी प्रिंट नहीं करता है। ट्रेसबैक में लाइन ४५ नया डाला गया स्टेटमेंट है, लेकिन यह इतना दूर भी नहीं जाता है! आंतरिक लूप में पहले कथन के रूप में एक और puts जोड़ने से कुछ नहीं होता है।

मैंने राउटर लॉग संदेशों वाले ईमेल के एक समूह को जोड़ने से पहले ऐसा किया है, लेकिन फिर मैंने उस कोड को संशोधित किया, और मैंने इसे किसी तरह तोड़ दिया! मैंने समस्या कथन को काट दिया है और फिर से टाइप किया है, यह सोचकर कि वहां अदृश्य हो सकता है, लेकिन मैं बीबीईडिट का उपयोग कर रहा हूं, जो ऐसी चीजें दिखाता है।

कृपया, इंगित करें कि मैं कहाँ कुछ बेवकूफी कर रहा हूँ!

धन्यवाद!

1
Jan Steinman 13 नवम्बर 2020, 05:22

1 उत्तर

सबसे बढ़िया उत्तर

nil एक खाली स्ट्रिंग के रूप में प्रिंट करता है, इसलिए यह संभव है कि वास्तव में एक अंतिम पंक्ति है जो regexp से मेल नहीं खाती है और जो एक खाली स्ट्रिंग के रूप में प्रिंट हो रही है। उस स्थिति में, tr विफल हो जाएगा क्योंकि nil के पास वास्तव में tr विधि नहीं है।

आप एक सशर्त असाइनमेंट का उपयोग कर सकते हैं, जो recType गलत होने पर दाईं ओर निष्पादित नहीं होगा।

recType = line[/^\[.*\] /]
recType &&= recType.tr('[]','')
puts recType

या (यदि आप वास्तव में इसे एक खाली स्ट्रिंग के रूप में मानना ​​​​चाहते हैं), तो आप बिना शर्त to_s पर कॉल कर सकते हैं।

recType = line[/^\[.*\] /].to_s
recType = recType.tr('[]','')
puts recType
4
Silvio Mayolo 13 नवम्बर 2020, 06:04