Precedente: , Su: Programmi di esempio   [Contenuti][Indice]


11.5 Esercizi

  1. Riscrivere cut.awk (vedi la sezione Ritagliare campi e colonne) usando split() con "" come separatore.
  2. In Ricercare espressioni regolari nei file, è detto che ‘egrep -i’ potrebbe essere simulato in versioni di awk che non prevedono IGNORECASE usando tolower() sulla riga e nei criteri di ricerca. In una nota a piè di pagina è anche detto che questa soluzione ha un problema: in output viene scritta la riga tradotta (a lettere minuscole), e non quella originale. Risolvere questo problema.
  3. La versione POSIX di id accetta opzioni che controllano quali informazioni stampare. Modificare la versione awk (vedi la sezione Stampare informazioni sull’utente) per accettare gli stessi argomenti e funzionare allo stesso modo.
  4. Il programma split.awk (vedi la sezione Suddividere in pezzi un file grosso) presuppone che le lettere siano contigue nella codifica dei caratteri, il che non è vero per sistemi che usano la codifica EBCDIC. Risolvere questo problema. (Suggerimento: Considerare un modo diverso di analizzare l’alfabeto, senza appoggiarsi sulle funzioni ord() e chr().)
  5. Nel programma uniq.awk (vedi la sezione Stampare righe di testo non duplicate, la logica per scegliere quali righe stampare rappresenta una macchina a stati, ossia “un dispositivo che può essere in uno di un insieme di stati stabili, a seconda dello stato in cui si trovava in precedenza, e del valore corrente dei suoi input.”88 Brian Kernighan suggerisce che “un approccio alternativo alle macchine a stati è di leggere tutto l’input e metterlo in un vettore, e quindi usare gli indici. È quasi sempre più semplice da programmare, e per la maggior parte degli input in cui si può usare, altrettanto veloce in esecuzione.” Riscrivere la logica del programma seguendo questa indicazione.
  6. Perché il programma wc.awk (vedi la sezione Contare cose) non può limitarsi a usare il valore di FNR nella funziona a_fine_file()? Suggerimento: Esaminare il codice in Trovare i limiti dei file-dati.
  7. La manipolazione di singoli caratteri nel programma translate (vedi la sezione Rimpiazzare o eliminare caratteri) è farraginosa usando le funzione standard awk. Poiché gawk può dividere stringhe in caratteri singoli usando come separatore "", come si potrebbe usare questa funzionalità per semplificare il programma?
  8. Il programma extract.awk (vedi la sezione Estrarre programmi da un file sorgente Texinfo) è stato scritto prima che gawk avesse a disposizione la funzione gensub(). Usarla per semplificare il codice.
  9. Si confronti la velocità di esecuzione del programma awksed.awk (vedi la sezione Un semplice editor di flusso) con il più diretto:
    BEGIN {
        stringa = ARGV[1]
        rimpiazzo = ARGV[2]
        ARGV[1] = ARGV[2] = ""
    }
    
    { gsub(stringa, rimpiazzo); print }
    
  10. Quali sono vantaggi e svantaggi di awksed.awk rispetto al vero programma di utilità sed?
  11. In Una maniera facile per usare funzioni di libreria, si è detto che non tentando di salvare la riga letta con getline nella funzione percorso(), mentre si controlla l’accessibilità del file da usare nel programma principale, semplifica notevolmente le cose. Quale problema è peraltro generato così facendo?
  12. Come ulteriore esempio dell’idea che non sempre è necessario aggiungere nuove funzionalità a un programma, si consideri l’idea di avere due file in una directory presente nel percorso di ricerca:
    default.awk

    Questo file contiene un insieme di funzioni di libreria di default, come getopt() e assert().

    sito.awk

    Questo file contiene funzioni di libreria che sono specifiche di un sito o di un’installazione; cioè, funzioni sviluppate localmente. Mantenere due file separati consente a default.awk di essere modificato in seguito a nuove versioni di gawk, senza che l’amministratore di sistema debba ogni volta aggiornarlo aggiungendo le funzioni locali.

    Un utente ha suggerito che gawk venga modificato per leggere automaticamente questi file alla partenza. Piuttosto, sarebbe molto semplice modificare igawk per farlo. Poiché igawk è capace di elaborare direttive @include nidificate, default.awk potrebbe contenere semplicemente la lista di direttive @include con le funzioni di libreria desiderate. Fare questa modifica.

  13. Modificare anagram.awk (vedi la sezione Trovare anagrammi da una lista di parole), per evitare di usare il programma di utilità esterno sort.

Note a piè di pagina

(88)

Questo è la definizione trovata usando define: state machine come chiave di ricerca in Google.


Precedente: , Su: Programmi di esempio   [Contenuti][Indice]