Gsub


#1

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. :frowning:


#2

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:


#3

:smiley: 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???


#4

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:

:smiley: 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???


#5

Grazie ragazzi funziona perferttamente!!! :wink:

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 :smiley: :D.Grazie comunque.

Ciao a tutti!!!


#6

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.invalidha scritto: