Successivo: , Su: Getline   [Contenuti][Indice]


4.9.1 Usare getline senza argomenti

Il comando getline può essere usato senza argomenti per leggere l’input dal file in input corrente. Tutto quel che fa in questo caso è leggere il record in input successivo e dividerlo in campi. Questo è utile se è finita l’elaborarezione del record corrente, e si vogliono fare delle elaborazioni particolari sul record successivo proprio adesso. Per esempio:

# rimuovere il testo tra /* e */, compresi
{
  if ((i = index($0, "/*")) != 0) {
     prima = substr($0, 1, i - 1)  # la parte iniziale della stringa
     dopo = substr($0, i + 2)    # ... */ ...
     j = index(dopo, "*/")       # */ è nella parte finale?
     if (j > 0) {
         dopo = substr(dopo, j + 2)  # rimozione del commento
     } else {
         while (j == 0) {
           # passa ai record seguenti
           if (getline <= 0) {
             print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
             exit
          }
           # incrementare la riga usando la concatenazione di stringhe
           dopo = dopo $0
           j = index(dopo, "*/")   # è */ nella parte finale?
           if (j != 0) {
             dopo = substr(dopo, j + 2)
             break
           }
        }
      }
      # incrementare la riga di output usando la concatenazione
      # di stringhe
      $0 = prima dopo
  }
  print $0
}

Questo programma awk cancella i commenti in stile C (‘/* … */’) dall’input. Usa diverse funzionalità che non sono ancora state trattate, incluse la concatenazione di stringhe (vedi Concatenazione) e le funzioni predefinite index() e substr() (vedi Funzioni per stringhe). Sostituendo ‘print $0’ con altre istruzioni, si possono effettuare elaborazioni più complesse sull’input decommentato, come ricercare corrispondenze di un’espressione regolare. (Questo programma ha un piccolo problema: non funziona se c’è più di un commento che inizia e finisce sulla stessa riga.)

Questa forma del comando getline imposta NF, NR, FNR, RT e il valore di $0.

NOTA: Il nuovo valore di $0 è usato per verificare le espressioni di ricerca di ogni regola successiva. Il valore originale di $0 che ha attivato la regola che ha eseguito la getline viene perso. A differenza di getline, l’istruzione next legge un nuovo record ma inizia a elaborarlo normalmente, a partire dalla prima regola presente nel programma. Vedi Istruzione next.


Successivo: , Su: Getline   [Contenuti][Indice]