L'include in un array come funziona?


#1

Mi spiego.
Nel codice ho m=riga1.scan(/<(.?@.?)>|(?)/).
In pratica in una riga di questo tipo
Passed, removed_email_address@domain.invalid -> removed_email_address@domain.invalid, Message-ID:
removed_email_address@domain.invalid, Hits: -
Mi trova tutte le occorrenze corrispondenti agli indirizzi mail.
Successivamente faccio un

   @hash.keys.each do |mail|
     if m.include? "#{mail}"
       puts "#{mail} spedito"
     elsif
       puts "Boh!!!!"
     end
   end

L’hash contiente valori del tipo "removed_email_address@domain.invalid->“nome cognome”

sono sicuro che almeno uno dei valori contenuti in mail nell’hash e’
contenuto anche in m.
Perche’ il risultato e’ sempre “Boh” cioe’ nell’array m non risulta
incluso almeno quel valore che io sono sicuro esserci?


#2

Mauro S. wrote:

    if m.include? "#{mail}"

perché? #{mail}? m.include?(mail) dovrebbe risolvere il problema.

Ciao


#3

Domenico Delle S. wrote:

Mauro S. wrote:

    if m.include? "#{mail}"

perché? #{mail}? m.include?(mail) dovrebbe risolvere il problema.

non cambia niente, ho provato anche a mettere un valore del tipo
if m.include? “removed_email_address@domain.invalid” che sono sicuro esserci ma non lo trova.
Perche’? Mi sta facendo dannare…


#4

Proviamo a pensare che l’include?, effettivamente, veda le stringhe come
diverse; perché? Potrebbe essere un problema di codifica, magari, io ho
fatto tutto dentro irb, infatti, tu prendi i tuoi dati da un file di
log, a quanto mi sembra di capire. Se fosse questo il caso, si potrebbe
utilizzare iconv per risolvere la questione.

Esempio?
Scusa ma sono alle prima armi con ruby.


#5

Mauro S. wrote:

non cambia niente, ho provato anche a mettere un valore del tipo
if m.include? “removed_email_address@domain.invalid” che sono sicuro esserci ma non lo trova.
Perche’? Mi sta facendo dannare…

Ho fatto una prova con irb, usando dei valori simili ai tuoi e non
cambia anche per me, la soluzione che ti ho proposto e solo più
veloce/sintatticamente più corretta, dato che passi comunque una stringa
ad include?.

L’unica differenza rispetto al tuo codice è che io ho usato
Hash.each_key, al posto del tuo Hash.keys.each, ma non mi sembra una
differenza sostanziale e, comunque sia, anche provando con
Hash.keys.each mi funziona ugualmente.

Proviamo a pensare che l’include?, effettivamente, veda le stringhe come
diverse; perché? Potrebbe essere un problema di codifica, magari, io ho
fatto tutto dentro irb, infatti, tu prendi i tuoi dati da un file di
log, a quanto mi sembra di capire. Se fosse questo il caso, si potrebbe
utilizzare iconv per risolvere la questione.

Ciao


#6

On 4/7/07, Mauro S. removed_email_address@domain.invalid wrote:

       puts "#{mail} spedito"
     elsif
       puts "Boh!!!!"
     end
   end

Di che tipo è l’oggetto cercato dentro a m? Se non è una stringa, la
include? fallisce perché tu la stai confrontando con una stringa (
“#{mail}” equivale a mail.to_s)

M


#7

Domenico Delle S. wrote:

Mauro S. wrote:

non cambia niente, ho provato anche a mettere un valore del tipo
if m.include? “removed_email_address@domain.invalid” che sono sicuro esserci ma non lo trova.
Perche’? Mi sta facendo dannare…

Ho fatto una prova con irb, usando dei valori simili ai tuoi e non
cambia anche per me, la soluzione che ti ho proposto e solo più
veloce/sintatticamente più corretta, dato che passi comunque una stringa
ad include?.

Ho risolto con l’aiuto di qualcuno in un newgroup ma a causa della mia
scarsa conoscenza di ruby mi sono limitato ad applicare i suggerimenti
senza capire molto.
Riposto le poche righe di codice:

class MyNewClass
@hash = {}
@arr = []
@a = []
IO.foreach(“ComuneCA.txt”) do |riga|
codice,cognome,nome,servizio,mail = riga.chomp.split(/\t/)
@hash.store("#{mail}","#{cognome} #{nome}")
end
IO.foreach(“mail.log”) do |riga1|
if riga1.match(/Passed/)
@a=riga1.scan(/<(.?@.?)>|(?)/)
@hash.each_key do |mail|
if @a.include?(mail)
puts “#{mail} trovato”
elsif
puts “non trovato!!!”
end
end
puts @a.first.class
end
end
end

mi e’ stato sugerito di controllare il risultato di puts @a.first.class
ed effettivamente ritorna un array, infatti @a e’ un array.
Dovrebbe essere regolare?
Ma cosa fanno quei metodi first.class?
Successivamente ho modificato, sempre dietro suggerimento, la
@a=riga1.scan(/<(.?@.?)>|(?)/) in
@a=riga1.scan(/<(.?@.?)>|(?)/).flatten.compact, dopo questa
modifica magicamente tutto funziona.
Qualcuno potrebbe spiegarmi?
Grazie mille.