Presentazione + Problema su match stringhe

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

Grazie a tutti per l’aiuto
ciao
h.

matching_lines = *open(‘file.txt’, ‘r’).select { |l| l.match
/regexp_here/ }

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.

On Feb 13, 2008, at 9:13 AM, haltman wrote:

 q += 1

end
n += 1
end
if q == 0
puts “Nessun elemento trovato!”
end
f1.close
end

Cerchero’ di essere didattico :slight_smile:

  • 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.