Forum: Italian Ruby user group Gsub

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.
Stefano D. (Guest)
on 2009-04-11 17:39
Ciao avrei un problema con l'istruzione gsub,che non riesco a
risolvere.Ho un testo da cui devo sostituire alcune parole con altre,e
uso agevolmente la funzione gsub.Tuttavia ho un problema con una
sostituizione...io ho una frase fatta in questo modo:

write (qualcuno.nome,' ',qualcuno.cognome,' ha ',qualcuno.eta);

dove devo sostituire qualcuno con persona.Adesso voi direte che posso
fare facilmente .gsub(/qualcuno/,'persona') pero noo posso fare cosi
perche non esegue correttamente la sostituzione.Allora ho creato in
questo modo la conversione:

puts"puts #{camb.gsub(/(\w+)\.(\w+)/x,'\1.fetch("\2")')}"

dove camb="...frase...",ma facendo in questo modo mi esce:

puts qualcuno.fetch("nome"),' ',qualcuno.fetch("cognome"),' ha
',qualcuno.fetch("eta")

io vorrei che invece di qualcuno.fetch("nome") ci fosse
persona.fetch("nome"). Ma non posso mettere facilmente al posto di 1 -->
persona perche persona potrebbe cambiare e diventare uomo(questo lo
sceglie l'utente),inoltre questa variabile che digita l'utente è
memorizzato in una variabile globale chiamata $record.Io avevo pensato
che si potesse fare in questo modo:

puts"puts #{camb.gsub(/(\w+)\.(\w+)/x,'\#{$record}.fetch("\2")')}"

ma non funziona.Come posso risolvere questo problema???
Spero di essere stato abbastanza chiaro. :(
Fabrizio R. (Guest)
on 2009-04-11 18:26
(Received via mailing list)
Ciao,
ho letto e riletto ma non ho capito. Prova a postare del codice
d'esempio che sia eseguibile.

Il giorno 11/apr/09, alle ore 15:39, Stefano De nigris ha scritto:
Stefano D. (Guest)
on 2009-04-11 18:47
:D eccoti l'esempio.Io ho un file txt in cui è scritto:

type
persona=record
eta: byte;
nome: string[50];
cognome: string[50]:
professione: string[55];
end;

write (qualcuno.nome,' ',qualcuno.cognome,' ha ',qualcuno.eta);

il mio codice che ho creato è questo:

arr=IO.readlines("file.txt")
rgx = /(.*): (.*);/
hash = Hash.new
arr.each do |line|
  if m=rgx.match(line)
   hash[m[1]]= m[2]  #un hash {nome=>tipo}
   puts hash.inspect
end
end
if arr!=nil
  lines=arr
end
for line in lines
  puts line.gsub(/(\w+)\.(\w+)/x,'\1.fetch("\2")')
end

questo codice non fa altro che convertire il codice scritto in delphi in
codice ruby.Adesso il problema qual'è??E' che quanto faccio:
puts line.gsub(/(\w+)\.(\w+)/x,'\1.fetch("\2")')
mi esce:
write qualcuno.fetch("nome"),' ',qualcuno.fetch("cognome"),' ha
',qualcuno.fetch("eta")

io invece voglio:

puts persona.fetch("nome"),' ',persona.fetch("cognome"),' ha
',persona.fetch("eta")

dove persona è una parola digitata dall'utente che è memorizzata in una
variabile globale ($record).Avevo pensato di fare cosi:

puts line.gsub(/(\w+)\.(\w+)/x,'\#{$record}.fetch("\2")')

ma non va.Come posso fare???
Pierpaolo S. (Guest)
on 2009-04-11 19:06
(Received via mailing list)
Ciao,
spero di aver capito quello che volevi.prova
così:
puts line.gsub(/(\w+)\.(\w+)/x,"#$record.fetch(\"\\2\")")

se crea una stringa con il singolo apice non puoi usare la sostituzione
di
espressioni con #{espr}, per farlo devi creare la stringa con i doppi
apici
o con %Q


Il giorno 11 aprile 2009 16.47, Stefano De nigris
<removed_email_address@domain.invalid>ha scritto:
Paolo M. (Guest)
on 2009-04-12 21:10
Una soluzione è

puts line.gsub(/(\w+)\.(\w+)/x, $record + '.fetch("\2")')

E' un po' meno bella della proposta originale, per via del +, ma
funziona.

L'output è

write (persona.fetch("nome"),' ',persona.fetch("cognome"),' ha
',persona.fetch("eta"));

Resta da sostituire write con puts, togliere il ; finale e concatenare
gli argomenti della write nel modo appropriato per la puts, ma questa è
un'altra storia.

Paolo

Stefano De nigris wrote:
> :D eccoti l'esempio.Io ho un file txt in cui è scritto:
>
> type
> persona=record
> eta: byte;
> nome: string[50];
> cognome: string[50]:
> professione: string[55];
> end;
>
> write (qualcuno.nome,' ',qualcuno.cognome,' ha ',qualcuno.eta);
>
> il mio codice che ho creato è questo:
>
> arr=IO.readlines("file.txt")
> rgx = /(.*): (.*);/
> hash = Hash.new
> arr.each do |line|
>   if m=rgx.match(line)
>    hash[m[1]]= m[2]  #un hash {nome=>tipo}
>    puts hash.inspect
> end
> end
> if arr!=nil
>   lines=arr
> end
> for line in lines
>   puts line.gsub(/(\w+)\.(\w+)/x,'\1.fetch("\2")')
> end
>
> questo codice non fa altro che convertire il codice scritto in delphi in
> codice ruby.Adesso il problema qual'è??E' che quanto faccio:
> puts line.gsub(/(\w+)\.(\w+)/x,'\1.fetch("\2")')
> mi esce:
> write qualcuno.fetch("nome"),' ',qualcuno.fetch("cognome"),' ha
> ',qualcuno.fetch("eta")
>
> io invece voglio:
>
> puts persona.fetch("nome"),' ',persona.fetch("cognome"),' ha
> ',persona.fetch("eta")
>
> dove persona è una parola digitata dall'utente che è memorizzata in una
> variabile globale ($record).Avevo pensato di fare cosi:
>
> puts line.gsub(/(\w+)\.(\w+)/x,'\#{$record}.fetch("\2")')
>
> ma non va.Come posso fare???
Stefano D. (Guest)
on 2009-04-14 13:04
Grazie ragazzi funziona perferttamente!!! ;)


> Resta da sostituire write con puts, togliere il ; finale e concatenare
> gli argomenti della write nel modo appropriato per la puts, ma questa è
> un'altra storia.
Questo è già fatto :D :D.Grazie comunque.

Ciao a tutti!!!!
This topic is locked and can not be replied to.