diff options
Diffstat (limited to 'doc/it/gawktexi.in')
-rwxr-xr-x[-rw-r--r--] | doc/it/gawktexi.in | 734 |
1 files changed, 576 insertions, 158 deletions
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in index fe7c6b29..0edb44e9 100644..100755 --- a/doc/it/gawktexi.in +++ b/doc/it/gawktexi.in @@ -56,7 +56,7 @@ @c applies to and all the info about who's publishing this edition @c These apply across the board. -@set UPDATE-MONTH Settembre 2020 +@set UPDATE-MONTH Gennaio 2021 @set VERSION 5.1 @set PATCHLEVEL 0 @@ -76,6 +76,7 @@ @iftex @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -93,6 +94,7 @@ @ifinfo @set DOCUMENT File Info @set CHAPTER nodo principale +@set CHAPTERS nodi principali @set APPENDIX nodo principale @set SECTION nodo secondario @set SECTIONS nodi secondari @@ -105,6 +107,7 @@ @ifhtml @set DOCUMENT Documento @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -117,6 +120,7 @@ @ifdocbook @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -129,6 +133,7 @@ @ifxml @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -141,6 +146,7 @@ @ifplaintext @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -309,7 +315,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 © 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2020 +<literallayout class="normal">Copyright © 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2021 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -331,7 +337,7 @@ Italian Linux Documentation Project (ILDP) Email: <emailildp@@pluto.it URL: <ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink></literallayout> -<literallayout class="normal">Copyright © 2016–2020 +<literallayout class="normal">Copyright © 2016–2021 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -339,7 +345,7 @@ All Rights Reserved. @ifnotdocbook @iftex -Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2020 @* +Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2021 @* Free Software Foundation, Inc. @end iftex @end ifnotdocbook @@ -687,7 +693,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Separazione in base al contenuto:: Definire campi dal loro contenuto. * File CSV:: Ancora sui file CSV. * Controllare la creazione di campi:: Controllare come @command{gawk} sta - dividendo i record. + suddividendo i record. * Righe multiple:: Record su righe multiple * Getline:: Richiedere input usando @code{getline}. * Getline semplice:: Usare @code{getline} senza argomenti. @@ -968,6 +974,9 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Programma tee:: Il programma di utilit@`a @command{tee}. * Programma uniq:: Il programma di utilit@`a @command{uniq}. * Programma wc:: Il programma di utilit@`a @command{wc}. +* Byte vs. Caratteri:: Moderni insiemi di caratteri. +* Usare le estensioni:: Una breve introduzione alle estensioni. +* Programmma @command{wc}:: Codice per @file{wc.awk}. * Programmi vari:: Alcuni interessanti programmi in @command{awk} * Programma dupword:: Trovare parole duplicate in un @@ -1005,6 +1014,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, programmazione di rete. * Profilare:: Profilare i propri programmi @command{awk}. +* Filosofia delle estensioni:: Cosa dovrebbe essere incluso e cosa no. * Sommario funzionalit@`a avanzate:: Sommario funzionalit@`a avanzate. * I18N e L10N:: Internazionalizzazione e localiz. * Utilizzare @command{gettext}:: Come funziona GNU @code{gettext}. @@ -1033,7 +1043,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Controllo dei breakpoint:: Controllo dei punti d'interruzione. * Controllo esecuzione debugger:: Controllo di esecuzione. * Vedere e modificare dati:: Vedere e modificare dati. -* Stack di esecuzione:: Lavorare con lo @dfn{stack}. +* Stack di esecuzione:: Lavorare con lo @dfn{Stack}. * Informazioni sul debugger:: Ottenere informazioni sullo stato del programma e del debugger. * Comandi vari del debugger:: Comandi vari del debugger. @@ -1065,13 +1075,14 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, esattamente. * Confronti tra valori in VM:: Come confrontare valori in virgola mobile. * Gli errori si sommano:: Gli errori diventano sempre maggiori. +* Valori strani:: Un cenno riguardo ai valori infiniti e a NaN [``non @`e un numero'']. * Ottenere la precisione:: Ottenere la precisione voluta. * Tentare di arrotondare:: Tentare di aggiungere bit di precisione e arrotondare. * Impostare la precisione:: Impostare la precisione. * Impostare modo di arrotondare:: Impostare la modalit@`a di arrotondamento. -* Controllare disponibilit@`a MPFR:: Come controllare se MPFR @`e disponibile. +* Controllare disponibilit@`a MPFR:: Come controllare se MPFR @`e disponibile. * Interi a precisione arbitraria:: Aritmetica dei numeri interi a precisione arbitraria con @command{gawk}. * Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente. @@ -1084,8 +1095,8 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Intro funzioni estensione API:: Introduzione alle funzioni dell'API. * Tipi di dati generali:: I tipi di dati. * Funzioni di allocazione memoria:: Funzioni per allocare memoria. -* API e gestione valori MPFR e GMP:: Gestione valori MPFR e GMP. * Funzioni di costruzione:: Funzioni per creare valori. +* API e gestione valori MPFR e GMP:: Gestione valori MPFR e GMP. * Funzioni di registrazione:: Funzioni per registrare cose con @command{gawk}. * Funzioni di estensione:: Registrare funzioni di estensione. @@ -3259,7 +3270,7 @@ Le ``shell'' nei sistemi Microsoft Windows usano il carattere doppio apice per protezione, e rendono difficile o impossibile inserire un carattere doppio apice letterale in uno @dfn{script} scritto su una riga di comando. L'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come -proteggere i doppi apici, con questo script di una sola riga, che stampa +proteggere i doppi apici, con questo @dfn{script} di una sola riga, che stampa tutte le righe di un file, racchiudendole tra doppi apici: @example @@ -3338,11 +3349,12 @@ persona @`e un amico [Friend]. Una @samp{R} vuol dire che quella persona @`e un parente [Relative]: @example -@c system if test ! -d eg ; then mkdir eg ; fi -@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi -@c system if test ! -d eg/data ; then mkdir eg/data ; fi -@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi -@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg ; then mkdir eg ; fi +@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi +@c system if test ! -d eg/data ; then mkdir eg/data ; fi +@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi +@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg/test-programs ; then mkdir eg/test-programs ; fi @c file eg/data/mail-list Amelia 555-5553 amelia.zodiacusque@@gmail.com F Anthony 555-3412 anthony.asserturo@@hotmail.com A @@ -3689,7 +3701,7 @@ anno). Come gi@`a visto sopra, l'output di @w{@samp{ls -l}} elenca la lista dei file contenuti in una directory, compresa la lunghezza di ogni -file la data in cui il file @`e stato modificato per l'ultima volta. +file e la data in cui il file @`e stato modificato per l'ultima volta. Il primo campo contiene le autorizzazioni di lettura-scrittura, il secondo campo contiene il numero di @dfn{link} di quel file e il terzo campo identifica il proprietario del file. @@ -3698,7 +3710,7 @@ Il quinto campo contiene la dimensione del file, in byte. Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora, rispettivamente, in cui il file @`e stato modificato l'ultima volta. -Finalmente il nono campo contiene il valore @value{FN}. +Infine, il nono campo contiene il valore @value{FN}. @c @cindex automatic initialization @cindex inizializzazione @subentry automatica @@ -3937,7 +3949,7 @@ e buttati via. Poich@'e i programmi @command{awk} sono interpretati, si pu@`o evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico dello sviluppo software, ossia edita-compila-prova-correggi. -@cindex BWK @command{awk} @seeentry{Brian Kernighan @subentry @command{awk} di} +@cindex BWK @command{awk} @seeentry{Brian Kernighan, @command{awk} di} @cindex Brian Kernighan @subentry @command{awk} di In @command{awk} sono stati scritti programmi complessi, compreso un assembler completo, pluri-piattaforma per @@ -4429,7 +4441,7 @@ informazioni. @cindex codice-byte interno @subentry tracciatura del Stampa i nomi del codice-byte generato internamente, nell'ordine in cui sono incontrati durante l'esecuzione del programma. -Questa trace @`e stampata sullo standard error. +Questa tracciatura @`e stampata sullo standard error. Ogni ``codice operativo'' @`e preceduto da un segno @code{+} nell'output. @@ -4534,7 +4546,7 @@ Forza l'uso del carattere di separazione decimale della localizzazione quando analizza i dati in input (@pxref{Localizzazioni}). -@cindex stampa elegante +@cindex stampa-elegante @item @option{-o}[@var{file}] @itemx @option{--pretty-print}[@code{=}@var{file}] @cindex @option{-o} (opzione) @@ -5018,7 +5030,7 @@ variabile non esiste, o se ha un come valore la stringa nulla, @command{gawk} usa un percorso di default (descritto tra poco). La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire -librerie di funzioni di @command{awk}. I file di libreria possono essere messi +librerie di funzioni di @command{awk}. Le librerie di file possono essere messe in una directory standard inclusa nel percorso di ricerca e richiamati sulla riga di comando con un @value{FN} breve. Altrimenti, si dovrebbe scrivere l'intero @value{FN} per @@ -5026,7 +5038,7 @@ ciascun file. Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di @command{awk} scritti sulla riga di comando possono usare le funzionalit@`a -contenute nei file di libreria di @command{awk} +contenute nelle librerie di file di @command{awk} @iftex (@pxrefil{Funzioni di libreria}). @end iftex @@ -5192,7 +5204,11 @@ del filesystem). @item AWK_HASH Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk} usa la funzione hash di GNU Smalltalk per gestire i vettori. -Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard. +Se invece ha per valore @samp{fnv1a}, @command{gawk} usa la funzione hash +@uref{http://www.isthe.com/chongo/tech/comp/fnv/index.html, +FNV1-A}. +Queste funzioni possono essere leggermente pi@`u veloci della funzione standard. + @item AWKREADFUNC Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per volta, anzich@'e a blocchi. Questa variabile @`e presente @@ -5386,7 +5402,7 @@ possono includere queste ``librerie'' usando il percorso completo dei file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e quindi usando @code{@@include} con la sola parte del percorso completo che designa il file. Naturalmente, -si possono tenere i file di libreria in pi@`u di una directory; +si possono tenere le librerie di file in pi@`u di una directory; pi@`u @`e complesso l'ambiente di lavoro, pi@`u directory possono essere necessarie per organizzare i file da includere. @@ -6314,6 +6330,47 @@ nella @dfn{regexp}. Per esempio, @code{/+/} individua un semplice segno pi@`u. Tuttavia, molte altre versioni di @command{awk} trattano una tale notazione come un errore di sintassi. +@sidebar E se la @dfn{regexp} è vuota? +@cindex vuote @subentry @dfn{regexps} +@cindex @dfn{regexp} @subentry vuote +Viene qui descritto un uso avanzato delle @dfn{regexp}. +Pu@`o essere saltato in una prima lettura. + +Si può specificare una costante @dfn{regexp} vuota (@samp{//}) in ogni +posto in cui ci si aspetta di trova una @dfn{regexp}. +Può servire a qualcosa farlo? A cosa corrisponde? + +Ha senso farlo. Corrisponde alla stringa vuota (invisibile), +all'inizio e alla fine di una stringa di caratteri, come pure +alla stringa vuota tra un carattere e l'altro. Lo si vede bene +con la funzione @code{gsub()}, che si usa per fare delle sostituzioni +globali (@pxref{Funzioni per stringhe}). L'uso normale di @code{gsub()} +è del tipo: + +@example +$ @kbd{awk '} +> @kbd{BEGIN @{} +> @kbd{ x = "ABC_CBA"} +> @kbd{ gsub(/B/, "bb", x)} +> @kbd{ print x} +> @kbd{@}'} +@print{} AbbC_CbbA +@end example + +Possiamo usare @code{gsub()} per verificare dove sono situate le stringhe +vuote che corrispondono alla @dfn{regexp} vuote: + +@example +$ @kbd{awk '} +> @kbd{BEGIN @{} +> @kbd{ x = "ABC"} +> @kbd{ gsub(//, "x", x)} +> @kbd{ print x} +> @kbd{@}'} +@print{} xAxBxCx +@end example +@end sidebar + @node Espressioni di intervallo @subsection Alcune note sulle espressioni di intervallo @@ -6384,7 +6441,7 @@ che occupano un unico byte (caratteri il cui valore stia nell'intervallo 0--256). Per individuare un intervallo di caratteri in cui i punti di inizio e fine dell'intervello abbiano valori maggiori di 256, occorre immettere direttamente -le codifiche multi-byte dei caratteri in questione. +le codifiche multibyte dei caratteri in questione. @cindex @code{\} (barra inversa) @subentry in espressioni tra parentesi quadre @cindex barra inversa (@code{\}) @subentry in espressioni tra parentesi quadre @@ -6523,7 +6580,7 @@ sono equivalenti). Queste sequenze sono: @cindex espressioni @subentry tra parentesi quadre @subentry elementi di collazione @cindex elementi @subentry di collazione @item elementi di collazione -Elementi di collazione multi-byte racchiusi fra +Elementi di collazione multibyte racchiusi fra @samp{[.} e @samp{.]}. Per esempio, se @samp{ch} @`e un elemento di collazione, @samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere @@ -7096,7 +7153,7 @@ getline (@pxref{Getline}). * Dimensione costante:: Leggere campi di larghezza costante. * Separazione in base al contenuto:: Definire campi dal loro contenuto. * Controllare la creazione di campi:: Controllare come @command{gawk} sta - dividendo i record. + suddividendo i record. * Righe multiple:: Leggere record che sono su pi@`u righe. * Getline:: Leggere file sotto il controllo del programma, usando la funzione @@ -7274,23 +7331,6 @@ 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}). -In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente -@samp{1}: - -@example -$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}' -@print{} 1 -@end example - -C'@`e un solo campo, consistente in un ritorno a capo. Il valore della -variabile predefinita @code{NF} @`e il numero di campi nel record corrente. -(Normalmente @command{gawk} tratta il ritorno a capo come uno spazio -vuoto, stampando @samp{0} come risultato. Anche molte altre versioni di -@command{awk} agiscono in questo modo.) - @cindex angolo buio @subentry file in input 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 @@ -7387,7 +7427,7 @@ particolare se il testo di input che potrebbe avere una corrispondenza con la parte finale @`e piuttosto lungo. @command{gawk} cerca di evitare questo problema, ma al momento non ci sono garanzie che questo funzioni sempre. -@quotation NOTA +@sidebar Avvertenze per quando si usano espressioni regolari come @code{RS} Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e @samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la fine di una @emph{riga}. Come risultato, qualcosa come @@ -7395,7 +7435,15 @@ fine di una @emph{riga}. Come risultato, qualcosa come Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa in cui possono essere presenti dei caratteri di ritorno a capo. @`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}. -@end quotation + +La suddivisione in campi usando espressioni regolari funziona in maniera +differente rispetto a quando la si usa con le funzioni @code{sub()}, @code{gsub()}, e +@code{gensub()} (@pxref{Funzioni per stringhe}). Tali funzioni consentono +che un'espressione regolare sia soddisfatta da una stringa nulla; +la suddivisione in campi non lo consente. Quindi, per esempio, +@samp{RS = "()"} @emph{non} divide un record in campi di un carattere +ciascuno. +@end sidebar @cindex @command{gawk} @subentry variabile @subentry @code{RT} in @cindex @code{RT} (variabile) @@ -8034,6 +8082,15 @@ $ @kbd{echo 'xxAA xxBxx C' |} @print{} -->C<-- @end example +Inoltre, +la suddivisione in campi usando espressioni regolari funziona in maniera +differente rispetto a quando la si usa con le funzioni @code{sub()}, @code{gsub()}, e +@code{gensub()} (@pxref{Funzioni per stringhe}). Tali funzioni consentono +che un'espressione regolare sia soddisfatta da una stringa nulla; +La suddivisione in campi non lo consente. Quindi, per esempio, +@samp{RS = "()"} @emph{non} divide un record in campi di un carattere +ciascuno. + @node Campi di un solo carattere @subsection Fare di ogni carattere un campo separato @@ -8592,6 +8649,10 @@ parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa Tuttavia, ci sono casi in cui effettivamente si ha bisogno di definire i campi in base a cosa essi sono, e non in base a cosa non sono. +@cindex dati CSV (valori separati da virgole) @subentry analizzare con @code{FPAT} +@cindex CSV (valori separati da virgole) come dati @subentry analizzare con @code{FPAT} +@cindex Comma Separated Values (CSV) come dati @subentry analizzare con @code{FPAT} +@cindex valori separati da virgole (CSV) come dati @subentry analizzare con @code{FPAT} Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated value} (CSV). Molti fogli elettronici, per esempio, possono esportare i dati in file di testo, dove ogni record termina con un ritorno a capo e i campi @@ -8710,7 +8771,7 @@ FPAT = "([^,]*)|(\"[^\"]+\")" @c Per email from Ed Morton <mortoneccc@comcast.net> @c @c WONTFIX: 10/2020 -@c This is too much work. FPAT and CSV files are very flakey and +@c This is too much work. FPAT and CSV files are very flaky and @c fragile. Doing something like this is merely inviting trouble. Come per @code{FS}, la variabile @code{IGNORECASE} @@ -8789,8 +8850,20 @@ $ @kbd{gawk -v fpat=2 -f test-csv.awk sample.csv} @print{} NF = 3 <p><><s> @end example +@cindex Collado, Manuel +@cindex @code{CSVMODE}, libreria per @command{gawk} +@cindex libreria @code{CSVMODE} per @command{gawk} +@cindex dati CSV (valori separati da virgole) @subentry analizzare con libreria @code{CSVMODE} +@cindex CSV (valori separati da virgole) come dati @subentry analizzare con libreria @code{CSVMODE} +@cindex valori separati da virgole (CSV) come dati @subentry analizzare con libreria @code{CSVMODE} +In generale, usare @code{FPAT} per effettuare l'analisi di dati in formato CSV +@`e come utilizzare un lenzuolo troppo corto. Rimane sempre un angolo che non +@`e coperto. Si raccomanda, in alternativa, di usare la libreria @code{CSVMODE} +messa a disposizione da Manuel Collado. Vedere: +@uref{http://mcollado.z15.es/xgawk/, @code{CSVMODE} libreria per @command{gawk}}. + @node Controllare la creazione di campi -@section Controllare come @command{gawk} sta dividendo i record +@section Controllare come @command{gawk} sta suddividendo i record @cindex @command{gawk} @subentry separazione in campi e Come visto sopra, @command{gawk} fornisce tre metodi indipendenti per @@ -10473,9 +10546,9 @@ dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come @samp{-inf} o @samp{-infinity}, e l'infinito positivo come @samp{inf} o @samp{infinity}. -Il valore speciale ``not a number'' [non @`e un numero] viene scritto come +Il valore speciale ``not a number'' ["non @`e un numero"] viene scritto come @samp{-nan} o @samp{nan} -(@pxref{Definizioni matematiche}). +(@pxref{Valori strani}). @item @code{%F} Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti @@ -13160,16 +13233,18 @@ Per avere la massima portabilit@`a, non usare l'operatore @samp{**=}. @sidebar Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari @cindex angolo buio @subentry costanti @dfn{regexp} @subentry operatore @code{/=} e -@cindex @code{/} (barra) @subentry operatore @code{/=} @subentry vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex barra (@code{/}) @subentry operatore @code{/=} @subentry vs. costante @dfn{regexp} @code{/=@dots{}/} +@cindex @code{/} (barra) @subentry operatore @code{/=} @subentry vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex barra (@code{/}) @subentry operatore @code{/=} @subentry vs.@: costante @dfn{regexp} @code{/=@dots{}/} @cindex @dfn{regexp} @subentry costanti @subentry @code{/=@dots{}/}, operatore @code{/=} e @c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu> @c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT) -@cindex angolo buio @subentry operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex sintattica @subentry ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} +@cindex angolo buio @subentry operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex ambiguit@`a sintattica: operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex sintattica @subentry ambiguit@`a: operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex @code{/=} (uguale) @subentry operatore vs.@: @code{/=@dots{}/} costante @dfn{regexp} +@cindex uguale (@code{/=}) @subentry operatore vs.@: @code{/=@dots{}/} costante @dfn{regexp} C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=} e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}. @value{DARKCORNER} @@ -14996,12 +15071,13 @@ Ci@`o non @`e pi@`u obbligatorio, ma @`e una buona idea continuare a seguire que modello per migliorare l'organizzazione e la leggibilit@`a del programma. Regole multiple @code{BEGIN} ed @code{END} sono utili per scrivere funzioni -di libreria, poich@'e ogni file di libreria pu@`o avere la sua propria regola -@code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o pulizia. +di libreria, poich@'e ogni file di una libreria pu@`o avere la sua propria +regola @code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o +pulizia. L'ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi determina l'ordine in cui le rispettive regole @code{BEGIN} ed @code{END} sono eseguite. Per questo motivi, occorre prestare attenzione nello scrivere tali -regole nei file di libreria, in modo che non sia importante +regole nelle librerie di file, in modo che non sia importante l'ordine in cui tali regole vengono eseguite. @xref{Opzioni} per maggiori informazioni sull'uso di funzioni di libreria. @iftex @@ -15127,11 +15203,11 @@ I codici delle regole @code{BEGINFILE} sono eseguiti subito prima che @`e impostata al nome del file corrente e @code{FNR} @`e impostata a zero. Prima della @value{PVERSION} 5.1.1 di @command{gawk}, per un difetto di -implementazione, @code{$0} e i campi del record mantenevano, nelle regole +implementazione, @code{$0} e i campi del record mantenevano nelle regole @code{BEGINFILE} il valore che avevano in precedenza. A partire dalla @value{PVERSION} 5.1.1, sia @code{$0} che i campi del record sono impostati alla stringa nulla, poich@'e nessun record @`e -ancora stato letto dal file in procinto di essere elaborato. +ancora stato letto dal file che sta per essere di essere elaborato. La regola @code{BEGINFILE} d@`a la possibilit@`a di eseguire due compiti che sarebbe difficile o impossibile effettuare altrimenti: @@ -15194,7 +15270,7 @@ modalit@`a compatibile (@pxref{Opzioni}), non sono regole speciali. @node Vuoto @subsection Il criterio di ricerca vuoto -@cindex vuoto @subentry criterio di ricerca +@cindex vuoti @subentry criteri di ricerca @cindex criteri di ricerca @subentry vuoti Un criterio di ricerca vuoto (cio@`e omesso) corrisponde a @emph{ogni} record in input. Per esempio, il programma: @@ -16060,16 +16136,17 @@ risultato. In @command{gawk}, l'esecuzione di @code{nextfile} produce ulteriori effetti: le eventuali regole @code{ENDFILE} sono eseguite se @command{gawk} non -si trova correntemente all'interno di una regola @code{END} o -@code{BEGINFILE}; @code{ARGIND} @`e +si trova correntemente all'interno di una regola @code{END}, +@code{ARGIND} @`e incrementato e le eventuali regole @code{BEGINFILE} sono eseguite. (@code{ARGIND} non @`e stato ancora trattato. @xref{Variabili predefinite}.) -In @command{gawk}, @code{nextfile} @`e utile all'interno di una regola +C'@`e un ulteriore caso speciale di utilizzo in @command{gawk}. +@code{nextfile} @`e utile all'interno di una regola @code{BEGINFILE} per evitare di elaborare un file che altrimenti causerebbe un errore fatale in @command{gawk}. -In questo caso, le regole @code{ENDFILE} non vengono eseguite. +In questo caso speciale, le regole @code{ENDFILE} non vengono eseguite. @xref{BEGINFILE/ENDFILE}. Sebbene possa sembrare che @samp{close(FILENAME)} ottenga lo stesso @@ -19051,8 +19128,8 @@ modalit@`a compatibile (@pxref{Opzioni}). @cindexawkfunc{log} @cindex logaritmo Restituisce il logaritmo naturale di @var{x}, se @var{x} @`e positivo; -altrimenti, restituisce @code{NaN} (``not a number'') sui sistemi che -implementano lo standard IEEE 754. +altrimenti, restituisce NaN (``not a number'',[``non @`e un numero'']) +sui sistemi che implementano lo standard IEEE 754. Inoltre, @command{gawk} stampa un messaggio di avvertimento qualora @code{x} sia negativo. @@ -26199,13 +26276,13 @@ possono essere separati da virgole, e intervalli di caratteri possono essere separated da trattini. La lista @samp{1-8,15,22-35} specifica i caratteri da 1 a 8, 15, e da 22 a 35. -@item -f @var{lista} -Usare @var{lista} come lista di campi da ritagliare. - @item -d @var{delimitatore} Usare @var{delimitatore} come carattere che separa i campi invece del carattere TAB. +@item -f @var{lista} +Usare @var{lista} come lista di campi da ritagliare. + @item -s Evita la stampa di righe che non contengono il delimitatore di campo. @end table @@ -26216,6 +26293,12 @@ di libreria @code{getopt()} e la funzione di libreria @code{join()} (@pxref{Funzione join}). +La versione POSIX corrente del comando @command{cut} prevede opzioni +per ritagliare dei campi che possono essere sia byte che caratteri +[possibilmente multibyte]. Questa versione non tenta di implementare +tali opzioni, poich@'e @command{awk} lavora esclusivamente in termini +di caratteri. + Il programma inizia con un commento che descrive le opzioni, le funzioni di libreria necessarie, e una funzione @code{sintassi()} che stampa un messaggio ed esce. @code{sintassi()} @`e chiamato se si specificano degli @@ -26237,9 +26320,9 @@ argomenti non validi: @c file eg/prog/cut.awk # Opzioni: +# -c lista Ritagliare caratteri # -f lista Ritagliare campi # -d c Carattere di delimitazione di campo -# -c lista Ritagliare caratteri # # -s Sopprimere righe che non contengono il delimitatore # @@ -26315,7 +26398,7 @@ un semplice spazio (@code{@w{" "}}) come valore per @code{FS} @`e sbagliato: @command{awk} separerebbe i campi con serie di spazi, TAB, e/o ritorni a capo, mentre devono essere separati solo da uno spazio. Per far questo, salviamo il carattere di spazio originale nella variabile -@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{"[ ]"} non +@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{@w{"[ ]"}} non @`e possibile usarlo direttamente per vedere se il carattere delimitatore di campo @`e nella stringa. @@ -26595,11 +26678,11 @@ da implementare con @command{gawk}; basta usare la variabile predefinita # -e l'argomento @`e un'espressione regolare # -i ignora maiuscolo/minuscolo # -l stampa solo nomi file -# -n aggiungi numeri linea in output +# -n aggiungi numeri riga in output # -q quieto - usa solo il codice di ritorno # -s silenzioso - non stampa messaggi di errore -# -v inverte test, successo se espression non trovata -# -x l'intera linea deve corrispondere +# -v inverte test, successo se espressione non viene trovata +# -x l'intera riga deve corrispondere # # Richiede la funzione getopt() # Usa IGNORECASE, BEGINFILE ed ENDFILE @@ -26633,14 +26716,17 @@ BEGIN @{ @noindent Si noti il commento relativo alla chiamata del programma: -Poich@'e parecchie opzioni possono essere sepcificate anche per -@command{gawk}, occorre immettere @option{--} per far s@`@{dotless{i}} che +Poich@'e parecchie opzioni possono essere specificate anche per +@command{gawk}, occorre immettere @option{--} per far s@`{@dotless{i}} che @command{gawk} non prosegua nell'analisi delle opzioni. Nel seguito c'@`e il codice che gestisce il comportamento specifico di -@command{egrep}. Se non @`e fornito esplicitamente alcun criterio di ricerca -tramite l'opzione @option{-e}, si usa il primo argomento sulla riga di -comando che non sia un'opzione. +@command{egrep}. @command{egrep} utilizza il primo argomento sulla +riga di comando che non sia un'opzione se non @`e fornito esplicitamente +alcun criterio di ricerca tramite l'opzione @option{-e}. +Se il criterio di ricerca @`e la stringa nulla, ci@`o significa che non +@`e stato fornito alcun criterio, quindi @`e necessario stampare un +messaggio di errore e terminare il programma. Gli argomenti della riga di comando di @command{awk} fino ad @code{ARGV[Optind]} vengono cancellati, in modo che @command{awk} non tenti di elaborarli come file. Se @@ -26694,12 +26780,12 @@ BEGINFILE @{ La regola @code{ENDFILE} viene eseguita alla fine dell'elaborazione di ogni file. Genera dell'output solo quando l'utente richiede un -contatore del numero di righe che sono state trovate corrispondere. +contatore del numero di righe corrispondenti che sono state trovate. La variabile @code{non_stampare} @`e vera qualora si chieda di impostare solo il codice di ritorno. La variabile @code{conta_e_basta} @`e vera qualora si chieda solo -il numero delle righe che sono state trovare corrispondere. +il numero delle righe corrispondenti che sono state trovate. @command{egrep} quindi stampa il contatore delle corrispondenze trovate solo se sia la stampa che il conteggio righe sono richieste. Il formato dell'output dev'essere adattato, a seconda del numero di @@ -26734,9 +26820,9 @@ verificando i valori delle variabili @code{RSTART} e @code{RLENGTH}. Se questi indicano che la corrispondenza non coincide con l'intera riga, la variabile @code{corrisponde} @`e impostata a zero (falsa). -Se l'utente chiede invece le righe che @emph{non} corrispondono, -il senso di @code{corrisponde} @`e invertito, usando l'operatore @samp{!}. -@code{contatore_file} @`e incrementato con il valore di +Se l'utente chiede invece le righe che non corrispondono, si inverte +il senso di @code{corrisponde}, usando l'operatore @samp{!}. +Poi, @code{contatore_file} @`e incrementato con il valore di @code{corrisponde}, che vale uno o zero, a seconda che la corrispondenza sia stata trovata oppure no. Se la riga non corrisponde, l'istruzione @code{next} passa ad esaminare il record successivo. @@ -26855,14 +26941,14 @@ Usa la funzione di libreria @code{getopt()} (@pxref{Funzione getopt}), le funzioni di libreria del database che descrive gli utenti (@pxref{Funzioni Passwd}), -Usa le funzioni di libreria che riguardano il database degli utenti +le funzioni di libreria che riguardano il database degli utenti (@pxref{Funzioni Passwd}) e le funzioni di libreria che riguardano il database dei gruppi (@pxref{Funzioni Group}). Il programma @`e abbastanza semplice. Tutto il lavoro @`e svolto nella regola @code{BEGIN}. -Inizia com dei commenti di spiegazioni, una lista di opzioni e infine +Inizia con dei commenti di spiegazione, una lista di opzioni e infine una funzione @code{sintassi()} function: @cindex @code{id.awk} (programma) @@ -26939,7 +27025,7 @@ BEGIN @{ @end example Il passo successivo @`e quello di controllare che non siano state -specificate opzioni mutualmente esclusive. +specificate opzioni mutuamente esclusive. Le opzioni @option{-G} e @option{-r} sono di questo tipo. Inoltre, non @`e possibile specificare pi@`u di un nome utente sulla riga di comando: @@ -26958,7 +27044,7 @@ dal vettore @code{PROCINFO} dell'utente corrente, oppure dal database degli utenti e delle password, per un utente il cui nome sia stato specificato nella riga di comando. -In quest'ultimo caos, viene impostato il flag @code{real_ids_only}, +In quest'ultimo caso, viene impostato il flag @code{real_ids_only}, poich@'e non @`e possibile stampare informazioni riguardo agli ID di utente e di gruppo effettivi: @@ -27075,9 +27161,9 @@ Una logica simile viene seguita per l'opzione @option{-u} @end example A questo punto non abbiamo ancora finito, e quindi stampiamo -l'output normale, di default, a riguardo dell'utente corrente -o dell'utente che era stato specificato sulla riga di comando. -Iniziamo a stmpare l'user ID reale: +l'output normale, di default, relative all'utente corrente +o all'utente che era stato specificato sulla riga di comando. +Iniziamo a stampare l'user ID reale: @example @c file eg/prog/id.awk @@ -27256,7 +27342,7 @@ ogni file dovrebbe essere lungo (al massimo) @var{N} byte. Se si specifica la lettera @samp{k}, il numero @var{N} viene moltiplicato per 1.024, ossia diviene il numero di kilobyte. Se si specifica la lettera @samp{m}, il numero @var{N} viene -moltiplicato per 1.048.576 (@math{1.024 @value{PER} 1.024}) +moltiplicato per 1.048.576 (@math{1.024 @value{VOLTE} 1.024}) ossia diviene il numero di megabyte. (Quest'opzione @`e mutuamente esclusiva con l'opzione @option{-l}). @@ -27285,7 +27371,9 @@ Ecco un'implementazione di @command{split} in @command{awk}. Viene utilizzata la funzione @code{getopt()} presentata in @ref{Funzione getopt}. Il programma inizia con un commento descrittivo e poi con la -funzione @code{sintassi()} che ne descrive le opzioni: +funzione @code{sintassi()} che ne descrive le opzioni. La variabile +@code{comune} permettere di avere delle righe brevi nella funzione, +in modo che sia stampata in maniera elegante nella pagina: @cindex @code{split.awk} (programma) @cindex programma @subentry @code{split.awk} @@ -27306,10 +27394,11 @@ funzione @code{sintassi()} che ne descrive le opzioni: @c endfile @end ignore @c file eg/prog/split.awk -function sintassi() +function sintassi( comune) @{ - print("Uso: split [-l contatore] [-a lunghezza-suffisso] [file [nome-output-file]]") > "/dev/stderr" - print(" split [-b N[k|m]] [-a lunghezza-suffisso] [file [nome-output-file]]") > "/dev/stderr" + common = "[-a lunghezza-suffisso] [file [nome-output-file]]" + printf("Uso: split [-l contatore] %s\n", comune) > "/dev/stderr" + printf(" split [-b N[k|m]] %s\n", comune) > "/dev/stderr" exit 1 @} @c endfile @@ -27402,7 +27491,7 @@ passare da @samp{abz} ad @samp{aca}. @item Si deve poter determinare se abbiamo utilizzato tutti i prefissi, -in modo che, nel caso ci siano ulteriori dati (da suddividere) si +in modo che, nel caso ci siano ulteriori dati (da suddividere), si possa stampare un messaggio di errore e terminare il programma. Il trucco @`e di gestire una tale situazione @emph{dopo} aver usato l'ultimo suffisso disponibile, e non quando viene generato l'ultimo @@ -27801,7 +27890,8 @@ spiegazione delle opzioni e del loro significato, sotto forma di commenti: function sintassi() @{ - print("Uso: uniq [-udc [-f campi]] [-s caratteri] [ in [ out ]]") > "/dev/stderr" + print("Uso: uniq [-udc [-f campi] [-s caratteri]] " \ + "[ in [ out ]]") > "/dev/stderr" exit 1 @} @@ -28063,14 +28153,14 @@ Klingon e il linguaggio degli elfi di J.R.R.@: Tolkien). Per risparmiare spazio nei file, i @dfn{code points} Unicode sono @dfn{codificati}, e la rappresentazione di ogni carattere pu@`o richiedere da uno a quattro byte nel file. UTF-8 @`e verosimilmente la pi@`u diffusa -fra queste codifiche multi-byte (@dfn{multibyte encodings}). +fra queste codifiche multibyte (@dfn{multibyte encodings}). Lo standard POSIX richiede che @command{awk} gestisca dei caratteri, non dei byte. Per questo motivo, in @command{gawk}, le funzioni @code{length()}, @code{substr()}, @code{split()}, @code{match()} e le altre funzioni di manipolazione di stringhe (@pxref{Funzioni per stringhe}) funzionano tutte elaborando dei caratteri, -come definiti dall'insieme di caratteri locale [a una determinata lingua] +come definiti dall'insieme di caratteri localizzati [a una determinata lingua] e non elaborando dei byte. (Incidentalmente, non tutte le implementazioni di @command{awk} si comportano cos@`{@dotless{i}}). @@ -28090,8 +28180,8 @@ possono anche essere dei codici scritti nei linguaggi C o C++. Per quanto riguarda @file{wc.awk}, @`e sufficiente sapere che l'estensione viene caricata con la direttiva @code{@@load}, e la funzione ulteriore che dovr@`a essere -usata si chiama @code{mbs_length()}. Questa funzione restiuisce il numero -di byte in una stringa, e non il numero di caratteri. +usata si chiama @code{mbs_length()}. Questa funzione restituisce il numero +di byte in una stringa, non il numero di caratteri. L'estensione @code{"mbs"} fa parte del progetto @code{gawkextlib}. @xref{gawkextlib} for ulteriori informazioni. @@ -28110,23 +28200,23 @@ standard input. Se ci sono pi@`u file, stampa anche il contatore totale di tutti i file. Le opzioni e il loro significato sono i seguenti: @table @code -@item -l -Conta solo le righe. - -@item -w -Conta solo le parole. -Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da -spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk} -separa i campi nei suoi record in input. - @item -c Conta solo i byte. Un tempo, la lettera @samp{c} di questa opzione stava per ``caratteri.'' Ma, come spiegato pi@`u sopra, byte e carattere non sono pi@`u sinonimi tra loro. +@item -l +Conta solo le righe. + @item -m Conta solo caratteri. + +@item -w +Conta solo le parole. +Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da +spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk} +separa i campi nei suoi record in input. @end table L'implementazione di @command{wc} in @command{awk} @`e particolarmente @@ -29365,7 +29455,7 @@ La riga @`e poi stampata nel file di output: gsub("@@`o","ò",riga) gsub("@@`u","ù",riga) # riga contiene ancora caratteri @@? - if (index(riga, "@@") == 0) { + if (index(riga, "@@") == 0) @{ print riga > file_corrente continue @} @@ -30618,6 +30708,7 @@ tratta della capacit@`a di aggiungere dinamicamente nuove funzioni predefinite a processo. * Reti TCP/IP:: Usare @command{gawk} per programmazione di rete. * Profilare:: Profilare i propri programmi @command{awk}. +* Filosofia delle estensioni:: Cosa dovrebbe essere incluso e cosa no. * Sommario funzionalit@`a avanzate:: Sommario delle funzionalit@`a avanzate. @end menu @@ -31828,7 +31919,7 @@ alfabetico. La versione profilata del proprio programma potrebbe non apparire esattamente come quella scritta durante la stesura del programma. Questo perch@'e -@command{gawk} crea la versione profilata facendo una ``stampa elegante'' della +@command{gawk} crea la versione profilata facendo una ``stampa-elegante'' della sua rappresentazione interna del programma. Un vantaggio di ci@`o @`e che @command{gawk} pu@`o produrre una rappresentazione standard. Inoltre, cose come: @@ -31923,9 +32014,9 @@ tastiera. Il segnale @code{INT} @`e generato dalle combinazioni di tasti @kbd{Ctrl-c} o @kbd{Ctrl-BREAK}, mentre il segnale @code{QUIT} @`e generato dalla combinazione di tasti @kbd{Ctrl-\}. -@cindex stampa elegante +@cindex stampa-elegante Infine, @command{gawk} accetta anche un'altra opzione, @option{--pretty-print}. -Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa elegante'' +Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa-elegante'' del programma nel file @file{awkprof.out}, senza conteggi sull'esecuzione. @quotation NOTA @@ -31933,10 +32024,10 @@ Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma. Ora non pi@`u. @end quotation -@cindex profilazione @subentry differenza rispetto alla stampa elegante -@cindex stampa elegante @subentry differenza rispetto alla profilazione +@cindex profilazione @subentry differenza rispetto alla ``stampa-elegante'' +@cindex stampa-elegante @subentry differenza rispetto alla profilazione C'@`e una differenza significativa tra l'output creato durante la profilazione, -e quello creato durante la stampa elegante. L'output della stampa elegante +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. Tuttavia, nessun commento dovrebbe andare @@ -31948,23 +32039,83 @@ in maniera perfetta. Comunque, per una precisa scelta progettuale, l'output della profilazione @emph{omette} i commenti del programma originale. Questo permette di concentrarsi sui dati del conteggio di esecuzione ed evita la tentazione di -usare il profilatore per creare una stampa elegante. +usare il profilatore per creare una ``stampa-elegante''. Oltre a ci@`o, l'output stampato in modo elegante non ha l'indentazione iniziale -che ha l'output della profilazione. Questo rende agevole la stampa elegante +che ha l'output della profilazione. Questo rende agevole la ``stampa-elegante'' del proprio codice una volta completato lo sviluppo, usando poi il risultato come versione finale del programma. Poich@'e la rappresentazione interna del programma @`e formattata per essere aderente al programma @command{awk} in questione, la profilazione -e la stampa elegante (opzione @option{--pretty-print}) disabilitano +e la ``stampa-elegante'' (opzione @option{--pretty-print}) disabilitano automaticamente le optimizzazioni di default di @command{gawk}. -La profilazione e la stampa elegante mantengono anche il formato originale +La profilazione e la ``stampa-elegante'' mantengono anche il formato originale delle costanti numeriche; se sono stati usati dei valori ottali o esadecimali nel codice sorgente, questi compariranno nell'output nello stesso formato con cui sono stati inseriti. +@node Filosofia delle estensioni +@section Funzionalit@`a incluse @dfn{versus} estensioni + +Come descritto sin qui e nei successivi @value{CHAPTERS}, +@command{gawk} ha numerose estensioni ulteriori, +rispetto a quelle presenti nel comando @command{awk} standard. +Queste sono state sviluppate col passare del tempo. +Pi@`u recentemente, l'attenzione si @`e spostata sull'uso +del meccanismo delle estensioni (@pxref{Estensioni dinamiche}) +per aggiungere ulteriori funzionalit@`a. +@ifnotinfo +Questa @value{SECTION} +@end ifnotinfo +@ifinfo +Questo @value{SECTION} +@end ifinfo +tratta della ``filosofia ispiratrice'' riguardo a ci@`o che dovrebbe +essere aggiunto all'interprete come funzionalit@`a interna, +rispetto a quello che dovrebbe essere reso disponibile tramite +estensioni. + +Ci sono parecchi obiettivi: + +@enumerate 1 +@item +Conservare il comando @command{awk}; non dovrebbe divenire irriconoscibile +anche se i programmi scritti per esso verranno eseguito usando solo +@command{gawk}. + +@item +Non aumentare le dimensioni del nucleo del programma, a meno che ci@`o +sia assolutamente indispensabile. + +@item +Aggiungere nuove funzionalit@`a o tramite @dfn{script} +(opzione @option{-f}, direttiva @code{@@include}) +o in un'estensione caricabile scritta in C o C++ +(opzione @option{-l}, direttiva @code{@@load}). + +@item +Estendere il nucleo dell'interpretatore solo se qualche funzionalit@`a: + +@c sublist +@enumerate A +@item +@`E veramente desiderabile. +@item +Non si pu@`o ottenere tramite dei file di libreria o estensioni caricabili. +@item +Pu@`o essere aggiunta al nucleo senza troppe difficolt@`a. +@end enumerate +@end enumerate + +Combinare dei moduli con dei file @command{awk} @`e una tecnica efficace. +Lo si pu@`o vedere in alcuni degli esempi di estensione. + +Il caricamento di estensioni e librerie di file non dovrebbe essere +fatto automaticamente, perch@'e questo richiede un consumo di risorse +che molti utenti non desiderano, o di cui non hanno bisogno. + @node Sommario funzionalit@`a avanzate @section Sommario @@ -32012,9 +32163,14 @@ profilazione @command{gawk} scrive il profilo, includendo lo @dfn{stack} della chiamata alla funzione e prosegue nell'elaborazione. @item -Si pu@`o anche fare solo una ``stampa elegante'' del programma. +Si pu@`o anche fare solo una ``stampa-elegante'' del programma. +@item +Nuove funzionalit@`a dovrebbero essere sviluppate usando, se possibile, +il meccanismo delle estensioni; si dovrebbero aggiungere al nucleo +dell'interpretatore solo come ultima risorsa. @end itemize + @node Internazionalizzazione @chapter Internazionalizzazione con @command{gawk} @@ -33579,7 +33735,7 @@ argomenti. * Controllo dei breakpoint:: Controllo dei punti d'interruzione. * Controllo esecuzione debugger:: Controllo di esecuzione. * Vedere e modificare dati:: Vedere e modificare dati. -* Stack di esecuzione:: Lavorare con lo @dfn{stack}. +* Stack di esecuzione:: Lavorare con lo @dfn{Stack}. * Informazioni sul debugger:: Ottenere informazioni sullo stato del programma e del debugger. * Comandi vari del debugger:: Comandi vari del debugger. @@ -34016,8 +34172,8 @@ argomenti) dalla lista dei punti d'osservazione. @end table -@node @dfn{Stack} di esecuzione -@subsection Lavorare con lo @dfn{stack} +@node Stack di esecuzione +@subsection Lavorare con lo @dfn{Stack} Ogni volta che si esegue un programma che contiene chiamate di funzione, @command{gawk} mantiene una pila contenente la lista delle chiamate di funzione @@ -35079,10 +35235,10 @@ Questo interagisce con altre importanti funzionalit@`a di @command{gawk}. @cindex spazio-dei-nomi @subentry interazione con la profilazione -@cindex spazio-dei-nomi @subentry interazione con la stampa elegante +@cindex spazio-dei-nomi @subentry interazione con la ``stampa-elegante'' @cindex profilazione @subentry interazione con spazio-dei-nomi -@cindex stampa elegante @subentry interazione con spazio-dei-nomi -La profilazione e la stampa elegante (@pxref{Profilare}) sono state +@cindex stampa-elegante @subentry interazione con spazio-dei-nomi +La profilazione e la ``stampa-elegante'' (@pxref{Profilare}) sono state migliorate per trattare gli spazi-dei-nomi e le regole per assegnare nomi in uno spazio-dei-nomi @ref{Regole per i nomi}. In particolare, l'output tiene insieme le funzioni che appartengono @@ -35143,7 +35299,7 @@ disponibile la potenza e la flessibilit@`a necessarie. @item Altre parti di @command{gawk} sono state estese come necessario per integrare gli spazi-dei-nomi nel loro funzionamento. -Questo vale soprattutto per la profilazione / stampa elegante +Questo vale soprattutto per la profilazione / ``stampa-elegante'' (@pxref{Profilare}) e per le funzionalit@`a relative alle estensioni (@pxref{Estensioni dinamiche}). @@ -35366,23 +35522,10 @@ Come i numeri vanno arrotondati, per eccesso o per difetto, quando necessario. Maggiori dettagli verranno forniti in seguito. @item NaN -``Not a number'' (Non un Numero).@footnote{Grazie a Michael -Brennan per questa descrizione, che abbiamo parafrasato, e per gli esempi.} Un -valore speciale che risulta da un calcolo che non ha risposta come numero -reale. In tal caso, i programmi possono o ricevere un'eccezione di virgola -mobile, o restituire @code{NaN} come risultato. Lo standard IEEE 754 -consiglia che i sistemi restituiscano @code{NaN}. Alcuni esempi: - -@table @code -@item sqrt(-1) -La radice quadrata di @minus{}1 ha senso nell'insieme dei numeri complessi, -ma non nell'insieme dei numeri reali, -per cui il risultato @`e @code{NaN}. - -@item log(-8) -Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()}, -per cui il risultato @`e @code{NaN}. -@end table +``Not a number'' (``non @`e un numero''). Un valore speciale +che risulta da un calcolo che non ha come risposta un numero +reale. @xref{Valori strani}, per maggiori informazioni riguardo +ai valori infiniti e ai valori ``non-un-numero''. @item Normalizzato (formato) Come la mantissa (vedi oltre in questa lista) @`e usualmente memorizzata. Il @@ -35534,8 +35677,8 @@ ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto. * Ottenere la precisione:: Ottenere pi@`u precisione richiede qualche sforzo. * Tentare di arrotondare:: Aggiungere cifre di precisione e arrotondare. -* Impostare la precisione:: Come impostare la precisione. -* Impostare modo di arrotondare:: Impostare le modalit@`a di arrotondamento. +* Impostare la precisione:: Impostare la precisione. +* Impostare modo di arrotondare:: Impostare la modalit@`a di arrotondamento. @end menu @node Inesattezza nei calcoli @@ -35556,6 +35699,7 @@ il numero di cifre decimali esatte nel risultato finale. * Rappresentazioni inesatte:: I numeri non sono rappresentati esattamente. * Confronti tra valori in VM:: Come confrontare valori in virgola mobile. * Gli errori si sommano:: Gli errori diventano sempre maggiori. +* Valori strani:: Valori in virgola mobile non spiegati a scuola. @end menu @node Rappresentazioni inesatte @@ -35682,6 +35826,257 @@ $ @kbd{gawk 'BEGIN @{} @print{} 4 @end example +@node Valori strani +@subsubsection Valori in virgola mobile non spiegati a scuola + +Sia l'hardware che implementa lo standard per i numeri in virgola +mobili IEEE 754, che la libreria matematica MPFR, prevedono due +tipi di valori di cui probabilmente non vi hanno parlato a scuola. +Il primo @`e il valore @dfn{infinity} (``infinito''), un valore speciale +che pu@`o avere un segno sia negativo che positivo, e che @`e pi@`u +piccolo di ogni altro valore (infinito negativo), o maggiore di ogni +altro valore (infinito positivo). Quando vengono generati tali valori +@command{gawk} li stampa come @samp{-inf} o @samp{+inf}, rispettivamente. +@command{gawk} accetta queste stringhe come dati in input, e li converte +internamente all'appropriato valore in virgola mobile. + +Valori di infinito che abbiano lo stesso segno risultano uguali +quando sono confrontati fra loro. +Per il resto, altre operazioni (addizione, sottrazione, etc.) +che hanno come operando un infinito e un altro numero producono +risultati matematicamente ragionevoli. + +Il secondo tipo di valore @`e ``not a number'' [``non @`e un numero''] +scritto in forma abbreviata come NaN.@footnote{Grazie a Michael Brennan +per questa descrizione, che abbiamo parafrasato, e per gli esempi.} + +Questo @`e un valore speciale che risulta da un calcolo che non ha come +risposta un numero reale. In tal caso, i programmi possono o ricevere +un’eccezione di virgola mobile, o restituire NaN come risultato. +Lo standard IEEE 754 consiglia che i sistemi restituiscano NaN. +Alcuni esempi: + +@table @code +@item sqrt(-1) +@iftex +La funzione @math{\sqrt{-1}} +@end iftex +@ifnottex +Questa funzione +@end ifnottex +ha senso nell'insieme dei numeri complessi, +ma non nell'insieme dei numeri reali, +per cui il risultato @`e @code{NaN}. + +@item log(-8) +Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()}, +per cui il risultato @`e @code{NaN}. +@end table + +I valori Nan sono strani. In particolare, non possono essere confrontati +con altri numeri in virgola mobile; ogni confronto di questo tipo, eccetto +quello ``non uguale a'', restituisce il valore ``falso''. +I valori NaN sono talmente differenti da altri valori che perfino il +confronto di due valori NaN identici fra loro con @code{!=} restituisce +il valore ``vero''! + +I valori NaN possono anche avere un segno (positivo o negativo), +anche se dipende dall'implementazione quale segno viene restituito +da qualsiasi operazione il cui risultato sia un valore NaN. +Per esempio, su alcuni sistemi la funzione @code{sqrt(-1)} +restituisce un NaN negativo. Su altri sistemi il NaN restituito +@`e invece positivo. + +Quando tali valori vengono generati, @command{gawk} li stampa +come @samp{-nan} o @samp{+nan}, rispettivamente. Anche per +questi valori, @command{gawk} accetta queste stringhe come +dati in input e le converte internamente ai valori loro +assegnati come numeri in virgola mobile. + +Se si desidera approfondire ulteriormente questo argomento, si possono +trovare programmi di test scritti in C, @command{awk} e Python +nella directory @file{awklib/eg/test-programs} disponibile +nella distribuzione di @command{gawk}. +Tali programmi permettono un confronto tra i linguaggi di +programmazione, riguardo al modo con cui vengono trattati +i valori di infinito e quelli NaN. + +@ignore +@c file eg/test-programs/gen-float-table.awk +function eq(left, right) +@{ + return left == right +@} + +function ne(left, right) +@{ + return left != right +@} + +function lt(left, right) +@{ + return left < right +@} + +function le(left, right) +@{ + return left <= right +@} + +function gt(left, right) +@{ + return left > right +@} + +function ge(left, right) +@{ + return left >= right +@} + +BEGIN @{ + nan = sqrt(-1) + inf = -log(0) + split("== != < <= > >=", names) + names[3] = names[3] " " + names[5] = names[5] " " + split("eq ne lt le gt ge", funcs) + + compare[1] = 2.0 + compare[2] = values[1] = -sqrt(-1.0) # nan + compare[3] = values[2] = sqrt(-1.0) # -nan + compare[4] = values[3] = -log(0.0) # inf + compare[5] = values[4] = log(0.0) # -inf + + for (i = 1; i in values; i++) @{ + for (j = 1; j in compare; j++) @{ + for (k = 1; k in names; k++) @{ + the_func = funcs[k] + printf("%g %s %g -> %s\n", + values[i], + names[k], + compare[j], + @@the_func(values[i], compare[j]) ? + "True" : "False"); + @} + printf("\n"); + @} + @} +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.c +#include <stdio.h> +#include <math.h> +#include <stdbool.h> + +#define def_func(name, op) \ + bool name(double left, double right) @{ \ + return left op right; \ + @} + +def_func(eq, ==) +def_func(ne, !=) +def_func(lt, <) +def_func(le, <=) +def_func(gt, >) +def_func(ge, >=) + +struct @{ + const char *name; + bool (*func)(double left, double right); +@} functions[] = @{ + @{ "==", eq @}, + @{ "!=", ne @}, + @{ "< ", lt @}, + @{ "<=", le @}, + @{ "> ", gt @}, + @{ ">=", ge @}, + @{ 0, 0 @} +@}; + +int main() +@{ + double values[] = @{ + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + double compare[] = @{ 2.0, + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + + int i, j, k; + + for (i = 0; i < 4; i++) @{ + for (j = 0; j < 5; j++) @{ + for (k = 0; functions[k].name != NULL; k++) @{ + printf("%g %s %g -> %s\n", values[i], + functions[k].name, + compare[j], + functions[k].func(values[i], compare[j]) ? "True" : "False"); + @} + printf("\n"); + @} + @} + + return 0; +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.py +from math import * + +nan = float('NaN') +inf = float('Inf') + +def eq(left, right): + return left == right + +def ne(left, right): + return left != right + +def lt(left, right): + return left < right + +def le(left, right): + return left <= right + +def gt(left, right): + return left > right + +def ge(left, right): + return left >= right + +func_map = { + "==": eq, + "!=": ne, + "< ": lt, + "<=": le, + "> ": gt, + ">=": ge, +} + +compare = [2.0, nan, -nan, inf, -inf] +values = [nan, -nan, inf, -inf] + +for i in range(len(values)): + for j in range(len(compare)): + for op in func_map: + print("%g %s %g -> %s" % + (values[i], op, compare[j], func_map[op](values[i], compare[j]))) + + print("") +@c endfile +@end ignore + @node Ottenere la precisione @subsection Ottenere la precisione voluta @@ -37369,8 +37764,8 @@ restituiti sono di tipo @code{mpfr_ptr} e @code{mpz_ptr} rispettivamente, e si dovrebbero assegnare in maniera appropriata questi codici di ritorno prima di assegnare i risultati a variabili del tipo corretto. -La memoria allocata da queste funzioni dovrebbe essere liberata a fine -utilizzo, richiamando @code{gawk_free()}. +La memoria allocata da queste funzioni dovrebbe essere liberata dopo il +loro uso, richiamando @code{gawk_free()}. @node Funzioni di costruzione @subsection Funzioni per creare valori @@ -38023,7 +38418,7 @@ I campi sono: @table @code @item awk_bool_t use_chars; Impostare ad @code{awk_true} se le lunghezze di campo sono specificate in -unit@`a di caratteri potenzialmente multi-byte, oppure impostarlo a +unit@`a di caratteri potenzialmente multibyte, oppure impostarlo a @code{awk_false} se le lunghezze sono espresse in numero di byte. L'efficienza del programma sar@`a maggiore utilizzando la dimensione in byte. @@ -42555,7 +42950,7 @@ con @option{--}. @item L'opzione @option{--source} per combinare codice sorgente immesso nella riga -di comando e codice sorgente proveniente da file di libreria. +di comando e codice sorgente proveniente da librerie di file. @end itemize @end itemize @@ -43057,7 +43452,7 @@ L'opzione @option{-D} attiva il debugger. @item Le opzioni @option{-i} e @option{--include} -caricano dei file di libreria @command{awk}. +caricano delle librerie di file @command{awk}. @item Le opzioni @option{-l} e @option{--load} caricano estensioni dinamiche @@ -43105,7 +43500,7 @@ La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di @item Il comando @code{where} @`e stato aggiunto al debugger -(@pxref{@dfn{Stack} di esecuzione}). +(@pxref{Stack di esecuzione}). @item Il supporto per Ultrix @`e stato rimosso. @@ -44390,7 +44785,7 @@ Il codice sorgente di @command{gawk}, in generale, cerca di aderire, nei limiti del possibile, a degli standard formali. Ci@`o significa che @command{gawk} usa routine di libreria che sono specificate nello standard ISO C e nello standard POSIX per le interfacce dei sistemi operativi. Il codice sorgente di -@command{gawk} richiede l'uso di un compilatore ISO C (standard 1990). +@command{gawk} richiede l'uso di un compilatore ISO C (standard 1999). Molti sistemi Unix non aderiscono completamente n@'e allo standard ISO n@'e a quello POSIX. La sottodirectory @file{missing_d} nella distribuzione di @@ -45411,6 +45806,10 @@ il sito @url{https://sourceforge.net/projects/awka}. Il progetto sembra essere stato congelato; non ci sono state modifiche nel codice sorgente dal 2001 circa. +@item Resuscitare Awka +Questo progetto, disponibile nel sito @uref{https://github.com/noyesno/awka}, +si propone di fissare bug in @command{awka} e di aggiungere nuove funzionalit@`a. + @cindex Beebe, Nelson H.F.@: @cindex @command{pawk} (versione con profilazione di Brian Kernighan @command{awk}) @cindex codice sorgente @subentry @command{pawk} @@ -45464,6 +45863,17 @@ 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{frawk} +@cindex sorgente @subentry codice @subentry @command{frawk} +@cindex codice sorgente @subentry @command{frawk} +@item @command{frawk} +Questo @`e un linguaggio per scrivere programmi corti. +``In prima approssimazione, @`e un'implementazione del linguaggio AWK; +molti comuni programmi @command{awk} producono un output equivalente +quando passati a @command{frawk}.'' Comunque, ha anche numerose e +importanti funzionalit@`a ulteriori. Il codice sorgente @`e disponibile +sul sito @uref{https://github.com/ezrosent/frawk}. + @cindex @command{goawk} @cindex Go @subentry implementazione di @command{awk} @cindex sorgente @subentry @command{goawk} @@ -45490,7 +45900,13 @@ essere un interprete completo, anche se, poich@'e usa funzionalit@`a di Java per l'I/O e per la ricerca di @dfn{regexp}, il linguaggio che supporta @`e differente da @command{awk} POSIX. Ulteriori informazioni sono disponibili sulla -@uref{https://jawk.sourceforge.net, pagina principale del progetto}. +@uref{http://jawk.sourceforge.net, pagina principale del progetto}. + +@item Hoijui's @command{jawk} +Questo progetto, disponibili sul sito +@uref{https://github.com/hoijui/Jawk}, +@`e un altro interpretatore di @command{awk} scritto in Java. +Usa i moderni strumenti di sviluppo software di Java. @item Libmawk @cindex @command{libmawk} (interpretatore) @@ -45504,7 +45920,6 @@ Questo @`e un interprete @command{awk} incorporabile, derivato da @cindex interpretatore @command{awk} incorporabile @subentry codice sorgente @cindex Neacsu, Mircea @item @command{awk} incorporabile di Mircea Neacsu -@item incorporabile, @command{awk}, di Mircea Neacsu Mircea Neacsu ha creato un interpretatore @command{awk} incorporabile, basato su BWK @command{awk}. @`E disponibile nel sito @uref{https://github.com/neacsum/awk}. @@ -45549,6 +45964,9 @@ Wikipedia} su @command{awk} per informazioni su ulteriori versioni. @end table +Un'interessante raccolta di funzioni di libreria @`e disponibile sul sito +@uref{https://github.com/e36freak/awk-libs}. + @node Sommario dell'installazione @appendixsec Sommario |