Successivo: , Precedente: , Su: Tutti gli operatori   [Contenuti][Indice]


6.2.2 Concatenazione di stringhe

Allora ci era sembrata una buona idea.

Brian Kernighan

C’è una sola operazione di stringa: la concatenazione. Non ha un operatore specifico per rappresentarla. Piuttosto, la concatenazione è effettuata scrivendo le espressioni l’una vicino all’altra, senza alcun operatore. Per esempio:

$ awk '{ print "Campo numero uno: " $1 }' mail-list
-| Campo numero uno: Amelia
-| Campo numero uno: Anthony
…

Senza lo spazio nella costante stringa dopo ‘:’, la riga rimane unita. Per esempio:

$ awk '{ print "Campo numero uno:" $1 }' mail-list
-| Campo numero uno:Amelia
-| Campo numero uno:Anthony
…

Poiché la concatenazione di stringhe non ha un operatore esplicito, è spesso necessario assicurarsi che venga effettuata al momento giusto usando le parentesi per racchiudere gli elementi da concatenare. Per esempio, ci si potrebbe aspettare che il seguente fammento di codice concateni nome e file:

nome = "nome"
file = "file"
print "qualcosa di significativo" > nome file

Questo produce un errore di sintassi in alcune versioni di awk per Unix.32 È necessario usare la seguente sintassi:

print "qualcosa di significativo" > (nome file)

Si dovrebbero usare le parentesi attorno alle concatenazioni in tutti i contesti non comuni, come, per esempio, sul lato destro di ‘=’. Bisogna stare attenti al tipo di espressioni usate nella concatenazione di stringhe. In particolare, l’ordine di valutazione di espressioni usate per la concatenazione non è definita nel linguaggio awk. Si consideri quest’esempio:

BEGIN {
    a = "Non"
    print (a " " (a = "v'allarmate"))
}

Non è definito se il secondo assegnamento ad a debba avvenire prima o dopo il recupero del valore di a per produrre il valore concatenato. Il risultato potrebbe essere sia ‘Non v'allarmate’, sia ‘v'allarmate v'allarmate’.

La precedenza della concatenazione, quando è in combinazione con altri operatori, è spesso controintuitiva. Si consideri questo esempio:

$ awk 'BEGIN { print -12 " " -24 }'
-| -12-24

Quest’esempio, “ovviamente” concatena -12, uno spazio, e -24. Ma dov’è finito lo spazio? La risposta sta nella combinazione di precedenze di operatori e nelle regole di conversione automatica di awk. Per ottenere il risultato desiderato, si deve scrivere il programma in questo modo:

$ awk 'BEGIN { print -12 " " (-24) }'
-| -12 -24

Questo forza il trattamento, da parte di awk, del ‘-’ del ‘-24’ come operatore unario. Altrimenti è analizzato in questo modo:

    -12 (" " - 24)
⇒ -12 (0 - 24)
⇒ -12 (-24)
⇒ -12-24

Come si è detto precedentemente, quando si usa la concatenazione insieme ad altri operatori, è necessario usare le parentesi. Altrimenti, non si può essere mai completamente certi di quel che si ottiene.


Note a piè di pagina

(32)

Può capitare che BWK awk, gawk e mawk lo interpretino nel modo giusto, ma non ci si dovrebbe fare affidamento.


Successivo: , Precedente: , Su: Tutti gli operatori   [Contenuti][Indice]