Track
/
AWK
AWK
/
Esercizi
/
Matrice
Matrice

Matrice

Medio

Istruzioni

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:

  • Un array delle righe, leggendo ogni riga da sinistra a destra mentre ci si sposta dall'alto verso il basso tra le righe,
  • Un array delle colonne, leggendo ogni colonna dall'alto verso il basso mentre ci si sposta da sinistra a destra.

Le righe della nostra matrice di esempio:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

E le sue colonne:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

Nuovi concetti di AWK

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.

Leggere da un file

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.

Ancora sugli array

Un array bidimensionale potrebbe essere un modo per implementare questa soluzione. GNU awk ha due modi per rappresentarlo:

File inclusi (gawk)

Nota la direttiva @include nel file di test.
Indica a gawk di leggere e valutare il file indicato.

Namespace (gawk)

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.

Come vengono passati i parametri delle funzioni

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:

  • se la funzione lo inizializza come array, allora diventa un parametro passato per riferimento,
  • se la funzione lo inizializza come valore scalare (un numero o una stringa), allora non è un riferimento.

Tutti i dettagli sono nel manuale, in Passaggio degli argomenti di funzione per valore o per riferimento.

Variabili locali

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.

  • Se assegni un valore scalare a un parametro, questo è locale alla funzione.
  • Se assegni un valore scalare a una variabile non presente nell'elenco dei parametri, quella variabile è 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
}
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
AWK Exercism

Vuoi iniziare Matrice?

Iscriviti a Exercism per imparare e padroneggiare AWK con 3 concetti92 esercizi e il mentoring di persone reali, tutto gratis.