Ciao a tutti!
Mi sto pian piano avvicinando al mondo di Ruby, questo è il mio primo
programmino che provo a fare, quindi abbiate pietà >_<
Quello che vorrei fare è uno script che apre un file di testo e cerca una
stringa dentro al testo. Il mio problema e che non so come “passargli”
alla regular expression il mio pattern che tutte le volte cambia.
Questo è il codice che ho provato:
n = 0
q = 0
print “Stringa da cercare:\n”
a = gets.chomp!
puts “stringa->” + a + “\n”
File.open(‘prova.txt’, ‘r’) do |f1|
while line = f1.gets
puts n.to_s + " " + line
if line == /a.to_s/
puts “trovato alla riga:” + n.to_s + " " + line
q += 1
end
n += 1
end
if q == 0
puts “Nessun elemento trovato!”
end
f1.close
end
L’operatore splat (*) forza la conversione in Enumerator, ove possibile.
Dato che File include il modulo Enumerable, possiamo tranquillamente
ottenere un array composto dalle linee di testo del file.
Successivamente invochiamo il metodo select, nel cui blocco eseguiamo un
test, che se positivo, va a collezionare il risultato in matching_lines.
end
n += 1
end
if q == 0
puts “Nessun elemento trovato!”
end
f1.close
end
Cerchero’ di essere didattico
e’ piu’ comodo se i vari parametri (stringa da cercare e file su cui
operare) li ottieni
dalla riga di comando, tramite l’array ARGV
per trasformare una stringa in una regexp puoi usare Regexp.new
puoi leggere un file e ottenere un array di tutte le righe con
IO.readlines
invece di incrementare un contatore per tenere conto del numero di
riga, puoi iterare
sull’array con Enumerable#each_with_index
invece di concatenare le stringhe puoi usare la notazione “#{ obj }”
quindi:
expr = Regexp.new(ARGV[0])
lines = IO.readlines(ARGV[1])
matches = 0
lines.each_with_index do |line, n|
if expr.match(line)
matches += 1
puts “Trovato alla riga #{ n }: #{ line }”
end
end
puts “Nessun elemento trovato” if matches.zero?
S.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.