# Presentazione + Problema su match stringhe

**URL:** <https://www.ruby-forum.com/t/presentazione-problema-su-match-stringhe/128987>\
**Category:** IT\
**Created:** [February 13, 2008, 9:14am UTC](https://www.ruby-forum.com/t/presentazione-problema-su-match-stringhe/128987 "2008-02-13T09:14:11Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![haltman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/4da419/32.png) [@haltman](https://www.ruby-forum.com/u/haltman)\
**Post date:** [February 13, 2008, 9:14am UTC](https://www.ruby-forum.com/t/presentazione-problema-su-match-stringhe/128987/1 "2008-02-13T09:14:11Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![haltman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/4da419/32.png) [@haltman](https://www.ruby-forum.com/u/haltman)\
**Post date:** [February 13, 2008, 9:57am UTC](https://www.ruby-forum.com/t/presentazione-problema-su-match-stringhe/128987/2 "2008-02-13T09:57:09Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![haltman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/4da419/32.png) [@haltman](https://www.ruby-forum.com/u/haltman)\
**Post date:** [February 13, 2008, 10:13am UTC](https://www.ruby-forum.com/t/presentazione-problema-su-match-stringhe/128987/3 "2008-02-13T10:13:38Z")

</div>

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 🙂

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