Forum: Italian Ruby user group l'include in un array come funziona?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mauro S. (Guest)
on 2007-04-07 17:28
(Received via mailing list)
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?
Domenico Delle S. (Guest)
on 2007-04-07 18:02
(Received via mailing list)
Mauro S. wrote:

>         if m.include? "#{mail}"

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


Ciao
Mauro S. (Guest)
on 2007-04-07 18:05
(Received via mailing list)
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........
Domenico Delle S. (Guest)
on 2007-04-07 18:28
(Received via mailing list)
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
Mauro S. (Guest)
on 2007-04-07 18:42
(Received via mailing list)
> 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.
Mauro S. (Guest)
on 2007-04-09 00:33
(Received via mailing list)
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.
Matteo V. (Guest)
on 2007-04-15 18:53
(Received via mailing list)
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
This topic is locked and can not be replied to.