# Gsub

**URL:** <https://www.ruby-forum.com/t/gsub/165289>\
**Category:** IT\
**Created:** [April 11, 2009, 3:39pm UTC](https://www.ruby-forum.com/t/gsub/165289 "2009-04-11T15:39:47Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 11, 2009, 3:39pm UTC](https://www.ruby-forum.com/t/gsub/165289/1 "2009-04-11T15:39:47Z")

</div>

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](http://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. ☹

---

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 11, 2009, 4:26pm UTC](https://www.ruby-forum.com/t/gsub/165289/2 "2009-04-11T16:26:53Z")

</div>

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:

---

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 11, 2009, 4:47pm UTC](https://www.ruby-forum.com/t/gsub/165289/3 "2009-04-11T16:47:11Z")

</div>

😃 eccoti l’[esempio.Io](http://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???

---

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 12, 2009, 7:10pm UTC](https://www.ruby-forum.com/t/gsub/165289/4 "2009-04-12T19:10:23Z")

</div>

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:

> 😃 eccoti l’[esempio.Io](http://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???

---

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 14, 2009, 11:04am UTC](https://www.ruby-forum.com/t/gsub/165289/5 "2009-04-14T11:04:58Z")

</div>

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.Grazie comunque.

Ciao a tutti!!!

---

<div class="post-metadata">

**Author:** ![stewie](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@stewie](https://www.ruby-forum.com/u/stewie)\
**Post date:** [April 11, 2009, 5:06pm UTC](https://www.ruby-forum.com/t/gsub/165289/6 "2009-04-11T17:06:40Z")

</div>

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](mailto:removed_email_address@domain.invalid)ha scritto:
