Hai trovato lavoro in una biblioteca locale, dove aiuti a organizzare la collezione di libri antichi. Gli studenti che la frequentano sono spesso a caccia di citazioni ricordate a metà, da inserire nelle loro tesine. Invece di leggere a mano ogni libro da cima a fondo, decidi di costruire un piccolo strumento che li analizzi, cercando proprio queste citazioni parziali.
Cerca nei file le righe che corrispondono a una stringa di ricerca e restituisci tutte le righe corrispondenti.
Il comando Unix grep cerca nei file le righe che corrispondono a un'espressione regolare. Il tuo compito è implementare una versione semplificata del comando grep, che supporta la ricerca di stringhe fisse.
Il comando grep accetta tre argomenti:
Poi legge il contenuto dei file specificati (nell'ordine indicato), trova le righe che contengono la stringa di ricerca e infine restituisce quelle righe nell'ordine in cui sono state trovate. Quando cerca in più file, ogni riga corrispondente è preceduta dal nome del file e dai due punti (':').
Il comando grep supporta i seguenti flag:
-n Anteponi il numero di riga e i due punti (':') a ogni riga dell'output, mettendo il numero dopo il nome del file (se presente).-l Restituisci solo i nomi dei file che contengono almeno una riga corrispondente.-i Confronta ignorando la differenza tra maiuscole e minuscole.-v Inverti il programma: raccogli tutte le righe che non corrispondono.-x Cerca solo le righe in cui la stringa di ricerca corrisponde all'intera riga.Questo esercizio introduce il crate anyhow, che semplifica la gestione di tipi di errore arbitrari.
L'intento è assicurarsi che, quando scrivi un'applicazione, non devi preoccuparti di quali
errori specifici restituisce la funzione che hai chiamato, ma devi solo fare la cosa giusta quando li propaghi.
N.B.: in realtà è una forma un po' discutibile usare anyhow quando si scrive una libreria, come stiamo facendo qui; è più
esplicito e più utile scrivere un tuo enum Error quando scrivi una libreria (potenzialmente con l'aiuto di macro
ausiliarie come quelle fornite dal crate thiserror). Tuttavia, lo stiamo
facendo qui intenzionalmente ed esplicitamente per dimostrare l'uso di questo crate.
Per saperne di più su questo crate, consulta la sua documentazione.
Questo esercizio ti chiede di implementare solo le funzioni più basilari di grep,
ma in realtà esiste un progetto che punta a reimplementare grep del tutto in Rust: ripgrep.
Se ti è piaciuto il concetto di riscrivere i programmi di utilità di base in Rust, dai un'occhiata ai seguenti progetti:
Iscriviti a Exercism per imparare e padroneggiare Rust con 99 esercizi e il mentoring di persone reali, tutto gratis.