Uso dei blocchi

Ciao ragazzi io ho un problema con un blocco,cioè non riesco a far
stampare il contenuto di un hash che viene creato con un blocco.Ora vi
spiego il tutto…
io ho questo testo:
type
persona=record
età : byte;
nome: string[50];
cognome: string[50]:
professione: stringz[55];
end;

e ho creato questo programma:

arr=IO.readlines(“record.txt”) #dove record.txt è il file che
contiene il
valore=0 #testo
for i in 0 … arr.size-1
primariga=arr[valore].split(/\s/)
valore=valore+1

elements = primariga
puts elements.class
rgx = / (.):(.);/ # spazio, nome, “:” valore, “;”
hash = {}
elements.each do |line|
if m=rgx.match(line)
hash[m[1]]= m[2] #un hash {nome=>tipo}
end
end
puts hash
end

In pratica il programma prende ogni frase del testo e vi ci lavora
sopra,cioè esegue il blocco.Il mio scopo è quello che venga memorizzato
in un hash il contenuto di:età : byte;
nome: string[50];
cognome: string[50]:
professione: stringz[55];
dove nome è il primo elemento dell’array e il tipo di variabile è il
secondo elemnto.
Il mio problema è che se eseguo il tutto non mi viene visualizzato
nulla,come se il blocco non trovasse nulla da memorizzare.Dove
sbaglio???

Stefano De nigris wrote:

rgx = / (.):(.);/ # spazio, nome, “:” valore, “;”
hash = {}
elements.each do |line|
if m=rgx.match(line)
hash[m[1]]= m[2] #un hash {nome=>tipo}
end
end
puts hash
end

Non uso mai le regular expression, però rgx.match(line) non mi sembra
restituisca un array… prova a mettere una puts m.inspect subito dopo
la if e vedi se m è un array o una stringa

ok, direi che hai fatto un pò troppi split :slight_smile:

prova così(ho cambiato qualche metodo per farlo + pulito)

file = File.new(“record.txt”, “r”)
rgx = / (.):(.);/ # spazio, nome, “:” valore, “;”
hash = Hash.new

while (line = file.gets)
if m=rgx.match(line)
hash[m[1]]= m[2] #un hash {nome=>tipo}
end
end
puts hash.inspect

Ale grazie il programma funzione,l’unica cosa è che io ho creato tutto
il mio programma sull’istruzione:

arr=IO.readlines(“prova.txt”)

c’è un sistema alternativo delle istruzione che mi hai consigliato in
modo da adattarsi a questo???
Mi potresti spiegare di preciso il comando gets.
Ciao

Ciao ale,ecco cosa mi esce:
5024
Array

Array

Array

Array

Array

Array

Array

quindi sono tutti array.Ma quello che io mi domando è…di preciso a
cosa serve line???Perche l’if fa il confronto tra rgx e line,ma io a
line non gli ho assegnato niente(che confronto farebbe??). :smiley:

Stefano De nigris wrote:

Ale grazie il programma funzione,l’unica cosa è che io ho creato tutto
il mio programma sull’istruzione:

arr=IO.readlines(“prova.txt”)

c’è un sistema alternativo delle istruzione che mi hai consigliato in
modo da adattarsi a questo???
Mi potresti spiegare di preciso il comando gets.
Ciao

a grandi linee fanno la stessa cosa, ho usato il while perchè mi
sembrava + pulito, il tuo codice con IO.readlines è analogo:

arr=IO.readlines(“record.txt”)
rgx = / (.):(.);/ # spazio, nome, “:” valore, “;”
hash = Hash.new

arr.each do |line|
if m=rgx.match(line)
hash[m[1]]= m[2] #un hash {nome=>tipo}
end
end
puts hash.inspect

così dovrebbe andare ==

Ale grazie per l’aiuto…funziona.:wink:

Ciao a tutti!!!