diff options
Diffstat (limited to 'doc/it/gawktexi.in')
-rwxr-xr-x[-rw-r--r--] | doc/it/gawktexi.in | 1142 |
1 files changed, 873 insertions, 269 deletions
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in index 26e35e2c..8faac5de 100644..100755 --- a/doc/it/gawktexi.in +++ b/doc/it/gawktexi.in @@ -56,8 +56,8 @@ @c applies to and all the info about who's publishing this edition @c These apply across the board. -@set UPDATE-MONTH Agosto 2022 -@set VERSION 5.2 +@set UPDATE-MONTH Febbraio 2023 +@set VERSION 5.3 @set PATCHLEVEL 0 @c added Italian hyphenation stuff @@ -73,7 +73,7 @@ @set TITLE GAWK: Programmare efficacemente in AWK @end ifclear @set SUBTITLE Una Guida Utente per GNU Awk -@set EDITION 5.2 +@set EDITION 5.3 @iftex @set DOCUMENT libro @@ -93,6 +93,16 @@ @set COMMONEXT (e.c.) @set PAGE pagina @end iftex +@iflatex +@set DOCUMENT libro +@set CHAPTER capitolo +@set APPENDIX appendice +@set SECTION sezione +@set SUBSECTION sottosezione +@set DARKCORNER (a.b.) +@set COMMONEXT (e.c.) +@set PAGE pagina +@end iflatex @ifinfo @set DOCUMENT File Info @set CHAPTER nodo principale @@ -179,6 +189,10 @@ @set LEQ @math{@leq} @set PI @math{@pi} @end iftex +@iflatex +@set LEQ <= +@set PI @i{pi} +@end iflatex @ifdocbook @set LEQ @inlineraw{docbook, ≤} @set PI @inlineraw{docbook, &pgr;} @@ -276,6 +290,10 @@ Some comments on the layout for TeX. @syncodeindex fn cp @syncodeindex vr cp @end iftex +@iflatex +@syncodeindex fn cp +@syncodeindex vr cp +@end iflatex @ifxml @syncodeindex fn cp @syncodeindex vr cp @@ -293,6 +311,9 @@ Some comments on the layout for TeX. @iftex @finalout @end iftex +@iflatex +@finalout +@end iflatex @c Enabled '-quotes in PDF files so that cut/paste works in @c more places. @@ -318,7 +339,7 @@ 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–2022 +<literallayout class="normal">Copyright © 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2023 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -341,7 +362,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–2022 +<literallayout class="normal">Copyright © 2016–2023 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -349,7 +370,7 @@ All Rights Reserved. @ifnotdocbook @iftex -Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2022 @* +Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2023 @* Free Software Foundation, Inc. @end iftex @end ifnotdocbook @@ -436,7 +457,7 @@ URL: @uref{https://www.gnu.org/}@* @c This one is correct for gawk 3.1.0 from the FSF @c ISBN 1-882114-28-0 @sp 0 -Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2022@* +Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2023@* Free Software Foundation, Inc. @sp 1 Traduzione e revisione:@* @@ -679,6 +700,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori. * Campi di un solo carattere:: Fare di ogni carattere un campo separato. +* Campi separati da virgola:: Lavorare con file CSV. * Separatori campo da riga di comando:: Impostare @code{FS} dalla riga di comando. * Campo intera riga:: Fare di una riga intera un campo @@ -692,7 +714,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Campi con dati a larghezza fissa:: Valore di campi con dati a larghezza fissa. * Separazione in base al contenuto:: Definire campi dal loro contenuto. -* File CSV:: Ancora sui file CSV. +* Ancora CSV:: Ancora sui file CSV. * FS rispetto a FPAT:: Una differenza sottile. * Controllare la creazione di campi:: Controllare come @command{gawk} sta suddividendo i record. @@ -746,6 +768,9 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Avvertimenti speciali:: Cose a cui prestare attenzione. * Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e @dfn{pipe}. +* Valore restituito da @code{close}:: Usare il valore di ritorno restituito da + @code{close()}. +* Noflush:: Velocizzare output da @dfn{pipe}. * Continuazione dopo errori:: Abilitare continuazione dopo errori in output. * Sommario di Output:: Sommario di Output. @@ -944,7 +969,9 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Funzione getlocaltime:: Una funzione per ottenere data e ora nel formato desiderato. * Funzione isnumeric:: Una funzione per controllare se un - valore @`e numerico. + valore @`e numerico. +* Funzione tocsv:: Una funzione per convertire l'output + al formato CSV. * Funzione readfile:: Una funzione per leggere un file intero in un colpo solo. * Apici alla shell:: Una funzione per passare stringhe @@ -1215,15 +1242,16 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, per Cygwin. * MSYS:: Usare @command{gawk} nell'ambiente MSYS. -* Installazione su VMS:: Installare @command{gawk} su VMS. -* Compilazione su VMS:: Come compilare @command{gawk} su - VMS. -* Estensioni dinamiche su VMS:: Compilare estensioni dinamiche - di @command{gawk} su VMS. -* Dettagli installazione su VMS:: Come installare @command{gawk} su - VMS. -* Esecuzione su VMS:: Come eseguire @command{gawk} su VMS. -* GNV su VMS:: Il progetto GNV di VMS. +* Installazione su OpenVMS:: Installare @command{gawk} su OpenVMS. +* Compilazione su OpenVMS:: Come compilare @command{gawk} su + OpenVMS. +* Estensioni dinamiche su OpenVMS:: Compilare estensioni dinamiche + di @command{gawk} su OpenVMS. +* Dettagli installazione su OpenVMS:: Come installare @command{gawk} su + OpenVMS. +* Esecuzione su OpenVMS:: Come eseguire @command{gawk} su + OpenVMS. +* GNV su OpenVMS:: Il progetto GNV su OpenVMS. * Bug:: Notificare problemi e bug. * Definizione di bug:: Definire cos'@`e e cosa non @`e un bug. * Indirizzo bug:: Dove notificare problemi. @@ -1622,7 +1650,7 @@ implementazione di @command{awk} chiamata @command{gawk} (che sta per ``GNU @command{awk}''). @command{gawk} funziona su una vasta gamma di sistemi Unix, dai PC basati su architettura Intel fino a sistemi di potenza molto maggiore. -@command{gawk} @`e stato portato anche su Mac OS X, +@command{gawk} @`e stato portato anche su macOS, z/OS, Microsoft Windows (tutte le versioni), e OpenVMS.@footnote{Qualche altro sistema operativo obsoleto su cui @@ -3622,7 +3650,7 @@ Questo esempio @`e leggermente diverso da quello precedente: l'input @`e l'output del comando @command{expand}, che cambia i TAB in spazi, in modo che le larghezze confrontate siano quelle che sarebbero qualora le si stampasse, e non il numero dei caratteri di input su ogni -riga. [il carattere TAB occupa un byte nel file, ma pu@`o generare fino a +riga. [Il carattere TAB occupa un byte nel file, ma pu@`o generare fino a otto spazi bianchi in fase di stampa.] @item @@ -3897,7 +3925,7 @@ per programmi sulla riga di comando, @emph{ammesso} che si stia usando una shell conforme a POSIX, come la Unix Bourne shell o Bash. Ma la C shell si comporta in maniera diversa! In quel caso, occorre usare due barre inverse consecutive, in fondo alla riga. Si noti anche che quando si usa la C shell -@emph{ogni} andata a capo nel vostro programma @command{awk} deve essere +@emph{ogni} andata a capo nel vostro programma @command{awk} dev'essere indicata con una barra inversa. Per esempio: @example @@ -3954,6 +3982,13 @@ successiva. Invece, la combinazione barra inversa-ritorno a capo non viene per nulla notata, in quanto ``nascosta'' all'interno del commento. Quindi, il @code{BEGIN} @`e marcato come errore di sintassi. +Chi @`e interessato pu@`o vedere +@uref{https://lists.gnu.org/archive/html/bug-gawk/2022-10/msg00025.html} +per una modifica al codice sorgente che consente la continuazione di +righe se sono racchiuse fra parentesi. Questa @dfn{patch} non @`e stata +inclusa nella distribuzione di @command{gawk} perch@'e implicitamente +diminuisce la portabilit@`a dei programmi @command{awk}. + @cindex istruzioni @subentry multiple @cindex @code{;} (punto e virgola) @subentry separare istruzioni nelle azioni @cindex punto e virgola (@code{;}) @subentry separare istruzioni nelle azioni @@ -4449,7 +4484,7 @@ Le variabili da riga di comando della forma @end itemize Quest'opzione @`e particolarmente necessaria per le applicazioni World Wide Web -CGI che passano argomenti attraverso le URL; l'uso di quest'opzione impedisce +CGI che passano argomenti attraverso gli 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, @@ -4538,6 +4573,23 @@ Questa tracciatura @`e stampata sullo standard error. Ogni ``codice operativo'' @`e preceduto da un segno @code{+} nell'output. +@item @option{-k} +@itemx @option{--csv} +@cindex @option{-k} (opzione) +@cindex opzione @subentry @option{-k} +@cindex @option{--csv} (opzione) +@cindex opzione @subentry @option{--csv} +@cindex campi separati da virgola (CSV) come dati @subentry opzione @option{-k} +@cindex campi separati da virgola (CSV) come dati @subentry opzione @option{--csv} +@cindex CSV (dati con valori separati da virgola) @subentry opzione @option{-k} +@cindex CSV (dati con valori separati da virgola) @subentry opzione @option{--csv} +@cindex dati CSV (campi separati da virgola) @subentry @option{-k} +@cindex dati CSV (campi separati da virgola) @subentry @option{--csv} +Richiede un trattamento speciale per file CSV [valori separati da virgola]. +@xref{Campi separati da virgola}. +Quest'opzione non pu@`o essere usata insieme all'opzione @option{--posix}. +Se lo si fa, viene generato un errore fatale. + @item @option{-l} @var{ext} @itemx @option{--load} @var{ext} @cindex @option{-l} (opzione) @@ -5593,11 +5645,16 @@ directory possono essere necessarie per organizzare i file da includere. Vista la possibilit@`a di specificare opzioni @option{-f} multiple, il meccanismo @code{@@include} non @`e strettamente necessario. Comunque, la direttiva @code{@@include} pu@`o essere d'aiuto nel costruire -programmi @command{gawk} autosufficienti, riducendo cos@`{@dotless{i}} la necessit@`a -di scrivere righe di comando complesse e tediose. +programmi @command{gawk} autosufficienti, riducendo cos@`{@dotless{i}} la +necessit@`a di scrivere righe di comando complesse e tediose. In particolare, @code{@@include} @`e molto utile per scrivere @dfn{script} CGI eseguibili da pagine web. +La direttiva @code{@@include} e l'opzione @option{-i}/@option{--include} +sulla riga di comando sono completamente equivalenti. Un programma sorgente +incluso non viene caricato di nuovo se @`e stato gi@`a caricato +in precedenza. + Le regole usate per trovare un file sorgente, descritte @iftex nella @@ -5682,7 +5739,7 @@ Questa @ifinfo Questo @end ifinfo -@value{SECTION} descrive funzionalit@`a o opzioni da riga di comando +@value{SECTION} descrive una funzionalit@`a o opzione da riga di comando provenienti da precedenti versioni di @command{gawk} che non sono pi@`u disponibili nella versione corrente, o che sono ancora utilizzabili ma sono deprecate (ci@`o significa che @emph{non} saranno presenti in una futura @@ -6116,7 +6173,7 @@ $ @kbd{awk 'BEGIN @{ print "Egli le disse \"ciao!\"." @}'} Lo stesso carattere di barra inversa @`e un altro carattere che non pu@`o essere incluso normalmente; occorre scrivere @samp{\\} per inserire una barra inversa nella stringa o @dfn{regexp}. Quindi, la stringa costituita dai due -caratteri @samp{"} e @samp{\} deve essere scritta come @code{"\"\\"}. +caratteri @samp{"} e @samp{\} dev'essere scritta come @code{"\"\\"}. Altre sequenze di protezione rappresentano caratteri non stampabili come TAB o il ritorno a capo. Anche se @`e possibile immettere la maggior parte dei @@ -6189,7 +6246,7 @@ Il valore esadecimale @var{hh}, dove @var{hh} indica una sequenza di cifre esadecimali (@samp{0}--@samp{9}, e @samp{A}--@samp{F} o @samp{a}--@samp{f}). Dopo @samp{\x} @`e consentito un massimo di due cifre. Ogni ulteriore cifra esadecimale @`e considerata come una semplice -lettera o numero. @value{COMMONEXT} +lettera o numero. @value{COMMONEXT} (La sequenza di protezione @samp{\x} non @`e permessa in POSIX awk.) @quotation ATTENZIONE @@ -6203,6 +6260,27 @@ Dalla @value{PVERSION} 4.2, vengono elaborate solo due cifre. @end quotation +@cindex @code{\} (barra inversa) @subentry @code{\u} (sequenza di protezione) +@cindex backslash (@code{\}) @subentry @code{\u} (sequenza di protezione) +@cindex barra inversa (@code{\}) @subentry @code{\/} (sequenza di protezione) +@cindex estensioni comuni @subentry @code{\u} (sequenza di protezione) +@cindex comuni @subentry estensioni @subentry @code{\u} (sequenza di protezione) +@item \u@var{hh}@dots{} +Il valore esadecimale @var{hh}, dove @var{hh} indica una sequenza di cifre +esadecimli (@samp{0}--@samp{9}, e @samp{A}--@samp{F} o +@samp{a}--@samp{f}). Un massimo di otto cifre @`e consentito dopo +la @samp{\u}. Ogni successiva cifra esadecimale eventualmente immessa +@`e trattata come una semplice lettera o numero. @value{COMMONEXT} +(La sequenza di protezione @samp{\u} non @`e ammessa in modalit@`a POSIX.) + +Questa sequenza di protezione serve per indicare una lettera o un +simbolo come specificato nella codifica Unicode. +@command{gawk} dapprima converte le cifre cos@`{@dotless{i}} specificate in +un numero intero, e poi traduce il ``carattere largo'' +cos@`{@dotless{i}} specificato nella codifica multibyte locale (anche se la +codifica locale non @`e Unicode). Se i byte specificati non +rappresentano un carattere valido, il valore diviene @code{"?"}. + @cindex @code{\} (barra inversa) @subentry @code{\/} (sequenza di protezione) @cindex barra inversa (@code{\}) @subentry @code{\/} (sequenza di protezione) @item \/ @@ -6361,7 +6439,6 @@ Le sequenze di protezione descritte @ifnotinfo prima @end ifnotinfo - @iftex nella @end iftex @@ -6530,7 +6607,7 @@ da ricercare @`e @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} individua tutte le @cindex pi@`u (@code{+}) @subentry operatore @dfn{regexp} @item @code{+} Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione -precedente deve essere trovata almeno una volta. Questo significa che +precedente dev'essere trovata almeno una volta. Questo significa che @samp{wh+y} individuerebbe @samp{why} e @samp{whhy}, ma non @samp{wy}, mentre @samp{wh*y} li troverebbe tutti e tre. @@ -7152,6 +7229,8 @@ Individua la stringa nulla che ricorre all'interno di una parola. Per esempio, @code{/\Bora\B/} individua @samp{Colorado}, ma non individua @samp{che ora @`e}. @samp{\B} @`e essenzialmente l'opposto di @samp{\y}. +Un altro modo di intenderlo @`e che @samp{\B} corrisponde alla stringa vuota, +nel caso questa non si trovi al bordo di una parola. @end table @cindex buffer @subentry operatori per @@ -7482,6 +7561,20 @@ 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. +@quotation NOTA +Quando @command{gawk} @`e chiamato con l'opzione @option{--csv}, nulla +di quanto descritto in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} @`e applicabile. +@xref{Campi separati da virgola}, +per i dettagli. +@end quotation + @menu * awk divisione record:: Come @command{awk} standard divide i record. * gawk divisione record:: Come @command{gawk} divide i record. @@ -8160,6 +8253,7 @@ in precedenza. * Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori. * Campi di un solo carattere:: Fare di ogni carattere un campo separato. +* Campi separati da virgola:: Lavorare con file CSV. * Separatori campo da riga di comando:: Assegnare @code{FS} dalla riga di comando. * Campo intera riga:: Far s@`{@dotless{i}} che la riga intera sia un @@ -8208,10 +8302,10 @@ ricerca speciale @code{BEGIN} (@pxref{BEGIN/END}). Per esempio, qui impostiamo il valore di @code{FS} alla stringa -@code{","}: +@code{":"}: @example -awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}' +awk 'BEGIN @{ FS = ":" @} ; @{ print $2 @}' @end example @cindex @code{BEGIN} (regola) @@ -8219,7 +8313,7 @@ awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}' Data la riga in input: @example -John Q. Smith, 29 Oak St., Walamazoo, MI 42139 +John Q. Smith: 29 Oak St.: Walamazoo: MI 42139 @end example @noindent @@ -8235,7 +8329,7 @@ nome della persona dell'esempio che abbiamo appena usato potrebbe avere un titolo o un suffisso annesso, come: @example -John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139 +John Q. Smith: LXIX: 29 Oak St.: Walamazoo: MI 42139 @end example @noindent @@ -8253,8 +8347,6 @@ si possano manipolare con un programma @command{awk} separato.) @cindex separatore di campo @subentry spazi vuoti come @cindex spazi vuoti @subentry come separatore di campo -@cindex separatore di campo @subentry @code{FS} (variabile) come -@cindex @code{FS} (variabile) @subentry come separatore di campo I campi sono separati normalmente da spazi vuoti (spazi, tabulazioni e ritorni a capo), non solo da spazi singoli. Due spazi in una riga non delimitano un campo vuoto. Il valore di default del separatore @@ -8437,6 +8529,111 @@ In modalit@`a di compatibilit@`a se @code{FS} @`e la stringa nulla, anche @command{gawk} si comporta in questo modo. +@node Campi separati da virgola +@subsection Lavorare con file CSV + +@cindex CSV (dati con valori separati da virgola) @subentry record e campi +@cindex dati CSV (dati con valori separati da virgola) @subentry record e campi +@cindex campi separati da virgola (CSV) come dati @subentry record e campi +Molti programmi di uso frequente si servono della virgola come separatore +di campo, invece di usare lo spazio. [Normalmente i file in input +a @command{gawk} hanno in questo caso come suffisso "csv", +Comma Separated Value, ovvero Campi separati da virgola.] +Questo @`e il caso in particolare per popolari fogli di calcolo. +Non c'@`e uno standard accettato da tutti che regoli il formato di tali +file, sebbene il documento +@uref{http://www.ietf.org/rfc/rfc4180, RFC 4180} +elenchi le pratiche normalmente seguite. + +Per decenni, chi voleva lavorare con file CSV in @command{awk} +ha dovuto ``trovare da solo'' una soluzione. (Per esempio, +@pxref{Separazione in base al contenuto}). +Nel 2023, Brian Kernighan ha deciso di aggiungere un supporto +per i file CSV alla sua versione di @command{awk}. +Per restare allo stesso livello, anche @command{gawk} rende +disponibile lo stesso supporto presente nella versione di Brian. +Per usare dei file contenenti campi in formato CSV, basta +chiamare @command{gawk} specificando come opzione +@option{-k} oppure @option{--csv}. + +I campi nei file CSV sono separati da virgola. Per consentire la +presenza di una virgola all'interno di un campo (p.es. come parte +di un dato), il campo pu@`o essere racchiuso fra doppi apici. +Per consentire un doppio apice all'interno di un campo racchiuso fra +doppi apici, il campo stesso @empf{deve} essere racchiuso fra doppi apici +e due doppi apici vanno specificati per ogni singolo doppio apice +all'interno del campo. +Il doppio apice che segnala l'inizio del campo dev'essere +il primo carattere dopo la virgola [che segna l'inizio del campo]. +La tabella +@ref{table-csv-examples} mostra alcuni esempi. + +@float Table,table-csv-examples +@caption{Esempi di dati in file CSV} +@multitable @columnfractions .3 .3 +@headitem Input @tab Contenuto del campo +@item @code{abc def} @tab @code{abc def} +@item @code{"dati tra doppi apici"} @tab @code{dati tra doppi apici} +@item @code{"dati tra, doppi apici"} @tab @code{dati tra, doppi apici} +@item @code{"Lei disse ""Basta!""."} @tab @code{Lei disse "Basta!".} +@item @code{Lei disse "Basta!".} @tab @code{Lei disse "Basta!".} +@end multitable +@end float + +Inoltre, ed @`e qui che la situazione si ingarbuglia, all'interno +di un campo fra doppi apici @`e consentito anche inserire +il carattere a-capo! +Per gestire una tale situazione, quando sta trattando un file CSV +@command{gawk} analizza il file in input alla ricerca di +caratteri a-capo che non siano racchiusi fra doppi apici. +Quindi, se si utilizza l'opzione @option{--csv}, il modo +di gestire i record utilizzando la variabile @code{RS} +(@pxref{Record}) non viene utilizzato per nulla. + +@cindex Kernighan, Brian @subentry citazioni di +@sidebar Carriage-Return--Line-Feed Line Endings In CSV Files +@sidebar Fine riga dei file CSV con ritorno-carrello--a-capo +@quotation +@code{\r\n} @i{@`e un'invenzione del diavolo.} +@author Brian Kernighan +@end quotation + +Molti file CSV provengono da sistemi in cui il carattere di +fine riga per file di testo @`e costituito dalla coppia di +caratteri ritorno-carrello--a-capo +(CR-LF, @samp{\r} seguito da @samp{\n}). +Per semplificare la vita @command{gawk}, quando tratta +dei file CSV, include il carattere a-capo a fine record solo +quando precede immediatamente un carattere ritorno-carrello +nell'input. +@end sidebar + +Il comportamento della funzione @code{split()} (ancora non +formalmente trattato, vedere @ref{Funzioni per stringhe}) +@`e leggermento differente quando si abbia a che fare con file CSV. +Se @`e chiamato con due argomenti +(@samp{split(@var{stringa}, @var{vettore})}), @code{split()} +separa i campi con la logica CSV. +In tutti gli altri casi, il comportamento @`e quello normale. + +Se si @`e specificato l'opzione @option{--csv}, l'elemento +@code{PROCINFO["CSV"]} esister@`a, altrimenti non sar@`a disponibile. +@xref{Variabili auto-assegnate}. + +Infine, se si @`e specificato @option{--csv}, l'assegnazione di +un valore a una delle variabili +@code{FS}, @code{FIELDWIDTHS}, @code{FPAT}, o @code{RS} +genera un messaggio di avvertimento. + +Per amor di chiarezza, @command{gawk} considera come +autoritativo per il file in input di tipo CSV +il documento +@uref{http://www.ietf.org/rfc/rfc4180, RFC 4180}. +Non ci sono meccanismi che consentono di accettare file CSV +in input che non rispettino tali specifiche, p.es. dei +file che usino come carattere che separa i campi un +punto-e-virgola al posto della virgola. + @node Separatori campo da riga di comando @subsection Impostare @code{FS} dalla riga di comando @cindex @option{-F} (opzione) sulla riga di comando @@ -8628,9 +8825,17 @@ Il seguente elenco riassume come i campi vengono divisi, in base al valore di @code{FS} (@samp{==} significa ``@`e uguale a''): @table @code +@item @asis{@command{gawk} @`e stato chiamato specificando l'opzione @option{--csv}} +La divisione in campi segue le regole esposte in @ref{Campi separati da virgola}. +Il valore di @code{FS} @`e ignorato. + @item FS == " " -I campi sono separati da serie di spazi vuoti. Gli spazi vuoti iniziale e -finale sono ignorati. Questo @`e il comportamento di default. +I campi sono separati da uno o pi@`u spazi vuoti. Gli spazi vuoti iniziali +e finali sono ignorati. Questo @`e il comportamento di default. + +@item FS == "," +I campi sono separati da virgola, con regole speciali per inserire in un +campo virgole e/o doppi apici. @item FS == @var{qualsiasi altro carattere singolo} I campi sono separati da ogni ricorrenza del carattere. Ricorrenze @@ -8933,8 +9138,12 @@ per un esempio di tale funzione). @node Separazione in base al contenuto @section Definire i campi in base al contenuto +@strong{FIXME}: Quest'intera sezione dev'essere riscritta +dopo che in @command{gawk} @`e stata introdotta la capacit@`a di analizzare +file di tipo CSV. Ahim@`e. + @menu -* File CSV:: Ancora sui file CSV. +* Ancora CSV:: Ancora sui file CSV. * FS rispetto a FPAT:: Una differenza sottile. @end menu @@ -8958,12 +9167,12 @@ 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 +@cindex CSV (campi separati da virgola) come dati @subentry analizzare con @code{FPAT} +@cindex dati CSV (campi separati da virgola) @subentry analizzare con @code{FPAT} +@cindex campi separati da virgola (CSV) come dati @subentry analizzare con @code{FPAT} +Il caso pi@`u emblematico +@`e quello dei dati di tipo CSV (campi separati da virgola). +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 sono separati tra loro da virgole. Se le virgole facessero solo da separatore fra i dati non ci sarebbero problemi. Il problema sorge se uno dei campi @@ -9093,7 +9302,16 @@ effettuata utilizzando @code{FS} o @code{FIELDWIDTHS}. Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile per suddividere normali stringhe (@pxref{Funzioni per stringhe}). -@node File CSV +@quotation NOTA +Poich@'e @command{gawk} consente ora un trattamento diretto dei +file di tipo CSV (@pxref{Campi separati da virgola}), gli esempi +presentati qui sono obsoleti. +Nonostante ci@`o, rimangono utili come esempio di ci@`o che +un'analisi dei campi utilizzando la variabile @code{FPAT} +permette di fare. +@end quotation + +@node Ancora CSV @subsection Ancora sui file CSV @cindex Collado, Manuel @@ -9162,9 +9380,9 @@ $ @kbd{gawk -v fpat=2 -f test-csv.awk sample.csv} @cindex Collado, Manuel @cindex @code{CSVMODE}, libreria per @command{gawk} @cindex libreria @subentry @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} +@cindex dati CSV (campi separati da virgola) @subentry analizzare con libreria @code{CSVMODE} +@cindex CSV (campi separati da virgola) come dati @subentry analizzare con libreria @code{CSVMODE} +@cindex campi separati da virgola (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} @@ -9222,7 +9440,9 @@ Il valore @`e @code{"FS"} se si usa la maniera normale di divisione dei campi, oppure @code{"FPAT"} se si una la divisione in campi in base al contenuto: @example -if (PROCINFO["FS"] == "FS") +if ("CSV" in PROCINFO) + @var{divisione in campi secondo le regole CSV} @dots{} +else if (PROCINFO["FS"] == "FS") @var{divisione normale in campi} @dots{} else if (PROCINFO["FS"] == "FIELDWIDTHS") @var{divisione in campi a lunghezza fissa} @dots{} @@ -9234,8 +9454,9 @@ else @end example Quest'informazione @`e utile se si sta scrivendo una funzione che -deve cambiare provvisoriamente @code{FS} o @code{FIELDWIDTHS}, leggere alcuni -record e poi ripristinare le inpostazioni originali. Si veda +deve cambiare provvisoriamente @code{FS}, @code{FIELDWIDTHS}, o +@code{FPAT}, leggere alcuni +record e poi tornale alle impostazioni originali. Si veda (@pxref{Funzioni Passwd} per un esempio di una funzione di questo tipo. @node Righe multiple @@ -10084,7 +10305,7 @@ Questo @value{SECTION} descrive una funzionalit@`a disponibile solo in @command{gawk}. -Si pu@`o specificare un tempo limite in millisecondi per leggere l'input dalla +Si pu@`o specificare un tempo limite in millisecondi per leggere l'input dalla tastiera, da una @dfn{pipe} o da una comunicazione bidirezionale, compresi i @dfn{socket} TCP/IP. Questo pu@`o essere fatto per input, per comando o per connessione, impostando un elemento speciale nel vettore @code{PROCINFO} @@ -10405,6 +10626,7 @@ e parla della funzione predefinita @code{close()}. file gi@`a aperti a inizio esecuzione * Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e @dfn{pipe}. +* Noflush:: Velocizzare output da @dfn{pipe}. * Continuazione dopo errori:: Abilitare continuazione dopo errori in output. * Sommario di Output:: Sommario di Output. @@ -11376,7 +11598,7 @@ invece di inviarlo a un file. Questa ridirezione apre una @dfn{pipe} verso L'argomento @var{comando}, verso cui @`e rivolta la ridirezione, @`e in realt@`a un'espressione @command{awk}. Il suo valore @`e convertito in una stringa il cui contenuto -costituisce un comando della shell che deve essere eseguito. Per esempio, +costituisce un comando della shell che dev'essere eseguito. Per esempio, il seguente programma produce due file, una lista non ordinata di nomi di persone e una lista ordinata in ordine alfabetico inverso: @@ -11674,8 +11896,8 @@ per accedere a ogni altro file aperto ereditato: @table @file @item /dev/fd/@var{N} -Il file associato al descrittore di file @var{N}. Il file indicato deve -essere aperto dal programma che inizia l'esecuzione di @command{awk} +Il file associato al descrittore di file @var{N}. Il file indicato +dev'essere aperto dal programma che inizia l'esecuzione di @command{awk} (tipicamente la shell). Se non sono state poste in essere iniziative speciali nella shell da cui @command{gawk} @`e stato invocato, solo i descrittori 0, 1, e 2 sono disponibili. @@ -11761,6 +11983,11 @@ Se lo si fa, il comportamente risultante @`e imprevedibile. @cindex coprocessi @subentry chiusura @cindex @code{getline} (comando) @subentry coprocessi, usare da +@menu +* Valore restituito da @code{close}:: Usare il valore di ritorno restituito da + @code{close()}. +@end menu + Se lo stesso @value{FN} o lo stesso comando di shell @`e usato con @code{getline} pi@`u di una volta durante l'esecuzione di un programma @command{awk} (@pxref{Getline}), @@ -11813,9 +12040,10 @@ close("sort -r nomi") Una volta eseguita questa chiamata di funzione, la successiva @code{getline} da quel file o comando, o la successiva @code{print} o @code{printf} verso quel file o comando, riaprono il file o eseguono nuovamente il comando. -Poich@'e l'espressione da usare per chiudere un file o una @dfn{pipeline} deve -essere uguale all'espressione usata per aprire il file o eseguire il comando, -@`e buona norma usare una variabile che contenga il @value{FN} o il comando. +Poich@'e l'espressione da usare per chiudere un file o una @dfn{pipeline} +dev'essere uguale all'espressione usata per aprire il file o eseguire il +comando, @`e buona norma usare una variabile che contenga il valore +@value{FN} o il comando. Il precedente esempio cambia come segue: @example @@ -11940,7 +12168,9 @@ rinviata alla @ref{I/O bidirezionale}, che ne parla pi@`u dettagliatamente e fornisce un esempio. -@sidebar Usare il codice di ritorno di @code{close()} +@node Valore restituito da @code{close} +@subsection Usare il valore di ritorno restituito da @code{close()} +@node Usare il valore di ritorno di @code{close()} @cindex angolo buio @subentry funzione @subentry @code{close()} @cindex funzione @subentry @code{close()} @subentry codice di ritorno @cindex @code{close()} (funzione) @subentry codice di ritorno @@ -11972,7 +12202,7 @@ 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 codice di ritorno @`e quello restituito dal comando, +il valore di ritorno @`e quello restituito dal comando, come descritto @iftex nella @@ -11988,6 +12218,8 @@ 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. +Anche le versioni pi@`u recenti di BWK @command{awk} restituiscono gli stessi +valori per la funzione @command{close()}. @float Tabella,table-close-pipe-return-values @caption{Codici di ritorno dalla @code{close()} di una @dfn{pipe}} @@ -12011,10 +12243,64 @@ portabile. @value{DARKCORNER} In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero quando chiude una @dfn{pipe}. -@end sidebar + +@node Noflush +@section Velocizzare output da @dfn{pipe} +@c FIXME: Add indexing + +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} descrive una funzionalit@`a propria di @command{gawk}. + +Normalmente, quando si spediscono data tramite una @dfn{pipe} a +un comando, usando le istruzioni @code{print} o @code{printf}, +@command{gawk} scarica l'output verso la @dfn{pipe}. +Ovvero, l'output non @`e bufferizzato, ma scritto direttamente. +Ci@`o garantisce che l'output della @dfn{pipe}, insieme a quello +generato da @command{gawk} viene scritto enll'ordine che ci si +aspetta: + +@example +print "qualcosa" # va allo standard output +print "qualcos'altro" | "un-comando" # anche allo standard output +print "ulteriori cose" # come pure questo +@end example + +Fare ci@`o ha un prezzo; scaricare dati nella @dfn{pipe} usa +pi@`u tempo CPU, e in alcuni ambienti tale consumo pu@`o +essere eccessivo. + +Si pu@`o chiedere a @command{gawk} di non scaricare direttamente dati +ma di bufferizzarli, in uno dei seguenti due modi: + +@itemize @bullet +@item +Impostare @code{PROCINFO["BUFFERPIPE"]} a un valore qualsiasi. +Dopo aver fatto questo, @command{gawk} bufferizzer@`a i dati per tutte +le @dfn{pipe}. + +@item +Impostare @code{PROCINFO["@var{un-comando}", "BUFFERPIPE"]} a un +valore qualsiasi. In tal caso, solo i dati relativi al comando +@var{un-comando} saranno bufferizzati. +@end itemize + +Uno degli elementi visti sopra @emph{deve} essere impostato nel +vettore @code{PROCINFO} @emph{prima} di eseguire la prima istruzione +@code{print} o @code{printf} diretta alla @dfn{pipe}. +Se lo si fa dopo che dell'output @`e gi@`a stato inviato alla @dfn{pipe}, +@`e troppo tardi. + +Utilizzare questa funzionalit@`a pu@`o modificare il comportamento +dell'output [cambiando l'ordine di quel che viene stampato], +quindi occorre stare attenti a quello che si fa. @node Continuazione dopo errori @section Abilitare continuazione dopo errori in output +@c FIXME: Add indexing @ifnotinfo Questa @@ -12366,7 +12652,10 @@ 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} +BKW @command{awk}@footnote{In tutti gli esempi contenuti in +questo @value{DOCUMENT}, il comando @command{nawk} +richiama BWK @command{awk}.} +e BusyBox @command{awk} tolgono la barra inversa, ma lasciano indisturbato il carattere di avanzamento riga, che fa quindi parte della stringa: @@ -15677,12 +15966,17 @@ specificati sulla riga di comando di @command{gawk}. Come con le regole @code{BEGIN} ed @code{END} @ifnottex @ifnotdocbook +@ifnotlatex (@pxref{BEGIN/END}), +@end ifnotlatex @end ifnotdocbook @end ifnottex @iftex (si veda la @value{SECTION} precedente), @end iftex +@iflatex +(si veda la @value{SECTION} precedente), +@end iflatex @ifdocbook (si veda la @value{SECTION} precedente), @end ifdocbook @@ -17438,13 +17732,13 @@ uno dei seguenti: Microsoft Windows, utilizzando MinGW. @item "os390" -OS/390. +OS/390 (noto anche come z/OS). @item "posix" -GNU/Linux, Cygwin, Mac OS X, e sistemi Unix tradizionali. +GNU/Linux, Cygwin, macOS, e sistemi Unix tradizionali. @item "vms" -OpenVMS o Vax/VMS. +OpenVMS. @end table @item PROCINFO["pgrpid"] @@ -17455,6 +17749,17 @@ Il @dfn{ID di gruppo del processo} del programma corrente. @cindex @dfn{process ID} del programma @command{gawk} Il @dfn{process ID} del programma corrente. +@item PROCINFO["pma"] +@cindex memoria persistente @subentry disponibile in @command{gawk} +@cindex PMA (allocatore di memoria persistente) @subentry disponibile in @command{gawk} +@cindex allocatore di memoria persistente (PMA) @subentry disponibile in @command{gawk} +@cindex memoria persistente (PMA) @subentry disponibile in @command{gawk} +La versione dell'allocatore di memoria persistente (PMA) +disponibile in @command{gawk}. +Questo elemento non sar@`a presente se l'allocatore di memoria +persistente non @`e disponibile. +@xref{Memoria persistente}. + @item PROCINFO["ppid"] @cindex @dfn{parent process ID} del programma @command{gawk} Il @dfn{ID di processo del padre} del programma corrente. @@ -17534,6 +17839,14 @@ I seguenti elementi consentono di modificare il comportamento di @command{gawk}: @table @code +@item PROCINFO["BUFFERPIPE"] +Se questo elemento esiste, tutto l'output alla @dfn{pipe} viene +bufferizzato. + +@item PROCINFO["@var{un-comando}", "BUFFERPIPE"] +Rende bufferizzato l'output del comnado @var{un-comando}. +@xref{Noflush}. + @item PROCINFO["NONFATAL"] Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni consentono la prosecuzione del programma. @@ -18070,10 +18383,10 @@ concettualmente, se i valori degli elementi sono 8, @code{"pippo"}, @float Figura,vettore-elementi @caption{Un vettore contiguo} @ifset SMALLPRINT -@center @image{vettore-elementi, 11cm, , Un vettore contiguo} +@center @image{gawk-vettore-elementi, 11cm, , Un vettore contiguo} @end ifset @ifclear SMALLPRINT -@center @image{vettore-elementi, , , Un vettore contiguo} +@center @image{gawk-vettore-elementi, , , Un vettore contiguo} @end ifclear @end float @end ifnotdocbook @@ -18082,7 +18395,7 @@ concettualmente, se i valori degli elementi sono 8, @code{"pippo"}, <figure id="vettore-elementi" float="0"> <title>Un vettore contiguo</title> <mediaobject> -<imageobject role="web"><imagedata fileref="vettore-elementi.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-vettore-elementi.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -18823,9 +19136,10 @@ successivamente: @example @dots{} -if ("sorted_in" in PROCINFO) @{ +if ("sorted_in" in PROCINFO) ordine_salvato = PROCINFO["sorted_in"] - PROCINFO["sorted_in"] = "@@val_str_desc" # o qualcos'altro + +PROCINFO["sorted_in"] = "@@val_str_desc" # o qualcos'altro @} @dots{} if (ordine_salvato) @@ -20394,7 +20708,7 @@ Se @var{separacampo} @`e omesso, si usa il valore di @code{FS}. @code{@var{vettore}[@var{i}+1]}. Se @var{separacampo} @`e uno spazio bianco, ogni eventuale spazio bianco a inizio stringa viene messo in @code{@var{separatori}[0]} e ogni -eventuale spazio bianco a fine stringa viene messo in +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}). @@ -20419,13 +20733,22 @@ a[3] = "sac" e imposta il contenuto del vettore @code{separatori} come segue: @example -seps[1] = "-" -seps[2] = "-" +separatori[1] = "-" +separatori[2] = "-" @end example @noindent Il valore restituito da questa chiamata a @code{split()} @`e tre. +Se @command{gawk} @`e chiamato con l'opzione @option{--csv}, una chiamata +a @code{split()} con due soli argomenti, divide la stringa usando le +regole di analisi dei file di dati CSV, come esposto in +@ref{Campi separati da virgola}. Con tre o quattro argomenti, +@code{split()} funzione come visto sopra. La chiamata con quattro +argomenti non avrebbe senso per i file CSV, poich@'e ogni elemento +del vettore @var{separatori} consisterebbe semplicemente in una +stringa che contiene una virgola. + @cindex differenze tra @command{awk} e @command{gawk} @subentry funzione @code{split()} Come nella divisione in campi dei record in input, quando il valore di @var{separacampo} @`e @w{@code{" "}}, gli spazi bianchi a inizio e fine stringa @@ -21800,7 +22123,7 @@ L'ora espressa in numero di secondi a partire dall'Epoca. @ignore @item %v -La data in formato VMS (p.es., @samp{20-JUN-1991}). +La data in formato OpenVMS (p.es., @samp{20-JUN-1991}). @end ignore @end table @@ -23248,6 +23571,13 @@ valore pi@`u alto contenuto nel vettore. @node Variabili di tipo dinamico @subsection Funzioni e loro effetti sul tipo di una variabile +@quotation +@i{@`E una farcitura per il deserto! @*@footnote{Si tratta di un +gioco di parole fra "desert" (deserto) e "dessert" (dolce).} +@`E una cera per pavimenti!} +@author Saturday Night Live (quando era ancora divertente) +@end quotation + @command{awk} @`e un linguaggio molto fluido. @`E possible che @command{awk} non sia in grado di stabilire se un identificativo rappresenta una variabile scalare o un vettore, @@ -23274,8 +23604,65 @@ un errore fatale, quindi @command{awk} non arriver@`a a segnalare il secondo errore. Se si commenta la prima chiamata e si riesegue il programma, a quel punto @command{awk} terminer@`a con un messaggio relativo al secondo errore. -Solitamente queste cose non causano grossi problemi, ma @`e bene -esserne a conoscenza. + +Ecco un esempio pi@`u complesso: + +@example +BEGIN @{ + funky(a) + if (A == 0) + print "<" a ">" + else + print a[1] +@} + +function funky(arr) +@{ + if (A == 0) + arr = 1 + else + arr[1] = 1 +@} +@end example + +In questo esempio, la funzione usa il parametro che le viene +passato in modo differente a seconda del valore della variabile +globale @code{A}. +Se @code{A} vale zero, il parametro @code{arr} @`e trattato come una +variabile scalare. Altrimenti @`e trattato come un vettore. + +Ci sono due modi in cui questo programma potrebbe comportarsi. +@command{awk} potrebbe determinare che, nel programma principale +@code{a} ha un indice (ossia @`e un elemento di un vettore), e quindi +considerarlo un vettore (nella fase di analisi del programma, ossia +prima ancora che il programma inizi la sua esecuzione. +BWK @code{awk}, @code{mawk}, e forse altri fanno questo: + +@example +$ @kbd{nawk -v A=0 -f funky.awk} +@error{} nawk: can't assign to a; it's an array name. +@error{} source line number 11 +$ @kbd{nawk -v A=1 -f funky.awk} +@print{} 1 +@end example + +Oppure @command{awk} potrebbe attendere il momento in cui l'istruzione +viene eseguita, per determinare il tipo della variabile @code{a}. +In tal caso, poich@'e @code{a} non @`e ancora stato usato prima di essere +passato alla funzione, l'uso che ne fa la funzione determina il tipo +della variabile, che quindi pu@`o diventare scalare o vettoriale. +@command{gawk} e MKS @command{awk} si comportano cos@`{@dotless{i}}: + +@example +$ @kbd{gawk -v A=0 -f funky.awk} +@print{} <> +$ @kbd{gawk -v A=1 -f funky.awk } +@print{} 1 +@end example + +POSIX non specifica quale dei due comportamenti sia quello corretto, +quindi occorre essere consapevoli che differenti implementazioni di +@command{awk} si comportano in modi diversi. @node Chiamate indirette @section Chiamate indirette di funzione @@ -24116,6 +24503,8 @@ programmazione. con apici alla shell. * Funzione isnumeric:: Una funzione per controllare se un valore @`e numerico. +* Funzione tocsv:: Una funzione per convertire l'output + al formato CSV. @end menu @node Funzione strtonum @@ -25011,6 +25400,102 @@ uguale a quella originale. Tuttavia, per farlo, utilizza la funzione @code{typeof()} (@pxref{Funzioni per i tipi}), che @`e disponibile solo in @command{gawk}. +@node Funzione tocsv +@subsection Produrre output in formato CSV + +@cindex campi separati da virgola (CSV) come dati @subentry generare output in formato CSV +@cindex CSV (dati con valori separati da virgola) @subentry generare output in formato CSV +@cindex dati CSV (campi separati da virgola) @subentry generati da @command{gawk} +L'opzione @option{--csv} di @command{gawk} permette di gestire dati di input in formato +CSV (@pxref{Campi separati da virgola}). + +Se si volesse invece, a partire da dati normali, generare in output +dati in formato CSV? +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} fornisce delle funzioni che consentono di farlo. + +La prima funzione, @code{tocsv()}, ha come input un vettore +formato da campi di dati. Il vettore dovrebbe avere come indice +i numeri, a partire dall'uno. Il secondo parametro, opzionale, +specifica quale sia il separatore dei campi. Se non se ne +specifica uno, quello di default @`e la virgola. + +La funzione @`e in grado di mettere correttamente in formato +CSV campi che contengono al loro interno doppi apici, caratteri +a-capo, o il carattere stesso usato come separatore. +Il record finale in formato CSV viene preparato e restituito +dalla funzione. + +@cindex @code{tocsv()} @subentry funzione definita dall'utente +@cindex funzione definita dall'utente @subentry @code{tocsv()} +@example +@c file eg/lib/tocsv.awk +# tocsv.awk --- convertire dati al formato CSV +@c endfile +@ignore +@c file eg/lib/tocsv.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# April 2023 +@c endfile +@end ignore +@c file eg/lib/tocsv.awk + +function tocsv(campi, sep, i, j, n_campi, risultato) +@{ + if (length(campi) == 0) + return "" + + if (sep == "") + sep = "," + delete n_campi + for (i = 1; i in campi; i++) @{ + n_campi[i] = campi[i] + if (n_campi[i] ~ /["\n]/ || index(n_campi[i], sep) != 0) @{ + gsub(/"/, "\"\"", n_campi[i]) # raddoppia doppi apici + n_campi[i] = "\"" n_campi[i] "\"" # fra doppi apici + @} + @} + + risultato = n_campi[1] + j = length(n_campi) + for (i = 2; i <= j; i++) + risultato = risultato sep n_campi[i] + + return risultato +@} +@c endfile +@end example + +La funzione che segue, @code{tocsv_rec()} serve per utilizzare +@code{tocsv()}. Si pu@`o usare se si vuol convertire un record in +input al formato CSV. La funzione stessa si limita a copiare i +campi del record in un vettore, che viene poi passato alla funzione +@code{tocsv()} che effettua la conversione. +La funzione accetta come suo primo parametro un carattere di +separazione opzionale, che viene semplicemente passato alla funzione +@code{tocsv()}. + +@cindex @code{tocsv_rec()} @subentry funzione definita dall'utente +@cindex funzione definita dall'utente @subentry @code{tocsv_rec()} +@example +@c file eg/lib/tocsv.awk +function tocsv_rec(sep, i, campi) +@{ + delete campi + for (i = 1; i <= NF; i++) + campi[i] = $i + + return tocsv(campi, sep) +@} +@c endfile +@end example + @node Gestione File Dati @section Gestione di @value{DF} @@ -25044,7 +25529,7 @@ presenta funzioni utili per gestire @value{DF} da riga di comando. @cindex file @subentry gestione di @subentry limiti dei file-dati @cindex file @subentry inizializzazione e pulizia Ognuna delle regole @code{BEGIN} ed @code{END} viene eseguita esattamente -solo una volta, rispettivamente all'inizio e alla fine del programma +una volta sola, rispettivamente all'inizio e alla fine del programma @command{awk} (@pxref{BEGIN/END}). Una volta noi (gli autori di @command{gawk}) siamo venuti in contatto con un utente che @@ -25851,7 +26336,7 @@ Si continua poi: @example @c file eg/lib/getopt.awk - if (substr(opzioni_lunghe, i+1+length(unaopz), 1) == ":") @{ + if (substr(opzioni_lunghe, i+1+RLENGTH, 1) == ":") @{ if (j > 0) Optarg = substr(argv[Optind], j + 1) else @@ -28416,7 +28901,7 @@ Ci sono due aspetti importanti da considerare qui: @itemize @bullet @item -Si deve essere in grado di generare facilmente tali suffissi e in +Si dev'essere in grado di generare facilmente tali suffissi e in particolare di gestire facilmente lo ``scorrimento''; per esempio, passare da @samp{abz} ad @samp{aca}. @@ -29362,8 +29847,11 @@ Si spera che siano interessanti e divertenti. Un errore comune quando si scrive un testo lungo @`e quello di ripetere accidentalmente delle parole. Tipicamente lo si pu@`o vedere in testi del tipo ``questo programma fa quanto segue segue@dots{}'' Quando il testo @`e pubblicato in rete, spesso -le parole duplicate sono poste tra il termine di -una riga e l'inizio di un'altra, il che rende difficile scoprirle. +le parole duplicate sono poste tra il termine di una +@iftex +una +@end iftex +riga e l'inizio di un'altra, il che rende difficile scoprirle. @c as here! Questo programma, @file{dupword.awk}, legge un file una riga alla volta @@ -29720,7 +30208,7 @@ per ogni record: @c endfile @end ignore @c file eg/prog/translate.awk -# Bug: non gestisce cose del tipo tr A-Z a-z; deve essere +# Bug: non gestisce cose del tipo tr A-Z a-z; dev'essere # descritto carattere per carattere. # Tuttavia, se `a' @`e pi@`u corto di `da', # l'ultimo carattere in `a' @`e usato per il resto di `da'. @@ -33117,6 +33605,10 @@ formato con cui sono stati inseriti. @node Memoria persistente @section Preservare dati fra successive esecuzioni di @command{gawk} +@cindex PMA (allocatore di memoria persistente) +@cindex allocatore di memoria persistente (PMA) +@cindex memoria persistente (PMA) + A partire dalle versione @value{PVERSION} 5.2, @command{gawk} supporta la @dfn{memoria persistente} [@dfn{persistent memory}]. @@ -33144,8 +33636,8 @@ in @command{gawk} in questo modo: @example $ @kbd{gawk --version} -@print{} GNU Awk 5.2.0, API 3.2, PMA Avon 7, (GNU MPFR 4.0.1, GNU MP 6.1.2) -@print{} Copyright (C) 1989, 1991-2022 Free Software Foundation. +@print{} GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.1.0, GNU MP 6.2.1) +@print{} Copyright (C) 1989, 1991-2023 Free Software Foundation. @dots{} @end example @@ -33153,11 +33645,19 @@ $ @kbd{gawk --version} Se @`e presente la stringa @samp{PMA} con un indicatore di versione, allora la memoria persistente @`e supportata. +@cindex @env{REALLY_USE_PERSIST_MALLOC} (variabile d'ambiente) +@cindex variabili d'ambiente @subentry @env{REALLY_USE_PERSIST_MALLOC} Finora la memoria persistente @`e stata testata solo nei sistemi operativi -GNU/Linux, Cygwin, Solaris 2.11 e in Mac OS. -In altri sistemi operativi, la situazione pu@`o essere diversa, e potrebbero -essere necessarie ulteriori indagini prima di utilizzare questa -funzionalit@`a. +GNU/Linux, Cygwin, Solaris 2.11, sistemi macOS su hardware Intel, +FreeBSD 13.1 e OpenBSD 7.1. +Su tutti gli altri sistemi, la memoria persistente @`e disabilitata +per default. Si pu@`o chiedere di abilitarla esportando la +variabile d'ambiente @env{REALLY_USE_PERSIST_MALLOC} con un +valore diverso dalla stringa nulla, prima di eseguire +@command{configure} +(@pxref{Installazione veloce}). +Se lo fate, e tutti i test passano senza errori, siete pregati +di informare il manutentore di @command{gawk}. Per usare la memoria persistente, seguire questa procedura: @@ -33171,6 +33671,14 @@ di utilit@`a @command{truncate}: $ @kbd{truncate -s 4G dati.pma} @end example +@item +Si raccomanda (ma non @`e obbligatorio farlo) di modificare i permessi +di accesso al file in modo che solo il proprietario possa leggere e +aggiornare il file: + +@example +$ @kbd{chmod 0600 dati.pma} +@end example @cindex @env{GAWK_PERSIST_FILE} (variabile d'ambiente) @cindex variabili d'ambiente @subentry @env{GAWK_PERSIST_FILE} @@ -33264,19 +33772,34 @@ di memoria persistente. codice sorgente @file{support/pma.c} per comprendere il comportamento dei vari livelli di verbosit@`a. -@quotation NOTA +Ci sono alcune limitazioni all'uso della memoria persistente: + +@itemize @bullet +@item Se si usa la libreria MPFR (opzione @option{-M}) nella prima esecuzione di un programma che fa uso della memoria persistente si @emph{deve} usarla in tutte le esecuzioni successive. Analogamente, se non si usa l'opzione @option{-M} nella prima esecuzione non va usata in alcuna esecuzione successiva. -Mischiare esecuzioni che usano la libreria MPFR con esecuzioni che non -la usano, utilizzando lo stesso file di memoria persistente produrr@`a -risultati inattesi e/o errori fatali. -@command{gawk} non rileva una tale situazione, e non @`e detto che lo -far@`a in qualche versione futura. -@end quotation +Non @`e consentito alternare esecuzioni che usano la libreria MPFR con +esecuzioni che non la usano. Se @command{gawk} rileva questa +situazione, termina l'esecuzione con un errore fatale. + +@item +Il filesystem CIFS in ambiente GNU/Linux risulta non +funzionare bene con l'allocatore PMA. +Quindi, non va usato un file di appoggio per la memoria persistente +residente su un filesystem CIFS. + +@item +Se @command{gawk} @`e eseguito dall'utente @command{root}, l'uso +della memoria persistente non @`e consentito. +Ci@`o al fine di evitare la possibilit@`a che dati "privati" +siano salvati nel file di appoggio e vengano successivamente +acceduti da un altro utente o hacker (che a sua volta sia divenuto +@command{root}. +@end itemize Terence Kelly ha preparato un documento a parte, dedicato alla memoria persistente @cite{@value{PMGAWKTITLE}}, @@ -34732,7 +35255,7 @@ quello di programmi che risiedono su file.) Nel nostro caso, il debugger verr@`a invocato in questo modo: @example -$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk -1 file_di_input} +$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk -- -1 file_di_input} @end example @cindex @env{AWKPATH} (variabile d'ambiente) @@ -34744,6 +35267,10 @@ questa sintassi @`e leggermente differente da quello che sono abituati a usare. Col debugger di @command{gawk}, si danno gli argomenti per eseguire il programma nella riga di comando al debugger piuttosto che come parte del comando @code{run} al prompt del debugger.) +Il doppio trattino @option{--} termina le opzioni specificate a @command{gawk} +sulla riga di comando. Non @`e strettamente necessaria in questo caso, +ma lo diviente se un'opzione destinata al programma @command{awk} +@`e in conflitto con qualche opzione di @command{gawk}. L'opzione @option{-1} @`e un'opzione per @file{uniq.awk}. @cindex debugger @subentry prompt @@ -37067,8 +37594,8 @@ Si pu@`o verificare se il supporto a MPFR @`e disponibile in questo modo: @example $ @kbd{gawk --version} -@print{} GNU Awk 5.2.0, API 3.2, PMA Avon 7, (GNU MPFR 4.0.1, GNU MP 6.1.2) -@print{} Copyright (C) 1989, 1991-2022 Free Software Foundation. +@print{} GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.1.0, GNU MP 6.2.1) +@print{} Copyright (C) 1989, 1991-2023 Free Software Foundation. @dots{} @end example @@ -38475,10 +39002,10 @@ Questo si pu@`o vedere in @inlineraw{docbook, <xref linkend="figura-carica-esten @float Figura,figura-carica-estensione @caption{Caricamento dell'estensione} @ifclear SMALLPRINT -@center @image{api-figura1, , , Caricamento dell'estensione} +@center @image{gawk-api-figura1, , , Caricamento dell'estensione} @end ifclear @ifset SMALLPRINT -@center @image{api-figura1, 11cm, , Caricamento dell'estensione} +@center @image{gawk-api-figura1, 11cm, , Caricamento dell'estensione} @end ifset @end float @@ -38488,7 +39015,7 @@ Questo si pu@`o vedere in @inlineraw{docbook, <xref linkend="figura-carica-esten <figure id="figura-carica-estensione" float="0"> <title>Caricamento dell'estensione</title> <mediaobject> -<imageobject role="web"><imagedata fileref="api-figura1.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-api-figura1.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -38516,10 +39043,10 @@ Questo @`e shown in @inlineraw{docbook, <xref linkend="figura-registrare-una-nuo @float Figura,figura-registrare-una-nuova-funzione @caption{Registrare una nuova funzione} @ifclear SMALLPRINT -@center @image{api-figura2, , , Registrare una nuova funzione} +@center @image{gawk-api-figura2, , , Registrare una nuova funzione} @end ifclear @ifset SMALLPRINT -@center @image{api-figura2, 11cm , , Registrare una nuova funzione} +@center @image{gawk-api-figura2, 11cm , , Registrare una nuova funzione} @end ifset @end float @end ifnotdocbook @@ -38528,7 +39055,7 @@ Questo @`e shown in @inlineraw{docbook, <xref linkend="figura-registrare-una-nuo <figure id="figura-registrare-una-nuova-funzione" float="0"> <title>Registering a new function</title> <mediaobject> -<imageobject role="web"><imagedata fileref="api-figura2.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-api-figura2.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -38556,10 +39083,10 @@ Questo @`e mostrato in @inlineraw{docbook, <xref linkend="figura-chiamata-nuova- @float Figura,figura-chiamata-nuova-funzione @caption{Chiamata della nuova funzione} @ifclear SMALLPRINT -@center @image{api-figura3, , , Chiamata della nuova funzione} +@center @image{gawk-api-figura3, , , Chiamata della nuova funzione} @end ifclear @ifset SMALLPRINT -@center @image{api-figura3,11cm , , Chiamata della nuova funzione} +@center @image{gawk-api-figura3,11cm , , Chiamata della nuova funzione} @end ifset @end float @end ifnotdocbook @@ -38568,7 +39095,7 @@ Questo @`e mostrato in @inlineraw{docbook, <xref linkend="figura-chiamata-nuova- <figure id="figura-chiamata-nuova-funzione" float="0"> <title>Chiamata della nuova funzione</title> <mediaobject> -<imageobject role="web"><imagedata fileref="api-figura3.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-api-figura3.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -39658,9 +40185,9 @@ registrate, quando viene invocato specificando l'opzione @option{--version}. @cindex input @subentry analizzatore di @subentry personalizzato Per default, @command{gawk} legge file di testo come input. Il valore della -variabile @code{RS} @`e usato per determinare la fine di un record, e subito -dopo la variabile @code{FS} (o @code{FIELDWIDTHS} o @code{FPAT}) viene usata -per suddividerlo in campi +variabile @code{RS} @`e usato per determinare la fine di un record in input, +e subito dopo la variabile @code{FS} (o @code{FIELDWIDTHS} o @code{FPAT}) +viene usata per suddividerlo in campi @iftex (@pxrefil{Leggere file}). @end iftex @@ -39776,14 +40303,41 @@ inizialmente) da @code{@var{XXX}_can_take_file()}, e quelli che sono usati da Il nome del file. @item int fd; -Un descrittore di file per il file. Se @command{gawk} riesce ad aprire -il file, il valore di @code{fd} @emph{non} sar@`a uguale a -@code{INVALID_HANDLE} [descrittore non valido]. In caso contrario, -quello sar@`a il valore. +Un descrittore di file per il file. @command{gawk} tenta di aprire +il file in lettura usando la chiamata di sistema @code{open()}. +Se il file viene effettivamente aperto, il valore di @code{fd} +@emph{non} sar@`a uguale a @code{INVALID_HANDLE} +[descrittore non valido]. +In caso contrario, il valore sar@`a quello. + +Un'estensione pu@`o decidere che non desidera usare il descrittore +di file aperto che le viene passato da @command{gawk}. +In tal caso pu@`o chiudere il file e impostare il relativo +descrittore di file @code{fd} al valore @code{INVALID_HANDLE}, +oppure ignorarlo e mantenere un suo proprio descrittore di file +nei suoi dati privati, raggiungibili usando il puntatore +@code{opaque} (vedere pi@`u sotto in questa lista). +In ogni caso, se il descrittore di file @`e valido, @emph{non} +dovrebbe essere sovrascritto con un altro valore; se lo si fa, +si causa una perdita di dati. @item struct stat sbuf; Se il descrittore di file @`e valido, @command{gawk} avr@`a riempito i campi di questa struttura invocando la chiamata di sistema @code{fstat()}. +Altrimenti, se la chiamata di sistema @code{lstat()} @`e disponibile, +essa verr@`a usata. Se neppure @code{lstat()} @`e disponibile, allora +verr@`a usata la chiamata di sistema @code{stat()}. + +L'ottenere informazioni relative al file consente alle estensioni di +controllare il tipo di file, anche se non sar@`a poi possibile aprirlo. +Ci@`o capita, per esempio, nei sistemi Windows, quando si tenta di +usare @code{open()} su una directory. + +Se @command{gawk} non sar@`a riuscito a ottenere le informazioni +relative al file, allora @code{sbuf} conterr@`a zeri binari. +In particolare, il codice dell'estensione pu@`o testare se il campo +@samp{sbuf.st_mode == 0}. Se @`e questo il caso, allora in +@code{sbuf} non @`e contenuta alcuna informazione. @end table La funzione @code{@var{XXX}_can_take_file()} dovrebbe esaminare i campi di @@ -39821,7 +40375,7 @@ Questo puntatore a funzione dovrebbe puntare a una funzione che crea i record in input. Tale funzione @`e il nucleo centrale dell'analizzatore di input. Il suo modo di operare @`e descritto nel testo che segue questo elenco. -@item ssize_t (*read_func)(); +@item ssize_t (*read_func)(int, void *, size_t); Questo puntatore a funzione dovrebbe puntare a una funzione che ha lo stesso comportamento della chiamata di sistema standard POSIX @code{read()}. @`E in alternativa al puntatore a @code{get_record}. Il relativo comportamento @@ -39848,14 +40402,16 @@ record in input. I parametri sono i seguenti: @table @code @item char **out -Questo @`e un puntatore a una variabile @code{char *} che @`e impostatata in modo -da puntare al record. @command{gawk} usa una sua copia locale dei dati, -quindi l'estensione deve gestire la relativa area di memoria. +Questo @`e un puntatore a una variabile @code{char *} che @`e impostatata +in modo da puntare al record. @command{gawk} usa una sua copia locale dei +dati, quindi l'estensione dell'utente deve gestire la relativa area di +memoria. @item struct awk_input *iobuf -Questa @`e la struttura @code{awk_input_buf_t} per il file. I campi dovrebbero -essere usati per leggere i dati (@code{fd}) e per gestire lo stato privato -(@code{opaque}), se necessario. +Questa @`e la struttura @code{awk_input_buf_t} per il file. +Due dei suoi campi dovrebbero essere usati dall'estensione utente: +@code{fd} per leggere i dati, e @code{opaque} per gestire lo stato privato +se necessario. @item int *errcode Se si verifica un errore, @code{*errcode} dovrebbe essere impostato a un @@ -39867,8 +40423,8 @@ Se il concetto ``fine record'' @`e applicabile, @code{*rt_start} dovrebbe essere impostato per puntare ai dati da usare come @code{RT}, e @code{*rt_len} dovrebbe essere impostata alla lunghezza di quel campo. In caso contrario, @code{*rt_len} dovrebbe essere impostata a zero. -@command{gawk} usa una sua copia di questi dati, quindi l'estensione deve -gestire tale memoria. +Anche qui @command{gawk} usa una sua copia di questi dati, quindi +l'estensione utente deve gestire tale memoria. @item const awk_fieldwidth_info_t **field_width Se @code{field_width} non @`e @code{NULL}, @code{*field_width} sar@`a @@ -39880,6 +40436,7 @@ inoltre essa deve rimanere disponibile almeno fino alla successiva chiamata a @code{get_record} o a @code{close_func}. Si noti inoltre che @code{field_width} vale @code{NULL} quando @code{getline} sta assegnando i risultati a una variabile, e quindi un'analisi del campo non @`e necessaria. + Se l'analizzatore imposta @code{*field_width}, allora @command{gawk} usa questa descrizione per analizzare il record in input, e il valore di @code{PROCINFO["FS"]} sar@`a @code{"API"} finch@'e questo @@ -39938,15 +40495,8 @@ valore preso da una variabile @command{awk}, come fa l'estensione XML inclusa nel progetto @code{gawkextlib} (@pxref{gawkextlib}). In quest'ultimo caso, il codice in una regola @code{BEGINFILE} pu@`o controllare @code{FILENAME} ed @code{ERRNO} per decidere se -attivare un analizzatore di input (@pxref{BEGINFILE/ENDFILE}) oppure no. - -Un analizzatore di input va registrato usando la seguente funzione: - -@table @code -@item void register_input_parser(awk_input_parser_t *input_parser); -Registra l'analizzatore di input puntato da @code{input_parser} con -@command{gawk}. -@end table +attivare un analizzatore di input utente oppure no +(@pxref{BEGINFILE/ENDFILE}). Se si vuole ignorare il meccanismo di default per l'analisi dei campi per un determinato record, si deve riempire una struttura @@ -39993,6 +40543,14 @@ dimensione pu@`o essere usata come argomento per @code{malloc()} o in una struttura @dfn{union} per allocare spazio staticamente. Per un esempio si pu@`o vedere l'estensione di esempio @code{readdir_test}. +Un analizzatore di input va registrato usando la seguente funzione: + +@table @code +@item void register_input_parser(awk_input_parser_t *input_parser); +Registra l'analizzatore di input puntato da @code{input_parser} con +@command{gawk}. +@end table + @node Processori di output @subsubsection Registrare un processore di output @cindex personalizzato @subentry processore di output @@ -40108,11 +40666,14 @@ appropriate per fare il lavoro richiesto. La funzione @code{@var{XXX}_can_take_file()} dovrebbe decidere in base ai campi @code{nome} e @code{modo}, e a ogni altro ulteriore indicatore di stato (p.es., valori di variabili @command{awk}) adatto allo scopo. +@command{gawk} tenta di aprire in scrittura il file indicato. +L'elemento @code{fp} varr@`a @code{NULL} solo se non si riesci ad aprire +il file. Quando @command{gawk} chiama @code{@var{XXX}_take_control_of()}, la funzione dovrebbe riempire i rimanenti campi in modo opportuno, tranne che per @code{fp}, che dovrebbe essere usato -normalmente. +normalmente se il suo valore non @`e @code{NULL}. Il processore di output va registrato usando la seguente funzione: @@ -40987,7 +41548,7 @@ richiede di comprendere il modo con cui tali valori sono convertiti in stringhe Come per @emph{tutte} le stringhe passate a @command{gawk} da un'estensione, la memoria che contiene il valore della stringa con chiave -@code{index} deve essere stata acquisita utilizzando le funzioni +@code{index} dev'essere stata acquisita utilizzando le funzioni @code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}, e @command{gawk} rilascer@`a (al momento opportuno) la relativa memoria. @@ -41285,7 +41846,7 @@ codice di un'estensione: @itemize @value{BULLET} @item -Il vettore appena creato deve essere subito messo nella Tabella dei simboli di +Il vettore appena creato dev'essere subito messo nella Tabella dei simboli di @command{gawk}. Solo dopo aver fatto questo @`e possibile aggiungere elementi al vettore. @@ -43348,8 +43909,9 @@ valore uno se completa il lavoro o zero se non va a buon fine. Questa funzione ha come argomento una stringa, che @`e il nome del file dal quale leggere i valori di molteplici variabili globali. Per ogni variabile contenuta nel file, il relativo valore viene -caricato, a meno che la variabile sia gi@`a esistente. -Se la variabile esiste gi@`a, il valore della variabile specificato +caricato, a meno che alla variabile sia gi@`a stato assegnato un +valore, o sia stata usata come un vettore. +In tal caso, il valore della variabile specificato nel file viene ignorato. Restituisce il valore uno se completa il lavoro o zero se non va a buon fine. @end table @@ -43439,18 +44001,6 @@ if (contents == "" && ERRNO != "") @{ @node Esempio di estensione Time @subsection Funzioni dell'estensione time -@quotation ATTENZIONE -A partire da @command{gawk} @value{PVERSION} 5.1.0, quest'estensione @`e -da considerarsi obsoleta. @`E sostituita dall'estensione -@code{timex} in @code{gawkextlib} (@pxref{gawkextlib}). - -Nella @value{PVERSION} 5.1, non viene emesso alcun messaggio di avviso -se si usa quest'estensione. -A partire dalla prossima versione principale, verr@`a emesso un messaggio -di avviso. Nella versione successiva a quella, quest'estensione sar@`a -rimossa dalla distribuzione. -@end quotation - L'estensione @code{time} aggiunge due funzioni, di nome @code{gettimeofday()} e @code{sleep()}, come segue: @@ -43486,6 +44036,34 @@ 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 ottenere il tempo di attesa richiesto. + +@cindex @code{strptime()} (funzione estesa) +@cindex funzione estesa @subentry @code{strptime()} +@item timeval = strptime(@var{string}, @var{format}) +Questa funzione accetta due argomenti, una stringa che rappresenta +una data e un'ora e una stringa di formato che descrive i dati +contenuti nella prima stringa. +Viene richiamata la funzione di libreria C @code{strptime()}, +con i valori passati alla funzione. +Se la scansione dei parametri risulta essere corretta, i risultati +sono quindi passati alla funzione di libreria C @code{mktime()}, +i cui risultati vengono poi restituiti, e contengono il numero di +secondi passato dall'inizio del tempo in Unix (01 gennaio 1970), +nel fuso orario del computer, a prescindere da qualsiasi specificazione +di fuso orario contenuta negli argomenti passati alla funzione. +(Ci@`o equivale alla funzione predefinita @code{systime()} di +@command{gawk}. +Altrimenti, in caso di errore, viene restituito @minus{}1. + +Notare che la routine di libreria C @code{strptime()} qui +richiamata ignora ogni indicazione di fuso orario nella stringa +che descrive la data, restituendo sempre valori relativi al +fuso orario del computer. +@ignore +It might be better to have this +routine return a string similar to what @command{gawk}'s @code{mktime()} +function expects, but we ran out of energy. +@end ignore @end table @node Esempio di estensione API Test @@ -43693,8 +44271,8 @@ un'estensione. considerata come in sola lettura dall'estensione. @item -@emph{Tutta} la memoria passata da un'estensione a @command{gawk} deve -essere ottenuta dalle funzioni di allocazione della memoria previste +@emph{Tutta} la memoria passata da un'estensione a @command{gawk} +dev'essere ottenuta dalle funzioni di allocazione della memoria previste dall'API. @command{gawk} @`e responsabile per la gestione di quella memoria e la libera quando @`e il momento per farlo. @@ -44472,7 +45050,7 @@ Tandem (non-POSIX) Compilatore pre-standard VAX C per VAX/VMS @item -GCC per VAX e Alpha non @`e stato verificato da parecchio tempo. +GCC per Alpha non @`e stato verificato da parecchio tempo. @end itemize @@ -45219,6 +45797,10 @@ La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di (@pxref{BEGINFILE/ENDFILE}). @item +Supporto per continuare dopo errori di I/O non fatali +@xref{Continuazione dopo errori}. + +@item Il comando @code{where} @`e stato aggiunto al debugger (@pxref{Stack di esecuzione}). @@ -45440,6 +46022,34 @@ integrato, consentendo l'uso di dati persistenti sistemi (@pxref{Memoria persistente}). +@item +L'elemento @code{PROCINFO["pma"]} esiste se l'allocatore di memoria +persistente (PMA) @`e disponibile. +@pxref{Variabili auto-assegnate}.) + +@end itemize + +La versione 5.3 ha aggiunto le seguenti funzionalit@`a: + +@itemize +@item +Divisione in campi per file di tipo CSV (Campi separati da virgola) +(@pxref{Campi separati da virgola}). + +@item +La possibilit@`a che @command{gawk} bufferizzi l'output a @dfn{pipe} +(@pxref{Noflush}). + +@item +La sequenza di protezione @samp{\u} +(@pxref{Sequenze di protezione}). + +@item +La necessit@`a di utilizzare la libreria GNU @code{libsigsegv} +@`e stata rimossa da @command{gawk}. +Il valore aggiunto relativo non @`e mai stato grande e la funzionalit@`a +causava problemi in alcuni sistemi. + @end itemize @c XXX ADD MORE STUFF HERE @@ -45457,18 +46067,20 @@ le tre versioni liberamente disponibili pi@`u usate di @command{awk} @multitable {File speciale @file{/dev/stderr}} {BWK @command{awk} } {@command{mawk}} {@command{gawk}} {Standard attuale} @headitem Funzionalit@`a @tab BWK @command{awk} @tab @command{mawk} @tab @command{gawk} @tab Standard attuale +@item Operatori @code{**} e @code{**=} @tab X @tab @tab X @tab @item Sequenza di protezione @samp{\x} @tab X @tab X @tab X @tab -@item Stringa nulla come @code{FS} @tab X @tab X @tab X @tab +@item Sequenza di protezione @samp{\u} @tab X @tab @tab X @tab @item File speciale @file{/dev/stdin} @tab X @tab X @tab X @tab @item File speciale @file{/dev/stdout} @tab X @tab X @tab X @tab @item File speciale @file{/dev/stderr} @tab X @tab X @tab X @tab +@item Variabile @code{BINMODE} @tab @tab X @tab X @tab +@item Supporto CSV @tab X @tab @tab X @tab +@item Stringa nulla come @code{FS} @tab X @tab X @tab X @tab @item @code{delete} senza indici @tab X @tab X @tab X @tab X @item Funzione @code{fflush()} @tab X @tab X @tab X @tab X +@item Parola chiave @code{func} @tab X @tab @tab X @tab @item @code{length()} di un vettore @tab X @tab X @tab X @tab @item Istruzione @code{nextfile} @tab X @tab X @tab X @tab X -@item Operatori @code{**} e @code{**=} @tab X @tab @tab X @tab -@item Parola chiave @code{func} @tab X @tab @tab X @tab -@item Variabile @code{BINMODE} @tab @tab X @tab X @tab @item @code{RS} come @dfn{regexp} @tab X @tab X @tab X @tab @item Funzioni gestione data/ora @tab @tab X @tab X @tab @end multitable @@ -45889,10 +46501,6 @@ resto del team di sviluppo. John Malmberg ha apportato miglioramenti significativi alla versione OpenVMS e alla relativa documentazione. -@item -@cindex Colombo, Antonio -Antonio Giovanni Colombo ha riscritto diversi esempi, che non erano pi@`u -attuali, contenuti nei primi capitoli, e gliene sono estremamente grato. Ha inoltre preparato con Marco Curreli e mantiene la traduzione in italiano di questo libro. @@ -46387,8 +46995,8 @@ File necessari per compilare @command{gawk} sotto MS-Windows (@pxref{Installazione su PC} per i dettagli). @item vms/* -File necessari per compilare @command{gawk} sotto Vax/VMS e OpenVMS -(@pxref{Installazione su VMS} per i dettagli). +File necessari per compilare @command{gawk} sotto OpenVMS +(@pxref{Installazione su OpenVMS} per i dettagli). @item test/* Una serie di test per @@ -46802,7 +47410,7 @@ vari sistemi non-Unix. @menu * Installazione su PC:: Installare e compilare @command{gawk} su Microsoft Windows. -* Installazione su VMS:: Installare @command{gawk} su VMS. +* Installazione su OpenVMS:: Installare @command{gawk} su OpenVMS. @end menu @node Installazione su PC @@ -47079,16 +47687,16 @@ automaticamente la conversione di @code{"\r\n"}, mentre cos@`{@dotless{i}} non @ In ambiente MSYS2, la compilazione usando i comandi classici @samp{./configure && make} funziona senza necessitare di alcuna modifica. -@node Installazione su VMS -@appendixsubsec Compilare e installare @command{gawk} su Vax/VMS e OpenVMS +@node Installazione su OpenVMS +@appendixsubsec Compilare e installare @command{gawk} su OpenVMS @c based on material from Pat Rankin <rankin@eql.caltech.edu> @c now rankin@pactechdata.com @c now r.pat.rankin@gmail.com -@cindex @command{gawk} @subentry versione VMS di -@cindex installare @command{gawk} @subentry su VMS -@cindex VMS @subentry installare @command{gawk} su +@cindex @command{gawk} @subentry versione OpenVMS di +@cindex installare @command{gawk} @subentry su OpenVMS +@cindex OpenVMS @subentry installare @command{gawk} su @ifnotinfo Questa @end ifnotinfo @@ -47098,23 +47706,23 @@ Questo @value{SUBSECTION} descrive come compilare e installare @command{gawk} sotto OpenVMS. -Il termine classico ``VMS'' @`e usato qui per designare OpenVMS. @menu -* Compilazione su VMS:: Come compilare @command{gawk} su VMS. -* Estensioni dinamiche su VMS:: Compilare estensioni dinamiche - di @command{gawk} su VMS. -* Dettagli installazione su VMS:: Come installare @command{gawk} su VMS. -* Esecuzione su VMS:: Come eseguire @command{gawk} su VMS. -* GNV su VMS:: Il progetto VMS GNV. +* Compilazione su OpenVMS:: Come compilare @command{gawk} su OpenVMS. +* Estensioni dinamiche su OpenVMS:: Compilare estensioni dinamiche + di @command{gawk} su OpenVMS. +* Dettagli installazione su OpenVMS:: Come installare @command{gawk} su + OpenVMS. +* Esecuzione su OpenVMS:: Come eseguire @command{gawk} su OpenVMS. +* GNV su OpenVMS:: Il progetto GNV su OpenVMS. @end menu -@node Compilazione su VMS -@appendixsubsubsec Compilare @command{gawk} su VMS -@cindex compilare @command{gawk} @subentry per VMS -@cindex VMS @subentry compilare @command{gawk} per +@node Compilazione su OpenVMS +@appendixsubsubsec Compilare @command{gawk} su OpenVMS +@cindex compilare @command{gawk} @subentry per OpenVMS +@cindex OpenVMS @subentry compilare @command{gawk} per -Per compilare @command{gawk} sotto VMS, esiste una procedura di comandi +Per compilare @command{gawk} sotto OpenVMS, esiste una procedura di comandi @code{DCL} che esegue tutti i comandi @code{CC} e @code{LINK} necessari. C'@`e anche un @file{Makefile} da usare con i programmi di utilit@`a @code{MMS} e @code{MMK}. @@ -47152,7 +47760,7 @@ il nome del parametro che specifica l'obiettivo pu@`o dover essere scritto digitando esattamente le lettere maiuscole e minuscole. @command{gawk} @`e stato testato usando VMS Software, Inc.@: -Community editions. +Community editions: @itemize @bullet @item @@ -47164,15 +47772,15 @@ IA64 @`e anche nota come ``Itanium''.} @end itemize Poich@'e HPE ha eliminato il programma di licenza Hobbyist, non @`e possibile -effettuare ulteriori test su versioni pi@`u datate di VAX/VMS e OpenVMS. +effettuare ulteriori test su versioni pi@`u datate di OpenVMS. -@xref{GNV su VMS} per informazioni su come compilare +@xref{GNV su OpenVMS} per informazioni su come compilare @command{gawk} come un kit PCSI compatible con il prodotto GNV. -@node Estensioni dinamiche su VMS -@appendixsubsubsec Compilare estensioni dinamiche di @command{gawk} in VMS +@node Estensioni dinamiche su OpenVMS +@appendixsubsubsec Compilare estensioni dinamiche di @command{gawk} su OpenVMS -Le estensioni che sono state rese disponibile su VMS possono essere +Le estensioni che sono state rese disponibile su OpenVMS possono essere costruite dando uno dei comandi seguenti: @example @@ -47197,45 +47805,34 @@ col formato IEEE. La dimensione dei puntatori @`e 32 bit, e il trattamento dei simbolici dovrebbe richiedere il rispetto esatto di maiuscole/minuscole, con le abbreviazioni CRC per simboli pi@`u lunghi di 32 bit. -Per Alpha e Itanium: - @example /nome=(as_is,short) /float=ieee/ieee_mode=denorm_results @end example -Per VAX@footnote{Le estensioni dinamiche in questo momento non funzionano -su VAX, quanto segue vale solo come documentazione.}: - -@example -/nome=(as_is,short) -@end example - Le macro da usare al momento della compilazione devono essere definite prima di -includere il primo file di intestazione proveniente da VMS, come segue: +includere il primo file di intestazione proveniente da OpenVMS, come segue: @example -#if (__CRTL_VER >= 70200000) && !defined (__VAX) +#if (__CRTL_VER >= 70200000) #define _LARGEFILE 1 #endif -#ifndef __VAX #ifdef __CRTL_VER #if __CRTL_VER >= 80200000 #define _USE_STD_STAT 1 #endif #endif -#endif @end example -Se si scrivono delle estensioni utente da eseguire su VMS, vanno fornite anche -queste definizioni. Il file @file{config.h} creato quando si compila -@command{gawk} su VMS lo fa gi@`a; se invece si usa qualche altro file simile, -occorre ricordarsi di includerlo prima di qualsiasi file di intestazione -proveniente da VMS. +Se si scrivono delle estensioni utente da eseguire su OpenVMS, vanno fornite +anche queste definizioni. Il file @file{config.h} creato quando si compila +@command{gawk} su OpenVMS lo fa gi@`a; se invece si usa qualche altro file +simile, occorre ricordarsi di includerlo prima di qualsiasi file di +intestazione proveniente da OpenVMS. -@node Dettagli installazione su VMS -@appendixsubsubsec Installare @command{gawk} su VMS +@node Dettagli installazione su OpenVMS +@appendixsubsubsec Installare @command{gawk} su OpenVMS Per usare @command{gawk}, tutto ci@`o che serve @`e un comando ``esterno'', che @`e un simbolo @code{DCL} il cui valore inizia col segno del dollaro. @@ -47269,14 +47866,14 @@ Per farlo solo nella sessione corrente si pu@`o usare: $ @kbd{set command gnv$gnu:[vms_bin]gawk_verb.cld} @end example -Oppure il sistemista VMS pu@`o usare @file{GNV$GNU:[vms_bin]gawk_verb.cld} per +Oppure il sistemista OpenVMS pu@`o usare @file{GNV$GNU:[vms_bin]gawk_verb.cld} per aggiungere i comandi @command{gawk} e @command{awk} alla tabella @samp{DCLTABLES} valida per tutto il sistema. La sintassi DCL @`e documentata nel file @file{gawk.hlp}. In alternativa, l'elemento @file{gawk.hlp} pu@`o essere caricato in una -libreria di aiuto VMS: +libreria di aiuto OpenVMS: @example $ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp} @@ -47284,7 +47881,7 @@ $ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp} @noindent (Una libreria specifica dell'installazione potrebbe venir usata invece -della libreria standard VMS library @samp{HELPLIB}.) Dopo aver installato +della libreria standard OpenVMS @samp{HELPLIB}.) Dopo aver installato il testo di aiuto, il comando: @example @@ -47305,11 +47902,11 @@ ancora stato trovato, @command{gawk} appone il suffisso @samp{.awk} al @value{FN} e ritenta la ricerca del file. Se @samp{AWK_LIBRARY} non @`e definita, si usa per essa il valore di default @samp{SYS$LIBRARY:}. -@node Esecuzione su VMS -@appendixsubsubsec Eseguire @command{gawk} su VMS +@node Esecuzione su OpenVMS +@appendixsubsubsec Eseguire @command{gawk} su OpenVMS L'elaborazione della riga di comando e le convenzioni per proteggere i -caratteri sono significativamente differenti in VMS, e quindi gli esempi +caratteri sono significativamente differenti in OpenVMS, e quindi gli esempi presenti in questo @value{DOCUMENT} o provenienti da altre fonti necessitano piccole modifiche. Le modifiche, tuttavia, @emph{sono} veramente piccole, e tutti i programmi @command{awk} dovrebbero funzionare correttamente. @@ -47326,33 +47923,34 @@ $ @kbd{gawk -"W" version} Si noti che il testo con caratteri maiuscoli e misti maiuscoli/minuscoli dev'essere incluso tra doppi apici. -La versione VMS di @command{gawk} comprende un'interfaccia in stile @code{DCL}, -oltre a quella originale, di tipo shell (si veda il file di aiuto per ulteriori -dettagli). Un effetto indesiderato della duplice analisi della riga -di comando @`e che se c'@`e solo un unico parametro (come nel programma con le -righe contenenti doppi apici), il comando diviene ambiguo. Per evitare questo -inconveniente, il flag, normalmente non necessario, @option{--} @`e necessario -per forzare un esame dei parametri in stile Unix, piuttosto che nella modalit@`a -@code{DCL}. Se qualsiasi altra opzione preceduta dal segno @option{-} (o pi@`u -parametri, per esempio, pi@`u @value{DF} in input) @`e presente, non c'@`e ambiguit@`a, +La versione OpenVMS di @command{gawk} comprende un'interfaccia in stile +@code{DCL}, oltre a quella originale, di tipo shell (si veda il file di aiuto +per ulteriori dettagli). Un effetto indesiderato della duplice analisi della +riga di comando @`e che se c'@`e solo un unico parametro (come nel programma +con le righe contenenti doppi apici), il comando diviene ambiguo. Per evitare +questo inconveniente, il flag, normalmente non necessario, @option{--} @`e +necessario per forzare un esame dei parametri in stile Unix, piuttosto che +nella modalit@`a @code{DCL}. +Se qualsiasi altra opzione preceduta dal segno @option{-} (o pi@`u parametri, +per esempio, pi@`u @value{DF} in input) @`e presente, non c'@`e ambiguit@`a, e l'opzione @option{--} pu@`o essere omessa. -@cindex codice di ritorno @subentry di @command{gawk} @subentry in VMS -@cindex @code{exit} (istruzione) @subentry codice di ritorno di @command{gawk}, in VMS +@cindex codice di ritorno @subentry di @command{gawk} @subentry in OpenVMS +@cindex @code{exit} (istruzione) @subentry codice di ritorno di @command{gawk}, in OpenVMS Il valore di @code{exit} @`e un valore in stile Unix e viene trasformato in -un codice di ritorno VMS all'uscita del programma. +un codice di ritorno OpenVMS all'uscita del programma. -I bit di severit@`a di VMS saranno impostati a partire dal valore dell'istruzione -@code{exit}. Un errore grave @`e indicato da 1, e VMS imposta la condizione -@code{ERROR}. Un errore fatale @`e indicato da 2, e VMS imposta la condizione +I bit di severit@`a di OpenVMS saranno impostati a partire dal valore dell'istruzione +@code{exit}. Un errore grave @`e indicato da 1, e OpenVMS imposta la condizione +@code{ERROR}. Un errore fatale @`e indicato da 2, e OpenVMS imposta la condizione @code{FATAL}. Ogni altro valore imposta la condizione @code{SUCCESS}. Il -valore d'uscita @`e codificato per aderire agli standard di codifica VMS e avr@`a +valore d'uscita @`e codificato per aderire agli standard di codifica OpenVMS e avr@`a un @code{C_FACILITY_NO} di @code{0x350000} con il codice costante @code{0xA000} aggiunto al numero spostato a sinistra di 3 bit per far posto al codice di severit@`a. Per estrarre il codice reale di ritorno dell'istruzione @code{exit} -di @command{gawk} dalla condizione impostata da VMS, si usi: +di @command{gawk} dalla condizione impostata da OpenVMS, si usi: @example unix_status = (vms_status .and. %x7f8) / 8 @@ -47362,20 +47960,8 @@ 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 -gli altri valori erano restituiti immodificati. Questa era una violazione -rispetto alle specifiche di codifica delle condizioni di uscita di VMS. - -@cindex numeri @subentry in virgola mobile @subentry VAX/VMS -@cindex VAX/VMS @subentry numeri in virgola mobile, -L'aritmetica in virgola mobile VAX/VMS usa un arrotondamento statistico. -@xref{Funzione round}. - -VMS restituisce data e ora in formato GMT, a meno che non siano stati impostati -i nomi logici @code{SYS$TIMEZONE_RULE} o @code{TZ}. Precedenti versioni di -VMS, come VAX/VMS 7.3, non impostano questi nomi logici. +OpenVMS restituisce data e ora in formato GMT, a meno che non siano stati impostati +i nomi logici @code{SYS$TIMEZONE_RULE} o @code{TZ}. @cindex percorso di ricerca @cindex percorso di ricerca @subentry per file sorgente @@ -47389,24 +47975,24 @@ di directory, separate da virgola. Nel definirla, il valore dovrebbe essere incluso tra doppi apici, in modo che consenta una sola traduzione, e non una lista di ricerca multitraduzione @code{RMS}. -@cindex ridirezione in VMS +@cindex ridirezione in OpenVMS Questa restrizione vale anche se si esegue @command{gawk} sotto GNV, in quanto la ridirezione @`e sempre verso un comando DCL. -Se si ridirigono dati verso un comando o un programma di utilit@`a VMS, -l'implementazione corrente richiede la creazione di un comando VMS esterno che +Se si ridirigono dati verso un comando o un programma di utilit@`a OpenVMS, +l'implementazione corrente richiede la creazione di un comando OpenVMS esterno che esegua un file di comandi, prima di invocare @command{gawk}. (Questa restrizione potrebbe essere rimossa in una futura versione di -@command{gawk} per VMS.) +@command{gawk} su OpenVMS.) Senza un tale file di comandi, i dati in input saranno presenti anche in output, prima dei dati di output veri e propri. -Ci@`o consente la simulazione di comandi POSIX non disponibili in VMS +Ci@`o consente la simulazione di comandi POSIX non disponibili in OpenVMS o l'uso di programmi di utilit@`a GNV. L'esempio seguente mostra come ridirigere dati da @command{gawk} verso il -comando VMS @command{sort}. +comando OpenVMS @command{sort}. @example $ sort = "@@device:[dir]vms_gawk_sort.com" @@ -47434,10 +48020,10 @@ $ define/user sys$input sys$command: $ sort sys$input: sys$output: @end example -@node GNV su VMS -@appendixsubsubsec Il progetto VMS GNV +@node GNV su OpenVMS +@appendixsubsubsec Il progetto GNV su OpenVMS -Il pacchetto VMS GNV fornisce un ambiente di sviluppo simile +Il pacchetto OpenVMS GNV fornisce un ambiente di sviluppo simile a POSIX tramite una collezione di strumenti @dfn{open source}. Il @command{gawk} presente nel pacchetto base GNV @`e una vecchia versione. Attualmente, il progetto GNV @`e in fase di riorganizzazione, con l'obiettivo @@ -47448,7 +48034,7 @@ La procedura normale per compilare @command{gawk} produce un programma adatto a essere usato con GNV. Il file @file{vms/gawk_build_steps.txt} nella distribuzione documenta -la procedura per compilare un pacchetto PCSI compatible con GNV. +la procedura per compilare un pacchetto PCSI OpenVMS compatible con GNV. @node Bug @appendixsec Segnalazione di problemi e bug @@ -47952,7 +48538,7 @@ Le persone che si occupano delle varie versioni di @command{gawk} sono: @item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz (chiocciola) gnu (punto) org} -@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw (chiocciola) qsl (punto) net} +@item OpenVMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw (chiocciola) qsl (punto) net} @item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk (chiocciola) iSKUNK (punto) ORG} @end multitable @@ -48020,7 +48606,7 @@ Brian Kernighan, uno degli sviluppatori originali di Unix @command{awk}, ha reso disponibile liberamente la sua implementazione di @command{awk}. Pu@`o essere scaricata da GitHub: @example -git clone git://github.com/onetrueawk/awk bwkawk +git clone https://github.com/onetrueawk/awk bwkawk @end example @noindent @@ -48043,7 +48629,7 @@ POSIX @command{awk}. Incidentalmente, Dan Bornstein ha creato un deposito Git che contiene tutte le versioni di BWK @command{awk} che @`e riuscito a trovare. @`E disponibile in -@uref{git://github.com/danfuzz/one-true-awk}. +@uref{https://github.com/danfuzz/one-true-awk}. @cindex Brennan, Michael @cindex @command{mawk} (programma di utilit@`a) @@ -48248,6 +48834,21 @@ Questo @`e un modulo Python che intende introdurre funzionalit@`a di tipo ulteriori informazioni. (Questo programma non @`e correlato con la versione modificata da Nelson Beebe di BWK @command{awk}, descritta prima.) +@cindex Ramming, J.@: Christopher +@cindex @command{awkcc}, @subentry traduttore da @command{awk} a C +@cindex compilatore per @command{awk} @subentry @command{awkcc} +@cindex sorgente @subentry codice @subentry @command{awkcc} +@cindex codice sorgente @subentry @command{awkcc} +@item @command{awkcc} +Questo @`e un adattamento di una versione Unix di @command{awk} +che traduce script @command{awk} in programmi C. +@`E stato scritto da J.@: Christopher Ramming nei Bell Labs, +attorno al 1988. +@`E disponibile in @uref{https://github.com/nokia/awkcc}. +Aggiornare questo programma per renderlo applicabile +alle versioni pi@`u recenti di @command{gawk} sarebbe +un interessante esercizio di ingegneria del software. + @item @w{QSE @command{awk}} @cindex QSE @command{awk} @cindex codice sorgente @subentry QSE @command{awk} @@ -48311,7 +48912,7 @@ per poter scaricare il file. @command{gawk} pu@`o essere installato anche su sistemi non-POSIX. I sistemi correntemente supportati sono MS-Windows, usando MSYS, MSYS2, MinGW e Cygwin, -e sia Vax/VMS che OpenVMS. Le istruzioni per ognuno di questi sistemi sono +e OpenVMS. Le istruzioni per ognuno di questi sistemi sono incluse in @ifnotinfo questa @@ -48454,7 +49055,10 @@ ugualmente al deposito usando il comando: git clone http://git.savannah.gnu.org/r/gawk.git @end example -Una volta modificato il sorgente, @`e posibile usare @samp{git diff} per +@noindent +(Utilizzare un URL di tipo @code{https} @`e ritenuto pi@`u sicuro.) + +Una volta modificato il sorgente, @`e possibile usare @samp{git diff} per produrre una @dfn{patch}, e spedirla al manutentore di @command{gawk}; si veda @ref{Bug}, per come farlo. @@ -48852,11 +49456,11 @@ solo scaricare una data versione e provarla? Il manutentore di @command{gawk} desidera che per tutti gli utenti @command{awk} interessati sia possibile limitarsi a clonare il deposito sul -proprio computer, selezionare la variante che lo interessa e costruirla. Senza +proprio computer, selezionare la variante che lo interessa e costruirla, senza doversi preoccupare di avere a disposizione le versioni corrette degli Autotool GNU.@footnote{Ecco un programma GNU che (secondo noi) @`e estremamente difficile da estrarre dal deposito Git e compilare. Per esempio, in un vecchio (ma -ancora funzionante) PowerPC Macintosh, con il sistema operativo Mac Os X 10.5, +ancora funzionante) PowerPC Macintosh, con il sistema operativo macOs 10.5, @`e stato necessario scaricare e compilare una tonnellata di software, incominciando dallo stesso programma Git, per riuscire a lavorare con l'ultima versione del codice. Non @`e un'esperienza piacevole e, specie sui vecchi @@ -49428,10 +50032,10 @@ Si veda la @inlineraw{docbook, <xref linkend="figura-generica-flusso"/>}. @float Figura,figura-generica-flusso @caption{Flusso generico di un programma} @ifclear SMALLPRINT -@center @image{programma-generico, , , Flusso generico di un programma} +@center @image{gawk-programma-generico, , , Flusso generico di un programma} @end ifclear @ifset SMALLPRINT -@center @image{programma-generico, 11cm, , Flusso generico di un programma} +@center @image{gawk-programma-generico, 11cm, , Flusso generico di un programma} @end ifset @end float @end ifnotdocbook @@ -49440,7 +50044,7 @@ Si veda la @inlineraw{docbook, <xref linkend="figura-generica-flusso"/>}. <figure id="figura-generica-flusso" float="0"> <title>Flusso generico di un programma</title> <mediaobject> -<imageobject role="web"><imagedata fileref="programma-generico.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-programma-generico.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -49478,10 +50082,10 @@ come si vede nella @inlineraw{docbook, <xref linkend="figura-flusso-elaborazione @float Figura,figura-flusso-elaborazione @caption{Fasi di un programma generico} @ifclear SMALLPRINT -@center @image{flusso-elaborazione, , , Fasi di un programma generico} +@center @image{gawk-flusso-elaborazione, , , Fasi di un programma generico} @end ifclear @ifset SMALLPRINT -@center @image{flusso-elaborazione, 11cm , , Fasi di un programma generico} +@center @image{gawk-flusso-elaborazione, 11cm , , Fasi di un programma generico} @end ifset @end float @end ifnotdocbook @@ -49490,7 +50094,7 @@ come si vede nella @inlineraw{docbook, <xref linkend="figura-flusso-elaborazione <figura id="figura-flusso-elaborazione" float="0"> <title>Fasi di un programma generico</title> <mediaobject> -<imageobject role="web"><imagedata fileref="flusso-elaborazione.png" format="PNG"/></imageobject> +<imageobject role="web"><imagedata fileref="gawk-flusso-elaborazione.png" format="PNG"/></imageobject> </mediaobject> </figure> @end docbook @@ -51078,7 +51682,7 @@ termini della sezione 6d. @end enumerate Una porzione separabile del codice oggetto, il cui sorgente @`e escluso dal -Sorgente Corrispondente e trattato come Libreria di Sistema, non deve essere +Sorgente Corrispondente e trattato come Libreria di Sistema, non dev'essere obbligatoriamente inclusa nella distribuzione del codice oggetto del programma. @@ -51111,7 +51715,7 @@ distribuzione avviene come parte di una transazione nella quale il diritto di possesso e di uso del Prodotto Utente viene trasferito al destinatario per sempre o per un periodo prefissato (indipendentemente da come la transazione sia caratterizzata), il Sorgente Corrispondente distribuito secondo le -condizioni di questa sezione deve essere accompagnato dalle Informazioni di +condizioni di questa sezione dev'essere accompagnato dalle Informazioni di Installazione. Questa condizione non @`e richiesta se n@`e tu n@`e una terza parte ha la possibilit@`a di installare versioni modificate del codice oggetto sul Prodotto Utente (per esempio, se il programma @`e installato su una ROM) @@ -51627,7 +52231,7 @@ codificata in un formato le cui specifiche sono disponibili pubblicamente, tale che il suo contenuto possa essere modificato in modo semplice con generici editor di testi o (per immagini composte da pixel) con generici editor di immagini o (per i disegni) con qualche editor di disegni -ampiamente diffuso; la copia deve essere adatta al trattamento per la +ampiamente diffuso; la copia dev'essere adatta al trattamento per la formattazione o per la conversione in una variet@`a di formati atti alla successiva formattazione. Una copia fatta in un formato di file, per il resto trasparente, i cui marcatori o assenza di tali sono stati progettati |