aboutsummaryrefslogtreecommitdiffstats
path: root/doc/it/gawktexi.in
diff options
context:
space:
mode:
Diffstat (limited to 'doc/it/gawktexi.in')
-rw-r--r--doc/it/gawktexi.in1378
1 files changed, 985 insertions, 393 deletions
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in
index d29cdf03..5a56e8fc 100644
--- a/doc/it/gawktexi.in
+++ b/doc/it/gawktexi.in
@@ -61,9 +61,9 @@
@c applies to and all the info about who's publishing this edition
@c These apply across the board.
-@set UPDATE-MONTH Ottobre 2017
+@set UPDATE-MONTH Settembre 2018
@set VERSION 4.2
-@set PATCHLEVEL 0
+@set PATCHLEVEL 1
@c added Italian hyphenation stuff
@hyphenation{ven-go-no o-met-te-re o-met-ten-do}
@@ -308,7 +308,7 @@ Some comments on the layout for TeX.
Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email>
URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout>
-<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2017
+<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2018
Free Software Foundation, Inc.
All Rights Reserved.
</literallayout>
@@ -338,7 +338,8 @@ All Rights Reserved.
@ifnotdocbook
@iftex
-Copyright @copyright{} 2017 -- Free Software Foundation, Inc.
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
+Free Software Foundation, Inc.
@end iftex
@end ifnotdocbook
@sp 2
@@ -422,7 +423,7 @@ URL: @uref{https://www.gnu.org/}
@c This one is correct for gawk 3.1.0 from the FSF
ISBN 1-882114-28-0
@sp 0
-Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
Free Software Foundation, Inc.
@sp 1
Traduzione e revisione:@*
@@ -508,7 +509,7 @@ Questo file documenta @command{awk}, un programma che si pu@`o usare per
selezionare dei record determinati in un file ed eseguire azioni su di essi.
@noindent
-Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
+Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
Free Software Foundation, Inc.
@noindent
@@ -1207,7 +1208,6 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation,
* Obiettivi delle estensioni:: Obiettivi del nuovo meccanismo.
* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
* Futuri sviluppi delle estensioni:: Possibilit@`a di crescita futura.
-* Meccanismo delle vecchie estensioni:: Problemi con le vecchie estensioni.
* Sommario delle note:: Sommario delle note di
implementazione.
* Fondamenti ad alto livello:: Una visione dall'alto.
@@ -1689,8 +1689,10 @@ del tipo:
@example
$ @kbd{awk 1 /dev/null}
+@group
@error{} awk: syntax error near line 1
@error{} awk: bailing out near line 1
+@end group
@end example
@noindent
@@ -1948,6 +1950,7 @@ e alcune possibili direzioni per il futuro sviluppo di @command{gawk}.
fornisce del materiale di riferimento a livello elementare per chi
sia completamente digiuno di programmazione informatica.
+@item
Il @ref{Glossario}, definisce quasi tutti i termini significativi
usati all'interno di questo @value{DOCUMENT}. Se si incontrano termini
coi quali non si ha familiarit@`a, questo @`e il posto dove cercarli.
@@ -2260,39 +2263,21 @@ di gestire una raccolta di programmi @command{awk} pubblicamente disponibili e
avevo anche esortato a collaborare. Rendere disponibili le cose su Internet
aiuta a contenere la distribuzione @command{gawk} entro dimensioni gestibili.
-L'iniziale raccolta di materiale, come questo, @`e tuttora disponibile
+L'iniziale raccolta di materiale, cos@`{@dotless{i}} com'@`e, @`e tuttora disponibile
su @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
-Chi fosse @emph{seriamente} interessato a contribuire nell'implementazione
-di un sito Internet dedicato ad argomenti riguardanti il
-linguaggio @command{awk}, @`e pregato di contattarmi.
-
-@ignore
-Nella speranza di
-fare qualcosa di pi@`u esteso, acquisii il dominio @code{awk.info}.
-
-Tuttavia, mi accorsi che non potevo dedicare abbastanza tempo per la gestione
-del codice inviato dai collaboratori: l'archivio non cresceva e il dominio
-rimase in disuso per diversi anni.
+Nella speranza di fare qualcosa di pi@`u generale, ho acuisito il dominio
+@code{awklang.org}. A fine anno 2017 un volontario si @`e assunto il compito
+di gestirlo.
-Alla fine del 2008, un volontario si assunse il compito di mettere a punto
-un sito web collegato ad @command{awk}---@uref{http://awk.info}---e fece un
-lavoro molto ben fatto.
+Se qualcuno ha scritto un programma @command{awk} interessante, o
+un'estensione a @command{gawk} che vuole condividere col resto del mondo,
+@`e invitato a consultare la pagina @uref{http://www.awklang.org} e a usare
+il puntatore ``Contact''.
-Se qualcuno ha scritto un programma @command{awk} interessante, o un'estensione
-a @command{gawk} che vuole condividere col resto del mondo, @`e invitato a
-consultare la pagina @uref{http://awk.info/?contribute} per sapere come
-inviarlo per contribuire al sito web.
+Se qualcuno ha scritto un'estensione a @command{gawk}, si veda
+@ref{gawkextlib}.
-Mentre scrivo, questo sito @`e in cerca di un responsabile; se qualcuno @`e
-interessato mi contatti.
-@end ignore
-
-@ignore
-Altri collegamenti:
-
-https://www.reddit.com/r/linux/comments/dtect/composing_music_in_awk/
-@end ignore
@end ifclear
@node Ringraziamenti
@@ -2914,6 +2899,8 @@ messaggio di errore di qualche tipo da @command{awk}.
@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
@cindex portabilit@`a, variabile @code{ARGV}
Infine, il valore di @code{ARGV[0]}
+@cindex angolo buio, @code{ARGV}, valore della variabile
+@cindex angolo buio, variabile @code{ARGV}, valore
(@pxref{Variabili predefinite})
pu@`o variare a seconda del sistema operativo.
Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
@@ -3180,10 +3167,12 @@ per i caratteri
apice singolo e doppio, cos@`{@dotless{i}}:
@example
+@group
$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <\47>" @}'}
@print{} Questo @`e un apice singolo <'>
$ @kbd{awk 'BEGIN @{ print "Questo @`e un doppio apice <\42>" @}'}
@print{} Questo @`e un doppio apice <">
+@end group
@end example
@noindent
@@ -3470,8 +3459,10 @@ e non ha azione---quindi applica l'azione di default, stampando il record.
Stampare la lunghezza della riga in input pi@`u lunga:
@example
+@group
awk '@{ if (length($0) > max) max = length($0) @}
END @{ print max @}' data
+@end group
@end example
Il codice associato a @code{END} viene eseguito dopo che tutto
@@ -3802,11 +3793,13 @@ un @samp{#} che inizia un commento, ignora @emph{tutto} il resto della riga.
Per esempio:
@example
+@group
$ @kbd{gawk 'BEGIN @{ print "Non allarmarti" # una amichevole \}
> @kbd{ regola BEGIN}
> @kbd{@}'}
@error{} gawk: riga com.:2: regola BEGIN
@error{} gawk: riga com.:2: ^ syntax error
+@end group
@end example
@noindent
@@ -3967,8 +3960,8 @@ riga di comando, sia quelle dello standard POSIX che quelle specifiche di
argomenti che non sono opzioni.
Prosegue poi spiegando come @command{gawk} cerca i file sorgenti,
leggendo lo standard input assieme ad altri file, le variabili d'ambiente di
-@command{gawk}, lo stato di ritorno di @command{gawk}, l'uso dei file inclusi,
-e opzioni e/o funzionalit@`a obsolete e non documentate.
+@command{gawk}, il codice di ritorno di @command{gawk}, l'uso dei file
+inclusi, e opzioni e/o funzionalit@`a obsolete e non documentate.
Molte delle opzioni e funzionalit@`a qui descritte sono trattate con
maggior dettaglio nei capitoli successivi del @value{DOCUMENT}; gli argomenti
@@ -4027,6 +4020,7 @@ awk '' file_dati_1 file_dati_2
@end example
@cindex @option{--lint}, opzione
+@cindex angolo buio, programmi vuoti
@noindent
Fare cos@`{@dotless{i}} ha comunque poco senso; @command{awk} termina
silenziosamente quando viene fornito un programma vuoto.
@@ -4269,7 +4263,7 @@ Quest'opzione @`e particolarmente necessaria per le applicazioni World Wide Web
CGI che passano argomenti attraverso le URL; l'uso di quest'opzione impedisce
a un utente malintenzionato (o ad altri) di passare opzioni, assegnamenti o
codice sorgente @command{awk} (con @option{-e}) all'applicazione
-CGI.@footnote{per maggiori dettagli,
+CGI.@footnote{Per maggiori dettagli,
si veda la Sezione 4.4 di @uref{http://www.ietf.org/rfc/rfc3875,
RFC 3875}. Si veda anche
@uref{https://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
@@ -4424,12 +4418,10 @@ Ora non @`e pi@`u cos@`{@dotless{i}}.
@cindex @option{--optimize}, opzione
@cindex @option{-O}, opzione
Abilita le ottimizzazioni di default nella rappresentazione interna del
-programma. Attualmente, questo comprende delle semplificazioni nell'uso
-di costanti e l'eliminazione delle code di chiamata nelle funzioni
-ricorsive [sostituzione della chiamata di funzione con dei salti
-diretti alla funzione].
+programma. Attualmente, questo comprende solo delle semplificazioni nell'uso
+di costanti.
-Queste ottimizzazioni sono abilitate per default.
+Quest'ottimizzazione @`e abilitata per default.
Quest'opzione rimane disponibile per compatibilit@`a all'indietro.
Tuttavia pu@`o essere usata per annullare l'effetto di una precedente
opzione @option{-s} (si veda pi@`u sotto in questa lista).
@@ -4893,6 +4885,16 @@ essere di aiuto per gestire la variabile @env{AWKPATH}.
@code{ENVIRON["AWKLIBPATH"]}. Questo consente di aver accesso al valore del
percorso di ricerca in uso all'interno di un programma @command{awk}.
+Sebbene sia possibile modificare la variabile @code{ENVIRON["AWKLIBPATH"]}
+all'interno di un programma @command{awk}, la modifica non ha effetto
+sul comportamento del programma in esecuzione.
+Il motivo @`e chiaro: la variabile d'ambiente
+@env{AWKLIBPATH} @`e usata per trovare eventuali estensioni richieste, e
+queste sono caricate prima che il programma inizi l'esecuzione. Dopo che
+il programma ha iniziato l'esecuzione, tutte le estensioni sono gi@`a state
+caricate, e @command{gawk} non ha pi@`u bisogno di usare la variabile d'ambiente
+@env{AWKLIBPATH}.
+
@node Altre variabili d'ambiente
@subsection Le variabili d'ambiente.
@@ -5086,10 +5088,12 @@ I file da includere possono essere nidificati; p.es., dato un terzo
@dfn{script}, che chiameremo @file{test3}:
@example
+@group
@@include "test2"
BEGIN @{
print "Questo @`e lo script test3."
@}
+@end group
@end example
@noindent
@@ -5187,8 +5191,10 @@ $ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
Questo equivale all'esempio seguente:
@example
+@group
$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
@print{} A
+@end group
@end example
@noindent
@@ -5317,6 +5323,14 @@ programmi erano stati scritti.
Le funzioni predefinite standard di command{awk}, per esempio
@code{sin()} o @code{substr()} @emph{non} ammettono questa possibilit@`a.
+@`E possibile specificare in @code{printf} un modificatore @samp{P}
+fra le lettere di controllo dei numeri in virgola mobile, per
+utilizzare il risultato fornito dalle funzioni di libreria C
+per i valori NaN [Not a Number] e Infinity [Infinito], invece dei
+valori speciali normalmente prodotti da @command{gawk}, come
+descritto in @ref{Problemi virgola mobile POSIX}.
+Questo serve principalmente nella fase di test delle componenti aggiunte.
+
@end ignore
@node Sommario invocazione
@@ -5572,12 +5586,12 @@ Nuova pagina, @kbd{Ctrl-l}, codice ASCII 12 (FF).
@cindex @code{\} (barra inversa), @code{\n}, sequenza di protezione
@cindex barra inversa (@code{\}), @code{\n}, sequenza di protezione
@item \n
-A capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
+A-capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
@cindex @code{\} (barra inversa), @code{\r}, sequenza di protezione
@cindex barra inversa (@code{\}), @code{\r}, sequenza di protezione
@item \r
-Ritorno del carrello, @kbd{Ctrl-m}, codice ASCII 13 (CR).
+Ritorno-a-capo, @kbd{Ctrl-m}, codice ASCII 13 (CR).
@cindex @code{\} (barra inversa), @code{\t}, sequenza di protezione
@cindex barra inversa (@code{\}), @code{\t}, sequenza di protezione
@@ -6088,8 +6102,7 @@ l'altro.)
caratteri di controllo).
@item @code{[:punct:]} @tab Caratteri di punteggiatura (caratteri che non
sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
-@item @code{[:space:]} @tab Caratteri di spazio (come @dfn{spazio}, TAB, e
-@dfn{formfeed}, per citarne alcuni).
+@item @code{[:space:]} @tab Caratteri di spazio (ovvero: @dfn{spazio}, TAB, avanzamento riga (@dfn{newline}), ritorno a capo (@dfn{carriage return}), avanzamento pagina (@dfn{formfeed}) e tabulazione verticale)
@item @code{[:upper:]} @tab Caratteri alfabetici maiuscoli.
@item @code{[:xdigit:]} @tab Caratteri che sono cifre esadecimali.
@end multitable
@@ -6116,6 +6129,12 @@ dell'insieme di caratteri ASCII. Usando una lista di caratteri che esclude
(@samp{[^\x00-\x7F]}) si individuano tutti i caratteri mono-byte che non
sono nell'intervallo ASCII.
+@quotation NOTA
+Alcune vecchie versioni Unix di @command{awk}
+trattano @code{[:blank:]} come @code{[:space:]}, individuando quindi
+pi@`u caratteri del dovuto. Caveat Emptor! [Stia in guardia il compratore!].
+@end quotation
+
@cindex espressioni tra parentesi quadre, elementi di collazione
@cindex espressioni tra parentesi quadre, non-ASCII
@cindex elementi di collazione
@@ -6296,8 +6315,8 @@ chiaramente che si vuole una corrispondenza con una @dfn{regexp}.
@cindex ritorno a capo, in @dfn{regexp} dinamiche
Alcune delle prime versioni di @command{awk} non consentono di usare il
-carattere di ritorno
-a capo all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
+carattere di ritorno a capo
+all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
dinamiche:
@example
@@ -6733,6 +6752,14 @@ numero totale di record in input gi@`a letti da tutti i @value{DF}.
Il suo valore iniziale @`e zero ma non viene mai reimpostata a zero
automaticamente.
+I record sono normalmente separati dal carattere di avanzamento riga
+(@dfn{newline}). @`E possibile specificare come vanno separati i record
+assegnando un valore alla variabile predefinita @code{RS}.
+Se il valore di @code{RS} @`e costituto da un solo carattere, @`e quello
+il carattere che fa da separatore fra i record.
+Altrimenti (in @command{gawk}), @code{RS} @`e valutata come espressione
+regolare. Questo meccanismo @`e spiegato pi@`u in dettaglio qui sotto.
+
@menu
* awk divisione record:: Come @command{awk} standard divide i record.
* gawk divisione record:: Come @command{gawk} divide i record.
@@ -6777,13 +6804,16 @@ file in input, e la seconda regola nel programma @command{awk} (l'azione
eseguita se non si specifica un criterio)
stampa ogni record. Poich@'e ogni istruzione @code{print} aggiunge
un ritorno a capo alla fine del suo output, questo programma
-@command{awk} copia l'input con ogni @samp{u} trasformato in un ritorno
-a capo. Qui vediamo il risultato dell'esecuzione del programma sul file
+@command{awk} copia l'input con ogni @samp{u} trasformato in un
+ritorno a capo.
+Qui vediamo il risultato dell'esecuzione del programma sul file
@file{mail-list}:
@example
+@group
$ @kbd{awk 'BEGIN @{ RS = "u" @}}
> @kbd{@{ print $0 @}' mail-list}
+@end group
@print{} Amelia 555-5553 amelia.zodiac
@print{} sq
@print{} e@@gmail.com F
@@ -6860,6 +6890,14 @@ Usando un carattere insolito come @samp{/} @`e pi@`u probabile
che si ottenga un comportamento corretto nella maggioranza dei casi, ma non
c'@`e nessuna garanzia. La morale @`e: conosci i tuoi dati!
+@command{gawk} consente di usare per @code{RS} un'espressione regolare
+normale (descritta pi@`u avanti; @pxref{gawk divisione record}).
+Tuttavia, se l'espressione regolare @`e costituita da un singolo metacarattere,
+come p.es. @samp{.} che assegni il valore di @code{RS}, il metacarattere
+in questione non viene trattato come tale, ma viene usato letteralmente.
+Ci@`o viene fatto per compatibilit@`a all'indietro sia con il comando
+Unix @command{awk} che con lo standard POSIX.
+
Quando si usano caratteri normali come separatore di record,
c'@`e un caso insolito che capita quando @command{gawk}
@`e reso completamente conforme a POSIX (@pxref{Opzioni}).
@@ -6882,8 +6920,8 @@ Il raggiungimento della fine di un file in input fa terminare il record di
input corrente, anche se l'ultimo carattere nel file non @`e il carattere in
@code{RS}. @value{DARKCORNER}
-@cindex stringhe vuote
-@cindex stringhe nulle
+@cindex stringa vuota
+@cindex stringa nulla
@c @cindex strings, empty, see null strings
La stringa nulla @code{""} (una stringa che non contiene alcun carattere)
ha un significato particolare come
@@ -6914,7 +6952,8 @@ imposta la variabile @code{RT} al testo nell'input che corrisponde a
@cindex comuni, estensioni@comma{} @code{RS} come espressione regolare
Quando si usa @command{gawk},
il valore di @code{RS} non @`e limitato a una stringa costituita da un solo
-carattere, ma pu@`o essere qualsiasi espressione regolare
+carattere. Se contiene pi@`u di un carattere, @`e considerato essere
+un'espressione regolare
@iftex
(@pxrefil{Espressioni regolari}). @value{COMMONEXT}
@end iftex
@@ -6945,9 +6984,11 @@ cerca sia un ritorno a capo che una serie di una o pi@`u lettere
maiuscole con uno spazio vuoto opzionale iniziale e/o finale:
@example
+@group
$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
> @kbd{@{ print "Record =", $0,"e RT = [" RT "]" @}'}
+@end group
@print{} Record = record 1 e RT = [ AAAA ]
@print{} Record = record 2 e RT = [ BBBB ]
@print{} Record = record 3 e RT = [
@@ -7325,6 +7366,8 @@ $ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
@quotation ATTENZIONE
Alcune versioni di @command{awk} non
ricostruiscono @code{$0} quando @code{NF} viene diminuito.
+Fino ad agosto 2018, fra queste c'era BWK @command{awk}; per fortuna
+da allora la sua versione funziona correttamente.
@end quotation
Infine, ci sono casi in cui conviene forzare
@@ -7333,8 +7376,10 @@ dei campi e @code{OFS}. Per far ci@`o, si usa
l'apparentemente innocuo assegnamento:
@example
+@group
$1 = $1 # forza la ricostruzione del record
print $0 # o qualsiasi altra cosa con $0
+@end group
@end example
@noindent
@@ -7546,8 +7591,8 @@ $ @kbd{echo ' a b c d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
@noindent
@c @cindex null strings
-@cindex stringhe nulle
-@cindex stringhe vuote, si veda stringhe nulle
+@cindex stringa nulla
+@cindex stringa vuota, si veda stringa nulla
In questo caso, il primo campo @`e nullo, o vuoto.
Il taglio degli spazi vuoti iniziale e finale ha luogo anche
ogniqualvolta @code{$0} @`e ricalcolato.
@@ -8197,16 +8242,20 @@ e divide i dati:
@example
@c file eg/misc/simple-csv.awk
+@group
BEGIN @{
FPAT = "([^,]+)|(\"[^\"]+\")"
@}
+@end group
+@group
@{
print "NF = ", NF
for (i = 1; i <= NF; i++) @{
printf("$%d = <%s>\n", i, $i)
@}
@}
+@end group
@c endfile
@end example
@@ -8270,14 +8319,6 @@ FPAT = "([^,]*)|(\"[^\"]+\")"
Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile
per suddividere normali stringhe (@pxref{Funzioni per stringhe}).
-@ignore
-Per ricapitolare, @command{gawk} fornisce tre metodi indipendenti per
-suddividere in campi i record in input.
-Il meccanismo usato @`e determinato da quella tra le tre
-variabili---@code{FS}, @code{FIELDWIDTHS}, o @code{FPAT}---a cui
-sia stato assegnato un valore pi@`u recentemente.
-@end ignore
-
@node Controllare la creazione di campi
@section Controllare come @command{gawk} sta dividendo i record
@@ -8537,7 +8578,7 @@ e avere acquisito una buona conoscenza di come funziona @command{awk}.
@cindex @command{gawk}, variabile @code{ERRNO} in
@cindex @code{ERRNO}, variabile, con comando @command{getline}
@cindex differenze tra @command{awk} e @command{gawk}, comando @code{getline}
-@cindex @code{getline}, comando, valori di ritorno
+@cindex @code{getline}, comando, codice di ritorno
@cindex @option{--sandbox}, opzione, ridirezione dell'input con @code{getline}
Il comando @code{getline} restituisce 1 se trova un record e 0 se
@@ -8673,6 +8714,7 @@ e controlla ogni regola" non la veda affatto.
L'esempio seguente inverte tra loro a due a due le righe in input:
@example
+@group
@{
if ((getline tmp) > 0) @{
print tmp
@@ -8680,6 +8722,7 @@ L'esempio seguente inverte tra loro a due a due le righe in input:
@} else
print $0
@}
+@end group
@end example
@noindent
@@ -8825,6 +8868,7 @@ sostituite dall'output prodotto dall'esecuzione del resto della riga
costituito da un comando di shell.
@example
+@group
@{
if ($1 == "@@execute") @{
tmp = substr($0, 10) # Rimuove "@@execute"
@@ -8834,6 +8878,7 @@ costituito da un comando di shell.
@} else
print
@}
+@end group
@end example
@noindent
@@ -9162,12 +9207,14 @@ specificato. Per esempio, un cliente TCP pu@`o decidere di abbandonare se
non riceve alcuna risposta dal server dopo un certo periodo di tempo:
@example
+@group
Service = "/inet/tcp/0/localhost/daytime"
PROCINFO[Service, "READ_TIMEOUT"] = 100
if ((Service |& getline) > 0)
print $0
else if (ERRNO != "")
print ERRNO
+@end group
@end example
Qui vediamo come ottenere dati interattivamente dall'utente@footnote{Questo
@@ -9202,7 +9249,7 @@ messaggio di errore:
@example
@c questo @`e l'output effettivo - Antonio
-@error{} gawk: linea com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
+@error{} gawk: riga com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
@error{} file in input `-': Connessione scaduta
@end example
@@ -9478,8 +9525,8 @@ L'istruzione @code{print} si usa per produrre dell'output formattato in
maniera semplice, standardizzata. Si
specificano solo le stringhe o i numeri
da stampare, in una lista separata da virgole. Questi elementi sono stampati,
-separati tra loro da spazi singoli, e alla fine viene stampato un ritorno a
-capo. L'istruzione @`e simile a questa:
+separati tra loro da spazi singoli, e alla fine viene stampato un
+ritorno a capo. L'istruzione @`e simile a questa:
@example
print @var{elemento1}, @var{elemento2}, @dots{}
@@ -9542,10 +9589,12 @@ ritorni a capo:
@end ifnotinfo
@example
+@group
$ @kbd{awk 'BEGIN @{ print "riga uno\nriga due\nriga tre" @}'}
@print{} riga uno
@print{} riga due
@print{} riga tre
+@end group
@end example
@cindex campi, stampare
@@ -9751,7 +9800,7 @@ $ @kbd{awk 'BEGIN @{}
@cindex variabile @code{OFMT}, POSIX @command{awk} e
Per lo standard POSIX, il comportamento di @command{awk} @`e indefinito
se @code{OFMT} contiene qualcosa di diverso da una specifica di conversione
-di un numero a virgola mobile.
+di un numero in virgola mobile.
@value{DARKCORNER}
@node Printf
@@ -9819,12 +9868,14 @@ effetto sulle istruzioni @code{printf}.
Per esempio:
@example
+@group
$ @kbd{awk 'BEGIN @{}
> @kbd{ORS = "\nAHI!\n"; OFS = "+"}
> @kbd{msg = "Non v\47allarmate!"}
> @kbd{printf "%s\n", msg}
> @kbd{@}'}
@print{} Non v'allarmate!
+@end group
@end example
@noindent
@@ -9848,6 +9899,29 @@ lettere di controllo del formato:
@c @asis for docbook to come out right
@table @asis
+@item @code{%a}, @code{%A}
+Un numero in virgola mobile scritto nella forma
+[@code{-}]@code{0x@var{h}.@var{hhhh}p+-@var{dd}}
+(formato esadecimale virgola mobile nel compilatore C99).
+Per @code{%A},
+si usano lettere maiuscole invece che lettere minuscole.
+
+@quotation NOTA
+Lo standard POSIX in vigore richiede il supporto di @code{%a}
+e di @code{%A} in @command{awk}. Per quanto ci consta, oltre a
+@command{gawk}, la sola altra versione di @command{awk} che fornisce
+questo supporto @`e BWK @command{awk}.
+Se si usano questi formati, il programma in questione @`e quindi
+estremamente non-portabile!
+
+Inoltre, questi formati non sono disponibili su alcun sistema in cui
+la funzione di libreria C @code{printf()} utilizzata da @command{gawk}
+non li supporta.
+Al momento in cui questo libro @`e stato scritto, fra i sistemi su cui
+@`e stato portato @command{gawk}, il solo sistema noto che
+non li supporta @`e OpenVMS.
+@end quotation
+
@item @code{%c}
Stampa un numero come un carattere; quindi, @samp{printf "%c",
65} stampa la lettera @samp{A}. L'output per un valore costituito da una
@@ -9870,6 +9944,7 @@ carattere da stampare.
Altre versioni di @command{awk} generalmente si limitano a stampare
il primo byte di una stringa o i valori numerici che possono essere
rappresentati in un singolo byte (0--255).
+@value{DARKCORNER}
@end quotation
@@ -9896,7 +9971,7 @@ introdotti nella prossima @value{SUBSECTION}).
@samp{%E} usa @samp{E} invece di @samp{e} nell'output.
@item @code{%f}
-Stampa un numero in notazione a virgola mobile.
+Stampa un numero in notazione in virgola mobile.
Per esempio:
@example
@@ -9909,7 +9984,7 @@ delle quali vengono dopo il punto decimale.
(L'espressione @samp{4.3} rappresenta due modificatori,
introdotti nella prossima @value{SUBSECTION}).
-In sistemi che implementano il formato a virgola mobile, come specificato
+In sistemi che implementano il formato in virgola mobile, come specificato
dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come
@samp{-inf} o @samp{-infinity},
e l'infinito positivo come
@@ -9927,7 +10002,7 @@ i sistemi lo prevedono. In tali casi,
@command{gawk} usa il formato @samp{%f}.
@item @code{%g}, @code{%G}
-Stampa un numero usando o la notazione scientifica o quella a virgola
+Stampa un numero usando o la notazione scientifica o quella in virgola
mobile, scegliendo la forma pi@`u concisa; se il risultato @`e stampato usando la
notazione scientifica, @samp{%G} usa @samp{E} invece di @samp{e}.
@@ -9941,7 +10016,7 @@ Stampa una stringa.
@item @code{%u}
Stampa un numero intero decimale, senza segno.
(Questo formato @`e poco usato, perch@'e tutti i numeri in @command{awk}
-sono a virgola mobile; @`e disponibile principalmente per compatibilit@`a col
+sono in virgola mobile; @`e disponibile principalmente per compatibilit@`a col
linguaggio C.)
@item @code{%x}, @code{%X}
@@ -9970,6 +10045,18 @@ stampare valori non validi, o comportarsi in modo completamente differente.
@value{DARKCORNER}
@end quotation
+@quotation NOTA
+Lo standard IEEE 754 per l'aritmetica in virgola mobile consente di
+avere valori speciali per rappresentare ``infinito'' (sia positivo che
+negativo) e valori che sono ``non numerici'' (NaN - [Not a Number]).
+
+L'input e l'output di tali valori avviene sotto forma di stringhe di
+testo. Ci@`o pone dei problemi nel linguaggio @command{awk}, che
+esisteva gi@`a prima della definizione dello standard IEEE. Dettagli
+ulteriori si possono trovare in @ref{Problemi virgola mobile POSIX};
+si prega di fare riferimento a quel testo.
+@end quotation
+
@node Modificatori di formato
@subsection Modificatori per specifiche di formato @code{printf}
@@ -10061,7 +10148,7 @@ di quella del valore da stampare.
@item @code{'}
Un carattere di apice singolo o un apostrofo @`e un'estensione POSIX allo
standard ISO C.
-Indica che la parte intera di un valore a virgola mobile, o la parte intera
+Indica che la parte intera di un valore in virgola mobile, o la parte intera
di un valore decimale intero, ha un carattere di separazione delle migliaia.
Ci@`o @`e applicabile solo alle localizzazioni che prevedono un tale carattere.
Per esempio:
@@ -10386,9 +10473,11 @@ alone for now and let's hope no-one notices.
@end ignore
@example
+@group
awk '@{ print $1 > "nomi.non.ordinati"
comando = "sort -r > nomi.ordinati"
print $1 | comando @}' mail-list
+@end group
@end example
La lista non ordinata @`e scritta usando una ridirezione normale, mentre
@@ -10703,12 +10792,12 @@ Questo avviene usando uno speciale @value{FN} della forma:
@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}
@end example
-il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
+Il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
Il @var{protocollo} pu@`o essere @samp{tcp} o @samp{udp},
e gli altri campi rappresentano gli altri dati essenziali
necessari per realizzare una connessione di rete.
Questi @value{FNS} sono usati con l'operatore @samp{|&} per comunicare
-con un coprocesso
+con @w{un coprocesso}
(@pxref{I/O bidirezionale}).
Questa @`e una funzionalit@`a avanzata, qui riferita solo per completezza.
Una spiegazione esauriente sar@`a fornita nella
@@ -10811,10 +10900,14 @@ essere uguale all'espressione usata per aprire il file o eseguire il comando,
Il precedente esempio cambia come segue:
@example
+@group
sortcom = "sort -r nomi"
sortcom | getline pippo
+@end group
+@group
@dots{}
close(sortcom)
+@end group
@end example
@noindent
@@ -10902,7 +10995,7 @@ per la @dfn{pipe} non @`e chiuso e liberato finch@'e non si chiama
@code{close()} non fa nulla (e non emette messaggi) se le viene fornito come
argomento una stringa che non rappresenta un file, una @dfn{pipe} o un
coprocesso che sia stato aperto mediante una ridirezione. In quel caso,
-@code{close()} restituisce un valore di ritorno negativo, che indica un
+@code{close()} restituisce un codice di ritorno negativo, che indica un
errore. Inoltre, @command{gawk} imposta @code{ERRNO}
a una stringa che indica il tipo di errore.
@@ -10928,19 +11021,19 @@ rinviata alla
@ref{I/O bidirezionale},
che ne parla pi@`u dettagliatamente e fornisce un esempio.
-@sidebar Usare il valore di ritorno di @code{close()}
+@sidebar Usare il codice di ritorno di @code{close()}
@cindex angolo buio, funzione @code{close()}
-@cindex funzione @code{close()}, valore di ritorno
-@cindex @code{close()}, funzione, valore di ritorno
-@cindex valore di ritorno@comma{} funzione @code{close()}
+@cindex funzione @code{close()}, codice di ritorno
+@cindex @code{close()}, funzione, codice di ritorno
+@cindex codice di ritorno@comma{} funzione @code{close()}
@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
@cindex Unix @command{awk}, funzione @code{close()} e
In molte versioni di Unix @command{awk}, la funzione @code{close()}
@`e in realt@`a un'istruzione.
@value{DARKCORNER}
-@`E un errore di sintassi tentare di usare il valore
-di ritorno da @code{close()}:
+@`E un errore di sintassi tentare di usare il
+codice di ritorno da @code{close()}:
@example
comando = "@dots{}"
@@ -10952,7 +11045,7 @@ retval = close(comando) # errore di sintassi in parecchi Unix awk
@cindex variabile @code{ERRNO}, con funzione @command{close()}
@cindex @code{ERRNO}, variabile, con funzione @command{close()}
@command{gawk} gestisce @code{close()} come una funzione.
-Il valore di ritorno @`e @minus{}1 se l'argomento designa un file
+Il codice di ritorno @`e @minus{}1 se l'argomento designa un file
che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
sistema nella chiusura del file o del processo.
In tal caso, @command{gawk} imposta la variabile predefinita
@@ -10960,18 +11053,18 @@ In tal caso, @command{gawk} imposta la variabile predefinita
In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
-il valore di ritorno @`e quello restituito dal comando,
+il codice di ritorno @`e quello restituito dal comando,
come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
-della @value{PVERSION} 4.2, il valore di ritorno dopo la chiusura di
+della @value{PVERSION} 4.2, il codice di ritorno dopo la chiusura di
una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
-Altrimenti, @`e il valore di ritorno dalla chiamata alle funzione
+Altrimenti, @`e il codice di ritorno dalla chiamata alle funzione
di sistema @code{close()} o alla funzione C @code{fclose()}
se si sta chiudendo un file in input o in output, rispettivamente.
Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
@float Tabella,table-close-pipe-return-values
-@caption{Valori di ritorno dalla @code{close()} di una @dfn{pipe}}
+@caption{Codici di ritorno dalla @code{close()} di una @dfn{pipe}}
@multitable @columnfractions .50 .50
@headitem Situazione @tab Valore restituito da @code{close()}
@item Uscita normale dal comando @tab Il codice di ritorno del comando
@@ -10985,7 +11078,7 @@ Lo standard POSIX @`e molto generico; dice che @code{close()}
restituisce zero se @`e terminata correttamente, e un valore diverso da zero
nell'altro caso. In generale,
implementazioni differenti variano in quel che restituiscono chiudendo una
-@dfn{pipe}; quindi, il valore di ritorno non pu@`o essere usato in modo
+@dfn{pipe}; quindi, il codice di ritorno non pu@`o essere usato in modo
portabile.
@value{DARKCORNER}
In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
@@ -11253,6 +11346,77 @@ tutti i possibili caratteri ASCII a otto bit, compreso il carattere ASCII
Altre implementazioni di @command{awk} possono avere difficolt@`a con alcuni
particolari codici di carattere.
+Alcuni linguaggi di programmazione consentono la continuazione di stringhe
+lunghe su pi@`u righe, qualora una riga termini con una barra inversa.
+Per esempio in C:
+
+@example
+#include <stdio.h>
+
+int main()
+@{
+ printf "ciao, \
+mondo\n");
+ return 0;
+@}
+@end example
+
+@noindent
+In questo caso, il compilatore C rimuove sia la barra inversa che il
+carattere di avanzamento riga (@dfn{newline}),
+producendo una stringa che equivale ad aver immesso
+@samp{"ciao, mondo\n"}. Ci@`o torna utile quando una stringa deve contenere
+una grande quantit@`a di testo.
+
+Lo standard POSIX afferma esplicitamente che
+il carattere di avanzamento riga
+non @`e consentito all'interno di costanti di tipo stringa.
+E in effetti, tutte le implementazioni di @command{awk} emettono un
+messaggio di errore se si tenta di utilizzarlo. Per esempio:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "ciao, }
+> @kbd{mondo" @}'}
+@print{} gawk: riga com.:1: BEGIN @{ print "ciao,
+@print{} gawk: riga com.:1: ^ stringa non terminata
+@print{} gawk: riga com.:1: BEGIN @{ print "ciao,
+@print{} gawk: riga com.:1: ^ syntax error
+@end example
+
+@cindex angolo buio, stringhe, continuazione su pi@`u righe
+@cindex stringhe, continuazione su pi@`u righe
+@cindex differenze tra @command{awk} e @command{gawk}, stringhe
+Sebbene POSIX non definisca cosa succede usando un carattere
+protetto di avanzamento riga, come nell'esempio in linguaggio C
+visto sopra, tutte le versioni di @command{awk} consentono di
+farlo. Sfortunatamente, quello che una particolare versione di
+@command{awk} fa con una tale stringa non @`e uniforme.
+@value{DARKCORNER} @command{gawk}, @command{mawk}, e
+OpenSolaris POSIX @command{awk} (@pxref{Altre versioni})
+tolgono sia la barra inversa che il carattere di
+avanzamento riga, come avviene nel linguaggio C:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "ciao, \}
+> @kbd{mondo" @}'}
+@print{} ciao, mondo
+@end example
+
+In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} non consente
+caratteri protetti di avanzamento riga. Altrimenti, il
+comportamento @`e quello descritto sopra.
+
+BKW @command{awk} e Busybox @command{awk}
+tolgono la barra inversa, ma lasciano indisturbato il carattere
+di avanzamento riga, che fa quindi parte della stringa:
+
+@example
+$ @kbd{nawk 'BEGIN @{ print "ciao, \}
+> @kbd{mondo" @}'}
+@print{} ciao,
+@print{} mondo
+@end example
+
@node Numeri non-decimali
@subsubsection Numeri ottali ed esadecimali
@cindex ottali, numeri
@@ -11486,6 +11650,7 @@ argomenti di funzioni definite dall'utente
(@pxref{Funzioni definite dall'utente}). Per esempio:
@example
+@group
function mysub(modello, sostituzione, stringa, globale)
@{
if (globale)
@@ -11494,13 +11659,16 @@ function mysub(modello, sostituzione, stringa, globale)
sub(modello, sostituzione, stringa)
return stringa
@}
+@end group
+@group
@{
@dots{}
text = "salve! salve a te!"
mysub(/salve/, "ciao", text, 1)
@dots{}
@}
+@end group
@end example
@c @cindex automatic warnings
@@ -11757,6 +11925,25 @@ sequenze di protezione
(@pxref{Sequenze di protezione}).
@value{DARKCORNER}
+Le variabili assegnate sulla riga di comando (sia tramite l'opzione
+@option{-v} che senza) sono trattate come stringhe. Quando tali variabili
+sono usate come numeri, viene effettuata la normale conversione automatica
+da stringhe a numeri, e ogni cosa ``funziona come deve''.
+
+Peraltro, @command{gawk} supporta variabili di tipo ``regexp''.
+Si possono assegnare valori a variabili di questo tipo usando la
+sintassi seguente:
+
+@example
+gawk -v 're1=@/pippo|pluto/' '@dots{}' /percorso/al/file1 're2=@/ciao|salve/' /percorso/al/file2
+@end example
+
+@noindent
+Le costanti @dfn{regexp} fortemente tipizzate sono un'altra
+funzionalit@`a avanzata disponibile
+(@pxref{costanti @dfn{regexp} fortemente tipizzate}).
+Sono ricordate qui solo per completezza.
+
@node Conversione
@subsection Conversione di stringhe e numeri
@@ -11786,8 +11973,10 @@ Se in una concatenazione di stringhe ci sono valori numerici, questi sono
convertiti in stringhe. Si consideri il seguente esempio:
@example
+@group
due = 2; tre = 3
print (due tre) + 4
+@end group
@end example
@noindent
@@ -11796,7 +11985,7 @@ variabili @code{due} e @code{tre} sono convertiti in stringhe e
concatenati insieme. La stringa risultante @`e riconvertita nel
numero 23, al quale poi viene aggiunto 4.
-@cindex stringhe nulle, conversione da tipo numerico a tipo stringa
+@cindex stringa nulla, conversione da tipo numerico a tipo stringa
@cindex conversione di tipo variabile
@cindex variabile, conversione di tipo
Se, per qualche ragione, si vuole forzare la conversione di un numero in
@@ -11935,8 +12124,8 @@ ancora descritte.
Infine, gli standard ufficiali correnti e la rappresentazione dei numeri
in virgola mobile dello standard IEEE possono avere un effetto insolito ma
importante sul modo in cui @command{gawk} converte alcuni valori di stringa
-speciali in
-numeri. I dettagli sono illustrati in @ref{Problemi virgola mobile POSIX}.
+speciali in numeri. I dettagli sono illustrati in
+@ref{Problemi virgola mobile POSIX}.
@node Tutti gli operatori
@section Operatori: fare qualcosa coi valori
@@ -12129,8 +12318,8 @@ print "qualcosa di significativo" > nome file
@cindex programma di utilit@`a @command{mawk}
@noindent
Questo produce un errore di sintassi in alcune versioni di
-@command{awk} per Unix.@footnote{Pu@`o capitare che BWK
-@command{awk}, @command{gawk} e @command{mawk} lo interpretino nel modo giusto,
+@command{awk} per Unix.@footnote{Pu@`o capitare che BWK @command{awk},
+@command{gawk} e @command{mawk} lo interpretino nel modo giusto,
ma non ci si dovrebbe fare affidamento.}
@`E necessario usare la seguente sintassi:
@@ -12288,10 +12477,14 @@ assegnato per ultimo. Nel seguente frammento di programma, la variabile
@code{pippo} ha dapprima un valore numerico, e in seguito un valore di stringa:
@example
+@group
pippo = 1
print pippo
+@end group
+@group
pippo = "pluto"
print pippo
+@end group
@end example
@noindent
@@ -12364,16 +12557,20 @@ di sinistra nell'espressione di destra. Per esempio:
@cindex Rankin, Pat
@example
+@group
# Grazie a Pat Rankin per quest'esempio
BEGIN @{
pippo[rand()] += 5
for (x in pippo)
print x, pippo[x]
-
+@end group
+
+@group
pluto[rand()] = pluto[rand()] + 5
for (x in pluto)
print x, pluto[x]
@}
+@end group
@end example
@cindex operatori di assegnamento, ordine di valutazione
@@ -13073,10 +13270,12 @@ omettendo uno dei due caratteri @samp{=}. Il risultato @`e sempre un codice
@command{awk} valido, ma il programma non fa quel che si voleva:
@example
+@group
if (a = b) # oops! dovrebbe essere == b
@dots{}
else
@dots{}
+@end group
@end example
@noindent
@@ -13525,7 +13724,7 @@ a un secondo momento; si veda @ref{Chiamate indirette}.
@cindex effetti collaterali, chiamate di funzione
Come ogni altra espressione, la chiamata di funzione ha un valore, chiamato
spesso @dfn{valore di ritorno}, che @`e calcolato dalla funzione
-in base agli argomenti dati. In quest'esempio, il valore di ritorno
+in base agli argomenti dati. In quest'esempio, il codice di ritorno
di @samp{sqrt(@var{argomento})} @`e la radice quadrata di @var{argomento}.
Il seguente programma legge numeri, un numero per riga, e stampa
la radice quadrata di ciascuno:
@@ -14079,8 +14278,10 @@ $ @kbd{awk '! /li/' mail-list}
@print{} Bill 555-1675 bill.drowning@@hotmail.com A
@print{} Camilla 555-2912 camilla.infusarum@@skynet.be R
@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
+@group
@print{} Martin 555-6480 martin.codicibus@@hotmail.com A
@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
+@end group
@end example
@cindex @code{BEGIN}, criterio di ricerca, criteri di ricerca booleani e
@@ -14200,6 +14401,7 @@ $ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
@end example
@cindex intervalli di ricerca, continuazione di riga e
+@cindex angolo buio, intervalli di ricerca, continuazione di riga e
Come punto di secondaria importanza, nonostante sia stilisticamente poco elegante,
lo standard POSIX consente di andare a capo dopo la virgola
in un intervallo di ricerca. @value{DARKCORNER}
@@ -14515,10 +14717,12 @@ variabile nel progamma @command{awk} contenuto nello @dfn{script}:
Per esempio, si consideri il programma seguente:
@example
+@group
printf "Immettere il criterio di ricerca: "
read criterio_di_ricerca
awk "/$criterio_di_ricerca/ "'@{ num_trov++ @}
END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
+@end group
@end example
@noindent
@@ -14734,10 +14938,12 @@ la stringa nulla; altrimenti, la condizione @`e vera.
Si consideri quanto segue:
@example
+@group
if (x % 2 == 0)
print "x @`e pari"
else
print "x @`e dispari"
+@end group
@end example
In questo esempio, se l'espressione @samp{x % 2 == 0} @`e vera (cio@`e,
@@ -14916,8 +15122,8 @@ awk '
@end example
@noindent
-Questo programma stampa i primi tre campi di ogni record in input, mettendo
-un campo su ogni riga.
+Questo programma stampa i primi tre campi di ogni record in input,
+mettendo un unico campo in una riga in output.
Non @`e possibile impostare
pi@`u di una variabile nella parte di
@@ -15089,6 +15295,7 @@ trova, se esiste, il divisore pi@`u piccolo di un dato numero intero, oppure
dichiara che si tratta di un numero primo:
@example
+@group
# trova il divisore pi@`u piccolo di num
@{
num = $1
@@ -15096,11 +15303,14 @@ dichiara che si tratta di un numero primo:
if (num % divisore == 0)
break
@}
+@end group
+@group
if (num % divisore == 0)
printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
else
printf "%d @`e un numero primo\n", num
@}
+@end group
@end example
Quando il resto della divisione @`e zero nella prima istruzione @code{if},
@@ -15424,7 +15634,7 @@ viene specificato alcun argomento,
Nel caso in cui un argomento
sia specificato in una prima istruzione @code{exit} e poi @code{exit} sia
chiamato una seconda volta all'interno di una regola @code{END} senza alcun
-argomento, @command{awk} usa il valore di ritorno specificato in precedenza.
+argomento, @command{awk} usa il codice di ritorno specificato in precedenza.
@value{DARKCORNER}
@xref{Codice di ritorno} per maggiori informazioni.
@@ -15436,14 +15646,18 @@ segnalano terminando con un codice di ritorno diverso da zero. Un programma
diverso da zero, come mostrato nell'esempio seguente:
@example
+@group
BEGIN @{
if (("date" | getline data_corrente) <= 0) @{
print "Non riesco a ottenere la data dal sistema" > "/dev/stderr"
exit 1
@}
+@end group
+@group
print "la data corrente @`e", data_corrente
close("date")
@}
+@end group
@end example
@quotation NOTA
@@ -15705,7 +15919,7 @@ il carattere di ritorno a capo.
@cindex @code{PREC}, variabile
@cindex variabile @code{PREC}
@item PREC #
-La precisione disponibile nei numeri a virgola mobile a precisione arbitraria,
+La precisione disponibile nei numeri in virgola mobile a precisione arbitraria,
per default 53 bit (@pxref{Impostare la precisione}).
@cindex @code{ROUNDMODE}, variabile
@@ -15798,6 +16012,7 @@ A differenza di quasi tutti i vettori di @command{awk},
Lo si pu@`o vedere nell'esempio seguente:
@example
+@group
$ @kbd{awk 'BEGIN @{}
> @kbd{for (i = 0; i < ARGC; i++)}
> @kbd{print ARGV[i]}
@@ -15805,6 +16020,7 @@ $ @kbd{awk 'BEGIN @{}
@print{} awk
@print{} inventory-shipped
@print{} mail-list
+@end group
@end example
@noindent
@@ -16003,7 +16219,7 @@ sono sicuramente sempre disponibili:
@table @code
@item PROCINFO["argv"]
-@cindex argomenti, riga di comando, @code{PROCINFO["argv"}
+@cindex argomenti, riga di comando, @code{PROCINFO["argv"]}
Il vettore @code{PROCINFO["argv"]} contiene tutti gli argomenti della riga di
comando (dopo che l'eventuale elaborazione di valutazione e ridirezione,
nelle piattaforme in cui ci@`o debba essere fatto a cura del programma), con
@@ -16084,6 +16300,31 @@ I valori riportano ci@`o che @command{gawk} sa sugli identificativi
dopo aver finito l'analisi iniziale del programma; questi valori @emph{non}
vengono pi@`u aggiornati durante l'esecuzione del programma.
+@item PROCINFO["platform"]
+@cindex piattaforma di esecuzione, @code{PROCINFO["platform"]}
+Quest'elemento restituisce una stringa che indica la piattaforma
+per la quale @command{gawk} @`e stato compilato. Il valore sar@`a
+uno dei seguenti:
+
+@c nested table
+@table @code
+@item "vms"
+OpenVMS o Vax/VMS.
+
+@item "djgpp"
+@itemx "mingw"
+Microsoft Windows, utilizzando DJGPP o MinGW, rispettivamente.
+
+@item "os2"
+OS/2.
+
+@item "os390"
+OS/390.
+
+@item "posix"
+GNU/Linux, Cygwin, Mac OS X, e sistemi Unix tradizionali.
+@end table
+
@item PROCINFO["pgrpid"]
@cindex @dfn{process group ID} del programma @command{gawk}
Il @dfn{ID di gruppo del processo} del programma corrente.
@@ -16165,17 +16406,17 @@ gruppi supplementari che il processo [Unix] possiede. Si usi l'operatore
I seguenti elementi consentono di modificare il comportamento di
@command{gawk}:
+@table @code
@item PROCINFO["NONFATAL"]
Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni
-consentono la prosecuzizone del programma.
+consentono la prosecuzione del programma.
@xref{Continuazione dopo errori}.
-@item PROCINFO["@var{nome_output}", "NONFATAL"]
-Gli errori in output per il file @var{nome_output}
-consentono la prosecuzizone del programma.
+@item PROCINFO["@var{nome}", "NONFATAL"]
+Gli errori di I/O per il file @var{nome}
+consentono la prosecuzione del programma.
@xref{Continuazione dopo errori}.
-@table @code
@item PROCINFO["@var{comando}", "pty"]
Per una comunicazione bidirezionale con @var{comando}, si usi una pseudo-tty
invece di impostare una @dfn{pipe} bidirezionale.
@@ -16186,7 +16427,7 @@ Imposta un tempo limite per leggere dalla ridirezione di input @var{input_name}.
@xref{Timeout in lettura} per ulteriori informazioni.
@item PROCINFO["@var{input_name}", "RETRY"]
-Se durante la lettura del file @var{input_name}si verifica un errore di I/O
+Se durante la lettura del file @var{input_name} si verifica un errore di I/O
per il quale si pu@`o ritentare una lettura, e questo elemento di vettore
esiste, @code{getline} d@`a come codice di ritorno @minus{}2 invece di
seguire il comportamento di default, che consiste nel restituire @minus{}1
@@ -16205,7 +16446,7 @@ l'ordine in cui gli indici dei vettori saranno elaborati nei cicli
@samp{for (@var{indice} in @var{vettore})}.
Questa @`e una funzionalit@`a avanzata, la cui descrizione completa sar@`a vista
pi@`u avanti; si veda
-@ref{Visitare un intero vettore}.
+@ref{Controllare visita}.
@end table
@cindex @code{RLENGTH}, variabile
@@ -16265,7 +16506,8 @@ controllare se un elemento in @code{SYMTAB} @`e un vettore.
Inoltre, non @`e possibile usare l'istruzione @code{delete} con il vettore
@code{SYMTAB}.
-@`E possibile aggiungere a @code{SYMTAB} un elemento che non sia un
+Prima della @value{PVERSION} 5.0 di @command{gawk}, era possibile
+usare come indice per @code{SYMTAB} una stringa che non era un
identificativo gi@`a esistente:
@example
@@ -16274,9 +16516,8 @@ print SYMTAB["xxx"]
@end example
@noindent
-Il risultato @`e quello previsto: in questo caso @code{SYMTAB} si comporta
-come un normale vettore. La sola differenza @`e che non @`e poi possibile
-cancellare @code{SYMTAB["xxx"]}.
+Ci@`o non @`e pi@`u possibile, e il farlo determina un errore
+fatale, perch@'e il poterlo fare era solo fonte di confusione.
@cindex Schorr, Andrew
Il vettore @code{SYMTAB} @`e pi@`u interessante di quel che sembra. Andrew
@@ -16284,6 +16525,7 @@ Schorr fa notare che effettivamente consente di ottenere dei puntatori ai dati
in @command{awk}. Si consideri quest'esempio:
@example
+@group
# Moltiplicazione indiretta di una qualsiasi variabile per un
# numero a piacere e restituzione del risultato
@@ -16291,6 +16533,7 @@ function multiply(variabile, numero)
@{
return SYMTAB[variabile] *= numero
@}
+@end group
@end example
@noindent
@@ -16369,6 +16612,7 @@ conteneva il programma seguente che visualizzava le informazioni contenute
in @code{ARGC} e @code{ARGV}:
@example
+@group
$ @kbd{awk 'BEGIN @{}
> @kbd{for (i = 0; i < ARGC; i++)}
> @kbd{print ARGV[i]}
@@ -16376,13 +16620,15 @@ $ @kbd{awk 'BEGIN @{}
@print{} awk
@print{} inventory-shipped
@print{} mail-list
+@end group
@end example
@noindent
In questo esempio, @code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
@samp{mail-list}.
-Si noti che il nome del programma @command{awk} non @`e incluso in @code{ARGV}.
+Si tenga presente che il nome del programma @command{awk}
+non @`e incluso in @code{ARGV}.
Le altre opzioni della riga di comando, con i relativi argomenti,
sono parimenti non presenti, compresi anche gli assegnamenti di
variabile fatti tramite l'opzione @option{-v}
@@ -17001,8 +17247,10 @@ Per esempio, quest'istruzione verifica se il vettore @code{frequenze}
contiene l'indice @samp{2}:
@example
+@group
if (2 in frequenze)
print "L'indice 2 @`e presente."
+@end group
@end example
Si noti che questo @emph{non} verifica se il vettore
@@ -17012,8 +17260,10 @@ elementi. Inoltre, questo @emph{non} crea @code{frequenze[2]}, mentre la
seguente alternativa (non corretta) lo fa:
@example
+@group
if (frequenze[2] != "")
print "L'indice 2 @`e presente."
+@end group
@end example
@node Impostare elementi
@@ -17071,6 +17321,7 @@ stampare tutte le righe.
Quando questo programma viene eseguito col seguente input:
@example
+@group
@c file eg/misc/arraymax.data
5 Io sono l'uomo Cinque
2 Chi sei? Il nuovo numero due!
@@ -17078,17 +17329,20 @@ Quando questo programma viene eseguito col seguente input:
1 Chi @`e il numero uno?
3 Sei il tre.
@c endfile
+@end group
@end example
@noindent
Il suo output @`e:
@example
+@group
1 Chi @`e il numero uno?
2 Chi sei? Il nuovo numero due!
3 Sei il tre.
4 . . . E quattro a terra
5 Io sono l'uomo Cinque
+@end group
@end example
Se un numero di riga appare pi@`u di una volta, l'ultima riga con quel dato
@@ -17098,11 +17352,13 @@ si possono saltare con un semplice perfezionamento della
regola @code{END} del programma, in questo modo:
@example
+@group
END @{
for (x = 1; x <= massimo; x++)
if (x in vett)
print vett[x]
@}
+@end group
@end example
@node Visitare un intero vettore
@@ -17123,8 +17379,10 @@ fare da indice in un vettore. Perci@`o @command{awk} ha un tipo speciale di
istruzione @code{for} per visitare un vettore:
@example
+@group
for (@var{variabile} in @var{vettore})
@var{corpo}
+@end group
@end example
@noindent
@@ -17147,12 +17405,15 @@ anche il numero di tali parole.
per maggiori informazioni sulla funzione predefinita @code{length()}.
@example
+@group
# Registra un 1 per ogni parola usata almeno una volta
@{
for (i = 1; i <= NF; i++)
usate[$i] = 1
@}
+@end group
+@group
# Trova il numero di parole distinte lunghe pi@`u di 10 caratteri
END @{
for (x in usate) @{
@@ -17163,6 +17424,7 @@ END @{
@}
print numero_parole_lunghe, "parole pi@`u lunghe di 10 caratteri"
@}
+@end group
@end example
@noindent
@@ -17571,9 +17833,11 @@ che assegnargli un valore nullo (la stringa vuota, @code{""}).
Per esempio:
@example
+@group
pippo[4] = ""
if (4 in pippo)
- print "Questo viene stampato, anche se pippo[4] @`e vuoto"
+ print "Questa riga viene stampata, anche se pippo[4] @`e vuoto"
+@end group
@end example
@cindex @dfn{lint}, controlli, elementi di vettori
@@ -17734,22 +17998,26 @@ END @{
Dato l'input:
@example
+@group
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
+@end group
@end example
@noindent
il programma produce il seguente output:
@example
+@group
4 3 2 1
5 4 3 2
6 5 4 3
1 6 5 4
2 1 6 5
3 2 1 6
+@end group
@end example
@node Visitare vettori multidimensionali
@@ -17921,7 +18189,7 @@ permette di verificare se un elemento di un vettore @`e esso stesso un vettore:
@example
for (i in vettore) @{
- if (isarray(vettore[i]) @{
+ if (isarray(vettore[i])) @{
for (j in vettore[i]) @{
print vettore[i][j]
@}
@@ -17937,15 +18205,19 @@ Per esempio,
il seguente codice stampa gli elementi del nostro vettore principale @code{a}:
@example
+@group
for (i in a) @{
for (j in a[i]) @{
if (j == 3) @{
for (k in a[i][j])
print a[i][j][k]
+@end group
+@group
@} else
print a[i][j]
@}
@}
+@end group
@end example
@noindent
@@ -18445,9 +18717,11 @@ asort(a)
genera i seguenti contenuti di @code{a}:
@example
+@group
a[1] = "cul"
a[2] = "de"
a[3] = "sac"
+@end group
@end example
La funzione @code{asorti()} si comporta in maniera simile ad @code{asort()};
@@ -18472,8 +18746,9 @@ Se @var{come} @`e una stringa che inizia
con @samp{g} o @samp{G} (abbreviazione di ``global''), sostituisce
ogni occorrenza di @var{regexp} con la stringa
@var{rimpiazzo}. Altrimenti, @var{come} @`e visto come un numero che indica
-quale corrispondenza di @var{regexp} va rimpiazzata. Se non si specifica
-il nome dell'@var{obiettivo}, si
+quale corrispondenza di @var{regexp} va rimpiazzata. Valori numerici
+inferiori a uno vengono gestiti come se avessero il valore uno.
+Se non si specifica il nome dell'@var{obiettivo}, si
opera su @code{$0}. La funzione restituisce come risultato la stringa
modificata, e la stringa originale di partenza @emph{non} viene modificata.
@@ -18845,8 +19120,8 @@ eventuale spazio bianco a fine stringa viene messo in
@code{@var{separatori}[@var{n}]}, dove @var{n} @`e il valore restituito da
@code{split()} (cio@`e il numero di elementi in @var{vettore}).
-La funzione @code{split()} divide le stringhe in pezzi in modo simile
-a quello con cui le righe in input sono divise in campi. Per esempio:
+La funzione @code{split()} divide le stringhe in pezzi nello stesso
+modo in cui le righe in input sono divise in campi. Per esempio:
@example
split("cul-de-sac", a, "-", separatori)
@@ -18882,6 +19157,9 @@ bianchi. Inoltre, come nel caso della divisione dei record in input, se
@var{separacampo} @`e la stringa nulla, ogni singolo carattere nella stringa
costituisce un elemento del vettore.
@value{COMMONEXT}
+Inoltre, se @var{separacampo} @`e una stringa costituita da un unico
+carattere, quella stringa fa da separatore, anche se il carattere
+in questione @`e un metacarattere usato nella espressioni regolari.
Si noti, tuttavia, che @code{RS} non influisce sul comportamento di
@code{split()}.
@@ -19601,6 +19879,9 @@ buffer di un file o @dfn{pipe} che era stato aperto in lettura
o se @var{nome_file} non @`e un file, una @dfn{pipe}, o un coprocesso aperto.
in tal caso, @code{fflush()} restituisce ancora @minus{}1.
+@c end the table to let the sidebar take up the full width of the page.
+@end table
+
@sidebar Bufferizzazione interattiva e non interattiva
@cindex bufferizzazione, interattiva vs.@: non interattiva
@@ -19648,13 +19929,14 @@ In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
@dfn{pipe} al comando @command{cat} in un colpo solo.
@end sidebar
+@table @asis
@item @code{system(@var{comando})}
@cindexawkfunc{system}
@cindex chiamare comandi di shell
@cindex interagire con altri programmi
Esegue il comando del sistema operativo @var{comando} e quindi
ritorna al programma @command{awk}.
-Restituisce il codice ritorno di @var{comando}.
+Restituisce il codice di ritorno di @var{comando}.
Per esempio, inserendo il seguente frammento di codice in un programma
@command{awk}:
@@ -19712,7 +19994,7 @@ semplicemente limitata a restituire il valore del codice di ritorno
diviso per 256 (ossia la met@`a sinistra del numero di 16 bit, spostata
a destra). In una situazione normale questo equivale a utilizzare il
codice di ritornodi @code{system()}, ma nel caso in cui il programma sia
-stato terminato da un segnale, il valore diventa un numero frazionale a
+stato terminato da un segnale, il valore diventa un numero frazionale in
virgola mobile.@footnote{In uno scambio di messaggi privato il Dr.@:
Kernighan mi ha comunicato che questo modo di procedere @`e probabilmente
errato.} POSIX stabilisce che la chiamata a @code{system()} dall'interno
@@ -19736,6 +20018,9 @@ I valori del codice di ritorno sono descritti nella
@end float
@end table
+A partire dalla versione di agosto 2018, BWK @command{awk} si comporta
+come @command{gawk} per il codice di ritorno della chiamata @code{system()}.
+
@sidebar Controllare la bufferizzazione dell'output con @code{system()}
@cindex buffer, scrivere su disco un
@cindex bufferizzazione, dell'input/output
@@ -20391,7 +20676,7 @@ le operazioni a livello di bit.
I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
@cindex @command{gawk}, operazioni a livello di bit in
-@table @code
+@table @asis
@cindexgawkfunc{and}
@cindex AND, operazione sui bit
@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
@@ -20445,7 +20730,7 @@ che illustra l'uso di queste funzioni:
@example
@group
@c file eg/lib/bits2str.awk
-# bits2str --- decodifica un byte in una serie di 0/1 leggibili
+# bits2str --- decodifica un numero intero in una serie di 0/1 leggibili
function bits2str(byte, dati, maschera)
@{
@@ -20467,7 +20752,7 @@ function bits2str(byte, dati, maschera)
@c this is a hack to make testbits.awk self-contained
@ignore
@c file eg/prog/testbits.awk
-# bits2str --- turn a byte into readable 1's and 0's
+# bits2str --- turn an integer into readable ones and zeros
function bits2str(bits, data, mask)
@{
@@ -20508,8 +20793,8 @@ $ @kbd{gawk -f testbits.awk}
@print{} 123 = 01111011
@print{} 0123 = 01010011
@print{} 0x99 = 10011001
-@print{} compl(0x99) = 0x3fffffffffff66 = 001111111111111111111111111111111
-@print{} 11111111111111101100110
+@print{} compl(0x99) = 0x3fffffffffff66 =
+@print{} 00111111111111111111111111111111111111111111111101100110
@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
@print{} rshift(0x99, 2) = 0x26 = 00100110
@end example
@@ -20546,14 +20831,14 @@ e poi mostra i risultati delle funzioni
@sidebar Attenzione. Non @`e tutto oro quel che luccica!
In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
-non su valori a virgola mobile. Come regola generale, tali operazioni
+non su valori in virgola mobile. Come regola generale, tali operazioni
funzionano meglio se eseguite su interi senza segno.
@command{gawk} tenta di trattare gli argomenti delle funzioni
"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
provocano un errore fatale.
-In una normale operazione, per tutte queste funzioni, prima il valore a virgola
+In una normale operazione, per tutte queste funzioni, prima il valore in virgola
mobile a doppia precisione viene convertito nel tipo intero senza segno di C
pi@`u ampio, poi viene eseguita l'operazione "bit a bit". Se il risultato non
pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
@@ -20588,13 +20873,14 @@ $ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
-interi come regolari valori a virgola mobile con doppia precisione, che
+interi come regolari valori in virgola mobile con doppia precisione, che
mantengono solo 53 bit di precisione. Inoltre, la libreria GNU MP tratta
-(o almeno sembra che tratti) il bit iniziale come un bit con segno; cos@`i il
+(o almeno sembra che tratti) il bit iniziale come un bit con segno;
+cos@`{@dotless{i}} il
risultato con @option{-M} in questo caso @`e un numero negativo.
In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
-tranne le pi@`u semplici, probabilmente @`e una cattiva idea; caveat emptor!
+tranne le pi@`u semplici, probabilmente @`e una cattiva idea; @dfn{caveat emptor}!
@end sidebar
@@ -20799,10 +21085,12 @@ legge l'intero programma, prima di iniziare ad eseguirlo.
La definizione di una funzione chiamata @var{nome} @`e simile a questa:
@display
+@group
@code{function} @var{nome}@code{(}[@var{lista-parametri}]@code{)}
@code{@{}
@var{corpo-della-funzione}
@code{@}}
+@end group
@end display
@cindex nomi di funzione
@@ -20989,11 +21277,13 @@ La funzione seguente cancella tutti gli elementi in un vettore
l'inizio della lista delle variabili locali):
@example
+@group
function cancella_vettore(a, i)
@{
for (i in a)
delete a[i]
@}
+@end group
@end example
Quando si lavora con vettori, @`e spesso necessario cancellare
@@ -21215,10 +21505,12 @@ Inoltre, chiamate ricorsive creano nuovi vettori.
Si consideri questo esempio:
@example
+@group
function qualche_funz(p1, a)
@{
if (p1++ > 3)
return
+@end group
a[p1] = p1
@@ -21283,12 +21575,14 @@ locali, ci@`o non influisce su nessun'altra variabile. Quindi, se
@code{mia_funzione()} fa questo:
@example
+@group
function mia_funzione(stringa)
@{
print stringa
stringa = "zzz"
print stringa
@}
+@end group
@end example
@noindent
@@ -21466,11 +21760,13 @@ function massimo(vettore, i, max)
return max
@}
+@group
# Carica tutti i campi di ogni record in numeri.
@{
for (i = 1; i <= NF; i++)
numeri[NR, i] = $i
@}
+@end group
END @{
print massimo(numeri)
@@ -21606,7 +21902,7 @@ usando la chiamata indiretta di funzioni:
@ignore
@c file eg/prog/indirectcall.awk
#
-# Arnold Robbins, arnold@skeeve.com, Public Domain
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
# January 2009
@c endfile
@end ignore
@@ -21781,12 +22077,14 @@ di confronto:
@example
@c file eg/prog/indirectcall.awk
+@group
# num_min --- confronto numerico per minore di
function num_min(sinistra, destra)
@{
return ((sinistra + 0) < (destra + 0))
@}
+@end group
# num_magg_o_ug --- confronto numerico per maggiore o uguale
@@ -21839,6 +22137,7 @@ Per finire, le due funzioni di ordinamento chiamano la funzione
@example
@c file eg/prog/indirectcall.awk
+@group
# ascendente --- ordina i dati in ordine crescente
# e li restituisce sotto forma di stringa
@@ -21846,7 +22145,9 @@ function ascendente(primo, ultimo)
@{
return ordina(primo, ultimo, "num_min")
@}
+@end group
+@group
# discendente --- ordina i dati in ordine decrescente
# e li restituisce sotto forma di stringa
@@ -21854,6 +22155,7 @@ function discendente(primo, ultimo)
@{
return ordina(primo, ultimo, "num_magg_o_ug")
@}
+@end group
@c endfile
@end example
@@ -22368,7 +22670,7 @@ Se la stringa in input corrisponde all'espressione regolare che descrive i
numeri ottali, @code{mystrtonum()} esegue il ciclo per ogni carattere presente
nella stringa. Imposta @code{k} all'indice in @code{"1234567"} della cifra
ottale corrente.
-Il valore di ritorno sar@`a lo stesso numero della cifra, o zero
+Il codice di ritorno sar@`a lo stesso numero della cifra, o zero
se il carattere non c'@`e, il che succeder@`a per ogni cifra @samp{0}.
Questo si pu@`o fare, perch@'e il test di @dfn{regexp} nell'istruzione @code{if}
assicura che vengano scelti per
@@ -22412,6 +22714,7 @@ il programma.
In C, l'uso di @code{assert()} @`e simile a questo:
@example
+@group
#include <assert.h>
int myfunc(int a, double b)
@@ -22419,6 +22722,7 @@ int myfunc(int a, double b)
assert(a <= 5 && b >= 17.1);
@dots{}
@}
+@end group
@end example
Se l'asserzione @`e falsa, il programma stampa un messaggio simile a questo:
@@ -22589,9 +22893,10 @@ function round(x, ival, aval, frazione)
@}
@c endfile
@c don't include test harness in the file that gets installed
-
+@group
# codice per testare, commentato
# @{ print $0, round($0) @}
+@end group
@end example
@node Funzione random Cliff
@@ -23021,7 +23326,7 @@ rapidamente, e quindi @command{gawk} inserisce in
@code{temp} l'intero contenuto del file.
(@xref{Record} per informazioni su @code{RT} e @code{RS}.)
-Se @code{file} @`e vuoto, il valore di ritorno @`e la stringa vuota.
+Se @code{file} @`e vuoto, il codice di ritorno @`e la stringa vuota.
Quindi, il codice chiamante pu@`o usare qualcosa simile a questo:
@example
@@ -23031,7 +23336,7 @@ if (length(contenuto) == 0)
@end example
La verifica serve a determinare se il file @`e vuoto o no. Una verifica
-equivalente potrebbe essere @samp{contenuto == ""}.
+equivalente potrebbe essere @samp{@w{contenuto == ""}}.
@xref{Esempio di estensione Readfile} per una funzione di estensione
anch'essa finalizzata a leggere un intero file in memoria.
@@ -23361,8 +23666,10 @@ $ @kbd{gawk -f rewind.awk -f test.awk dati }
@print{} data 1 a
@print{} data 2 b
@print{} data 3 c
+@group
@print{} data 4 d
@print{} data 5 e
+@end group
@end example
@node Controllo di file
@@ -23731,7 +24038,7 @@ man mano che si elencano i pezzi di codice che la compongono:
@end example
La funzione inizia con commenti che elencano e descrivono le variabili globali
-utilizzate, spiegano quali sono i valori di ritorno, il loro significato, e
+utilizzate, spiegano quali sono i codici di ritorno, il loro significato, e
ogni altra variabile che @`e
``esclusiva'' a questa funzione di libreria. Tale
documentazione @`e essenziale per qualsiasi programma, e in modo particolare per
@@ -24709,8 +25016,10 @@ function getgrent()
_gr_init()
if (++_gr_contatore in _gr_bycount)
return _gr_bycount[_gr_contatore]
+@group
return ""
@}
+@end group
@c endfile
@end example
@@ -24751,8 +25060,8 @@ usa queste funzioni.
@iftex
La
@end iftex
-@ref{Vettori di vettori} trattava come @command{gawk}
-avere a disposizione vettori di vettori. In particolare, qualsiasi elemento di
+@ref{Vettori di vettori} trattava di come @command{gawk}
+mette a disposizione vettori di vettori. In particolare, qualsiasi elemento di
un vettore pu@`o essere uno scalare o un altro vettore. La funzione
@code{isarray()} (@pxref{Funzioni per i tipi})
permette di distinguere un vettore
@@ -25290,10 +25599,12 @@ preparare la lista dei campi o dei caratteri:
if (per_campi == 0 && per_caratteri == 0)
per_campi = 1 # default
+@group
if (lista_campi == "") @{
print "cut: specificare lista per -c o -f" > "/dev/stderr"
exit 1
@}
+@end group
if (per_campi)
prepara_lista_campi()
@@ -25538,7 +25849,7 @@ da implementare con @command{gawk}; basta usare la variabile predefinita
@c file eg/prog/egrep.awk
# Opzioni:
# -c conta le righe trovate
-# -s sileziosa: genera solo il codice di ritorno
+# -s silenziosa: genera solo il codice di ritorno
# -v inverte test, successo se @dfn{regexp} non presente
# -i ignora maiuscolo/minuscolo
# -l stampa solo nomi file
@@ -25641,8 +25952,8 @@ function a_inizio_file(da_buttare)
La funzione @code{endfile()} viene chiamata dopo l'elaborazione di ogni file.
Ha influenza sull'output solo quando l'utente desidera un contatore del
numero di righe che sono state individuate. @code{non_stampare} @`e vero nel
-caso si desideri solo il codice di
-ritorno. @code{conta_e_basta} @`e vero se si desiderano solo i contatori
+caso si desideri solo il codice di ritorno.
+@code{conta_e_basta} @`e vero se si desiderano solo i contatori
delle righe trovate. @command{egrep}
quindi stampa i contatori solo se
sia la stampa che il conteggio delle righe sono stati abilitati.
@@ -25662,8 +25973,10 @@ function endfile(file)
print contatore_file
@}
+@group
totale += contatore_file
@}
+@end group
@c endfile
@end example
@@ -25837,11 +26150,15 @@ BEGIN @{
pw = getpwuid(uid)
stampa_primo_campo(pw)
+@group
if (euid != uid) @{
printf(" euid=%d", euid)
pw = getpwuid(euid)
+@end group
+@group
stampa_primo_campo(pw)
@}
+@end group
printf(" gid=%d", gid)
pw = getgrgid(gid)
@@ -25974,14 +26291,17 @@ BEGIN @{
# testa argv nel caso che si legga da stdin invece che da file
if (i in ARGV)
i++ # salta nome file-dati
+@group
if (i in ARGV) @{
outfile = ARGV[i]
ARGV[i] = ""
@}
-
+@end group
+@group
s1 = s2 = "a"
out = (outfile s1 s2)
@}
+@end group
@c endfile
@end example
@@ -26146,11 +26466,15 @@ indicato nella riga di comando, e poi sullo standard output:
@`E anche possibile scrivere il ciclo cos@`{@dotless{i}}:
@example
+@group
for (i in copia)
if (append)
print >> copia[i]
+@end group
+@group
else
print > copia[i]
+@end group
@end example
@noindent
@@ -26305,10 +26629,12 @@ BEGIN @{
sintassi()
@}
+@group
if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
conta_caratteri = substr(ARGV[Optind], 2) + 0
Optind++
@}
+@end group
for (i = 1; i < Optind; i++)
ARGV[i] = ""
@@ -26345,11 +26671,13 @@ occorre saltare dei caratteri, si usa @code{substr()} per eliminare i primi
@example
@c file eg/prog/uniq.awk
+@group
function se_sono_uguali( n, m, campi_ultima, campi_corrente,\
vettore_ultima, vettore_corrente)
@{
if (contatore_file == 0 && conta_caratteri == 0)
return (ultima == $0)
+@end group
if (contatore_file > 0) @{
n = split(ultima, vettore_ultima)
@@ -26364,9 +26692,11 @@ vettore_ultima, vettore_corrente)
campi_ultima = substr(campi_ultima, conta_caratteri + 1)
campi_corrente = substr(campi_corrente, conta_caratteri + 1)
@}
+@group
return (campi_ultima == campi_corrente)
@}
+@end group
@c endfile
@end example
@@ -26428,11 +26758,13 @@ NR == 1 @{
END @{
if (conta_record)
printf("%4d %s\n", contatore, ultima) > file_output
+@group
else if ((solo_ripetute && contatore > 1) ||
(solo_non_ripetute && contatore == 1))
print ultima > file_output
close(file_output)
@}
+@end group
@c endfile
@end example
@@ -27272,10 +27604,12 @@ A prima vista, un programma come questo sembrerebbe essere sufficiente:
freq[$i]++
@}
+@group
END @{
for (word in freq)
printf "%s\t%d\n", word, freq[word]
@}
+@end group
@end example
Il programma si affida al meccanismo con cui @command{awk} divide i campi per
@@ -27662,7 +27996,7 @@ La riga @`e poi stampata nel file di output:
@}
if ($3 != file_corrente) @{
if (file_corrente != "")
- close(file_corrente)
+ lista_file[file_corrente] = 1 # memorizza per chiudere dopo
file_corrente = $3
@}
@@ -27689,9 +28023,11 @@ La riga @`e poi stampata nel file di output:
i++
@}
@}
+@group
print join(a, 1, n, SUBSEP) > file_corrente
@}
@}
+@end group
@c endfile
@end example
@@ -27699,14 +28035,35 @@ La riga @`e poi stampata nel file di output:
L'output fatto usando @samp{>} apre il file solo la prima volta; il file resta
poi aperto, e ogni scrittura successiva @`e aggiunta in fondo al file.
(@pxref{Ridirezione}).
-Ci@`o rende possibile mischiare testo del programm e commenti esplicativi
+Ci@`o rende agevole mischiare testo del programma e commenti esplicativi
(come @`e stato fatto qui) nello stesso file sorgente, senza nessun problema.
Il file viene chiuso solo quando viene trovato un nuovo nome di
@value{DF} oppure alla fine del file in input.
+Quando si incontra un nuovo @value{FN}, invece di chiudere il file,
+il programma memorizza il nome del file corrente in @code{lista_file}.
+Ci@`o rende possibile mischiare il codice per pi@`u di un file nel file
+sorgente Texinfo in input. (Precedenti versioni di questo programma
+chiudevano @emph{davvero} il file. Ma, a causa della ridirezione
+@samp{>}, un file le cui parti non erano tutte una di seguito all'altra
+finiva per contenere errori.)
+Una regola @code{END} effettua la chiusura di tutti i file aperti, quando
+l'elaborazione @`e stata completata:
+
+@example
+@c file eg/prog/extract.awk
+@group
+END @{
+ close(file_corrente) # chiudi l'ultimo file
+ for (f in lista_file) # chiudi tutti gli altri
+ close(f)
+@}
+@end group
+@c endfile
+@end example
+
Per finire, la funzione @code{@w{fine_file_inattesa()}} stampa un
-appropriato messaggio di errore ed esce.
-La regola @code{END} gestisce la pulizia finale, chiudendo il file aperto:
+appropriato messaggio di errore ed esce:
@example
@c file eg/prog/extract.awk
@@ -27718,11 +28075,6 @@ function fine_file_inattesa()
exit 1
@}
@end group
-
-END @{
- if (file_corrente)
- close(file_corrente)
-@}
@c endfile
@end example
@@ -27784,10 +28136,12 @@ function sintassi()
exit 1
@}
+@group
BEGIN @{
# valida argomenti
if (ARGC < 3)
sintassi()
+@end group
RS = ARGV[1]
ORS = ARGV[2]
@@ -28216,13 +28570,11 @@ di zero, il programma @`e terminato:
continue
@}
cammino = percorso($2)
-@group
if (cammino == "") @{
printf("igawk: %s:%d: non riesco a trovare %s\n",
input[indice_pila], FNR, $2) > "/dev/stderr"
continue
@}
-@end group
if (! (cammino in gia_fatto)) @{
gia_fatto[cammino] = input[indice_pila]
input[++indice_pila] = cammino # aggiungilo alla pila
@@ -28493,10 +28845,12 @@ notice and this notice are preserved.
Ecco il programma:
@example
+@group
awk 'BEGIN@{O="~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c";
printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O,
X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O,
O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),x-O@}'
+@end group
@end example
@c genera l'email del tizio:
@c dave_br@gmx.com
@@ -29022,7 +29376,7 @@ sono i corrispondenti valori dei due elementi che si stanno confrontando.
@code{v1} oppure @code{v2}, o entrambi, possono essere vettori se il vettore
che si sta visitando contiene sottovettori come valori.
(@xref{Vettori di vettori} per maggiori informazioni sui sottovettori.)
-I tre possibili valori di ritorno sono interpretati nel seguente modo:
+I tre possibili codici di ritorno sono interpretati nel seguente modo:
@table @code
@item confronta(i1, v1, i2, v2) < 0
@@ -29042,11 +29396,13 @@ La prima funzione di confronto pu@`o essere usata per scorrere un vettore
secondo l'ordine numerico degli indici:
@example
+@group
function cfr_ind_num(i1, v1, i2, v2)
@{
# confronto di indici numerici, ordine crescente
return (i1 - i2)
@}
+@end group
@end example
La seconda funzione scorre un vettore secondo l'ordine delle stringhe
@@ -29155,10 +29511,13 @@ function per_campo(i1, v1, i2, v2)
a[NR][i] = $i
@}
+@group
END @{
PROCINFO["sorted_in"] = "per_campo"
+@end group
if (POS < 1 || POS > NF)
POS = 1
+
for (i in a) @{
for (j = 1; j <= NF; j++)
printf("%s%c", a[i][j], j < NF ? ":" : "")
@@ -29215,6 +29574,7 @@ function per_numero(i1, v1, i2, v2)
return (v1 != v2) ? (v2 - v1) : (i2 - i1)
@}
+@group
function per_stringa(i1, v1, i2, v2)
@{
# confronto di valori di stringa (e indici), ordine decrescente
@@ -29222,6 +29582,7 @@ function per_stringa(i1, v1, i2, v2)
v2 = v2 i2
return (v1 > v2) ? -1 : (v1 != v2)
@}
+@end group
@end example
@c Avoid using the term ``stable'' when describing the unpredictable behavior
@@ -29288,7 +29649,7 @@ for (i = 1; i <= n; i++)
Dopo la chiamata ad @code{asort()}, il vettore @code{dati} @`e indicizzato da 1
a @var{n}, il numero totale di elementi in @code{dati}.
-(Questo conteggio @`e il valore di ritorno di @code{asort()}).
+(Questo conteggio @`e il codice di ritorno di @code{asort()}).
@code{dati[1]} @value{LEQ} @code{dati[2]} @value{LEQ} @code{dati[3]}, e cos@`{@dotless{i}}
via. Il confronto di default @`e basato sul tipo di elementi
(@pxref{Tipi di variabile e confronti}).
@@ -29387,11 +29748,13 @@ trasforma gli elementi da confrontare in lettere minuscole, in modo da avere
confronti che non dipendono da maiuscolo/minuscolo.
@example
+@group
# confronta_in_minuscolo --- confronta stringhe ignorando maiuscolo/minuscolo
function confronta_in_minuscolo(i1, v1, i2, v2, l, r)
@{
l = tolower(v1)
+@end group
r = tolower(v2)
if (l < r)
@@ -29678,6 +30041,55 @@ programmazione attenta, insieme alla conoscenza del comportamento del
coprocesso.
@end quotation
+@c From email send January 4, 2018.
+L'esempio seguente, preparato da Andrew Schorr, dimostra come
+l'utilizzo delle @dfn{pty} pu@`o servire a evitare situazioni
+di stallo connesse con i buffer
+
+Si supponga che @command{gawk} non sia in grado di sommare dei numeri.
+Si potrebbe usare un coprocesso per farlo. Ecco un programma fin troppo
+semplice, che pu@`o svolgere tale funzione:
+
+@example
+$ @kbd{cat add.c}
+#include <stdio.h>
+
+int
+main(void)
+@{
+ int x, y;
+ while (scanf("%d %d", & x, & y) == 2)
+ printf("%d\n", x + y);
+ return 0;
+@}
+$ @kbd{cc -O add.c -o add} @ii{Compilazione del programma}
+@end example
+
+Si potrebbe poi scrivere un programma @command{gawk} fin troppo semplice,
+per sommare dei numeri passandoli al coprocesso:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=./add '@{ print |& cmd; cmd |& getline x; print x @}'}
+@end example
+
+E il programma andrebbe in stallo, poich@'e, @file{add.c} non chiama a sua
+volta @samp{setlinebuf(stdout)}. Il programma @command{add} si blocca.
+
+Ora, si provi invece con:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=add 'BEGIN @{ PROCINFO[cmd, "pty"] = 1 @}}
+> @kbd{ @{ print |& cmd; cmd |& getline x; print x @}'}
+@print{} 3
+@end example
+
+Usando una @dfn{pty}, @command{gawk} fa s@`{@dotless{i}} che la libreria di I/O
+determini di avere a che fare con una sessione interattiva, e quindi
+utilizzi per default una riga alla volta come buffer.
+E ora, magicamente, funziona!
+
@node Reti TCP/IP
@section Usare @command{gawk} per la programmazione di rete
@cindex funzionalit@`a avanzate, programmazione di rete
@@ -29794,7 +30206,7 @@ TCP del sistema locale.
Stampa poi il risultato e chiude la connessione.
Poich@'e questo tema @`e molto ampio, l'uso di @command{gawk} per
-la programmazione TCP/IP viene documentato separatamente.
+la programmazione TCP/IP viene documentata separatamente.
@ifinfo
Si veda
@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
@@ -30010,6 +30422,8 @@ struttura del programma e dalle regole di precedenza.
Per esempio, @samp{(3 + 5) * 4} significa sommare tre e cinque, quindi
moltiplicare il totale per quattro. Di contro, @samp{3 + 5 * 4} non ha
parentesi, e significa @samp{3 + (5 * 4)}.
+Tuttavia, le parentesi inserite esplicitamente nel programma sorgente
+sono conservate come sono state scritte.
@ignore
@item
@@ -30048,12 +30462,14 @@ appaiono come:
@example
/pippo/ @{
- print $0
+ print
@}
@end example
@noindent
che @`e corretto, ma probabilmente inatteso.
+(Se un programma usa sia @samp{print $0} che un semplice
+@samp{print}, tale differenza @`e mantenuta.)
@cindex profilare programmi @command{awk}, dinamicamente
@cindex @command{gawk}, programma, profilazione dinamica
@@ -30135,16 +30551,15 @@ Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma.
Ora non pi@`u.
@end quotation
-C'@`e una differenza significativa tra l'output creato durante la profilazione, e
-quello creato durante la stampa elegante. L'output della stampa elegante
+C'@`e una differenza significativa tra l'output creato durante la profilazione,
+e quello creato durante la stampa elegante. L'output della stampa elegante
preserva i commenti originali che erano nel programma, anche se la loro
posizione pu@`o non corrispondere esattamente alle posizioni originali che
-avevano nel codice sorgente.@footnote{@command{gawk} fa del suo meglio
+avevano nel codice sorgente. Tuttavia, nessun commento dovrebbe andare
+perso. Inoltre, @command{gawk} fa del suo meglio
per mantenere la distinzione tra commenti posti dopo delle istruzioni e
-commenti su righe a s@'e stanti. Per limiti insiti nell'implementazione,
-non sempre questo pu@`o avvenire in maniera corretta, in particolare nel
-caso di istruzioni @code{switch}. I manutentori di @command{gawk}
-sperano di poter migliorare la situazione in una futura versione.}
+commenti su righe a s@'e stanti. Tuttavia, non sempre questo pu@`o avvenire
+in maniera perfetta.
Comunque, per una precisa scelta progettuale, l'output della profilazione
@emph{omette} i commenti del programma originale. Questo permette di
@@ -30863,9 +31278,11 @@ con altri contenenti degli specificatori posizionali in una stessa stringa di
formato:
@example
+@group
$ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "ciao" @}'}
@error{} gawk: riga com.:1: fatale: `count$' va usato per tutti
@error{} i formati o per nessuno
+@end group
@end example
@quotation NOTA
@@ -31287,7 +31704,7 @@ attiva. Tale pila (@dfn{stack}) @`e chiamata @dfn{call stack} (pila delle chiam
Per ciascuna funzione della pila delle chiamate (@dfn{call stack}), il sistema
mantiene un'area di dati che contiene i parametri della funzione, le variabili
-locali e i valori di ritorno, e anche ogni altra informazione ``contabile''
+locali e i codici di ritorno, e anche ogni altra informazione ``contabile''
necessaria per gestire la pila delle chiamate. Quest'area di dati @`e chiamata
@dfn{stack frame}.
@@ -31535,8 +31952,10 @@ ulteriormente, iniziamo a ``scorrere una ad una'' le righe di
[successivo]):
@example
+@group
gawk> @kbd{n}
@print{} 66 if (contatore_file > 0) @{
+@end group
@end example
Questo ci dice che @command{gawk} ora @`e pronto per eseguire la riga 66, che
@@ -31938,7 +32357,7 @@ Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
@cindex @code{return}, comando del debugger
@item @code{return} [@var{valore}]
Cancella l'esecuzione di una chiamata di funzione. Se @var{valore} (una
-stringa o un numero) viene specificato, @`e usato come valore di ritorno della
+stringa o un numero) viene specificato, @`e usato come codice di ritorno della
funzione. Se usato in un frame diverso da quello pi@`u interno (la funzione
correntemente in esecuzione; cio@`e, il frame numero 0), ignora tutti i frame
pi@`u interni di quello selezionato, e il chiamante del frame selezionato
@@ -32364,10 +32783,12 @@ Davide Brini (@pxref{Programma signature}):
@c FIXME: This will need updating if num-handler branch is ever merged in.
@smallexample
+@group
gawk> @kbd{dump}
@print{} # BEGIN
@print{}
@print{} [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk]
+@end group
@print{} [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR]
@print{} [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR]
@print{} [ 1:0xfcc280] Op_match :
@@ -32400,18 +32821,18 @@ gawk> @kbd{dump}
@print{} [ :0xfcc660] Op_no_op :
@print{} [ 1:0xfcc520] Op_assign_concat : c
@print{} [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440]
-@print{}
@dots{}
-@print{}
@print{} [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""]
@print{} [ :0xfcc140] Op_no_op :
@print{} [ :0xfcc1c0] Op_atexit :
@print{} [ :0xfcc640] Op_stop :
@print{} [ :0xfcc180] Op_no_op :
@print{} [ :0xfcd150] Op_after_beginfile :
+@group
@print{} [ :0xfcc160] Op_no_op :
@print{} [ :0xfcc1a0] Op_after_endfile :
gawk>
+@end group
@end smallexample
@cindex comando del debugger, @code{exit}
@@ -32805,55 +33226,84 @@ mentre i valori senza segno sono sempre maggiori o uguali a zero.
Nei sistemi informatici, il calcolo con valori interi @`e esatto, ma il possibile
campo di variazione dei valori @`e limitato. L'elaborazione con numeri interi @`e
-pi@`u veloce di quella con numeri a virgola mobile.
+pi@`u veloce di quella con numeri in virgola mobile.
-@item La matematica coi numeri a virgola mobile
-I numeri a virgola mobile rappresentano quelli che a scuola sono chiamati
+@cindex virgola mobile, numeri in
+@cindex numeri in virgola mobile
+@item La matematica coi numeri in virgola mobile
+I numeri in virgola mobile rappresentano quelli che a scuola sono chiamati
numeri ``reali'' (cio@`e, quelli che hanno una parte frazionaria, come
-3.1415927). Il vantaggio dei numeri a virgola mobile @`e che essi possono
+3.1415927). Il vantaggio dei numeri in virgola mobile @`e che essi possono
rappresentare uno spettro di valori molto pi@`u ampio di quello rappresentato dai
numeri interi. Lo svantaggio @`e che ci sono numeri che essi non possono
rappresentare in modo esatto.
-I computer moderni possono eseguire calcoli su valori a virgola mobile
+I computer moderni possono eseguire calcoli su valori in virgola mobile
nell'hardware dell'elaboratore, entro un intervallo di valori limitato.
-Ci sono inoltre librerie di programmi che consentono calcoli, usando numeri a
+Ci sono inoltre librerie di programmi che consentono calcoli, usando numeri in
virgola mobile, di precisione arbitraria.
-POSIX @command{awk} usa numeri a virgola mobile a @dfn{doppia precisione},
-che possono gestire pi@`u cifre rispetto ai numeri a virgola mobile a
+@cindex virgola mobile, numeri in@comma{} precisione singola
+@cindex virgola mobile, numeri in@comma{} precisione doppia
+@cindex virgola mobile, numeri in@comma{} precisione arbitraria
+@cindex precisione singola
+@cindex precisione doppia
+@cindex precisione arbitraria
+@cindex singola, precisione
+@cindex doppia, precisione
+@cindex arbitraria, precisione
+POSIX @command{awk} usa numeri in virgola mobile a @dfn{doppia precisione},
+che possono gestire pi@`u cifre rispetto ai numeri in virgola mobile a
@dfn{singola precisione}. @command{gawk} ha inoltre funzionalit@`a, descritte
in dettaglio pi@`u sotto, che lo mettono in grado di eseguire
-calcoli con i numeri a virgola mobile con precisione arbitraria.
+calcoli con i numeri in virgola mobile con precisione arbitraria.
@end table
-I calcolatori operano con valori interi e a virgola mobile su diversi
+I calcolatori operano con valori interi e in virgola mobile su diversi
intervalli. I valori interi normalmente hanno una dimensione di 32 bit o 64 bit.
-I valori a virgola mobile a singola precisione occupano 32 bit, mentre i
-valori a virgola mobile a doppia precisione occupano 64 bit. I valori a
-virgola mobile sono sempre con segno. Il possibile campo di variazione dei
-valori @`e mostrato in @ref{table-numeric-ranges}.
+I valori in virgola mobile a singola precisione occupano 32 bit, mentre i
+valori in virgola mobile a doppia precisione occupano 64 bit.
+(Esistono anche numeri in virgola mobile a precisione quadrupla. Occupano
+128 bit, ma non sono disponibili in @command{awk}.)
+I valori in virgola mobile sono sempre con segno. I possibili campi di
+variazione dei valori sono mostrati in @ref{table-numeric-ranges} e in
+@ref{table-floating-point-ranges}.
@float Tabella,table-numeric-ranges
-@caption{Intervalli dei valori per diverse rappresentazioni numeriche}
+@caption{Intervallo di valori per rappresentazioni di numeri interi}
@multitable @columnfractions .34 .33 .33
-@headitem Rappresentazione numerica @tab Valore minimo @tab Valore massimo
+@headitem Rappresentazione @tab Valore minimo @tab Valore massimo
@item Interi con segno a 32-bit @tab @minus{}2.147.483.648 @tab 2.147.483.647
@item Interi senza segno a 32-bit @tab 0 @tab 4.294.967.295
@item Interi con segno a 64-bit @tab @minus{}9.223.372.036.854.775.808 @tab 9.223.372.036.854.775.807
@item Interi senza segno a 64-bit @tab 0 @tab 18.446.744.073.709.551.615
+@end multitable
+@end float
+
+@float Tabella,table-floating-point-ranges
+@caption{Intervallo di valori per rappresentazioni di numeri in virgola mobile}
+@multitable @columnfractions .34 .22 .22 .22
@iftex
-@item Virgola mobile, singola precisione (circa) @tab @math{1,175494^{-38}} @tab @math{3,402823^{38}}
-@item Virgola mobile, doppia precisione (circa) @tab @math{2,225074^{-308}} @tab @math{1,797693^{308}}
+@headitem Rappresentazione @tab @w{Valore positivo} @w{minimo} @w{diverso da zero} @tab @w{Valore finito} @w{minimo} @tab @w{Valore finito} @w{massimo}
+@end iftex
+@ifnottex
+@headitem Rappresentazione @tab Valore positivo minimo diverso da zero @tab Valore finito minimo @tab Valore finito massimo
+@end ifnottex
+@iftex
+@item @w{Virgola mobile, singola precis.} @tab @math{1,175494 @cdot 10^{-38}} @tab @math{-3,402823 @cdot 10^{38}} @tab @math{3,402823 @cdot 10^{38}}
+@item @w{Virgola mobile, doppia precis.} @tab @math{2,225074 @cdot 10^{-308}} @tab @math{-1,797693 @cdot 10^{308}} @tab @math{1,797693 @cdot 10^{308}}
+@item @w{Virgola mobile, quadrupla prec.} @tab @math{3,362103 @cdot 10^{-4932}} @tab @math{-1,189731 @cdot 10^{4932}} @tab @math{1,189731 @cdot 10^{4932}}
@end iftex
@ifinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494e-38 @tab 3,402823e38
-@item Virgola mobile, doppia precisione (circa) @tab 2,225074e-308 @tab 1,797693e308
+@item Virgola mobile, singola precis. @tab 1,175494e-38 @tab -3,402823e38 @tab 3,402823e38
+@item Virgola mobile, doppia precis. @tab 2,225074e-308 @tab -1,797693e308 @tab 1,797693e308
+@item Virgola mobile, quadrupla prec. @tab 3,362103e-4932 @tab -1,189731e4932 @tab 1,189731e4932
@end ifinfo
@ifnottex
@ifnotinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494@sup{-38} @tab 3,402823@sup{38}
-@item Virgola mobile, singola precisione (circa) @tab 2,225074@sup{-308} @tab 1,797693@sup{308}
+@item Virgola mobile, singola precis. @tab 1,175494@sup{-38} @tab -3,402823@sup{38} @tab 3,402823*10@sup{38}
+@item Virgola mobile, singola precis. @tab 2,225074@sup{-308} @tab -1,797693@sup{308} @tab 1,797693*10@sup{308}
+@item Virgola mobile, quadrupla prec. @tab 3,362103@sup{-4932} @tab -1,189731@sup{4932} @tab 1,189731@sup{4932}
@end ifnotinfo
@end ifnottex
@end multitable
@@ -32868,7 +33318,7 @@ per la lettura di questo documento:
@table @dfn
@item Accuratezza
-L'accuratezza del calcolo sui numeri a virgola mobile indica di quanto si
+L'accuratezza del calcolo sui numeri in virgola mobile indica di quanto si
avvicina il calcolo al valore reale (calcolato con carta e penna).
@item Errore
@@ -32878,14 +33328,14 @@ possibile.
@item Esponente
L'ordine di grandezza di un valore;
-alcuni bit in un valore a virgola mobile contengono l'esponente.
+alcuni bit in un valore in virgola mobile contengono l'esponente.
@item Inf
Un valore speciale che rappresenta l'infinito. Le operazioni tra un qualsiasi
numero e l'infinito danno infinito.
@item Mantissa
-Un valore a virgola mobile @`e formato dalla mantissa moltiplicata per 10
+Un valore in virgola mobile @`e formato dalla mantissa moltiplicata per 10
alla potenza dell'esponente. Per esempio, in @code{1,2345e67},
la mantissa @`e @code{1,2345}.
@@ -32920,7 +33370,7 @@ generato il numero), ma non @`e memorizzato fisicamente.
Questo fornisce un bit di precisione in pi@`u.
@item Precisione
-Il numero di bit usati per rappresentare un numero a virgola mobile.
+Il numero di bit usati per rappresentare un numero in virgola mobile.
Pi@`u sono i bit, e maggiore @`e l'intervallo di cifre che si possono
rappresentare.
Le precisioni binaria e decimale sono legate in modo approssimativo, secondo
@@ -33069,10 +33519,10 @@ ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto.
@node Inesattezza nei calcoli
@subsection La matematica in virgola mobile non @`e esatta
-Le rappresentazioni e i calcoli con numeri a virgola mobile binari sono
+Le rappresentazioni e i calcoli con numeri in virgola mobile binari sono
inesatti. Semplici valori come 0,1 non possono essere rappresentati in modo
-preciso usando numeri a virgola mobile binari, e la limitata precisione dei
-numeri a virgola mobile significa che piccoli cambiamenti nell'ordine delle
+preciso usando numeri in virgola mobile binari, e la limitata precisione dei
+numeri in virgola mobile significa che piccoli cambiamenti nell'ordine delle
operazioni o la precisione di memorizzazione di operazioni
intermedie pu@`o cambiare il
risultato. Per rendere la situazione pi@`u difficile, nel calcolo in virgola
@@ -33102,7 +33552,7 @@ Diversamente dal numero in @code{y}, il numero memorizzato in @code{x}
@`e rappresentabile esattamente nel formato binario, perch@'e pu@`o essere
scritto come somma finita di una o pi@`u frazioni i cui denominatori sono tutti
multipli di due.
-Quando @command{gawk} legge un numero a virgola mobile dal sorgente di un
+Quando @command{gawk} legge un numero in virgola mobile dal sorgente di un
programma, arrotonda automaticamente quel numero alla precisione, quale che
sia, supportata dal computer in uso. Se si tenta di stampare il contenuto
numerico di una variabile usando una stringa di formato in uscita di
@@ -33125,7 +33575,7 @@ nell'esempio precedente, d@`a luogo a un output identico all'input.
Poich@'e la rappresentazione interna del computer
pu@`o discostarsi, sia pur di poco, dal valore
-esatto, confrontare dei valori a virgola mobile per vedere se sono esattamente
+esatto, confrontare dei valori in virgola mobile per vedere se sono esattamente
uguali @`e generalmente una pessima idea. Questo @`e un esempio in cui tale
confronto non funziona come dovrebbe:
@@ -33134,30 +33584,34 @@ $ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
@print{} 0
@end example
-Il metodo generalmente seguito per confrontare valori a virgola mobile
+Il metodo generalmente seguito per confrontare valori in virgola mobile
consiste nel controllare se la differenza tra loro @`e minore di un certo valore
(chiamato @dfn{delta}, o @dfn{tolleranza}). Quel che si deve decidere @`e qual
@`e il valore minimo di delta
adeguato. Il codice per far ci@`o @`e qualcosa del genere:
@example
+@group
delta = 0.00001 # per esempio
-differenza = abs(a) - abs(b) # sottrazione dei due valori
+differenza = abs(a - b) # sottrazione dei due valori
if (differenza < delta)
# va bene
else
# non va bene
+@end group
@end example
@noindent
-(Si presuppone che sia stata definita in qualche parte del programma una
-semplice funzione che restituisce il valore assoluto di un numero,
-chiamata @code{abs()}.)
+(Si presuppone che sia stata definita in qualche altra parte del programma
+una semplice funzione di nome @code{abs()}.) Se si scrive una funzione
+per confrontare dei valori con un valore dato @samp{delta}, si dovrebbe
+utilizzare la notazione @samp{differenza < abs(delta)} nel caso che
+a @samp{delta} venga assegnato un valore negativo.
@node Gli errori si sommano
@subsubsection Gli errori diventano sempre maggiori
-La perdita di accuratezza in un singolo calcolo con numeri a virgola mobile
+La perdita di accuratezza in un singolo calcolo con numeri in virgola mobile
generalmente non dovrebbe destare preoccupazione. Tuttavia, se si calcola un
valore che @`e una sequenza di operazioni in virgola mobile, l'errore si pu@`o
accumulare e influire sensibilmente sul risultato del calcolo stesso.
@@ -33372,6 +33826,8 @@ $ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
@node Impostare modo di arrotondare
@subsection Impostare la modalit@`a di arrotondamento
+@cindex @code{ROUNDMODE}, variable
+@cindex variabile @code{ROUNDMODE}
La variabile @code{ROUNDMODE} permette di controllare a livello di programma
la modalit@`a di arrotondamento.
La corrispondenza tra @code{ROUNDMODE} e le modalit@`a di arrotondamento IEEE
@@ -33385,14 +33841,15 @@ La corrispondenza tra @code{ROUNDMODE} e le modalit@`a di arrotondamento IEEE
@item Arrotonda verso infinito @tab @code{roundTowardPositive} @tab @code{"U"} o @code{"u"}
@item Arrotonda verso meno infinito @tab @code{roundTowardNegative} @tab @code{"D"} o @code{"d"}
@item Arrotonda verso zero (troncamento) @tab @code{roundTowardZero} @tab @code{"Z"} o @code{"z"}
-@item Arrotonda al pi@`u vicino, o per eccesso @tab @code{roundTiesToAway} @tab @code{"A"} o @code{"a"}
+@item Arrotonda lontano da zero (per eccesso) @tab @tab @code{"A"} o @code{"a"}
@end multitable
@end float
@code{ROUNDMODE} ha @code{"N"} come valore di default, ovvero si usa la
modalit@`a di arrotondamento IEEE 754 @code{roundTiesToEven}.
In @ref{table-gawk-rounding-modes}, il valore @code{"A"} seleziona
-@code{roundTiesToAway}. Questo @`e applicabile solo se la versione in uso
+l'arrotondamento lontano da zero (per eccesso).
+Questo @`e applicabile solo se la versione in uso
della libreria MPFR lo supporta; altrimenti, l'impostazione di @code{ROUNDMODE}
ad @code{"A"} non ha alcun effetto.
@@ -33409,7 +33866,7 @@ In questo caso, il numero @`e arrotondato alla cifra @emph{pari} pi@`u prossima.
Cos@`{@dotless{i}} arrotondando 0.125 alle due cifre si arrotonda per difetto a 0.12,
ma arrotondando 0.6875 alle tre cifre si arrotonda per eccesso a 0.688.
Probabilmente ci si @`e gi@`a imbattuti in questa modalit@`a di arrotondamento
-usando @code{printf} per formattare numeri a virgola mobile.
+usando @code{printf} per formattare numeri in virgola mobile.
Per esempio:
@example
@@ -33447,6 +33904,32 @@ valori equidistanti in eccesso e in difetto si distribuiscono pi@`u o meno
uniformemente, con la possibile conseguenza che errori di arrotondamento
ripetuti tendono ad annullarsi a vicenda. Questa @`e la modalit@`a di
arrotondamento di default per funzioni e operatori di calcolo secondo IEEE 754.
+@c January 2018. Thanks to nethox@gmail.com for the example.
+@sidebar Modalit@`a di arrotondamento e conversioni
+@`E importante comprendere che, insieme a @code{CONVFMT} e
+@code{OFMT}, la modalit@`a di arrotondamento ha effetto anche sul
+modo con cui i numeri sono convertiti in stringhe di caratteri.
+Per esempio,si consideri il seguente programma:
+
+@example
+BEGIN @{
+ pi = 3.1416
+ OFMT = "%.f" # Stampa il valore come numero intero
+ print pi # ROUNDMODE = "N" per default.
+ ROUNDMODE = "U" # Ora si cambia ROUNDMODE
+ print pi
+@}
+@end example
+
+@noindent
+L'esecuzione di questo programma produce il seguente output:
+
+@example
+$ @kbd{gawk -M -f roundmode.awk}
+@print{} 3
+@print{} 4
+@end example
+@end sidebar
Le altre modalit@`a di arrotondamento sono usate raramente. Gli arrotondamenti
verso l'infinito (@code{roundTowardPositive}) e verso il meno infinito
@@ -33454,10 +33937,9 @@ verso l'infinito (@code{roundTowardPositive}) e verso il meno infinito
intervalli, dove si adotta questa modalit@`a di arrotondamento per calcolare
i limiti superiore e inferiore per l'intervallo di valori in uscita.
La modalit@`a
-@code{roundTowardZero} pu@`o essere usata per convertire numeri a virgola mobile
-in numeri interi. La modalit@`a di arrotondamento @code{roundTiesToAway}
-arrotonda il risultato al numero pi@`u vicino, e in caso di equidistanza
-arrotonda per eccesso.
+@code{roundTowardZero} pu@`o essere usata per convertire numeri in virgola mobile
+in numeri interi. Quando si arrotonda lontano da zero (per eccesso), viene
+scelto il numero pi@`u vicino di grandezza maggiore o uguale al valore.
Qualche esperto di analisi numerica dir@`a che la scelta dello stile di
arrotondamento ha un grandissimo impatto sul risultato finale, e consiglier@`a
@@ -33494,7 +33976,7 @@ disponibile. Per esempio, il seguente programma calcola
5@sup{4@sup{3@sup{2}}},
@end ifnotinfo
@end ifnottex
-il cui risultato @`e oltre i limiti degli ordinari valori a virgola mobile a
+il cui risultato @`e oltre i limiti degli ordinari valori in virgola mobile a
doppia precisione dei processori:
@example
@@ -33507,7 +33989,7 @@ $ @kbd{gawk -M 'BEGIN @{}
@print{} 62060698786608744707 ... 92256259918212890625
@end example
-Se invece si dovesse calcolare lo stesso valore usando valori a virgola mobile
+Se invece si dovesse calcolare lo stesso valore usando valori in virgola mobile
con precisione arbitraria, la precisione necessaria per il risultato corretto
(usando
la formula
@@ -33528,8 +34010,8 @@ would be
@end docbook
o 608693.
-Il risultato di un'operazione aritmetica tra un intero e un valore a virgola
-mobile @`e un valore a virgola mobile con precisione uguale alla precisione di
+Il risultato di un'operazione aritmetica tra un intero e un valore in virgola
+mobile @`e un valore in virgola mobile con precisione uguale alla precisione di
lavoro. Il seguente programma calcola l'ottavo termine nella successione di
Sylvester@footnote{Weisstein, Eric W.
@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
@@ -33555,7 +34037,7 @@ esattamente il risultato in virgola mobile. Si pu@`o o aumentare la precisione
gli interi per ottenere l'output corretto.
A volte @command{gawk} deve convertire implicitamente un intero con precisione
-arbitraria in un valore a virgola mobile con precisione arbitraria.
+arbitraria in un valore in virgola mobile con precisione arbitraria.
Ci@`o si rende necessario
principalmente perch@'e la libreria MPFR non sempre prevede l'interfaccia
necessaria per elaborare interi a precisione arbitraria o numeri di tipo
@@ -33563,7 +34045,7 @@ eterogeneo come richiesto da un'operazione o funzione. In tal caso, la
precisione viene impostata al minimo valore necessario per una conversione
esatta, e non viene usata la precisione di lavoro. Se
questo non @`e quello di cui si ha bisogno o che si vuole, si pu@`o ricorrere a un
-sotterfugio e convertire preventivamente l'intero in un valore a virgola
+sotterfugio e convertire preventivamente l'intero in un valore in virgola
mobile, come qui di seguito:
@example
@@ -33571,7 +34053,7 @@ gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
@end example
Si pu@`o evitare completamente questo passaggio specificando il numero come
-valore a virgola mobile fin dall'inizio:
+valore in virgola mobile fin dall'inizio:
@example
gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
@@ -33585,7 +34067,7 @@ gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
@end example
Dividendo due interi a precisione arbitraria con @samp{/} o con @samp{%}, il
-risultato @`e tipicamente un valore a virgola mobile con precisione arbitraria
+risultato @`e tipicamente un valore in virgola mobile con precisione arbitraria
(a meno che il risultato non sia un numero intero esatto).
@ifset INTDIV
Per eseguire divisioni intere o calcolare moduli con interi a precisione
@@ -33637,6 +34119,7 @@ che si @`e scelto di impostare:
@example
@c file eg/prog/pi.awk
+@group
# pi.awk --- calcola le cifre di pi
@c endfile
@c endfile
@@ -33652,6 +34135,7 @@ che si @`e scelto di impostare:
BEGIN @{
cifre = 100000
due = 2 * 10 ^ cifre
+@end group
pi = due
for (m = cifre * 4; m > 0; --m) @{
d = m * 2 + 1
@@ -33762,11 +34246,16 @@ BEGIN @{
if (! adequate_math_precision(fpbits)) @{
print("Errore: la precisione di calcolo disponibile non basta.\n" \
"Provare ancora specificando l'argomento -M?") > "/dev/stderr"
+ # Nota: pu@`o essere necessario impostare un flag a questo punto
+ # per evitare di eseguire delle eventuali regole END
exit 1
@}
@}
@end example
+Occorre tener presente che @code{exit} eseguir@`a le regole @code{END},
+eventualmente contenute nel programma (@pxref{Istruzione exit}).
+
@node Problemi virgola mobile POSIX
@section Confronto tra standard e uso corrente
@@ -33782,12 +34271,12 @@ aggiuntive. Queste sono:
@itemize @value{BULLET}
@item
-Interpretazione del valore dei dati a virgola mobile specificati in notazione
+Interpretazione del valore dei dati in virgola mobile specificati in notazione
esadecimale (p.es., @code{0xDEADBEEF}). (Da notare: valore dei dati letti,
@emph{non} costanti facenti parte del codice sorgente.)
@item
-Supporto per i valori a virgola mobile speciali IEEE 754 ``not a number''
+Supporto per i valori in virgola mobile speciali IEEE 754 ``not a number''
(NaN), pi@`u infinito (``inf'') e meno infinito (``@minus{}inf'').
In particolare, il formato per questi valori @`e quello specificato dallo
standard C ISO 1999, che non distingue maiuscole/minuscole e pu@`o consentire
@@ -33800,7 +34289,7 @@ dalla prassi consolidata:
@itemize @value{BULLET}
@item
-Il manutentore di @command{gawk} crede che supportare i valori a virgola mobile
+Il manutentore di @command{gawk} crede che supportare i valori in virgola mobile
esadecimali, nello specifico, sia sbagliato, e che non sia mai stata intenzione
dell'autore originale di introdurlo nel linguaggio.
@@ -33818,7 +34307,7 @@ arrivati sin qui, ma non pensiamo che questo sia il posto dove volete essere.''
Recependo queste argomentazioni, e cercando nel contempo di assicurare la
compatibilit@`a con le versioni precedenti dello standard, lo standard POSIX 2008
ha aggiunto delle formulazioni esplicite per consentire l'uso da parte di
-@command{awk}, solo a richiesta, dei valori a virgola mobile esadecimali e
+@command{awk}, solo a richiesta, dei valori in virgola mobile esadecimali e
dei valori speciali
``@dfn{not a number}'' e infinito.
@@ -33856,7 +34345,7 @@ e
@samp{-nan}
in modo speciale, producendo i corrispondenti valori numerici speciali.
Il segno iniziale serve per segnalare a @command{gawk} (e all'utente)
-che il valore @`e realmente numerico. I numeri a virgola mobile esadecimali
+che il valore @`e realmente numerico. I numeri in virgola mobile esadecimali
non sono consentiti (a meno di non usare anche @option{--non-decimal-data},
che @emph{non} @`e consigliabile). Per esempio:
@@ -33864,7 +34353,7 @@ che @emph{non} @`e consigliabile). Per esempio:
$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
@print{} 0
$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
-@print{} nan
+@print{} +nan
$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
@print{} 0
@end example
@@ -33873,6 +34362,15 @@ $ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa.
@end itemize
+Oltre a gestire l'input, @command{gawk} deve anche stampare valori
+``corretti'' in output, quando un valore sia NaN o infinito.
+A partire dalla @value{PVERSION} 4.2.2, per tali valori
+@command{gawk} stampa una delle quattro stringhe sopra descritte:
+@samp{+inf}, @samp{-inf}, @samp{+nan}, or @samp{-nan}.
+Analogamente,se usato in modalit@`a POSIX, @command{gawk} stampa il risultato
+della funzione C di sistema @code{printf()} usando la stringa di formato
+@code{%g} per il valore, quale che esso sia.
+
@node Sommario virgola mobile
@section Sommario
@@ -33880,12 +34378,12 @@ speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa.
@item
La maggior parte dell'aritmetica al calcolatore @`e fatta usando numeri interi
oppure
-valori a virgola mobile. L'@command{awk} standard usa valori a virgola mobile
+valori in virgola mobile. L'@command{awk} standard usa valori in virgola mobile
a doppia precisione.
@item
Nei primi anni '90 Barbie disse erroneamente, ``L'ora di matematica @`e
-ostica!'' Sebbene la matematica non sia ostica, l'aritmetica a virgola
+ostica!'' Sebbene la matematica non sia ostica, l'aritmetica in virgola
mobile non @`e proprio come la
matematica ``carta e penna'', e bisogna prestare attenzione:
@@ -33926,7 +34424,7 @@ una pi@`u efficiente allocazione dello spazio rispetto all'uso di MPFR per
eseguire gli stessi calcoli.
@item
-Ci sono diverse aree per quanto attiene ai numeri a virgola mobile in cui
+Ci sono diverse aree per quanto attiene ai numeri in virgola mobile in cui
@command{gawk} @`e in disaccordo con lo standard POSIX.
@`E importante averlo ben presente.
@@ -34362,7 +34860,7 @@ e sono gestite da @command{gawk} da quel punto in avanti.
@item
L'API definisce parecchie semplici @code{struct} che mappano dei valori
come sono visti da @command{awk}. Un valore pu@`o essere un numero @code{double}
-(a virgola mobile, in doppia precisione), una stringa o un
+(in virgola mobile, in doppia precisione), una stringa o un
vettore (come @`e il caso per i vettori multidimensionali o nella creazione di
un nuovo vettore).
@@ -34524,18 +35022,24 @@ e ogni campo @`e del tipo appropriato.
L'uso di queste macro rende pi@`u facile da seguire l'accesso ai campi di
@code{awk_value_t}.
+@item enum AWK_NUMBER_TYPE @{
+@itemx @ @ @ @ AWK_NUMBER_TYPE_DOUBLE,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPFR,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPZ
+@itemx @};
+La lista @code{enum} @`e usata nella struttura seguente per definire
+il tipo di valore numerico con cui si ha a che fare. Va dichiarata al
+livello pi@`u alto del file, in modo da poter essere usata sia con il
+linguaggio C++ che con il C.
+
@item typedef struct awk_number @{
@itemx @ @ @ @ double d;
-@itemx @ @ @ @ enum AWK_NUMBER_TYPE @{
-@itemx @ @ @ @ @ @ @ @ AWK_NUMBER_TYPE_DOUBLE,
-@itemx @ @ @ @ @ @ @ @ AWK_NUMBER_TYPE_MPFR,
-@itemx @ @ @ @ @ @ @ @ AWK_NUMBER_TYPE_MPZ
-@itemx @ @ @ @ @} type;
+@itemx @ @ @ @ enum AWK_NUMBER_TYPE type;
@itemx @ @ @ @ void *ptr;
@itemx @} awk_number_t;
Questo rappresenta un valore numerico. Internamente, @command{gawk}
memorizza ogni numero o come una variabile C di tipo @code{double},
-o come un numero intero GMP, o come un numero MPFR a virgola mobile
+o come un numero intero GMP, o come un numero MPFR in virgola mobile
di precisione arbitraria. Per consentire alle estensioni di
supportare valori numerici GMP ed MPFR, i valori numerici sono
trasmessi utilizzando questa struttura.
@@ -34544,10 +35048,9 @@ L'elemento in doppia-precisione @code{d} @`e sempre presente nei dati
ricevuti da @command{gawk}. Inoltre, esaminando il membro
@code{type}, un'estensione @`e in grado di determinare se il membro puntato
da @code{ptr} sia un numero intero GMP (tipo @code{mpz_ptr}), o un numero
-MPFR a virgola mobile (tipo @code{mpfr_ptr_t}), e trasformarlo a seconda
+MPFR in virgola mobile (tipo @code{mpfr_ptr_t}), e trasformarlo a seconda
delle necessit@`a.
-
@item typedef void *awk_scalar_t;
La variabili scalari possono essere rappresentate da un tipo opaco. Questi
valori sono ottenuti da @command{gawk} e in seguito gli vengono restituiti.
@@ -34756,15 +35259,18 @@ Questo @`e solitamente il nome della funzione che sta usando la macro.
Per esempio, si potrebbe allocare il valore di una stringa cos@`{@dotless{i}}:
@example
+@group
awk_value_t risultato;
char *message;
-const char greet[] = "non v'allarmate!";
+const char greet[] = "Non v'allarmate!";
emalloc(message, char *, sizeof(greet), "myfunc");
strcpy(message, greet);
make_malloced_string(message, strlen(message), & risultato);
+@end group
@end example
+@sp 2
@item #define ezalloc(pointer, type, size, message) @dots{}
Questo @`e simile a @code{emalloc()}, ma chiama @code{gawk_calloc()}
invece che @code{gawk_malloc()}.
@@ -34799,9 +35305,9 @@ senza il supporto MPFR, chiamare questa funzione genera un errore fatale.
Entrambe queste funzioni restituiscono un codice di ritorno @samp{void *},
poich@'e il file di intestazione @file{gawkapi.h} non dovrebbe avere dipendenze
da @code{<mpfr.h>} (e @code{<gmp.h>},
-che @`e incluso da @code{<mpfr.h>}). I valori di ritorno effettivamente
+che @`e incluso da @code{<mpfr.h>}). I codici di ritorno effettivamente
restituiti sono di tipo @code{mpfr_ptr} e @code{mpz_ptr} rispettivamente,
-e si dovrebbero assegnare in maniera appropriata questi valori di ritorno
+e si dovrebbero assegnare in maniera appropriata questi codici di ritorno
prima di assegnare i risultati a variabili del tipo corretto.
@node Funzioni di costruzione
@@ -34916,6 +35422,7 @@ registrare parti di un'estensione con @command{gawk}.
Le funzioni di estensione sono descritte dal seguente tracciato record:
@example
+@group
typedef struct awk_ext_func @{
@ @ @ @ const char *name;
@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
@@ -34927,6 +35434,7 @@ typedef struct awk_ext_func @{
@ @ @ @ void *data; /* puntatore di tipo opaco
@ @ @ @ a ogni informazione ulteriore */
@} awk_ext_func_t;
+@end group
@end example
I campi sono:
@@ -35147,6 +35655,7 @@ L'estensione dovrebbe raccogliere queste funzioni all'interno di una
struttura @code{awk_input_parser_t}, simile a questa:
@example
+@group
typedef struct awk_input_parser @{
const char *name; /* nome dell'analizzatore */
awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
@@ -35154,6 +35663,7 @@ typedef struct awk_input_parser @{
awk_const struct awk_input_parser *awk_const next; /* per uso
di gawk */
@} awk_input_parser_t;
+@end group
@end example
I campi sono:
@@ -35980,6 +36490,7 @@ che un accesso @`e necessario. Questo
argomento @`e gi@`a stato trattato in precedenza, nella
@ref{Tipi di dati generali}.
+@need 1500
Le funzioni seguenti servono per gestire gli @dfn{scalar cookie}:
@table @code
@@ -36050,12 +36561,14 @@ uno @dfn{scalar cookie} per la
variabile usando @code{sym_lookup()}:
@example
+@group
static awk_scalar_t magic_var_cookie; /* cookie per MAGIC_VAR */
static void
inizializza_estensione()
@{
awk_value_t valore;
+@end group
/* immettere il valore iniziale */
sym_update("MAGIC_VAR", make_number(42.0, & valore));
@@ -36464,7 +36977,7 @@ costituisce la funzione
@code{dump_array_and_delete()}. @`E stato leggermente modificato per facilitare
l'esposizione.
-La prima parte dichiara variabili, imposta il valore di ritorno di default
+La prima parte dichiara variabili, imposta il codice di ritorno di default
in @code{risultato}, e controlla che la funzione
sia stata chiamata con il numero corretto di argomenti:
@@ -36606,10 +37119,12 @@ Infine, poich@'e tutto @`e andato bene, la funzione imposta il codice di ritorno
a "successo", e lo restituisce quando esce:
@example
+@group
make_number(1.0, risultato);
out:
return risultato;
@}
+@end group
@end example
Ecco l'output ottenuto eseguendo questa parte del test:
@@ -36829,7 +37344,7 @@ BEGIN @{
Ecco il risultato dell'esecuzione dello script:
@example
-$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk}
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
@print{} new_array["sottovettore"]["pippo"] = pluto
@print{} new_array["salve"] = mondo
@print{} new_array["risposta"] = 42
@@ -36986,7 +37501,7 @@ Dipende dall'estensione decidere se ci sono incompatibilit@`a con l'API.
Tipicamente, basta un controllo di questo tipo:
@example
-if (api->major_version != GAWK_API_MAJOR_VERSION
+if ( api->major_version != GAWK_API_MAJOR_VERSION
|| api->minor_version < GAWK_API_MINOR_VERSION) @{
fprintf(stderr, "estensione_pippo: discordanza di versione \
con gawk!\n");
@@ -37106,10 +37621,12 @@ standard, come descritto qui sotto. Il codice predefinito in questione @`e
anche descritto nel file di intestazione @file{gawkapi.h}:
@example
+@group
/* Codice predefinito: */
int plugin_is_GPL_compatible;
static gawk_api_t *const api;
+@end group
static awk_ext_id_t ext_id;
static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
@@ -37236,6 +37753,49 @@ compilazione, l'API rimane compatibile a livello di codice sorgente con la
precedente versione API. Le differenze pi@`u rilevanti sono gli ulteriori
campi nella struttura @code{awk_ext_func_t}, e l'aggiunta del terzo argomento
nella funzione di implementazione in linguaggio C.
+(@pxref{Funzioni di estensione}).
+
+Quella che segue @`e una lista di singole funzionalit@`a che sono
+state modificate nella versione 2 rispetto alla versione 1 dell'API:
+
+@itemize @bullet
+
+@item
+I valori numerici possono ora essere anche di tipo MPFR/MPZ
+(@pxref{Tipi di dati generali}).
+
+@item
+Ci sono nuovi tipi di stringa: @code{AWK_REGEX} e @code{AWK_STRNUM}
+(@pxref{Tipi di dati generali}).
+
+@item
+@`E disponibile la nuova macro @code{ezalloc()}
+(@pxref{Funzioni di allocazione memoria}).
+
+@item
+La struttura @code{awk_ext_func_t} @`e stata modificata. Invece del
+parametro @code{num_expected_args}, ha ora i due parametri
+@code{max_expected} e @code{min_required}
+(@pxref{Funzioni di estensione}).
+
+@item
+In @code{get_record()}, un analizzatore di input pu@`o ora specificare
+l'ampiezza dei campi
+(@pxref{Analizzatori di input}).
+
+@item
+Le estensioni possono ora inviare messaggi di errore non fatali
+(@pxref{Stampare messaggi}).
+
+@item
+Quando di appiattisce un vettore, si pu@`o ora specificare il tipo
+dell'indice e quello dei valori
+(@pxref{Funzioni per i vettori}).
+
+@item
+C'@`e una nuova API, @code{get_file()}
+(@pxref{Ridirezione API}).
+@end itemize
@node Trovare le estensioni
@section Come @command{gawk} trova le estensioni compilate
@@ -37502,11 +38062,13 @@ Il secondo @`e un puntatore a una struttura @code{awk_value_t}, normalmente
chiamata @code{risultato}:
@example
+@group
/* do_chdir --- fornisce funzione chdir()
caricata dinamicamente per gawk */
static awk_value_t *
do_chdir(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
+@end group
@{
awk_value_t newdir;
int ret = -1;
@@ -37641,7 +38203,7 @@ fill_stat_array(const char *name, awk_array_t vettore, struct stat *sbuf)
#endif
#ifdef S_IFDOOR /* Stranezza Solaris */
@{ S_IFDOOR, "door" @},
-#endif /* S_IFDOOR */
+#endif
@};
int j, k;
@end example
@@ -37683,9 +38245,11 @@ certi campi e/o il tipo del file. Viene poi restituito zero, per indicare che
tutto @`e andato bene:
@example
+@group
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
array_set_numeric(vettore, "blksize", sbuf->st_blksize);
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+#endif
+@end group
pmode = format_mode(sbuf->st_mode);
array_set(vettore, "pmode", make_const_string(pmode, strlen(pmode),
@@ -37781,10 +38345,12 @@ Poi, ottiene le informazioni relative al file. Se la funzione chiamata
in caso di errore,
imposta ERRNO e ritorna */
ret = statfunc(name, & sbuf);
+@group
if (ret < 0) @{
update_ERRNO_int(errno);
return make_number(ret, risultato);
@}
+@end group
@end example
Il lavoro noioso @`e svolto da @code{fill_stat_array()}, visto in
@@ -37792,10 +38358,12 @@ precedenza. Alla fine, la funzione restituisce il codice di ritorno
impostato da @code{fill_stat_array()}:
@example
+@group
ret = fill_stat_array(name, vettore, & sbuf);
return make_number(ret, risultato);
@}
+@end group
@end example
Infine, @`e necessario fornire la ``colla'' che aggrega
@@ -38258,7 +38826,7 @@ Nel processo figlio, gli elementi @code{PROCINFO["pid"]} e
@cindex estensione @code{waitpid()}
@item ret = waitpid(pid)
Questa funzione ha un unico argomento numerico, l'identificativo del processo
-di cui aspettare l'esito. Il valore di ritorno @`e quello restituito dalla
+di cui aspettare l'esito. Il codice di ritorno @`e quello restituito dalla
chiamata di sistema @code{waitpid()}.
@cindex @code{wait()}, estensione
@@ -38678,7 +39246,7 @@ Questo @`e il modo per caricare l'estensione.
@cindex estensione @code{gettimeofday()}
@item ora_corrente = gettimeofday()
Restituisce il numero di secondi trascorsi dalle ore 00:00 del giorno
-01/01/1970 UTC come valore a virgola mobile.
+01/01/1970 UTC come valore in virgola mobile.
Se questa informazione non @`e disponibile nella piattaforma in uso,
restituisce @minus{}1 e imposta @code{ERRNO}. Il valore fornito dovrebbe
avere la precisione di una frazione di
@@ -38697,7 +39265,7 @@ specificati. Se @var{secondi} ha un valore negativo,
o la chiamata di sistema non riesce, restituisce @minus{}1 e imposta @code{ERRNO}.
In caso contrario, restituisce zero dopo aver lasciato trascorrere
la quantit@`a di tempo indicata.
-Si noti che @var{secondi} pu@`o essere un numero a virgola mobile (non solo un
+Si noti che @var{secondi} pu@`o essere un numero in virgola mobile (non solo un
numero intero).
Dettagli di implementazione: a seconda della disponibilit@`a nel sistema in uso,
questa funzione tenta di usare @code{nanosleep()} o @code{select()} per
@@ -38730,31 +39298,28 @@ fornisce varie estensioni per @command{gawk}, compresa una per
l'elaborazione dei file XML. Questa @`e un'evoluzione del progetto noto come
@command{xgawk} (XML @command{gawk}).
-Al momento della stesura di questo testo, ci sono otto estensioni:
+Le estensioni sono parecchie. Alcune delle pi@`u interessanti sono:
@itemize @value{BULLET}
@item
-Estensione @code{errno}
-
-@item
-Estensione GD graphics library
+Estensione @code{abort}. Consente di uscire immediatamente dal programma
+@command{awk} senza eseguire le regole @code{END}.
@item
-Estensione libreria MPFR
-(fornisce l'accesso a varie funzioni MPFR non previste dal supporto nativo
-di MPFR disponibile in @command{gawk})
+Estensione @code{json}.
+Permette di serializzare un vettore multidimensionale trasformandolo in
+una stringa in formato JSON (JavaScript Object Notation), di effettuare
+l'operazione inversa, de-serializzando una stringa JSON, generando
+un vettore @command{gawk}.
@item
-Estensione PDF
+Estensione libreria MPFR.
+Fornisce accesso a varie funzioni MPFR non previste dal supporto nativo
+di MPFR disponibile in @command{gawk}
@item
-Estensione PostgreSQL
-
-@item
-Estensione Redis
-
-@item
-Estensione Select
+Estensione Select. Fornisce delle funzionalit@`a, appoggiandosi sulla
+chiamata di sistema @code{select()}.
@item
Estensione analizzatore XML, usando la libreria di analisi XML
@@ -38772,6 +39337,11 @@ Il comando per farlo @`e il seguente:
git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
@end example
+@cindex RapidJson, libreria per analizzare JSON
+@cindex JSON, RapidJson, libreria per analizzare
+Occorre che sia installata la libreria di analisi JSON
+per poter generare e usare l'estensione @code{json}.
+
@cindex Expat, libreria per analizzare XML
@cindex XML, Expat, libreria per analizzare
Per poter compilare e usare l'estensione XML, @`e necessario installare
@@ -39206,7 +39776,7 @@ Le sequenze di protezione @samp{\a}, @samp{\v} e @samp{\x}
@c GNU, for ANSI C compat
@item
-Un valore di ritorno definito per la funzione predefinita @code{srand()}
+Un codice di ritorno definito per la funzione predefinita @code{srand()}
(@pxref{Funzioni numeriche})
@item
@@ -40394,7 +40964,7 @@ La versione 4.2 di @command{gawk} ha introdotto le seguenti modifiche:
@itemize @bullet
@item
-Differenze apportate alle variabili di ambiente (@code{ENVIRON}) sono
+Differenze apportate alle variabili d'ambiente (@code{ENVIRON}) sono
riflesse in quelle rese disponibili a @command{gawk} e in quelle di
programmi che siano da esso richiamati.
@xref{Variabili auto-assegnate}.
@@ -40517,6 +41087,14 @@ Il supporto per GNU/Linux sull'architettura Alpha @`e stato rimosso.
@end itemize
+La @value{PVERSION} 5.0 ha aggiunto le seguenti funzionalit@`a:
+
+@itemize
+@item
+L'elemento di vettore @code{PROCINFO["platform"]}, che permette di
+scrivere del codice che tiene conto di piattaforma / sistema operativo.
+@end itemize
+
@c XXX ADD MORE STUFF HERE
@end ifclear
@@ -41139,7 +41717,7 @@ correzioni a errori minori sono state incluse nel rilascio.
Il @dfn{patch level} corrente @`e @value{PATCHLEVEL}, ma quando ci si procura
una distribuzione, andr@`a ottenuta quella con il livello pi@`u alto di
versione, rilascio e @dfn{patch}.
-(Si noti, comunque, che livelli di @dfn{patch} maggiori o uguali a 70
+(Si noti, comunque, che livelli di @dfn{patch} maggiori o uguali a 60
denotano versioni ``beta'', ossia versioni non destinate a essere usate
in produzione; non si dovrebbero utilizzare tali versioni, se non si @`e
disposti a sperimentare.)
@@ -41367,7 +41945,7 @@ gli esempi di estensione incluse con @command{gawk}.
Ulteriori file, non-essenziali. Al momento, questa directory contiene
alcuni file da eseguire al momento di iniziare una sessione,
da installare nella directory @file{/etc/profile.d}
-per essere di aiuto nella gestione delle variabili di ambiente
+per essere di aiuto nella gestione delle variabili d'ambiente
@env{AWKPATH} e @env{AWKLIBPATH}.
@xref{File da usare a inizio sessione}, per ulteriori informazioni.
@@ -41501,7 +42079,7 @@ utenti che possono utilizzare il comando @command{sudo}.
La distribuzione contiene i file da usare a inizio sessione
@file{gawk.sh} e
@file{gawk.csh}, che contengono funzioni che possono essere di aiuto
-nel gestire le variabili di ambiente
+nel gestire le variabili d'ambiente
@env{AWKPATH} e @env{AWKLIBPATH}.
Su un sistema Fedora GNU/Linux, questi file dovrebbero essere installati
nella directory @file{/etc/profile.d};
@@ -41558,7 +42136,7 @@ quando si compila @command{gawk} a partire dai sorgenti, tra cui:
@cindex @option{--disable-extensions}, opzione di configurazione
@cindex opzione di configurazione @code{--disable-extensions}
@item --disable-extensions
-Richiede di non configurare e generare le estensioni di esempio nella
+Richiesta di non configurare e generare le estensioni di esempio nella
directory @file{extension}. Questo @`e utile quando si genera
@command{gawk} per essere eseguito su un'altra piattaforma.
L'azione di default @`e di controllare dinamicamente se le estensioni
@@ -41567,7 +42145,7 @@ possono essere configurate e compilate.
@cindex @option{--disable-lint}, opzione di configurazione
@cindex opzione di configurazione @code{--disable-lint}
@item --disable-lint
-Disabilita i controlli @dfn{lint} all'interno di @command{gawk}. Le opzioni
+Disabilitare i controlli @dfn{lint} all'interno di @command{gawk}. Le opzioni
@option{--lint} e @option{--lint-old}
(@pxref{Opzioni})
sono accettate, ma non fanno nulla, e non emettono alcun messaggio di
@@ -41592,7 +42170,7 @@ Quest'opzione potr@`a essere rimossa in futuro.
@cindex @option{--disable-mpfr}, opzione di configurazione
@cindex opzione di configurazione @code{--disable-mpfr}
@item --disable-mpfr
-Non viene effettuato il controllo delle librerie MPFR e GMP.
+Non effettuare il controllo delle librerie MPFR e GMP.
Ci@`o pu@`o essere utile principalmente per gli sviluppatori,
per assicurarsi che tutto funzioni regolarmente nel caso in cui
il supporto MPFR non sia disponibile.
@@ -41600,16 +42178,19 @@ il supporto MPFR non sia disponibile.
@cindex @option{--disable-nls}, opzione di configurazione
@cindex opzione di configurazione @code{--disable-nls}
@item --disable-nls
-Non attiva la traduzione automatica dei messaggi.
+Non attivare la traduzione automatica dei messaggi.
Ci@`o normalmente non @`e consigliabile, ma pu@`o apportare qualche lieve
miglioramento nei tempi di esecuzione di un programma.
-@cindex @option{--with-whiny-user-strftime}, opzione di configurazione
-@cindex opzione di configurazione @code{--with-whiny-user-strftime}
-@item --with-whiny-user-strftime
-Forza l'uso della versione della funzione C @code{strftime()} inclusa nella
-distribuzione di @command{gawk}, per i sistemi in cui la funzione stessa
-non sia disponibile.
+@cindex @option{--enable-versioned-extension-dir}, opzione di configurazione
+@cindex opzione di configuzazione @code{--enable-versioned-extension-dir}
+@item --enable-versioned-extension-dir
+Usare una directory con l'indicazione della versione per le estensioni.
+Il nome della directory conterr@`a la versione principale e quella
+secondaria dell'API. Ci@`o consente la presenza, nello stesso sistema,
+di pi@`u di una versione dell'API, senza che fra di esse sorgano dei
+conflitti legati all'una o all'altra versione.
+
@end table
Si usi il comando @samp{./configure --help} per ottenere la lista completa
@@ -41741,9 +42322,10 @@ usando gli strumenti MinGW, scrivere @samp{make mingw32}.
@cindex PC, @command{gawk} su sistemi operativi
@cindex sistemi operativi PC, @command{gawk} su
-Sotto MS-Windows, gli ambienti Cygwin e MinGW consentono di usare
+Sotto MS-Windows, l'ambiente MinGW consente di usare
sia l'operatore @samp{|&} che le operazioni su rete TCP/IP
(@pxref{Reti TCP/IP}).
+L'ambiente DJGPP non consente di usare @samp{|&}.
@cindex percorso di ricerca
@cindex percorso di ricerca per file sorgente
@@ -41804,6 +42386,13 @@ un'appropriata opzione @samp{-v BINMODE=@var{N}} sulla riga di comando.
@code{BINMODE} @`e impostato nel momento in cui un file o @dfn{pipe} @`e aperto
e non pu@`o essere cambiato in corso di elaborazione.
+Su sistemi compatibili con POSIX, il valore di queta variabile non ha
+alcun effetto. Pertanto, se si pensa che un dato programma sar@`a eseguito
+su parecchi sistemi differenti, e che sia necessario usare
+@code{BINMODE}, @`e possibile impostarlo semplicemente (nel programma
+o sulla riga di comando) incondizionatamente, senza preoccuparsi del
+sistema operativo sotto il quale il programma viene eseguito.
+
Il nome @code{BINMODE} @`e stato scelto in analogia con @command{mawk}
(@pxref{Altre versioni}).
@command{mawk} e @command{gawk} gestiscono @code{BINMODE} in maniera simile;
@@ -41874,8 +42463,17 @@ make && make check
@end example
In confronto a un sistema GNU/Linux sulla stessa macchina, l'esecuzione
-del passo di @samp{configure} sotto Cygwin richiede molto pi@`u tempo. Tuttavia
-si conclude regolarmente, e poi @samp{make} funziona come ci si aspetta.
+del passo di @samp{configure} sotto Cygwin richiede molto pi@`u tempo.
+Tuttavia si conclude regolarmente, e poi @samp{make} funziona come ci si
+aspetta.
+
+Le versioni pi@`u recenti di Cygwin aprono tutti i file in modalit@`a binaria.
+Ci@`o implica che si dovrebbe usare @samp{RS = "\r?\n"} per riuscire a
+gestire file di testo MS-Windows in formato standard, in cui ogni riga
+termina con i due caratteri di ritorno a capo e avanzamento riga.
+
+L'ambiente Cygwin consente l'utilizzo sia dell'operatore @samp{|&}
+che di reti TCP/IP (@pxref{Reti TCP/IP}).
@node MSYS
@appendixsubsubsec Usare @command{gawk} in ambiente MSYS
@@ -42150,8 +42748,9 @@ unix_status = (vms_status .and. %x7f8) / 8
Un programma C che usa @code{exec()} per chiamare @command{gawk}
ricever@`a il valore originale della exit in stile Unix.
-Precedenti versioni di @command{gawk} per VMS consideravano un codice di
-ritorno a Unix di 0 come 1, un errore come 2, un errore fatale come 4, e tutti
+Precedenti versioni di @command{gawk} per VMS consideravano un
+codice di ritorno a Unix di 0 come 1, un errore come 2,
+un errore fatale come 4, e tutti
gli altri valori erano restituiti immodificati. Questa era una violazione
rispetto alle specifiche di codifica delle condizioni di uscita di VMS.
@@ -42386,6 +42985,13 @@ domande riguardo a qualcosa di non chiaro nella documentazione o a proposito
di funzionalit@`a oscure, si scriva alla mailing list dei bug; si prover@`a
a essere di aiuto nei limiti del possibile.
+Si tenga presente: Si chiede di seguire le
+@uref{https://gnu.org/philosophy/kind-communication.html,
+@dfn{GNU Kind Communication Guidelines}
+-- Linee guida GNU per una comunicazione gentile}
+nella corrispondenza con la lista
+(e anche in quella fuori dalla lista).
+
@node Usenet
@appendixsubsec Non segnalare bug a USENET!
@@ -42411,7 +43017,12 @@ Sebbene alcuni degli sviluppatori di @command{gawk} leggano talora i
messaggi di questo gruppo di discussione, il manutentore principale di
@command{gawk} non lo fa pi@`u. Quindi @`e praticamente certo che un
messaggio inviato l@`a @emph{non} sia da lui letto.
-La procedura qui descritta @`e la sola maniera ufficialmente riconosciuta
+
+Analogamente, segnalando bug o ponendo domande in @dfn{forum} online
+come @uref{https://stackoverflow.com/, Stack Overflow}) si pu@`o
+ottenere una risposta, ma non dai manutentori di @command{gawk},
+che non dedicano tempo ai @dfn{forum} online. La procedura qui
+descritta @`e la sola maniera ufficialmente riconosciuta
per notificare problemi. Davvero!
@ignore
@@ -42480,13 +43091,6 @@ nel caso che qualche volontario desideri prenderla in carico.
Se questo non dovesse succedere, la parte di codice relativa questa
versione sar@`a rimossa dalla distribuzione.
-@c 7/2017, Juan Guerrero has taken over the DJGPP port.
-@ignore
-The DJGPP port is no longer supported; it will remain in the code base
-for a while in case a volunteer wishes to take it over. If this does
-not happen, then eventually code for this port will be removed.
-@end ignore
-
@node Altre versioni
@appendixsec Altre implementazioni di @command{awk} liberamente disponibili
@cindex @command{awk}, implementazioni di
@@ -42531,38 +43135,25 @@ Questa @value{SECTION} descrive in breve dove @`e possibile trovarle:
@item Unix @command{awk}
Brian Kernighan, uno degli sviluppatori originali di Unix @command{awk},
ha reso disponibile liberamente la sua implementazione di @command{awk}.
-Si pu@`o scaricare questa versione dalla
-@uref{http://www.cs.princeton.edu/~bwk, sua pagina principale}.
-@`E disponibile in parecchi formati compressi:
-
-@table @asis
-@item Archivio Shell
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.shar}
-
-@item File @command{tar} compresso
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.tar.gz}
-
-@item File Zip
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.zip}
-@end table
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-@`E anche disponbile in GitHub:
-
+Pu@`o essere scaricata da GitHub:
@example
git clone git://github.com/onetrueawk/awk bwkawk
@end example
@noindent
Questo comando crea una copia del deposito @uref{https://git-scm.com, Git}
-in una directory chiamata @file{bwkawk}. Se si omette questo argomento della
-riga di comando @command{git}, la copia del deposito @`e creata nella
+in una directory chiamata @file{bwkawk}. Se si omette l'ultimo argomento
+della riga di comando @command{git}, la copia del deposito @`e creata in una
directory di nome @file{awk}.
Questa versione richiede un compilatore ISO C (standard 1990); il compilatore
C contenuto in GCC (la collezione di compilatori GNU) @`e pi@`u che sufficiente.
+Per eseguire la compilazione, si rivedano le impostazioni nel file
+@file{makefile}, e quindi si richiami semplicemente @command{make}.
+Si noti che il risultato della compilazione ha come nome
+@command{a.out}; questo file va rinominato in maniera adeguata.
+
@xref{Estensioni comuni}
per una lista di estensioni in questo @command{awk} che non sono in
POSIX @command{awk}.
@@ -42686,6 +43277,19 @@ il progetto
mette a disposizione questa implementazione. Si possono vedere i singoli file in
@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
+@cindex @command{goawk}
+@cindex Go, implementazione di @command{awk}
+@cindex sorgente, @command{goawk}
+@cindex @command{goawk}, sorgente di
+@item @command{goawk}
+Questo @`e un interpretatore di @command{awk} scritto nel
+@uref{https://golang.org/, Linguaggio di programmazion Go}.
+Implementa POSIX @command{awk}, con alcune estensioni minori.
+Il codice sorgente @`e disponibile in @uref{https://github.com/benhoyt/goawk}.
+L'autore ha scritto un buon
+@uref{https://benhoyt.com/writings/goawk/, articolo}
+che descrive l'implementazione.
+
@cindex @command{jawk}
@cindex Java, implementazione di @command{awk}
@cindex implementazione Java di @command{awk}
@@ -42810,8 +43414,6 @@ specificatamente a @command{gawk} e non ad altre implementazioni.
* Limitazioni dell'implementazione:: Alcune limitazioni
dell'implementazione.
* Progetto delle estensioni:: Note di progetto sull'estensione API.
-* Meccanismo delle vecchie estensioni:: Alcune compatibilit@`a per le vecchie
- estensioni.
* Sommario delle note:: Sommario delle note di
implementazione.
@end menu
@@ -43523,7 +44125,7 @@ sistemi operativi possono avere limiti differenti.
@item Numero di record in input in un singolo file @tab @code{MAX_LONG}
@item Numero totale di record in input @tab @code{MAX_LONG}
@item Numero di ridirezioni via @dfn{pipe} @tab min(numero processi per utente, numero di file aperti)
-@item Valori numerici @tab Numeri a virgola mobile in doppia precisione (se non si usa la funzionalit@`a MPFR)
+@item Valori numerici @tab Numeri in virgola mobile in doppia precisione (se non si usa la funzionalit@`a MPFR)
@item Dimensione di un campo @tab @code{MAX_INT}
@item Dimensione di una stringa letterale @tab @code{MAX_INT}
@item Dimensione di una stringa di @dfn{printf} @tab @code{MAX_INT}
@@ -43774,54 +44376,6 @@ evitare in questo modo possibili conflitti nei nomi di funzione.
Naturalmente, al momento in cui queste righe sono state scritte, nessuna
decisione @`e stata presa riguardo ai punti sopra descritti.
-@node Meccanismo delle vecchie estensioni
-@appendixsec Compatibilit@`a per le vecchie estensioni
-
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche}, descrive le API supportate e i meccanismi
-per scrivere estensioni per @command{gawk}. Quest'API @`e stata introdotta
-nella @value{PVERSION} 4.1. Peraltro, gi@`a da molti anni @command{gawk}
-metteva a disposizione un meccanismo di estensione che richiedeva una
-familiarit@`a con la struttura interna di @command{gawk} e che non era stato
-progettato altrettanto bene.
-
-Per garantire un periodo di transizione, @command{gawk} @value{PVERSION} 4.1
-continua a supportare il meccanismo di estensione originale.
-Questo rimarr@`a disponibile per la durata di una sola versione principale.
-Il supporto cesser@`a, e sar@`a rimosso dal codice sorgente, al rilascio
-della prossima versione principale.
-
-In breve, le estensioni in stile originale dovrebbero essere compilate
-includendo il file di intestazione @file{awk.h} nel codice sorgente
-dell'estensione. Inoltre, va definito l'identificativo @samp{GAWK} durante la
-preparazione (si usi @samp{-DGAWK} con compilatori in stile Unix). Se non lo
-si fa, le definizioni in @file{gawkapi.h} risulteranno in conflitto con quelle
-in @file{awk.h} e l'estensione non sar@`a compilabile.
-
-Come nelle versioni precedenti, un'estensione vecchio stile sar@`a caricata
-usando la funzione predefinita @code{extension()} (che non viene ulteriormente
-documentata). Questa funzione, a sua volta, trova e carica il file oggetto
-condiviso che contiene l'estensione e chiama la sua routine C @code{dl_load()}.
-
-Poich@'e le estensioni in stile originale e quelle nello stile nuovo usano
-differenti routine di inizializzazione(@code{dl_load()} e @code{dlload()},
-rispettivamente), esse possono tranquillamente essere installate nella stessa
-directory (il cui nome deve essere contenuto nella variabile @env{AWKLIBPATH})
-senza problemi di conflitti.
-
-Il @dfn{team} di sviluppo di @command{gawk} raccomanda caldamente di convertire
-ogni estensione del vecchio tipo ancora in uso, in modo da utilizzare la nuova
-API descritta
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Estensioni dinamiche}.
-
@node Sommario delle note
@appendixsec Sommario
@@ -44062,11 +44616,11 @@ variabili numeriche e di tipo stringa, sono definite come valori
La
@end iftex
@ref{Aritmetica del computer}, ha fornito un'introduzione di base ai tipi
-numerici (interi e a virgola mobile) e a come questi sono usati in un computer.
+numerici (interi e in virgola mobile) e a come questi sono usati in un computer.
Si consiglia di rileggere quelle informazioni, comprese le numerose avvertente
l@`a esposte.
-@cindex stringhe nulle
+@cindex stringa nulla
Mentre @`e probabile che ci si sia abituati all'idea di un numero senza un valore
(cio@`e, allo zero), richiede un po' pi@`u di riflessione abituarsi all'idea di
dati di tipo carattere a lunghezza zero. Nonostante ci@`o, questo tipo di dato
@@ -44076,14 +44630,30 @@ programmi @command{awk}: @code{""}.
Gli esseri umani sono abituati a usare il sistema decimale, cio@`e a base 10.
In base 10, i numeri vanno da 0 a 9, e poi ``vengono riportati'' nella
-colonna successiva. (Chi si ricorda la scuola elementare? 42 = 4 x 10 + 2.)
+colonna
+@iftex
+colonna successiva.
+(Chi si ricorda la scuola elementare? @math{42 = 4 volte 10 + 2}.)
+@end iftex
+@ifnottex
+colonna successiva.
+(Chi si ricorda la scuola elementare? 42 = 4 x 10 + 2.)
+@end ifnottex
Ma esistono anche altre basi per i numeri. I computer normalmente usano
la base 2 o @dfn{binaria}, la base 8 o @dfn{ottale}, e la base 16 o
@dfn{esadecimale}. Nella numerazione binaria, ogni colonna rappresenta il
doppio del valore della colonna alla sua destra. Ogni colonna pu@`o contenere
-solo uno 0 o un 1. Quindi, il numero binario 1010 rappresenta (1 x 8) + (0 x
-4) + (1 x 2) + (0 x 1), ossia il numero decimale 10. Le numerazioni ottale ed
+solo uno 0 o un 1.
+@iftex
+Quindi, il numero binario 1010 rappresenta @math{(1 volta 8) + (0 volte 4)
++ (1 volta 2) + (0 volte 1)}, ossia il numero decimale 10.
+@end iftex
+@ifnottex
+Quindi, il numero binario 1010 rappresenta (1 x 8) + (0 x 4)
++ (1 x 2) + (0 x 1), ossia il numero decimale 10.
+@end ifnottex
+Le numerazioni ottale ed
esadecimale sono trattate pi@`u ampiamente
@ifnottex
in
@@ -44236,7 +44806,13 @@ i circuiti elettronici funzionano ``naturalmente'' in base 2
calcolata usando la base 2. Ciascuna cifra rappresenta la presenza
(o l'assenza) di una potenza di 2 ed @`e chiamata un @dfn{bit}.
Cos@`{@dotless{i}}, per esempio, il numero in base due @code{10101} rappresenta il
-numero in base decimale 21, ((1 x 16) + (1 x 4) + (1 x 1)).
+numero in base decimale 21,
+@iftex
+(@math{(1 volta 16) + (1 volta 4) + (1 volta 1)}).
+@end iftex
+@ifnottex
+((1 x 16) + (1 x 4) + (1 x 1)).
+@end ifnottex
Poich@'e i numeri in base due diventano rapidamente molto lunghi
sia da leggere che da scrivere, normalmente li si unisce a gruppi di tre
@@ -44303,9 +44879,9 @@ Abbreviazione di ``Binary Digit'' [cifra binaria].
Tutti i valori nella memoria di un computer sono rappresentati nella forma di
cifre binarie: valori che sono zero o uno.
Gruppi di bit possono essere interpretati differentemente---come numeri
-interi, numeri a virgola mobile, dati di tipo carattere, indirizzi di altri
+interi, numeri in virgola mobile, dati di tipo carattere, indirizzi di altri
oggetti contenuti in memoria, o altri dati ancora.
-@command{awk} permette di lavorare con numeri a virgola mobile e stringhe.
+@command{awk} permette di lavorare con numeri in virgola mobile e stringhe.
@command{gawk} permette di manipolare bit con le funzioni predefinite
descritte
@ifnottex
@@ -44346,7 +44922,7 @@ stile complessivo, che @`e abbastanza simile a quello del linguaggio C.
La C shell non @`e compatibile all'indietro con la Bourne Shell, e per questo
motivo un'attenzione speciale @`e necessaria se si convertono alla C shell
degli script scritti per altre shell Unix, in particolare per ci@`o che
-concerne la gestione delle variaili di shell.
+concerne la gestione delle variabili di shell.
Si veda anche ``Bourne Shell''.
@item C++
@@ -44484,7 +45060,13 @@ le lettere @code{A}--@code{F}, con @samp{A}
che rappresenta 10, @samp{B} che rappresenta 11, e cos@`{@dotless{i}} via, fino a
@samp{F} per 15.
I numeri esadecimali sono scritti in C prefissandoli con @samp{0x},
-per indicarne la base. Quindi, @code{0x12} @`e 18 ((1 x 16) + 2).
+per indicarne la base.
+@iftex
+Quindi, @code{0x12} @`e 18 (@math{(1 volta 16) + 2}).
+@end iftex
+@ifnottex
+Quindi, @code{0x12} @`e 18 ((1 x 16) + 2).
+@end ifnottex
@xref{Numeri non-decimali}.
@item Espressione booleana
@@ -44578,7 +45160,7 @@ Si veda anche ``Espressioni regolari''.
La negazione di una @dfn{espressione tra parentesi quadre}. Tutto ci@`o che
@emph{non} @`e descritto da una data espressione tra parentesi quadre.
Il simbolo @samp{^} precede l'espressione tra parentesi quadre che viene
-negata. Per esempio: @samp{[[^:digit:]}
+negata. Per esempio: @samp{[^[:digit:]]}
designa qualsiasi carattere che non sia una cifra. @samp{[^bad]}
designa qualsiasi carattere che non sia una delle lettere @samp{b}, @samp{a},
o @samp{d}.
@@ -44860,11 +45442,11 @@ Un'operazione che non fa nulla.
@item Numero
Un dato oggetto il cui valore @`e numerico. Le implementazioni di @command{awk}
-usano numeri a virgola mobile in doppia precisione per rappresentare i numeri.
-Le primissime implementazioni di @command{awk} usavano numeri a virgola mobile
+usano numeri in virgola mobile in doppia precisione per rappresentare i numeri.
+Le primissime implementazioni di @command{awk} usavano numeri in virgola mobile
in singola precisione.
-@item Numero a virgola mobile
+@item Numero in virgola mobile
Spesso descritto, in termini matematici, come un numero ``razionale'' o reale,
@`e soltanto un numero che pu@`o avere una parte frazionaria.
Si veda anche ``Doppia precisione'' e ``Singola precisione''.
@@ -44875,7 +45457,13 @@ Si veda ``Metacaratteri''.
@item Ottale
Notazione avente come base 8, nella quale le cifre sono @code{0}--@code{7}.
I numeri ottali in C sono scritti premettendo uno @samp{0},
-per indicare la base. Quindi, @code{013} @`e 11 ((1 x 8) + 3).
+per indicare la base.
+@iftex
+Quindi, @code{013} @`e 11 (@math{(1 volta 8) + 3}).
+@end iftex
+@ifnottex
+Quindi, @code{013} @`e 11 ((1 x 8) + 3).
+@end ifnottex
@xref{Numeri non-decimali}.
@item Parentesi Graffe
@@ -44894,7 +45482,7 @@ Le parole chiave di @command{gawk} sono:
@code{break},
@code{case},
@code{continue},
-@code{default}
+@code{default},
@code{delete},
@code{do@dots{}while},
@code{else},
@@ -44954,7 +45542,7 @@ Si veda ``Record in input'' e ``Record in output''.
@item Record in input
Una singola parte di dati letta da @command{awk}. Solitamente, un
-record in input di @command{awk} consiste in una linea di testo.
+record in input di @command{awk} consiste in una riga di testo.
(@xref{Record}).
@item Record in output
@@ -45162,7 +45750,7 @@ interi sequenziali compresi in un intervallo prestabilito.
@c hence no sectioning command or @node.
@display
-Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{https://fsf.org/}
This is an unofficial translation of the GNU General Public License into
Italian. It was not published by the Free Software Foundation, and does not
@@ -45848,7 +46436,7 @@ CORREZIONE.
IN NESSUN CASO, A MENO CHE NON SIA RICHIESTO DALLA NORMATIVA VIGENTE O
CONCORDATO PER ISCRITTO, I DETENTORI DEL COPYRIGHT, O QUALUNQUE ALTRA PARTE
-CHE MODIICA E/O DISTRIBUISCE IL PROGRAMMA SECONDO LE CONDIZIONI PRECEDENTI,
+CHE MODIFICA E/O DISTRIBUISCE IL PROGRAMMA SECONDO LE CONDIZIONI PRECEDENTI,
POSSONO ESSERE RITENUTI RESPONSABILI NEI CONFRONTI DEL LICENZIATARIO PER
DANNI, INCLUSO QUALUNQUE DANNEGGIAMENTO GENERICO, SPECIALE, INCIDENTALE O
CONSEQUENZIALE DOVUTO ALL'USO O ALL'IMPOSSIBILIT@`A D'USO DEL PROGRAMMA
@@ -45899,8 +46487,8 @@ IDONEIT@`A AD UN PARTICOLARE SCOPO. Si veda la 'GNU General Public License' per
ulteriori dettagli.
Dovresti aver ricevuto una copia della GNU General Public License assieme a
-questo programma; se non @`e cos@`{@dotless{i}}, si veda
-@url{http://www.gnu.org/licenses/}.
+questo programma; se non @`e cos@`{@dotless{i}}, vedere
+@url{https://www.gnu.org/licenses/}.
@end smallexample
Inoltre, aggiungi le informazioni necessarie a contattarti via posta ordinaria
@@ -45927,14 +46515,14 @@ Devi inoltre fare in modo che il tuo datore di lavoro (se lavori come
programmatore presso terzi) o la tua scuola, eventualmente, firmino una
``rinuncia al copyright'' sul programma, se necessario. Per maggiori
informazioni su questo punto, e su come applicare e rispettare la GNU GPL,
-consultare la pagina @url{http://www.gnu.org/licenses/}.
+consultare la pagina @url{https://www.gnu.org/licenses/}.
La GNU General Public License non consente di incorporare il programma
all'interno di software proprietario. Se il tuo programma @`e una libreria di
funzioni, potresti ritenere pi@`u opportuno consentire il collegamento tra
software proprietario e la tua libreria. Se @`e questo ci@`o che vuoi, allora
utilizza la GNU Lesser General Public License anzich@'e questa Licenza, ma prima
-leggi @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
+leggi @url{https://www.gnu.org/philosophy/why-not-lgpl.html}.
@ifclear FOR_PRINT
@c The GNU Free Documentation License.
@@ -45957,7 +46545,7 @@ leggi @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
@display
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org}
+@uref{https://fsf.org}
This is an unofficial translation of the GNU Free Documentation License into
Italian. It was not published by the Free Software Foundation, and does not
@@ -46395,7 +46983,7 @@ La Free Software Foundation pu@`o occasionalmente pubblicare versioni nuove
o rivedute della Licenza per Documentazione Libera GNU. Le nuove versioni
saranno simili nello spirito alla versione attuale ma potrebbero
differirne in qualche dettaglio per affrontare nuovi problemi e concetti.
-Si veda @uref{http://www.gnu.org/copyleft/}.
+Si veda @uref{https://www.gnu.org/copyleft/}.
Ad ogni versione della licenza viene dato un numero che la distingue. Se
il documento specifica che si riferisce ad una versione particolare della
@@ -46513,6 +47101,8 @@ Consistency issues:
The term "blank" is thus basically reserved for "blank lines" etc.
To make dark corners work, the @value{DARKCORNER} has to be outside
closing `.' of a sentence and after (pxref{...}).
+ Make sure that each @value{DARKCORNER} has an index entry, and
+ also that each `@cindex dark corner' has an @value{DARKCORNER}.
" " should have an @w{} around it
Use "non-" only with language names or acronyms, or the words bug and option and null
Use @command{ftp} when talking about anonymous ftp
@@ -46630,5 +47220,7 @@ But to use it you have to say
which sorta sucks.
TODO:
-Check that all dark corners are indexed properly.
-
+Add a section explaining recursion from ground zero. Probably
+easiest to do it with factorial as the example. Explain that
+recursion needs a stopping condition. Thanks to
+Bill Duncan <bduncan@beachnet.org> for the suggestion.