Data una stringa che rappresenta una matrice di numeri, restituisci le righe e le colonne di quella matrice.
Quindi, data una stringa con caratteri di nuova riga incorporati come questa:
9 8 7
5 3 2
6 6 7
che rappresenta questa matrice:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
il codice dovrebbe essere in grado di produrre:
Le righe della nostra matrice di esempio:
E le sue colonne:
Questo è il primo esercizio in cui la soluzione non è uno script «main». L'obiettivo è scrivere una libreria di funzioni da includere in altri programmi awk. In questo esercizio ci sono diversi nuovi concetti interessanti da scoprire.
Le sezioni seguenti contrassegnate con "(gawk)" sono estensioni specifiche di GNU awk.
In questo esercizio leggerai i dati da un file, non dal flusso di input principale.
Leggi la documentazione su getline nel manuale di Gnu awk,
in particolare le forme Getline/File e Getline/Variable/File.
Un array bidimensionale potrebbe essere un modo per implementare questa soluzione. GNU awk ha due modi per rappresentarlo:
Nota la direttiva @include nel file di test.
Indica a gawk di leggere e valutare il file indicato.
Tutte le variabili di awk sono globali (tranne i parametri delle funzioni, che sono locali alla funzione).
C'è un alto rischio di collisioni di nomi, soprattutto quando si includono librerie di terze parti.
I namespace sono un modo per suddividere dove vengono memorizzate le variabili.
Nota la direttiva @namespace nei file dell'esercizio.
Il namespace predefinito si chiama «awk». Avere un namespace predefinito permette al programmatore di chiamare una funzione integrata di awk dall'interno di una funzione che si trova in un namespace diverso.
I parametri di tipo array vengono passati per riferimento. Le modifiche apportate all'array dentro la funzione sono visibili a chi l'ha chiamata.
I parametri che non sono array vengono passati per valore.
Per i parametri non tipizzati, dipende da cosa ne fa la funzione:
Tutti i dettagli sono nel manuale, in Passaggio degli argomenti di funzione per valore o per riferimento.
Le variabili con scope di funzione (locali) si possono creare usando parametri passati per valore. Non è un errore passare a una funzione meno valori del numero di parametri elencati; i parametri in eccesso sono «untyped» finché non vengono usati. Restano disponibili per ricevere valori scalari dentro la funzione, valori che non vengono memorizzati nel namespace globale.
Per convenzione, nella firma della funzione i parametri previsti compaiono per primi, seguiti da uno spazio e poi dai parametri locali. Un esempio:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}
Iscriviti a Exercism per imparare e padroneggiare AWK con 3 concetti92 esercizi e il mentoring di persone reali, tutto gratis.