aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-04-12 21:54:51 +0300
committerArnold D. Robbins <arnold@skeeve.com>2017-04-12 21:54:51 +0300
commitec0c2d411eac8362f18572b2d8bd8617368b3ca6 (patch)
tree029127e51700679615f7b22935c126b22e38120c
parentcaba861750571c86af1e80731f1a43dc96b47e95 (diff)
downloadegawk-ec0c2d411eac8362f18572b2d8bd8617368b3ca6.tar.gz
egawk-ec0c2d411eac8362f18572b2d8bd8617368b3ca6.tar.bz2
egawk-ec0c2d411eac8362f18572b2d8bd8617368b3ca6.zip
Remove unneeded execute permission on various files.
-rw-r--r--[-rwxr-xr-x]doc/gawkworkflow.texi0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura1.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura1.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura1.pdfbin9120 -> 9120 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura1.pngbin5747 -> 5747 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura1.txt0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura2.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura2.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura2.pdfbin11596 -> 11596 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura2.pngbin5768 -> 5768 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura2.txt0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura3.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura3.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura3.pdfbin11914 -> 11914 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura3.pngbin5734 -> 5734 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/api-figura3.txt0
-rw-r--r--[-rwxr-xr-x]doc/it/epsf.tex0
-rw-r--r--[-rwxr-xr-x]doc/it/flusso-elaborazione.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/flusso-elaborazione.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/flusso-elaborazione.pdfbin9672 -> 9672 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/flusso-elaborazione.pngbin6300 -> 6300 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/flusso-elaborazione.txt0
-rw-r--r--doc/it/gawk-it.texi46902
-rw-r--r--doc/it/gawk.texi46902
-rw-r--r--[-rwxr-xr-x]doc/it/gawktexi.in0
-rw-r--r--[-rwxr-xr-x]doc/it/lflashlight-small.xpic0
-rw-r--r--[-rwxr-xr-x]doc/it/lflashlight.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/lflashlight.pdf0
-rw-r--r--[-rwxr-xr-x]doc/it/margini.texi0
-rw-r--r--[-rwxr-xr-x]doc/it/programma-generico.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/programma-generico.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/programma-generico.pdfbin5313 -> 5313 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/programma-generico.pngbin4151 -> 4151 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/programma-generico.txt0
-rw-r--r--[-rwxr-xr-x]doc/it/rflashlight-small.xpic0
-rw-r--r--[-rwxr-xr-x]doc/it/rflashlight.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/rflashlight.pdf0
-rw-r--r--[-rwxr-xr-x]doc/it/sidebar.awk0
-rw-r--r--[-rwxr-xr-x]doc/it/texinfo.tex0
-rw-r--r--[-rwxr-xr-x]doc/it/txi-it.tex0
-rw-r--r--[-rwxr-xr-x]doc/it/vettore-elementi.eps0
-rw-r--r--[-rwxr-xr-x]doc/it/vettore-elementi.fig0
-rw-r--r--[-rwxr-xr-x]doc/it/vettore-elementi.pdfbin7009 -> 7009 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/vettore-elementi.pngbin1032 -> 1032 bytes
-rw-r--r--[-rwxr-xr-x]doc/it/vettore-elementi.txt0
-rw-r--r--[-rwxr-xr-x]test/arrayind1.awk0
-rw-r--r--[-rwxr-xr-x]test/poundbang.awk0
47 files changed, 0 insertions, 93804 deletions
diff --git a/doc/gawkworkflow.texi b/doc/gawkworkflow.texi
index 1bee193a..1bee193a 100755..100644
--- a/doc/gawkworkflow.texi
+++ b/doc/gawkworkflow.texi
diff --git a/doc/it/api-figura1.eps b/doc/it/api-figura1.eps
index 93560797..93560797 100755..100644
--- a/doc/it/api-figura1.eps
+++ b/doc/it/api-figura1.eps
diff --git a/doc/it/api-figura1.fig b/doc/it/api-figura1.fig
index c2718c71..c2718c71 100755..100644
--- a/doc/it/api-figura1.fig
+++ b/doc/it/api-figura1.fig
diff --git a/doc/it/api-figura1.pdf b/doc/it/api-figura1.pdf
index f31e25a8..f31e25a8 100755..100644
--- a/doc/it/api-figura1.pdf
+++ b/doc/it/api-figura1.pdf
Binary files differ
diff --git a/doc/it/api-figura1.png b/doc/it/api-figura1.png
index 444c2976..444c2976 100755..100644
--- a/doc/it/api-figura1.png
+++ b/doc/it/api-figura1.png
Binary files differ
diff --git a/doc/it/api-figura1.txt b/doc/it/api-figura1.txt
index 630e18f0..630e18f0 100755..100644
--- a/doc/it/api-figura1.txt
+++ b/doc/it/api-figura1.txt
diff --git a/doc/it/api-figura2.eps b/doc/it/api-figura2.eps
index 9920d3b9..9920d3b9 100755..100644
--- a/doc/it/api-figura2.eps
+++ b/doc/it/api-figura2.eps
diff --git a/doc/it/api-figura2.fig b/doc/it/api-figura2.fig
index a8b5c47d..a8b5c47d 100755..100644
--- a/doc/it/api-figura2.fig
+++ b/doc/it/api-figura2.fig
diff --git a/doc/it/api-figura2.pdf b/doc/it/api-figura2.pdf
index cadd4267..cadd4267 100755..100644
--- a/doc/it/api-figura2.pdf
+++ b/doc/it/api-figura2.pdf
Binary files differ
diff --git a/doc/it/api-figura2.png b/doc/it/api-figura2.png
index dbc46910..dbc46910 100755..100644
--- a/doc/it/api-figura2.png
+++ b/doc/it/api-figura2.png
Binary files differ
diff --git a/doc/it/api-figura2.txt b/doc/it/api-figura2.txt
index a030fb5a..a030fb5a 100755..100644
--- a/doc/it/api-figura2.txt
+++ b/doc/it/api-figura2.txt
diff --git a/doc/it/api-figura3.eps b/doc/it/api-figura3.eps
index daa3ba76..daa3ba76 100755..100644
--- a/doc/it/api-figura3.eps
+++ b/doc/it/api-figura3.eps
diff --git a/doc/it/api-figura3.fig b/doc/it/api-figura3.fig
index fae92940..fae92940 100755..100644
--- a/doc/it/api-figura3.fig
+++ b/doc/it/api-figura3.fig
diff --git a/doc/it/api-figura3.pdf b/doc/it/api-figura3.pdf
index 07f406bd..07f406bd 100755..100644
--- a/doc/it/api-figura3.pdf
+++ b/doc/it/api-figura3.pdf
Binary files differ
diff --git a/doc/it/api-figura3.png b/doc/it/api-figura3.png
index 26ca6cd6..26ca6cd6 100755..100644
--- a/doc/it/api-figura3.png
+++ b/doc/it/api-figura3.png
Binary files differ
diff --git a/doc/it/api-figura3.txt b/doc/it/api-figura3.txt
index 02791df5..02791df5 100755..100644
--- a/doc/it/api-figura3.txt
+++ b/doc/it/api-figura3.txt
diff --git a/doc/it/epsf.tex b/doc/it/epsf.tex
index 847de77f..847de77f 100755..100644
--- a/doc/it/epsf.tex
+++ b/doc/it/epsf.tex
diff --git a/doc/it/flusso-elaborazione.eps b/doc/it/flusso-elaborazione.eps
index c9e4c938..c9e4c938 100755..100644
--- a/doc/it/flusso-elaborazione.eps
+++ b/doc/it/flusso-elaborazione.eps
diff --git a/doc/it/flusso-elaborazione.fig b/doc/it/flusso-elaborazione.fig
index 50c9a209..50c9a209 100755..100644
--- a/doc/it/flusso-elaborazione.fig
+++ b/doc/it/flusso-elaborazione.fig
diff --git a/doc/it/flusso-elaborazione.pdf b/doc/it/flusso-elaborazione.pdf
index e7fb8555..e7fb8555 100755..100644
--- a/doc/it/flusso-elaborazione.pdf
+++ b/doc/it/flusso-elaborazione.pdf
Binary files differ
diff --git a/doc/it/flusso-elaborazione.png b/doc/it/flusso-elaborazione.png
index 4dc95902..4dc95902 100755..100644
--- a/doc/it/flusso-elaborazione.png
+++ b/doc/it/flusso-elaborazione.png
Binary files differ
diff --git a/doc/it/flusso-elaborazione.txt b/doc/it/flusso-elaborazione.txt
index 87a5b439..87a5b439 100755..100644
--- a/doc/it/flusso-elaborazione.txt
+++ b/doc/it/flusso-elaborazione.txt
diff --git a/doc/it/gawk-it.texi b/doc/it/gawk-it.texi
deleted file mode 100644
index ea3fd2f8..00000000
--- a/doc/it/gawk-it.texi
+++ /dev/null
@@ -1,46902 +0,0 @@
-% ****************************************************
-% * DO NOT MODIFY THIS FILE!!!! *
-% * It was generated from gawktexi.in by sidebar.awk *
-% * Edit gawktexi.in instead. *
-% ****************************************************
-\language=30
-\input texinfo @c -*-texinfo-*-
-@c vim: filetype=texinfo
-@c %**start of header (This is for running Texinfo on a region.)
-@setfilename gawk-it.info
-@settitle Guida Utente di GNU Awk
-@documentlanguage it
-@c %**end of header (This is for running Texinfo on a region.)
-
-@dircategory Creazione e manipolazione di testi
-@direntry
-* Gawk: (gawk). Un linguaggio per scandire ed elaborare testi.
-@end direntry
-@dircategory Programmi di utilit@`a individuale
-@direntry
-* awk: (gawk)Avviare gawk. Scansione e processo di testi.
-@end direntry
-
-@c Enable better indexing, requires texindex from Texinfo 6 or later.
-@tex
-\global\usebracesinindexestrue
-@end tex
-
-@ifset FOR_PRINT
-@tex
-\gdef\xrefprintnodename#1{``#1''}
-@end tex
-@end ifset
-
-@ifclear FOR_PRINT
-@c With early 2014 texinfo.tex, restore PDF links and colors
-@tex
-\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
-\gdef\urlcolor{0.5 0.09 0.12} % Also
-\global\urefurlonlylinktrue
-@end tex
-@end ifclear
-
-@ifnotdocbook
-@set BULLET @bullet{}
-@set MINUS @minus{}
-@end ifnotdocbook
-
-@ifdocbook
-@set BULLET
-@set MINUS
-@end ifdocbook
-
-@set xref-automatic-section-title
-
-@c The following information should be updated here only!
-@c This sets the edition of the document, the version of gawk it
-@c applies to and all the info about who's publishing this edition
-
-@c These apply across the board.
-@c Aggiornata alla versione del 3 marzo 2017
-@set UPDATE-MONTH gennaio 2017
-@set VERSION 4.1
-@set PATCHLEVEL 4
-
-@c added Italian hyphenation stuff
-@hyphenation{ven-go-no o-met-te-re o-met-ten-do}
-
-@set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
-@ifset FOR_PRINT
-@set TITLE Programmare efficacemente in awk
-@end ifset
-@ifclear FOR_PRINT
-@set TITLE GAWK: Programmare efficacemente in AWK
-@end ifclear
-@set SUBTITLE Una Guida Utente per GNU Awk
-@set EDITION 4.1
-
-@iftex
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@ifclear SMALLPRINT
-@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
-@end ifclear
-@ifset SMALLPRINT
-@set DARKCORNER @inmargin{@image{lflashlight,0.7cm}, @image{rflashlight,0.7cm}}
-@end ifset
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end iftex
-@ifinfo
-@set DOCUMENT File Info
-@set CHAPTER nodo principale
-@set APPENDIX nodo principale
-@set SECTION nodo secondario
-@set SECTIONS nodi secondari
-@set SUBSECTION nodo
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE videata
-@end ifinfo
-@ifhtml
-@set DOCUMENT Documento
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE videata
-@end ifhtml
-@ifdocbook
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifdocbook
-@ifxml
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifxml
-@ifplaintext
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifplaintext
-
-@ifdocbook
-@c empty on purpose
-@set PART1
-@set PART2
-@set PART3
-@set PART4
-@end ifdocbook
-
-@ifnotdocbook
-@set PART1 Parte I:@*
-@set PART2 Parte II:@*
-@set PART3 Parte III:@*
-@set PART4 Parte IV:@*
-@end ifnotdocbook
-
-@c some special symbols
-@iftex
-@set LEQ @math{@leq}
-@set PI @math{@pi}
-@end iftex
-@ifdocbook
-@set LEQ @inlineraw{docbook, &le;}
-@set PI @inlineraw{docbook, &pgr;}
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@set LEQ <=
-@set PI @i{pi}
-@end ifnotdocbook
-@end ifnottex
-
-@ifnottex
-@ifnotdocbook
-@macro ii{text}
-@i{\text\}
-@end macro
-@end ifnotdocbook
-@end ifnottex
-
-@ifdocbook
-@macro ii{text}
-@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
-@end macro
-@end ifdocbook
-
-@ifclear FOR_PRINT
-@set FN nome-file
-@set FFN Nome-file
-@c for Italian plurals {FN}s
-@set FNS nomi-file
-@set FFNS Nomi-file
-@set DF file-dati
-@set DDF File-dati
-@set PVERSION versione
-@end ifclear
-@ifset FOR_PRINT
-@set FN nome-file
-@set FFN Nome-File
-@c for Italian plurals {FN}s
-@set FNS nomi-file
-@set FFNS Nomi-file
-@set DF file-dati
-@set DDF File-dati
-@set PVERSION Versione
-@end ifset
-
-@c For HTML, spell out email addresses, to avoid problems with
-@c address harvesters for spammers.
-@ifhtml
-@macro EMAIL{real,spelled}
-``\spelled\''
-@end macro
-@end ifhtml
-@ifnothtml
-@macro EMAIL{real,spelled}
-@email{\real\}
-@end macro
-@end ifnothtml
-
-@c Indexing macros
-@ifinfo
-
-@macro cindexawkfunc{name}
-@cindex @code{\name\}
-@end macro
-
-@macro cindexgawkfunc{name}
-@cindex @code{\name\}
-@end macro
-
-@end ifinfo
-
-@ifnotinfo
-
-@macro cindexawkfunc{name}
-@cindex @code{\name\()}, funzione
-@end macro
-
-@macro cindexgawkfunc{name}
-@cindex @code{\name\()}, funzione (@command{gawk})
-@end macro
-@end ifnotinfo
-
-@ignore
-Some comments on the layout for TeX.
-1. Use at least texinfo.tex 2016-02-05.07.
-@end ignore
-
-@c merge the function and variable indexes into the concept index
-@ifinfo
-@synindex fn cp
-@synindex vr cp
-@end ifinfo
-@iftex
-@syncodeindex fn cp
-@syncodeindex vr cp
-@end iftex
-@ifxml
-@syncodeindex fn cp
-@syncodeindex vr cp
-@end ifxml
-@ifdocbook
-@synindex fn cp
-@synindex vr cp
-@end ifdocbook
-
-@c If "finalout" is commented out, the printed output will show
-@c black boxes that mark lines that are too long. Thus, it is
-@c unwise to comment it out when running a master in case there are
-@c overfulls which are deemed okay.
-
-@iftex
-@finalout
-@end iftex
-
-@copying
-@docbook
-<para>
-&ldquo;To boldly go where no man has gone before&rdquo;
-(&ldquo;Per arrivare l@`a dove nessun uomo @`e mai giunto prima&rdquo;)
-@`e un Marchio Registrato della Paramount Pictures Corporation.</para>
-
-<para>Titolo originale:</para>
-@b{Gawk: Effective AWK Programming}@*
-@i{A User's Guide for GNU Awk}
-
-<para>Published by:</para>
-<literallayout class="normal">Free Software Foundation
-51 Franklin Street, Fifth Floor -- Boston, MA 02110-1301 USA
-Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email>
-URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink></literallayout>
-
-<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2017
-Free Software Foundation, Inc.
-All Rights Reserved.
-</literallayout>
-
-</para>Traduzione e revisione:<para>
-<literallayout class="normal">
-Antonio Giovanni Colombo -- <email>azc100(chiocciola)gmail(punto)com</email>
-Marco Curreli -- <email>marcocurreli(chiocciola)tiscali(punto)it</email>
-(Italian Linux Documentation Project (<ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink>)
-</literallayout>
-
-<para>Pubblicato da:</para>
-<literallayout class="normal">Free Software Foundation
-Email: <email>gnu@@gnu.org</email>
-URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink>
-
-e da:
-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 &copy; 2016
-Free Software Foundation, Inc.
-All Rights Reserved.
-</literallayout>
-@end docbook
-
-@ifnotdocbook
-@iftex
-Copyright @copyright{} 2017 -- Free Software Foundation, Inc.
-@end iftex
-@end ifnotdocbook
-@sp 2
-Questa @`e l'Edizione @value{EDITION} di @cite{@value{TITLE}: @value{SUBTITLE}},
-per la versione @value{VERSION}.@value{PATCHLEVEL} (o successiva)
-dell'implementazione GNU di AWK.
-@ifnottex
-@ifnotxml
-@ifnotdocbook
-(Titolo originale: @i{Gawk: Effective AWK Programming: A User's Guide for GNU Awk.)}
-@end ifnotdocbook
-@end ifnotxml
-@end ifnottex
-
-@`E garantito il permesso di copiare, distribuire e/o modificare questo
-documento seguendo i termini della Licenza per Documentazione Libera
-GNU, Versione 1.3 o ogni versione successiva pubblicata dalla Free
-Software Foundation; con le Sezioni Non Modificabili ``GNU General
-Public License'', con i testi di copertina ``Un Manuale GNU'', e con i
-testi di quarta di copertina come in (a) pi@`u avanti.
-@ifclear FOR_PRINT
-Una copia della licenza @`e acclusa nella sezione intitolata
-"Licenza per Documentazione Libera GNU".
-@end ifclear
-@ifset FOR_PRINT
-Una copia della licenza
-si pu@`o trovare in internet all'indirizzo
-@uref{http://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
-il sito web del Progetto GNU}.
-@end ifset
-
-@enumerate a
-@item
-Il testo di quarta di copertina della FSF @`e: ``@`E garantito il permesso di
-copiare e modificare questo manuale GNU.''
-@end enumerate
-@end copying
-
-@c Comment out the "smallbook" for technical review. Saves
-@c considerable paper. Remember to turn it back on *before*
-@c starting the page-breaking work.
-
-@c 4/2002: Karl Berry recommends commenting out this and the
-@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
-@c if they want to waste paper.
-@c @smallbook
-
-
-@c Uncomment this for the release. Leaving it off saves paper
-@c during editing and review.
-@setchapternewpage odd
-
-@shorttitlepage GNU Awk
-@titlepage
-@title @value{TITLE}
-@subtitle @value{SUBTITLE}
-@subtitle Edizione @value{EDITION}
-@subtitle @value{UPDATE-MONTH}
-@author Arnold D. Robbins
-
-@ifnotdocbook
-@c Include the Distribution inside the titlepage environment so
-@c that headings are turned off. Headings on and off do not work.
-
-@page
-@vskip 0pt plus 1filll
-``To boldly go where no man has gone before''
-(``Per arrivare l@`a dove nessun uomo @`e mai giunto prima'')
-@`e un Marchio Registrato della Paramount Pictures Corporation. @*
-@c sorry, i couldn't resist
-@sp 1
-Titolo originale:@*
-@b{Gawk: Effective AWK Programming}@*
-@i{A User's Guide for GNU Awk}
-@sp 0
-Published by @strong{Free Software Foundation}@*
-51 Franklin Street, Fifth Floor -- Boston, MA 02110-1301 USA @*
-Tel.: +1-617-542-5942 -- Fax: +1-617-542-2652 -- Email: @email{gnu@@gnu.org} @*
-URL: @uref{http://www.gnu.org/}
-@sp 0
-@c This one is correct for gawk 3.1.0 from the FSF
-ISBN 1-882114-28-0
-@sp 0
-Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
-Free Software Foundation, Inc.
-@sp 1
-Traduzione e revisione:@*
-Antonio Giovanni Colombo -- @email{azc100(chiocciola)gmail(punto)com}@*
-Marco Curreli -- @email{marcocurreli(chiocciola)tiscali(punto)it}@*
-(Italian Linux Documentation Project -- @uref{http://www.pluto.it/ildp})
-@sp 1
-Pubblicato da:
-Free Software Foundation@*
-Email: @email{gnu@@gnu.org}; URL: @uref{http://www.gnu.org/}
-
-e da:
-Italian Linux Documentation Project (ILDP)@*
-Email: @email{ildp@@pluto.it}; URL: @uref{http://www.pluto.it/ildp}
-
-@insertcopying
-@sp 1
-@end ifnotdocbook
-@end titlepage
-
-@c Thanks to Bob Chassell for directions on doing dedications.
-@iftex
-@headings off
-@page
-@w{ }
-@sp 9
-
-@ifclear SMALLPRINT
-@center @i{Ai miei genitori, per il loro amore, e per lo splendido esempio che mi hanno dato.}
-@sp 1
-@center @i{A mia moglie, Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme a me.}
-@sp 1
-@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka, per aver arricchito le nostre vite in misura incalcolabile.}
-@end ifclear
-
-@ifset SMALLPRINT
-@center @i{Ai miei genitori, per il loro amore,}
-@center @i{ e per lo splendido esempio che mi hanno dato.}
-@sp 1
-@center @i{A mia moglie, Miriam, per avermi reso completo.} @*
-@center @i{ Grazie per aver costruito la tua vita insieme a me.}
-@sp 1
-@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka,}
-@center @i{per aver arricchito le nostre vite in misura incalcolabile.}
-@end ifset
-
-@sp 1
-@w{ }
-@page
-@w{ }
-@page
-@headings on
-@end iftex
-
-@docbook
-<dedication>
-<para>Ai miei genitori, per il loro amore, e per lo splendido
-esempio che mi hanno dato.</para>
-<para>A mia moglie Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme con me.</para>
-<para>Ai nostri figli Chana, Rivka, Nachum e Malka,
-per aver arricchito le nostre vite in misura incalcolabile.</para>
-</dedication>
-@end docbook
-
-@iftex
-@headings off
-@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
-@oddheading @| @| @strong{@thischapter}@ @ @ @thispage
-@end iftex
-
-@ifnottex
-@ifnotxml
-@ifnotdocbook
-@node Top
-@top Introduzione Generale
-@c Preface node should come right after the Top
-@c node, in `unnumbered' sections, then the chapter, `What is gawk'.
-@c Licensing nodes are appendices, they're not central to AWK.
-
-Questo file documenta @command{awk}, un programma che si pu@`o usare per
-selezionare dei record determinati in un file ed eseguire azioni su di essi.
-
-@noindent
-Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
-Free Software Foundation, Inc.
-
-@noindent
-Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, Inc.
-
-
-@insertcopying
-
-@end ifnotdocbook
-@end ifnotxml
-@end ifnottex
-
-@menu
-* Introduzione3:: Alcune parole gentili riguardo a questo
- @value{DOCUMENT}.
-* Introduzione4:: Ulteriori parole gentili.
-* Prefazione:: Di cosa tratta questo @value{DOCUMENT};
- breve storia e ringraziamenti.
-* Per iniziare:: Un'introduzione elementare all'uso di
- @command{awk}. Come eseguire un programma
- @command{awk}. Sintassi della riga di
- comando.
-* Invocare Gawk:: Come eseguire @command{gawk}.
-* Espressioni regolari:: Tutto quel che c'@`e da sapere
- sull'individuazione di stringhe tramite
- espressioni regolari.
-* Leggere file:: Come leggere file e manipolare campi.
-* Stampare:: Come stampare usando @command{awk}.
- Descrizione delle istruzioni @code{print} e
- @code{printf}. @`E descritta inoltre la
- ridirezione dell'output.
-* Espressioni:: Le espressioni sono i componenti elementari
- delle istruzioni.
-* Criteri di ricerca e azioni:: Panoramica sui criteri di ricerca e sulle
- azioni.
-* Vettori:: La descrizione e l'uso dei vettori. Sono
- inoltre descritte le istruzioni di controllo
- relative ai vettori.
-* Funzioni:: Funzioni predefinite e definite dall'utente.
-* Funzioni di libreria:: Una libreria di funzioni di @command{awk}.
-* Programmi di esempio:: Molti programmi @command{awk} con
- spiegazioni dettagliate.
-* Funzionalit@`a avanzate:: Roba per utenti sofisticati, propria di
- @command{gawk}.
-* Internazionalizzazione:: Come far s@`{@dotless{i}} che @command{gawk} parli la
- vostra lingua.
-* Debugger:: Il debugger di @command{gawk}.
-* Calcolo con precisione arbitraria:: Calcolo con precisione arbitraria in
- @command{gawk}.
-* Estensioni dinamiche:: Aggiungere nuove funzioni predefinite di
- @command{gawk}.
-* Storia del linguaggio:: L'evoluzione del linguaggio @command{awk}.
-* Installazione:: Installare @command{gawk} in vari sistemi
- operativi.
-* Note:: Note riguardo ad aggiunte a @command{gawk}
- e possibili futuri sviluppi.
-* Concetti fondamentali:: Velocissima introduzione alla
- programmazione.
-* Glossario:: Spiegazione di alcuni termini poco
- familiari.
-* Copia:: Il vostro diritto a copiare e distribuire
- @command{gawk}.
-* Licenza per Documentazione Libera GNU (FDL):: La licenza per questo
- @value{DOCUMENT}.
-* Indice analitico:: Indice dei concetti e delle variabili.
-
-@detailmenu
-* Storia:: La storia di @command{gawk} e
- @command{awk}.
-* Nomi:: Che nome usare per trovare
- @command{awk}.
-* Questo manuale:: Uso di questo @value{DOCUMENT}.
- Comprende esempi di file in input
- utilizzabili.
-* Convenzioni:: Convenzioni tipografiche.
-* Storia del manuale:: Breve storia del progetto GNU e di
- questo @value{DOCUMENT}.
-* Come contribuire:: Un aiuto per la salvezza del mondo.
-* Ringraziamenti:: Ringraziamenti.
-* Eseguire gawk:: Come eseguire programmi
- @command{gawk}; comprende la sintassi
- della riga di comando.
-* Monouso:: Eseguire un breve programma
- @command{awk} di tipo usa-e-getta.
-* Leggere dal terminale:: Senza uso di file in input (input
- immesso da tastiera).
-* Lunghi:: Mettere programmi @command{awk}
- permanenti in file.
-* @dfn{Script} eseguibili:: Preparare programmi @command{awk}
- da eseguire come @dfn{script}.
-* Commenti:: Aggiungere documentazione a programmi
- @command{gawk}.
-* Protezione:: Ulteriore discussione di problemi
- connessi alle protezioni nella shell.
-* Doppi apici in DOS:: Doppi apici in file .BAT Windows
-* File dati di esempio:: File di dati di esempio da usare nei
- programmi @command{awk} illustrati in
- questo @value{DOCUMENT}.
-* Molto semplice:: Un esempio molto semplice.
-* Due regole:: Un esempio meno semplice di programma
- di una riga, che usa due regole.
-* Maggiore sofisticazione:: Un esempio pi@`u complesso.
-* Istruzioni/Righe:: Suddividere o riunire istruzioni
- su [una o pi@`u] righe.
-* Altre funzionalit@`a:: Altre funzionalit@`a di @command{awk}.
-* Quando:: Quando usare @command{gawk} e quando
- usare altre cose.
-* Sommario dell'introduzione:: Sommario dell'introduzione.
-* Riga di comando:: Come eseguire @command{awk}.
-* Opzioni:: Opzioni sulla riga di comando e loro
- significato.
-* Altri argomenti:: Nomi dei file in input e assegnamento
- di valori a variabili.
-* Specificare lo standard input:: Come specificare lo standard input
- insieme ad altri file.
-* Variabili d'ambiente:: Le variabili d'ambiente usate da
- @command{gawk}.
-* AWKPATH (Variabile):: Ricerca di programmi @command{awk}
- in una lista di directory.
-* AWKLIBPATH (Variabile):: Ricerca di librerie condivise
- @command{awk} in una lista di
- directory.
-* Altre variabili d'ambiente:: Le variabili d'ambiente.
-* Codice di ritorno:: Il codice di ritorno all'uscita
- da @command{gawk}.
-* Includere file:: Come includere altri file nel
- proprio programma.
-* Caricare librerie condivise:: Caricare librerie condivise nel
- proprio programma.
-* Parti obsolete:: Opzioni e/o funzionalit@`a obsolete.
-* Non documentato:: Opzioni e funzionalit@`a non documentate.
-* Sommario invocazione:: Sommario di come eseguire
- @command{awk}.
-* Uso di @dfn{regexp}:: Come usare le espressioni regolari.
-* Sequenze di protezione:: Come scrivere caratteri non stampabili.
-* Operatori di espressioni regolari:: Operatori di espressioni regolari.
-* Espressioni tra parentesi quadre:: Cosa possono contenere @samp{[...]}.
-* Pi@`u lungo da sinistra:: Quanto @`e lungo il testo individuato.
-* Espressioni regolari calcolate:: Usare @dfn{regexp} dinamiche.
-* Operatori di @dfn{regexp} GNU:: Operatori propri del software GNU.
-* Maiuscolo-Minuscolo:: Fare confronti ignorando
- maiuscolo/minuscolo.
-* Sommario espressioni regolari:: Sommario delle espressioni regolari.
-* Record:: Controllare come i dati sono suddivisi
- in record.
-* awk divisione record:: Divisione dei record con @command{awk}
- standard.
-* gawk divisione record:: Divisione dei record con @command{gawk}.
-* Campi:: Un'introduzione ai campi.
-* Campi non costanti:: Numeri di campo variabili.
-* Cambiare i campi:: Cambiare il contenuto di un campo.
-* Separatori di campo:: I separatori di campo, e come
- cambiarli.
-* Separatori di campo di default:: Come di solito sono separati i campi.
-* Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori.
-* Campi di un solo carattere:: Fare di ogni carattere un campo
- separato.
-* Separatori campo da riga di comando:: Impostare @code{FS} dalla riga di
- comando.
-* Campo intera riga:: Fare di una riga intera un campo
- solo.
-* Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
- sommario.
-* Dimensione costante:: Leggere campi di larghezza costante.
-* Separazione in base al contenuto:: Definire campi dal loro Contenuto.
-* Righe multiple:: Record su righe multiple
-* Getline:: Richiedere input usando @code{getline}.
-* Getline semplice:: Usare @code{getline} senza argomenti.
-* Getline variabile:: Usare @code{getline} in una variabile.
-* Getline file:: Usare @code{getline} da un file.
-* Getline variabile file:: Usare @code{getline} in una variabile
- da un file.
-* Getline @dfn{pipe}:: Usare @code{getline} da una @dfn{pipe}.
-* Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile
- da una @dfn{pipe}.
-* Getline coprocesso:: Usare @code{getline} da un coprocesso.
-* Getline variabile coprocesso:: Usare @code{getline} in una variabile
- da un coprocesso.
-* Note su getline:: Cose importanti da sapere su
- @code{getline}.
-* Sommario di getline:: Sommario delle varianti di
- @code{getline}.
-* Timeout in lettura:: Leggere input entro un tempo limite.
-* Proseguire dopo errore in input:: Rielaborare input dopo certi errori.
-* Directory su riga di comando:: Cosa accade se si mette una directory
- sulla riga di comando.
-* Sommario di Input:: Sommario di Input.
-* Esercizi su Input:: Esercizi.
-* Print:: L'istruzione @code{print}.
-* Esempi su print:: Semplici esempi di
- istruzioni @code{print}.
-* Separatori di output:: I separatori di output e come
- modificarli.
-* OFMT:: Controllare l'output di numeri con
- @code{print}.
-* Printf:: L'istruzione @code{printf}.
-* Printf Fondamenti:: Sintassi dell'istruzione
- @code{printf}.
-* Lettere di controllo:: Lettere di controllo del formato.
-* Modificatori di formato:: Modificatori specifiche di formato.
-* Esempi su printf:: Numerosi esempi.
-* Ridirezione:: Come ridirigere l'output a diversi
- file e @dfn{pipe}.
-* FD speciali:: File speciali per I/O.
-* File speciali:: Interpretazione @value{FNS} in
- @command{gawk}. @command{gawk}
- permette di accedere a descrittori di
- file ereditati.
-* Altri file ereditati:: Accedere ad altri file aperti con
- @command{gawk}.
-* Reti speciali:: File speciali per comunicazioni con
- la rete.
-* Avvertimenti speciali:: Cose a cui prestare attenzione.
-* Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e
- @dfn{pipe}.
-* Continuazione dopo errori:: Abilitare continuazione dopo errori
- in output.
-* Sommario di Output:: Sommario di Output.
-* Esercizi su Output:: Esercizi.
-* Valori:: Costanti, variabili ed espressioni
- regolari.
-* Costanti:: Costanti di tipo stringa, numeriche ed
- espressioni regolari.
-* Costanti scalari:: Costanti numeriche e stringhe.
-* Numeri non-decimali:: Cosa sono i numeri ottali ed
- esadecimali.
-* Costanti come espressioni regolari:: Costanti fornite tramite espressioni
- regolari.
-* Usare le costanti @dfn{regexp}:: Quando e come usare una costante
- specificata tramite espressioni
- regolari
-* Costanti @dfn{regexp} normali:: Costanti @dfn{regexp} normali in
- @command{awk}.
-* Costanti @dfn{regexp} forti:: Costanti @dfn{regexp} fortemente
- tipizzate.
-* Variabili:: Le variabili permettono di
- definire valori da usare in seguito.
-* Usare variabili:: Usare variabili nei propri programmi.
-* Opzioni di assegnamento:: Impostare variabili dalla riga di
- comando, e un sommario della sintassi
- della riga di comando.
- Questo @`e un metodo di input avanzato.
-* Conversione:: La conversione di stringhe in numeri
- e viceversa.
-* Stringhe e numeri:: Come @command{awk} converte tra
- stringhe e numeri.
-* Localizzazione e conversioni:: Come la localizzazione pu@`o influire
- sulle conversioni.
-* Tutti gli operatori:: Gli operatori di @command{gawk}.
-* Operatori aritmetici:: Operazioni aritmetiche (@samp{+},
- @samp{-}, etc.)
-* Concatenazione:: Concatenazione di stringhe.
-* Operatori di assegnamento:: Cambiare il valore di una variabile
- o di un campo.
-* Operatori di incremento:: Incrementare il valore numerico di una
- variabile.
-* Valori e condizioni di verit@`a:: Determinare Vero/Falso.
-* Valori di verit@`a:: Cosa @`e ``vero'' e cosa @`e ``falso''.
-* Tipi di variabile e confronti:: Come alle variabili si assegna il tipo
- e l'effetto che questo ha sul confronto
- di numeri e stringhe con @samp{<}, etc.
-* Tipi di variabile:: Tipo stringa rispetto a tipo numero.
-* Operatori di confronto:: Gli operatori di confronto.
-* Confronto POSIX di stringhe:: Confronto tra stringhe usando le
- regole POSIX.
-* Operatori booleani:: Combinare espressioni di confronto
- usando operatori booleani @samp{||}
- (``or''), @samp{&&} (``and'') e
- @samp{!} (``not'').
-* Espressioni condizionali:: Le espressioni condizionali scelgono
- una tra due sottoespressioni, a
- seconda del valore di una terza
- sottoespressione.
-* Chiamate di funzione:: Una chiamata di funzione @`e
- un'espressione.
-* Precedenza:: Come si nidificano i vari operatori.
-* Localizzazioni:: Come la localizzazione influenza la
- gestione dati.
-* Sommario delle espressioni:: Sommario delle espressioni.
-* Panoramica sui criteri di ricerca:: Come scrivere un criterio di ricerca.
-* @dfn{regexp} come criteri di ricerca:: Espressioni regolari come criteri
- di ricerca.
-* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
- criterio di ricerca.
-* Intervalli:: Specificare intervalli di record con i
- criteri di ricerca.
-* BEGIN/END:: Specificare regole di inizio e fine
- programma.
-* Usare BEGIN/END:: Come e perch@'e usare regole BEGIN/END.
-* I/O e BEGIN/END:: Problemi di I/O nelle regole BEGIN/END.
-* BEGINFILE/ENDFILE:: Due condizioni speciali per controlli
- avanzati.
-* Vuoto:: Il criterio di ricerca vuoto, che
- corrisponde a ogni record.
-* Usare variabili di shell:: Come usare variabili di shell in
- @command{awk}.
-* Panoramica sulle azioni:: Cosa costituisce un'azione.
-* Istruzioni:: Descrizione dettagliata delle varie
- istruzioni di controllo.
-* Istruzione if:: Eseguire in maniera condizionale
- istruzioni @command{awk}.
-* Istruzione while:: Eseguire il ciclo, finch@'e @`e
- verificata una condizione.
-* Istruzione do:: Eseguire l'azione specificata, continuare
- a eseguire il ciclo
- finch@'e @`e verificata una condizione.
-* Istruzione for:: Un'altra istruzione iterativa, che
- permette di specificare clausole
- iniziali e di incremento.
-* Istruzione switch:: Valutazione di quale insieme di
- istruzioni eseguire, a seconda del
- valore assunto da una variabile.
-* Istruzione break:: Uscire subito dal ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione continue:: Andare alla fine del ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione next:: Smettere di elaborare il record
- corrente.
-* Istruzione nextfile:: Smettere di elaborare il file
- corrente.
-* Istruzione exit:: Interrompere l'esecuzione di @command{awk}.
-* Variabili predefinite:: Sommario delle variabili predefinite.
-* Variabili modificabili dall'utente:: Variabili predefinite modificabili per
- controllare @command{awk}.
-* Variabili auto-assegnate:: Variabili predefinite con cui
- @command{awk} fornisce informazioni.
-* ARGC e ARGV:: Modi di usare @code{ARGC} e
- @code{ARGV}.
-* Sommario criteri e azioni:: Sommario criteri e azioni.
-* Fondamenti sui vettori:: Informazioni di base sui vettori.
-* Introduzione ai vettori:: Introduzione ai vettori.
-* Visitare elementi:: Come esaminare un elemento di un
- vettore.
-* Impostare elementi:: Come cambiare un elemento di un
- vettore.
-* Esempio di vettore:: Esempio semplice di vettore
-* Visitare un intero vettore:: Variazione dell'istruzione
- @code{for}. Cicla attraverso gli
- indici degli elementi contenuti in
- un vettore.
-* Controllare visita:: Controllare l'ordine in cui i vettori
- sono visitati.
-* Indici numerici di vettore:: Come usare numeri come indici in
- @command{awk}.
-* Indici non inizializzati:: Usare variabili non inizializzate
- come indici.
-* Cancellazione:: L'istruzione @code{delete} toglie un
- elemento da un vettore.
-* Vettori multidimensionali:: Emulare vettori multidimensionali in
- @command{awk}.
-* Visitare vettori multidimensionali:: Visitare vettori multidimensionali.
-* Vettori di vettori:: Vettori multidimensionali veri.
-* Sommario dei vettori:: Sommario dei vettori.
-* Funzioni predefinite:: Riepilogo delle funzioni predefinite.
-* Chiamare funzioni predefinite:: Come chiamare funzioni predefinite.
-* Funzioni numeriche:: Funzioni che trattano numeri, comprese
- @code{int()}, @code{sin()}
- e @code{rand()}.
-* Funzioni per stringhe:: Funzioni di manipolazione di stringhe,
- come @code{split()}, @code{match()}
- e @code{sprintf()}.
-* Dettagli ostici:: Pi@`u di quel che si vorrebbe sapere su
- @samp{\} e @samp{&} con @code{sub()},
- @code{gsub()}, e @code{gensub()}.
-* Funzioni di I/O:: Funzioni per i file e per i comandi
- della shell.
-* Funzioni di tempo:: Funzione per gestire marcature temporali.
-* Funzioni a livello di bit:: Funzioni per operazioni di
- manipolazione bit.
-* Funzioni per i tipi:: Funzioni per conoscere il tipo
- di una variabile.
-* Funzioni di internazionalizzazione:: Funzioni per tradurre stringhe.
-* Funzioni definite dall'utente:: Descrizione dettagliata delle funzioni
- definite dall'utente.
-* Sintassi delle definizioni:: Come scrivere definizioni e cosa
- significano.
-* Esempio di funzione:: Un esempio di definizione di
- funzione e spiegazione della stessa.
-* Precisazioni sulle funzioni:: Cose a cui prestare attenzione.
-* Chiamare una funzione:: Non usare spazi.
-* Campo di validit@`a variabili:: Variabili locali e globali.
-* Parametri per valore/riferimento:: Passaggio parametri.
-* Istruzione return:: Specificare il valore che una
- funzione restituisce.
-* Variabili di tipo dinamico:: Come cambiare tipo a una variabile in
- fase di esecuzione del programma.
-* Chiamate indirette:: Scegliere la funzione da chiamare in
- fase di esecuzione del programma.
-* Sommario delle funzioni:: Sommario delle funzioni.
-* Nomi di variabili di libreria:: Che nomi @`e meglio dare alle variabili
- private globali nelle funzioni di
- libreria
-* Funzioni di tipo generale:: Funzioni di uso generale.
-* Funzione strtonum:: Da usare se non @`e disponibile la
- funzione predefinita
- @code{strtonum()}.
-* Funzione assert:: Una funzione per controllare
- affermazioni in programmi
- @command{awk}.
-* Funzione round:: Una funzione per eseguire
- arrotondamenti se @code{sprintf()}
- non lo fa correttamente.
-* Funzione random Cliff:: Il generatore Cliff di numeri casuali.
-* Funzioni ordinali:: Funzioni per usare caratteri come
- numeri e viceversa.
-* Funzione join:: Una funzione per raccogliere un
- vettore in una stringa.
-* Funzione getlocaltime:: Una funzione per ottenere data e
- ora nel formato desiderato.
-* Funzione readfile:: Una funzione per leggere un file
- intero in un colpo solo.
-* Apici alla shell:: Una funzione per passare stringhe
- con apici alla shell.
-* Gestione File Dati:: Funzioni for gestire file dati
- specificati sulla riga di comando,
-* Funzione filetrans:: Una funzione per gestire il passaggio
- da un file in input al successivo.
-* Funzione rewind:: Una funzione per rileggere il file
- di input.
-* Controllo di file:: Controllare che i file in input siano
- accessibili.
-* File vuoti:: Controllare se i file in input sono
- vuoti.
-* Ignorare assegnamenti di variabili:: Trattare assegnamenti di variabili
- come nomi di file.
-* Funzione getopt:: Una funzione per trattare argomenti
- presenti sulla riga di comando.
-* Funzioni Passwd:: Funzioni per ottenete informazioni
- sull'utente [da /etc/passwd].
-* Funzioni Group:: Funzioni per ottenete informazioni
- sul gruppo [da /etc/group].
-* Visitare vettori:: Una funzione per visitare vettori
- di vettori.
-* Sommario funzioni di libreria:: Sommario funzioni di libreria.
-* Esercizi con le librerie:: Esercizi.
-* Eseguire esempi:: Come eseguire i programmi di esempio.
-* Cloni:: Cloni di programmi di utilit@`a comuni.
-* Programma cut:: Il programma di utilit@`a @command{cut}.
-* Programma egrep:: Il programma di utilit@`a @command{egrep}.
-* Programma id:: Il programma di utilit@`a @command{id}.
-* Programma split:: Il programma di utilit@`a @command{split}.
-* Programma tee:: Il programma di utilit@`a @command{tee}.
-* Programma uniq:: Il programma di utilit@`a @command{uniq}.
-* Programma wc:: Il programma di utilit@`a @command{wc}.
-* Programmi vari:: Alcuni interessanti programmi in
- @command{awk}
-* Programma dupword:: Trovare parole duplicate in un
- documento.
-* Programma alarm:: Un programma di sveglia.
-* Programma translate:: Un programma simile al comando di
- utilit@`a @command{tr}.
-* Programma labels:: Stampare etichette per lettere.
-* Programma utilizzo parole:: Un programma per produrre un contatore
- dell'utilizzo di parole in un testo.
-* Programma riordino diario:: Eliminare righe doppie da un file di
- cronologia.
-* Programma extract:: Estrarre programmi da file sorgenti
- Texinfo.
-* Programma sed semplice:: Un semplice editor di flusso.
-* Programma igawk:: Un programma per fornire ad
- @command{awk} la possibilit@`a di
- includere file.
-* Programma anagram:: Trovare anagrammi da una lista di
- parole.
-* Programma signature:: La gente fa cose stupefacenti se ha
- troppo tempo libero.
-* Sommario dei programmi:: Sommario dei programmi.
-* Esercizi sui programmi:: Esercizi.
-* Dati non decimali:: Consentire dati di input in base
- diversa da 10.
-* Ordinamento di vettori:: Modi per controllare la visita di un
- vettore e il suo ordinamento.
-* Controllare visita vettori:: Come usare PROCINFO["sorted_in"].
-* Funzioni di ordinamento di vettori:: Come usare @code{asort()} e
- @code{asorti()}.
-* I/O bidirezionale:: Comunicazione nei due sensi con un
- altro processo.
-* Reti TCP/IP:: Usare @command{gawk} per
- programmazione di rete.
-* Profilare:: Profilare i propri programmi
- @command{awk}.
-* Sommario funzionalit@`a avanzate:: Sommario funzionalit@`a avanzate.
-* I18N e L10N:: Internazionalizzazione e localiz.
-* Utilizzare @command{gettext}:: Come funziona GNU @code{gettext}.
-* I18N per programmatore:: Funzionalit@`a per il programmatore.
-* I18N per traduttore:: Funzionalit@`a per il traduttore.
-* Estrazione di stringhe:: Estrarre stringhe marcate.
-* Ordinamento di printf:: Riordinare argomenti @code{printf}
- [nelle stringhe da tradurre].
-* Portabilit@`a nell'I18N:: Problemi di portabilit@`a a livello di
- @command{awk}.
-* Esempio I18N:: Un semplice esempio di
- internazionalizzazione.
-* Gawk internazionalizzato:: @command{gawk} stesso @`e
- internazionalizzato.
-* Sommario I18N:: Sommario sull'internazionalizzazione.
-* Debugging:: Introduzione al debugger di
- @command{gawk}.
-* Nozioni sul debug:: Generalit@`a sul debug.
-* Terminologia nel debug:: Concetti fondamentali sul debug.
-* Debug di Awk:: Il debug di @command{awk}.
-* Esempio di sessione di debug:: Esempio di sessione di debug di
- @command{gawk}.
-* Invocazione del debugger:: Come avviare il debugger.
-* Trovare il bug:: Trovare il bug.
-* Lista dei comandi di debug:: I principali comandi di debug.
-* Controllo dei breakpoint:: Controllo dei punti d'interruzione.
-* Controllo esecuzione debugger:: Controllo di esecuzione.
-* Vedere e modificare dati:: Vedere e modificare dati.
-* Stack di esecuzione:: Lavorare con lo stack.
-* Informazioni sul debugger:: Ottenere informazioni sullo stato
- del programma e del debugger.
-* Comandi vari del debugger:: Comandi vari del debugger.
-* Supporto per Readline:: Supporto per Readline.
-* Limitazioni:: Limitazioni.
-* Sommario sul debug:: Sommario sul debug.
-* Aritmetica del computer:: Una rapida introduzione alla matematica del
- computer.
-* Definizioni matematiche:: Altre cose da sapere.
-* Funzionalit@`a MPFR:: Funzionalit@`a per il calcolo a
- precisione arbitraria in @command{gawk}
-* Cautela col calcolo in VM:: Cose da sapere.
-* Inesattezza nei calcoli:: La matematica in virgola mobile non @`e
- esatta.
-* Rappresentazioni inesatte:: Molti numeri non sono rappresentati
- esattamente.
-* Confronti tra valori in VM:: Come confrontare valori in virgola mobile.
-* Gli errori si sommano:: Gli errori diventano sempre maggiori.
-* Ottenere la precisione:: Ottenere la precisione voluta.
-* Tentare di arrotondare:: Tentare di aggiungere bit di precisione e
- arrotondare.
-* Impostare la precisione:: Impostare la precisione.
-* Impostare modi di arrotondare:: Impostare la modalit@`a di
- arrotondamento.
-* Interi a precisione arbitraria:: Aritmetica dei numeri interi a precisione
- arbitraria con @command{gawk}.
-* Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente.
-* Sommario virgola mobile:: Sommario della trattazione della
- virgola mobile.
-* Introduzione alle estensioni:: Cos'@`e un'estensione.
-* Licenza delle estensioni:: tipo di licenza delle estensioni.
-* Panoramica sul meccanismo delle estensioni:: Come funziona a grandi linee.
-* Descrizione dell'API delle estensioni:: Una descrizione completa dell'API.
-* Intro funzioni API delle estensioni:: Introduzione alle funzioni dell'API.
-* Tipi di dati generali:: I tipi di dati.
-* Funzioni di allocazione memoria:: Funzioni per allocare memoria.
-* Funzioni di costruzione:: Funzioni per creare valori.
-* Funzioni di registrazione:: Funzioni per registrare cose con
- @command{gawk}.
-* Funzioni di estensione:: Registrare funzioni di estensione.
-* Funzioni di exit callback:: Registrare una exit di callback.
-* Stringa di versione Estensioni:: Registrare una stringa di versione.
-* Analizzatori di input:: Registrare un analizzatore di input.
-* Processori di output:: Registrare un processore di output.
-* Processori bidirezionali:: Registrare un processore
- bidirezionale.
-* Stampare messaggi:: Stampare messaggi dalle estensioni.
-* Aggiornare @code{ERRNO}:: Funzioni per aggiornare @code{ERRNO}.
-* Richiedere valori:: Come ottenere un valore.
-* Accedere ai parametri:: Funzioni per acceder ai parametri.
-* Accedere alla tabella simboli:: Funzioni per accedere alle variabili
- globali.
-* Tabella simboli per nome:: Accedere e aggiornare variabili per nome.
-* Tabella simboli tramite cookie:: Accedere alle variabili per ``cookie''.
-* Valori nascosti:: Creare e usare valori nascosti.
-* Manipolazione di vettori:: Funzioni per lavorare coi vettori.
-* Tipi di dati per i vettori:: Tipi dati per lavorare coi vettori.
-* Funzioni per i vettori:: Funzioni per lavorare coi vettori.
-* Appiattimento di vettori:: Come appiattire i vettori.
-* Creazione di vettori:: Come creare e popolare vettori.
-* Ridirezione API:: Come accedere alla ridirezioni e
- modificarle.
-* Variabili dell'estensione API:: Variabili fornite dall'API.
-* Versione dell'estensione:: Informazioni sulla versione API.
-* Variabili informative di estens. API:: Variabili che forniscono informazioni
- sull'invocazione di @command{gawk}.
-* Codice predefinito di un'estensione API:: Codice predefinito di interfaccia API.
-* Modifiche dalla versione API 1:: Modifiche dalla versione 1 dell'API.
-* Trovare le estensioni:: Come @command{gawk} trova le
- estensioni compilate.
-* Esempio di estensione:: Esempio di codice C di un'estensione.
-* Descrizione interna file:: Quello che le nuove funzioni faranno.
-* Operazioni interne file:: Codice per gestire file all'interno.
-* Usare operazioni interne file:: Come usare un'estensione esterna.
-* Esempi di estensione:: Le estensioni di esempio incluse con
- @command{gawk}.
-* Esempio di estensione funzioni file:: Funzioni relative ai file.
-* Esempio di estensione Fnmatch:: Un'interfaccia a @code{fnmatch()}.
-* Esempio di estensione Fork:: Un'interfaccia a @code{fork()} e
- altre funzioni di processo.
-* Esempio di estensione Inplace:: Consentire modifica file input
- nell'estensione.
-* Esempio di estensione Ord:: Conversioni di caratteri in valori
- numerici e viceversa.
-* Esempio di estensione Readdir:: Un'interfaccia a @code{readdir()}.
-* Esempio di estensione Revout:: Invertire la stringa in output.
-* Esempio di estensione Rev2way:: Esempio di I/O bidirezionale.
-* Esempio di estensione Rwarray:: Scaricare e ricaricare un vettore.
-* Esempio di estensione Readfile:: Leggere un intero file in una stringa.
-* Esempio di estensione Time:: Un'interfaccia a @code{gettimeofday()}
- e @code{sleep()}.
-* Esempio di estensione API Test:: Test per la API.
-* gawkextlib:: Il progetto @code{gawkextlib}.
-* Sommario delle estensioni:: Sommario delle estensioni.
-* Esercizi sulle estensioni:: Esercizi.
-* V7/SVR3.1:: Le principali differenze tra V7 e
- System V Release 3.1.
-* SVR4:: Differenze minori tra System V
- Release 3.1 e 4.
-* POSIX:: Nuove funzionalit@`a per lo standard
- POSIX.
-* BTL:: Nuove funzionalit@`a dalla versione
- di @command{awk} di Brian Kernighan.
-* POSIX/GNU:: Le estensioni in @command{gawk} non
- previste in @command{awk} POSIX.
-* Storia delle funzionalit@`a:: Storia delle funzionalit@`a di
- @command{gawk}.
-* Estensioni comuni:: Sommario Estensioni comuni.
-* Intervalli e localizzazione:: Come le localizzazioni influiscono
- sugli intervalli delle espressioni
- regolari.
-* Contributori:: I maggiori contributori a
- @command{gawk}.
-* Sommario della storia:: Sommario della storia.
-* Distribuzione di Gawk:: Contenuto della distribuzione di
- @command{gawk}.
-* Scaricare:: Come ottenere la distribuzione.
-* Scompattazione:: Come estrarre la distribuzione.
-* Contenuti della distribuzione:: Cosa c'@`e nella distribuzione.
-* Installazione Unix:: Installare @command{gawk} su
- varie versioni di Unix.
-* Installazione veloce:: Compilare @command{gawk} sotto Unix.
-* File da usare a inizio sessione:: Funzioni di personalizzazione shell.
-* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase
- di compilazione.
-* Filosofia della configurazione:: Come si suppone che funzioni.
-* Installazione non-Unix:: Installazioni su altri Sistemi
- Operativi.
-* Installazione su PC:: Installare e compilare
- @command{gawk} su Microsoft Windows.
-* Installazione binaria su PC:: Installare una distribuzione pronta
- all'uso.
-* Compilazione su PC:: Compilare @command{gawk} per
- Windows32.
-* Uso su PC:: Eseguire @command{gawk} su Windows32.
-* Cygwin:: Compilare ed eseguire @command{gawk}
- 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.
-* Vecchio Gawk su VMS:: Una versione non aggiornata arriva
- con alcune versioni di VMS.
-* Bug:: Notificare problemi e bug.
-* Indirizzo Bug:: Dove notificare problemi.
-* Usenet:: Dove non notificare problemi.
-* Manutentori:: Manutentori di version non-*nix.
-* Altre versioni:: Altre implementazioni di
- @command{awk} liberamente
- disponibili.
-* Sommario dell'installazione:: Sommario dell'installazione.
-* Modalit@`a di compatibilit@`a:: Come inibire alcune estensioni di
- @command{gawk}.
-* Aggiunte:: Fare aggiunte a @command{gawk}.
-* Accedere ai sorgenti:: Accedere al deposito sorgenti Git.
-* Aggiungere codice:: Aggiungere codice al programma
- principale @command{gawk}.
-* Nuovi sistemi:: Rendere disponibile @command{gawk}
- a un nuovo sistema operativo.
-* File derivati:: Perch@'e i file ancillari sono tenuti
- nel deposito @command{git}.
-* Future estensioni:: Nuove funzionalit@`a che potranno
- essere implementate in futuro.
-* Limitazioni dell'implementazione:: Alcune limitazioni
- dell'implementazione.
-* Progetto delle estensioni:: Note di progetto sull'estensione API.
-* Problemi con le vecchie estensioni:: Problemi con la precedente
- implementazione di estensioni.
-* Obiettivi delle estensioni:: Obiettivi del nuovo meccanismo.
-* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
-* Futuri sviluppi delle estensioni:: Possibilit@`a di crescita futura.
-* Meccanismo delle vecchie estensioni:: Problemi con le vecchie estensioni.
-* Sommario delle note:: Sommario delle note di
- implementazione.
-* Fondamenti ad alto livello:: Una visione dall'alto.
-* Fondamenti sui tipi di dati:: Una velocissima introduzione ai tipi
- di dati.
-@end detailmenu
-@end menu
-
-@c dedication for Info file
-@ifinfo
-Ai miei genitori, per il loro amore, e per lo splendido
-esempio che mi hanno dato.
-@sp 1
-A mia moglie Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme a me.
-@sp 1
-Ai nostri figli Chana, Rivka, Nachum e Malka,
-per aver arricchito le nostre vite in misura incalcolabile.
-@end ifinfo
-
-@ifset SMALLPRINT
-@fonttextsize 10
-@end ifset
-
-@summarycontents
-@contents
-
-@ifset SMALLPRINT
-@fonttextsize 11
-@end ifset
-
-@node Introduzione3
-@unnumbered Introduzione alla Terza Edizione
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Michael</firstname>
- <surname>Brennan</surname>
- <!-- can't put mawk into command tags. sigh. -->
- <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
- </author>
- <date>Marzo 2001</date>
- </prefaceinfo>
-@end docbook
-
-Arnold Robbins e io siamo buoni amici. Ci siamo conosciuti
-@c 11 years ago
-nel 1990 per un insieme di
-circostanze---e per il nostro linguaggio di programmazione preferito, AWK.
-Tutto era iniziato un paio d'anni prima.
-Avevo appena iniziato un nuovo lavoro e avevo notato un computer Unix scollegato
-che giaceva in un angolo.
-Nessuno sapeva come usarlo, tanto meno io. Comunque,
-qualche giorno pi@`u tardi, stava funzionando, con
-me come @code{root} e solo e unico utente.
-Quel giorno, iniziai la transizione da statistico a programmatore Unix.
-
-In uno dei miei giri per biblioteche e librerie alla ricerca di libri sullo
-Unix, trovai il libro, dalla copertina grigia, su AWK, noto anche come @:
-Alfred V.@: Aho, Brian W.@: Kernighan e
-Peter J.@: Weinberger, @cite{The AWK Programming Language}, (Addison-Wesley,
-1988). Il semplice paradigma di programmazione di AWK
----trovare un'espressione di ricerca nell'input e di conseguenza compiere
-un'azione---riduceva spesso
-complesse e tediose manipolazioni di dati a poche righe di codice. Ero
-entusiasta di cimentarmi nella programmazione in AWK.
-
-Ahim@`e, l'@command{awk} sul mio computer era una versione limitata del
-linguaggio descritto nel libro grigio. Scoprii che il mio computer aveva il
-``vecchio @command{awk}'' mentre il libro descriveva il ``nuovo
-@command{awk}.''
-Imparai che non era un caso isolato; la vecchia versione si rifiutava di farsi da
-parte o di cedere il suo nome. Se un sistema aveva un nuovo @command{awk},
-questo era chiamato invariabilmente @command{nawk}, e pochi sistemi lo avevano.
-Il miglior modo per ottenere un nuovo @command{awk} era quello di scaricare via
-@command{ftp} il codice sorgente di @command{gawk} da @code{prep.ai.mit.edu}.
-@command{gawk} era una versione del nuovo @command{awk} scritta da David Trueman
-e Arnold, e disponibile sotto la GNU General Public License.
-
-Per inciso, ora non @`e
-pi@`u cos@`{@dotless{i}} difficile trovare un nuovo @command{awk}. @command{gawk} viene
-fornito con GNU/Linux, e si possono scaricare i binari e il codice sorgente per
-quasi tutti i sistemi; mia moglie usa @command{gawk} nella sua stazione di lavoro VMS.
-
-Il mio sistema Unix non era inizialmente collegato a una presa di corrente; a
-maggior ragione non era collegato a una rete. Cos@`{@dotless{i}}, ignaro dell'esistenza di
-@command{gawk} e in generale della comunit@`a di Unix, e desiderando un nuovo
-@command{awk}, ne scrissi uno mio, chiamato @command{mawk}. Prima di aver
-finito, scoprii l'esistenza di @command{gawk},
-ma era troppo tardi per fermarmi, cos@`{@dotless{i}} alla fine inviai un messaggio
-a un newsgroup @code{comp.sources}.
-
-Qualche giorno dopo ricevetti un cordiale messaggio di posta elettronica
-da Arnold che si presentava.
-Propose di scambiarci progetti e algoritmi, e
-alleg@`o una bozza dello standard POSIX, che mi permise di
-aggiornare @command{mawk} per includere le estensioni al linguaggio
-aggiunte dopo la pubblicazione di @cite{The AWK Programming Language}.
-
-Francamente, se i nostri ruoli fossero stati
-invertiti, io non sarei stato cos@`{@dotless{i}} disponibile e probabilmente non ci
-saremmo mai incontrati. Sono felice che l'incontro sia avvenuto.
-Lui @`e un vero esperto tra gli esperti di AWK e una persona squisita.
-Arnold mette a disposizione della Free Software Foundation parti significative
-della sua esperienza e del suo tempo.
-
-Questo libro @`e il manuale di riferimento di @command{gawk}, ma sostanzialmente
-@`e un libro sulla programmazione in AWK che
-interesser@`a un vasto pubblico.
-@`E un riferimento completo al linguaggio AWK come definito dalla versione del
-1987 di Bell Laboratories e codificato nelle POSIX Utilities
-standard del 1992.
-
-D'altra parte, un programmatore AWK alle prime armi pu@`o studiare
-una quantit@`a di programmi pratici che permettono di apprezzare
-la potenza dei concetti di base di AWK:
-flusso di controllo guidato dai dati, ricerca di corrispondenze tramite
-espressioni regolari e vettori associativi.
-Chi desidera qualcosa di nuovo pu@`o provare l'interfaccia di @command{gawk}
-verso i protocolli di rete attraverso i file speciali @file{/inet}.
-
-I programmi in questo libro evidenziano come un programma AWK sia
-generalmente molto pi@`u piccolo e veloce da sviluppare
-di uno equivalente scritto in C.
-Di conseguenza, @`e spesso conveniente creare un prototipo di un
-algoritmo o di un progetto in AWK per arrivare a eseguirlo in breve tempo e
-scoprire prima i problemi che possono presentarsi. Spesso, l'efficienza di
-questa versione iniziale interpretata @`e sufficiente e il prototipo
-AWK diventa il prodotto finale.
-
-Il nuovo comando @command{pgawk} (profiling @command{gawk}) produce
-conteggi sull'esecuzione delle istruzioni del programma.
-Recentemente ho fatto un tentativo con un algoritmo che, a fronte di
-@ifnotdocbook
-@math{n}
-@end ifnotdocbook
-@ifdocbook
-@i{n}
-@end ifdocbook
-righe di input, produceva il risultato in un tempo
-@tex
-$\sim\! Cn^2$,
-@end tex
-@ifnottex
-@ifnotdocbook
-~ C n^2,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>&sim; Cn<superscript>2</superscript></emphasis>
-@end docbook
-mentre in teoria
-avrebbe dovuto terminare in un tempo
-@tex
-$\sim\! Cn\log n$.
-@end tex
-@ifnottex
-@ifnotdocbook
-~ C n log n.
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>&sim; Cn log n</emphasis>
-@end docbook
-Dopo qualche minuto di attenta lettura
-del profilo in @file{awkprof.out}, ho ricondotto il problema a
-una singola riga di codice. @command{pgawk} @`e una gradita integrazione
-ai miei strumenti di programmatore.
-
-Arnold ha condensato in questo libro oltre un decennio di esperienza nell'uso di
-programmi AWK e nello sviluppo di @command{gawk}. Se si vuole usare
-AWK o imparare ad usarlo, @`e consigliabile leggere questo libro.
-
-@ifnotdocbook
-@cindex Brennan, Michael
-@display
-Michael Brennan
-Autore di @command{mawk}
-Marzo 2001
-@end display
-@end ifnotdocbook
-
-@node Introduzione4
-@unnumbered Introduzione alla Quarta Edizione
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Michael</firstname>
- <surname>Brennan</surname>
- <!-- can't put mawk into command tags. sigh. -->
- <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
- </author>
- <date>Ottobre 2014</date>
- </prefaceinfo>
-@end docbook
-
-Ci sono cose che non cambiano. Tredici anni fa scrivevo:
-``Se si vuole usare AWK o imparare ad usarlo, @`e consigliabile
-leggere questo libro.''
-Era vero allora e rimane vero anche oggi.
-
-Imparare a usare un linguaggio di programmazione richiede qualcosa di pi@`u
-che padroneggiarne la sintassi. Occorre comprendere come
-usare le funzionalit@`a del linguaggio per risolvere problemi pratici di
-programmazione. Uno dei punti pi@`u importanti di questo libro @`e che
-fornisce molti esempi che mostrano come utilizzare AWK.
-
-Altre cose, invece, cambiano. I nostri computer sono diventati molto pi@`u
-veloci e la loro memoria @`e molto pi@`u estesa.
-Per questa ragione, la velocit@`a di esecuzione e l'uso efficiente della
-memoria, caratteristiche di un linguaggio di livello elevato, hanno minore
-rilevanza.
-Scrivere un programma prototipo in AWK per poi riscriverlo in C per
-migliorare l'utilizzo delle risorse capita sempre meno, perch@'e sempre pi@`u
-spesso il prototipo @`e abbastanza veloce anche per essere messo in produzione.
-
-Naturalmente, ci sono tipi di calcoli che sono effettuati pi@`u agevolmente
-da programmi scritti in C o C++.
-Con @command{gawk} 4.1 e successive versioni, non @`e necessario
-decidere se scrivere un programma in AWK oppure in C/C++. Si pu@`o scrivere
-buona parte del programma in AWK e le parti che richiedono
-specificamente il C/C++ possono essere scritte in C/C++ e quindi il tutto
-pu@`o essere eseguito come un programma unico, con il modulo @command{gawk}
-che carica dinamicamente il modulo C/C++ in fase di esecuzione.
-@c Chapter 16
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche},
-spiega la procedura in gran
-dettaglio, e, come prevedibile, riporta molti esempi che sono di aiuto per
-approfondire anche gli aspetti pi@`u complessi.
-
-@`E per me un piacere programmare in AWK ed @`e stato divertente (ri)leggere
-questo libro. Penso che sar@`a lo stesso per voi.
-
-@ifnotdocbook
-@cindex Brennan, Michael
-@display
-Michael Brennan
-Autore di @command{mawk}
-Ottobre 2014
-@end display
-@end ifnotdocbook
-@node Prefazione
-@unnumbered Prefazione
-@c I saw a comment somewhere that the preface should describe the book itself,
-@c and the introduction should describe what the book covers.
-@c
-@c 12/2000: Chuck wants the preface & intro combined.
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Arnold</firstname>
- <surname>Robbins</surname>
- <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
- <affiliation><jobtitle>Israel</jobtitle></affiliation>
- </author>
- <date>Febbraio 2015</date>
- </prefaceinfo>
-@end docbook
-
-Lavorando con file di testo capita di dover eseguire alcuni tipi ripetitivi di
-operazioni. Si potrebbe voler estrarre alcune righe e scartare il resto, o fare
-modifiche laddove siano verificate certe condizioni, lasciando inalterato il
-resto del file. Questi compiti risultano spesso pi@`u agevoli usando
-@command{awk}. Il programma di utilit@`a @command{awk} interpreta un linguaggio
-di programmazione specializzato che rende facile eseguire semplici attivit@`a
-di riformattazione di dati.
-
-@cindex Brian Kernighan, @command{awk} di
-L'implementazione GNU di @command{awk} @`e chiamata @command{gawk}; se
-invocato con le opzioni o con le variabili d'ambiente appropriate,
-(@pxref{Opzioni}), @`e pienamente
-compatibile con le specifiche
-POSIX@footnote{Lo standard POSIX 2008 @`e accessibile in rete all'indirizzo
-@w{@url{http://www.opengroup.org/onlinepubs/9699919799/}.}}
-del linguaggio @command{awk}
-e con la versione Unix di @command{awk} mantenuta
-da Brian Kernighan.
-Ci@`o implica che tutti i programmi
-@command{awk} scritti correttamente dovrebbero funzionare con @command{gawk}.
-Perci@`o nella maggior parte dei casi non si distingue tra @command{gawk} e
-altre implementazioni di @command{awk}.
-
-@cindex @command{awk}, POSIX e, si veda anche POSIX @command{awk}
-@cindex @command{awk}, POSIX e
-@cindex POSIX, @command{awk} e
-@cindex @command{gawk}, @command{awk} e
-@cindex @command{awk}, @command{gawk} e
-@cindex @command{awk}, uso di
-Usando @command{awk} potete:
-
-@itemize @value{BULLET}
-@item
-Gestire piccole basi di dati personali
-
-@item
-Generare rapporti
-
-@item
-Validare dati
-
-@item
-Produrre indici ed effettuare altre operazioni per la preparazione di documenti
-
-@item
-Sperimentare algoritmi che possono essere adattati in seguito ad altri
-linguaggi per computer
-@end itemize
-
-@cindex @command{awk}, si veda anche @command{gawk}
-@cindex @command{gawk}, si veda anche @command{awk}
-@cindex @command{gawk}, uso di
-Inoltre,
-@command{gawk}
-fornisce strumenti che rendono facile:
-
-@itemize @value{BULLET}
-@item
-Estrarre frammenti di dati per l'elaborazione
-
-@item
-Ordinare dati
-
-@item
-Effettuare semplici comunicazioni di rete
-
-@item
-Creare il profilo di esecuzione ed effettuare il debug
-di programmi @command{awk}.
-
-@item
-Estendere il linguaggio con funzioni scritte in C o C++.
-@end itemize
-
-Questo @value{DOCUMENT} spiega il linguaggio @command{awk} e come lo si pu@`o
-usare efficacemente. @`E richiesta una familiarit@`a coi comandi di sistema
-di base, come @command{cat} e @command{ls},@footnote{Questi programmi di
-utilit@`a sono disponibili sui sistemi conformi a POSIX, come pure sui sistemi
-tradizionali basati su Unix. Se si usa qualche altro sistema operativo, si
-deve comunque avere familiarit@`a con i concetti di ridirezione I/O e di
-@dfn{pipe}.} cos@`{@dotless{i}} come con le funzionalit@`a di base della shell, come la
-ridirezione, l'input/output (I/O) e le @dfn{pipe}.
-
-@cindex GNU @command{awk}, si veda @command{gawk}
-Implementazioni del linguaggio @command{awk} sono disponibili per diversi
-sistemi operativi di computer. Questo @value{DOCUMENT}, oltre a descrivere il
-linguaggio @command{awk} in generale, descrive anche la specifica
-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,
-Microsoft Windows
-(tutte le versioni),
-e OpenVMS.@footnote{Qualche altro sistema operativo obsoleto su cui
-@command{gawk} era stato portato non @`e pi@`u mantenuto e il codice specifico
-per quei sistemi @`e stato rimosso.}
-
-@menu
-* Storia:: La storia di @command{gawk} e
- @command{awk}.
-* Nomi:: Che nome usare per trovare
- @command{awk}.
-* Questo manuale:: Uso di questo @value{DOCUMENT}.
- Comprende esempi di file in input
- utilizzabili.
-* Convenzioni:: Convenzioni tipografiche.
-* Storia del manuale:: Breve storia del Progetto GNU e di
- questo @value{DOCUMENT}.
-@ifset FOR_PRINT
-* Aggiornamenti:: Come tenersi al corrente.
-@end ifset
-* Come contribuire:: Un aiuto per la salvezza del mondo.
-* Ringraziamenti:: Ringraziamenti.
-@end menu
-
-@node Storia
-@unnumberedsec La storia di @command{gawk} e @command{awk}
-@cindex ricetta per un linguaggio di programmazione
-@cindex linguaggio di programmazione, ricetta per un
-@cindex programmazione, ricetta per un linguaggio di
-@cindex sidebar, Ricetta per un linguaggio di programmazione
-@ifdocbook
-@docbook
-<sidebar><title>Ricetta per un linguaggio di programmazione</title>
-@end docbook
-
-
-@multitable {2 parti di} {1 parte di @code{egrep}} {1 parte di @code{snobol}}
-@item @tab 1 parte di @code{egrep} @tab 1 parte di @code{snobol}
-@item @tab 2 parti di @code{ed} @tab 3 parti di C
-@end multitable
-
-Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
-Preparare una concisa documentazione e distribuire.
-
-Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
-parti di C. Documentare molto bene e distribuire.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ricetta per un linguaggio di programmazione}
-
-
-
-@multitable {2 parti di} {1 parte di @code{egrep}} {1 parte di @code{snobol}}
-@item @tab 1 parte di @code{egrep} @tab 1 parte di @code{snobol}
-@item @tab 2 parti di @code{ed} @tab 3 parti di C
-@end multitable
-
-Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
-Preparare una concisa documentazione e distribuire.
-
-Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
-parti di C. Documentare molto bene e distribuire.
-@end cartouche
-@end ifnotdocbook
-
-@cindex Aho, Alfred
-@cindex Weinberger, Peter
-@cindex Kernighan, Brian
-@cindex @command{awk}, storia di
-Il nome @command{awk} deriva dalle iniziali dei suoi progettisti: Alfred V.@:
-Aho, Peter J.@: Weinberger e Brian W.@: Kernighan. La versione originale di
-@command{awk} fu scritta nel 1977 negli AT&T Bell Laboratories.
-Nel 1985, una nuova versione rese il linguaggio di programmazione
-pi@`u potente, introducendo le funzioni definite dall'utente, flussi di input
-multipli ed espressioni regolari calcolate.
-Questa nuova versione ebbe larga diffusione con Unix System V
-Release 3.1 (1987).
-La versione in System V Release 4 (1989) ha aggiunto alcune nuove funzionalit@`a
-e ha fatto pulizia nel comportamento di alcuni degli ``punti oscuri'' del
-linguaggio. Le specifiche per @command{awk} nello standard POSIX Command
-Language and Utilities ha in seguito reso pi@`u chiaro il linguaggio. Sia i
-progettisti di @command{gawk} che quelli dell'originale @command{awk} dei Bell
-Laboratories hanno collaborato alla formulazione delle specifiche POSIX.
-
-@cindex Rubin, Paul
-@cindex Fenlason, Jay
-@cindex Trueman, David
-Paul Rubin ha scritto @command{gawk}, nel 1986.
-Jay Fenlason l'ha completata, seguendo i consigli di Richard Stallman.
-Anche John Woods ha fornito parti del codice. Nel 1988 e 1989, David Trueman,
-col mio aiuto, ha rivisto completamente @command{gawk} per la compatibilit@`a
-col pi@`u recente @command{awk}.
-Intorno al 1994, sono divenuto il manutentore principale.
-Lo sviluppo corrente @`e incentrato sulla correzione degli errori, sul
-miglioramento delle prestazioni, sulla conformit@`a agli standard e,
-occasionalmente, su nuove funzionalit@`a.
-
-Nel maggio 1997, J@"urgen Kahrs avvert@`{@dotless{i}} la necessit@`a di un accesso alla
-rete da @command{awk}, e con un piccolo aiuto da parte mia, cominci@`o ad
-aggiungere funzionalit@`a a @command{gawk} per fare questo. A quel tempo,
-lui scrisse anche il grosso di
-@cite{@value{GAWKINETTITLE}}
-(un documento separato, disponibile come parte della distribuzione
-@command{gawk}). Il suo codice alla fine venne integrato nella distribuzione
-principale di @command{gawk} con la versione 3.1 di @command{gawk}.
-
-John Haque ha riscritto la parte interna di @command{gawk}, mentre metteva a
-punto un debugger a livello di @command{awk}. Questa versione divenne
-disponibile come @command{gawk} versione 4.0 nel 2011.
-
-@xref{Contributori}
-per un elenco completo di quelli che hanno fornito contributi importanti a
-@command{gawk}.
-
-@node Nomi
-@unnumberedsec Una rosa, con ogni altro nome...
-
-@cindex @command{awk}, nuovo e vecchio
-Il linguaggio @command{awk} si @`e evoluto nel corso degli anni. Tutti i
-dettagli si trovano in @ref{Storia del linguaggio}.
-Il linguaggio descritto in questo @value{DOCUMENT}
-viene spesso citato come ``nuovo @command{awk}''.
-Per analogia, la versione originale di @command{awk} @`e citata
-come ``vecchio @command{awk}.''
-
-Su molti sistemi di uso corrente, eseguendo il programma di utilit@`a
-@command{awk}, si invoca qualche versione del nuovo
-@command{awk}.@footnote{Solo i sistemi Solaris usano ancora un
-vecchio @command{awk} per il programma di utilit@`a predefinito
-@command{awk}. Una versione pi@`u moderna di @command{awk} si trova
-nella directory @file{/usr/xpg6/bin} su questi sistemi.} Se
-il comando @command{awk} nel sistema in uso @`e il vecchio, il
-risultato che vedrete per il programma di test che segue @`e
-del tipo:
-
-@example
-$ @kbd{awk 1 /dev/null}
-@error{} awk: syntax error near line 1
-@error{} awk: bailing out near line 1
-@end example
-
-@noindent
-Se questo @`e il caso, dovreste cercare una versione del nuovo @command{awk},
-o semplicemente installare @command{gawk}!
-
-All'interno di questo @value{DOCUMENT}, quando si fa riferimento a
-funzionalit@`a del linguaggio che dovrebbe essere disponibile in ogni
-implementazione completa di @command{awk} POSIX, viene usato il termine
-@command{awk}. Quando si fa riferimento a una funzionalit@`a specifica
-dell'implementazione GNU, viene usato i termine @command{gawk}.
-
-@node Questo manuale
-@unnumberedsec Uso di questo @value{DOCUMENT}
-@cindex @command{awk}, descrizione dei termini
-
-Il termine @command{awk} si riferisce sia a uno specifico programma sia al
-linguaggio che si usa per dire al programma stesso cosa deve fare. Quando dobbiamo
-essere precisi, chiamiamo il linguaggio ``il linguaggio @command{awk},''
-e il programma ``l'utilit@`a @command{awk}.''
-Questo @value{DOCUMENT} spiega
-sia come scrivere programmi nel linguaggio @command{awk} che come
-eseguire l'utilit@`a @command{awk}.
-Il termine ``programma @command{awk}'' si riferisce a un programma scritto
-dall'utente nel linguaggio di programmazione @command{awk}.
-
-@cindex @command{gawk}, @command{awk} e
-@cindex @command{awk}, @command{gawk} e
-@cindex POSIX @command{awk}
-In primo luogo, questo @value{DOCUMENT} spiega le funzionalit@`a di @command{awk}
-come definite nello standard POSIX, e lo fa nel contesto dell'implementazione
-@command{gawk}. Oltre a questo, cerca anche di descrivere le differenze
-significative tra @command{gawk}
-e altre
-@ifclear FOR_PRINT
-implementazioni @command{awk}.@footnote{Tutte queste differenze
-si trovano nell'indice alla
-voce ``differenze tra @command{awk} e @command{gawk}.''}
-@end ifclear
-@ifset FOR_PRINT
-implementazioni @command{awk}.
-@end ifset
-Infine, vien fatta rilevare ogni funzionalit@`a di @command{gawk} non
-inclusa nello standard POSIX per @command{awk}.
-
-@ifnotinfo
-Questo @value{DOCUMENT} ha il difficile compito di essere tanto una guida
-introduttiva che un manuale di riferimento. I neofiti possono
-tranquillamente saltare i dettagli che sembrano loro troppo complessi.
-Possono anche ignorare i molti riferimenti incrociati, preparati avendo in
-mente gli utenti esperti e per le versioni Info e
-@uref{http://www.gnu.org/software/gawk/manual/, HTML}
-del @value{DOCUMENT}.
-@end ifnotinfo
-
-Ci sono dei riquadri
-sparsi in tutto il @value{DOCUMENT}.
-Aggiungono una spiegazione pi@`u completa su punti importanti, ma che
-probabilmente non sono di interesse in sede di prima lettura.
-@ifclear FOR_PRINT
-Si trovano tutti nell'indice analitico, alla voce ``sidebar.'' @c non c'e riquadro nell'indice analitico
-@end ifclear
-
-La maggior parte delle volte, gli esempi usano programmi @command{awk} completi.
-Alcune delle @value{SECTIONS} pi@`u avanzate mostrano solo la parte del programma
-@command{awk} che illustra il concetto che si sta descrivendo.
-
-Sebbene questo @value{DOCUMENT} sia destinato soprattutto alle persone che non
-hanno una precedente conoscenza di @command{awk}, esso contiene anche tante
-informazioni che anche gli esperti di @command{awk} troveranno utili.
-In particolare, dovrebbero essere d'interesse la descrizione di POSIX
-@command{awk} e i programmi di esempio
-@ifnottex
-in
-@end ifnottex
-@iftex
-nel
-@end iftex
-@ref{Funzioni di libreria} e
-@ifnotdocbook
-@ifnottex
-in
-@end ifnottex
-@end ifnotdocbook
-@iftex
-nel
-@end iftex
-@ref{Programmi di esempio}.
-
-Questo @value{DOCUMENT} @`e suddiviso in diverse parti, come segue:
-
-@c FULLXREF ON
-
-@itemize @value{BULLET}
-@item
-La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
-nel dettaglio.
-Inizia con le nozioni di base, e continua con tutte le caratteristiche di
-@command{awk}. Contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Per iniziare},
-fornisce le nozioni minime indispensabili per iniziare a usare @command{awk}.
-
-@item
-@ref{Invocare Gawk},
-descrive come eseguire @command{gawk}, il significato delle sue
-opzioni da riga di comando e come trovare i file sorgenti del programma
-@command{awk}.
-
-@item
-@ref{Espressioni regolari},
-introduce le espressioni regolari in generale, e in particolare le variet@`a
-disponibili in @command{awk} POSIX e @command{gawk}.
-
-@item
-@ref{Leggere file},
-descrive come @command{awk} legge i dati inseriti dall'utente.
-Introduce i concetti di record e campi, e anche il
-comando @code{getline}.
-Contiene una prima descrizione della ridirezione I/O, e una breve descrizione
-dell'I/O di rete.
-
-@item
-@ref{Stampare},
-descrive come i programmi @command{awk} possono produrre output con
-@code{print} e @code{printf}.
-
-@item
-@ref{Espressioni},
-descrive le espressioni, che sono i componenti elementari di base
-per portare a termine la maggior parte delle operazioni in un programma.
-
-@item
-@ref{Criteri di ricerca e azioni},
-descrive come scrivere espressioni di ricerca per individuare corrispondenze nei
-record, le azioni da eseguire quando si @`e trovata una corrispondenza
-in un record, e le variabili predefinite di @command{awk} e
-@command{gawk}.
-
-@item
-@ref{Vettori},
-tratta dell'unica struttura di dati di @command{awk}: il vettore associativo.
-Vengono trattati anche l'eliminazione di elementi del vettore e di interi
-vettori, e l'ordinamento dei vettori in @command{gawk}.
-Il @value{CHAPTER} descrive inoltre come @command{gawk} fornisce vettori di
-vettori.
-
-@item
-@ref{Funzioni},
-descrive le funzioni predefinite fornite da @command{awk} e
-@command{gawk}, e spiega come definire funzioni personalizzate. Viene
-anche spiegato come @command{gawk} permetta di invocare funzioni in
-maniera indiretta.
-@end itemize
-
-@item
-La Parte II illustra come usare @command{awk} e @command{gawk} per la
-risoluzione di problemi. Qui ci sono molti programmi da leggere e da cui imparare.
-Questa parte contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Funzioni di libreria},
-fornisce diverse funzioni pensate per
-essere usate dai programmi scritti in @command{awk}.
-
-@item
-@ref{Programmi di esempio},
-fornisce molti programmi @command{awk} di esempio.
-@end itemize
-
-La lettura di questi due capitoli permette di capire come
-@command{awk} pu@`o risolvere problemi pratici.
-
-@item
-La Parte III si concentra sulle funzionalit@`a specifiche di @command{gawk}.
-Contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Funzionalit@`a avanzate},
-descrive diverse funzionalit@`a avanzate.
-Di particolare rilevanza sono
-la capacit@`a di controllare l'ordine di visita dei vettori,
-quella di instaurare comunicazioni bidirezionali con altri processi,
-di effettuare connessioni di rete TCP/IP, e di
-profilare i propri programmi @command{awk}.
-
-@item
-@ref{Internazionalizzazione},
-descrive funzionalit@`a speciali per tradurre i messaggi
-di programma in diverse lingue in fase di esecuzione.
-
-@item
-@ref{Debugger}, descrive il debugger di @command{gawk}.
-
-@item
-@ref{Calcolo con precisione arbitraria},
-illustra le capacit@`a di calcolo avanzate.
-
-@item
-@ref{Estensioni dinamiche},
-descrive come aggiungere nuove variabili e
-funzioni a @command{gawk} scrivendo estensioni in C o C++.
-@end itemize
-
-@item
-@ifclear FOR_PRINT
-La Parte IV contiene le appendici, il Glossario, e due licenze relative,
-rispettivamente, al codice sorgente di @command{gawk} e a questo
-@value{DOCUMENT}. Contiene le seguenti appendici:
-@end ifclear
-
-@ifset FOR_PRINT
-La Parte IV contiene le seguenti appendici,
-che includono la Licenza per Documentazione Libera GNU:
-@end ifset
-
-@itemize @value{MINUS}
-@item
-@ref{Storia del linguaggio},
-descrive l'evoluzione del linguaggio @command{awk} dalla sua prima versione
-fino a oggi. Descrive anche come @command{gawk}
-ha acquisito nuove funzionalit@`a col passare del tempo.
-
-@item
-@ref{Installazione},
-descrive come ottenere @command{gawk}, come compilarlo
-sui sistemi compatibili con POSIX,
-e come compilarlo e usarlo su diversi sistemi
-non conformi allo standard POSIX. Spiega anche come segnalare gli errori
-di @command{gawk} e dove si possono ottenere altre implementazioni
-di @command{awk} liberamente disponibili.
-
-@ifset FOR_PRINT
-@item
-@ref{Copia},
-presenta la licenza applicabile al codice sorgente @command{gawk}.
-@end ifset
-
-@ifclear FOR_PRINT
-@item
-@ref{Note},
-descrive come disabilitare le estensioni @command{gawk},
-come contribuire scrivendo del nuovo codice per @command{gawk},
-e alcune possibili direzioni per il futuro sviluppo di @command{gawk}.
-
-@item
-@ref{Concetti fondamentali},
-fornisce del materiale di riferimento a livello elementare per chi
-sia completamente digiuno di programmazione informatica.
-
-Il @ref{Glossario}, definisce quasi tutti i termini significativi
-usati all'interno di questo @value{DOCUMENT}. Se si incontrano termini
-coi quali non si ha familiarit@`a, questo @`e il posto dove cercarli.
-
-@item
-@ref{Copia}, e
-@ref{Licenza per Documentazione Libera GNU (FDL)},
-presentano le licenze che si applicano, rispettivamente, al codice sorgente
-di @command{gawk} e a questo @value{DOCUMENT}.
-@end ifclear
-@end itemize
-@end itemize
-
-@ifset FOR_PRINT
-La versione di questo @value{DOCUMENT} distribuita con @command{gawk}
-contiene ulteriori appendici e altro materiale.
-Per ragioni di spazio, per questa edizione a stampa abbiamo tralasciato alcune
-delle appendici. Si possono trovare in rete ai seguenti indirizzi:
-
-@itemize @value{BULLET}
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Notes.html,
-L'appendice sulle note di implementazione}
-descrive come disabilitare le estensioni @command{gawk}, come contribuire
-scrivendo del nuovo codice per @command{gawk}, dove reperire informazioni
-su alcune possibili future direzioni dello sviluppo di @command{gawk}, e
-sulle decisioni di progetto che hanno influito sulle estensioni API.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
-L'appendice sui concetti fondamentali}
-fornisce del materiale di riferimento a livello elementare per chi sia completamente a
-digiuno di programmazione informatica.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
-Il Glossario}
-definisce la maggior parte, se non tutti, i termini significativi usati
-nel corso del libro. Se si incontrano termini con cui non si ha familiarit@`a,
-questo @`e il posto dove cercarli.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html, la licenza GNU FDL}
-@`e la licenza che vale per questo @value{DOCUMENT}.
-@end itemize
-
-@c ok not to use CHAPTER / SECTION here
-Alcuni dei capitoli hanno sezioni con esercizi; queste sono anche
-state omesse dall'edizione a stampa ma sono disponibili online.
-@end ifset
-
-@c FULLXREF OFF
-
-@node Convenzioni
-@unnumberedsec Convenzioni tipografiche
-
-@cindex Texinfo
-Questo @value{DOCUMENT} @`e scritto in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
-il linguaggio di formattazione della documentazione GNU. Viene usato un unico
-file sorgente Texinfo per produrre sia la versione a stampa della documentazione
-sia quella online.
-@ifnotinfo
-A causa di ci@`o, le convenzioni tipografiche
-sono leggermente diverse da quelle presenti in altri libri che potete aver letto.
-@end ifnotinfo
-@ifinfo
-Questo @value{SECTION} documenta brevemente le convenzioni tipografiche usate in Texinfo.
-@end ifinfo
-
-Gli esempi da immettere sulla riga di comando sono preceduti dai
-comuni prompt di shell primario e secondario, @samp{$} e @samp{>}.
-L'input che si inserisce viene mostrato @kbd{in questo modo}.
-@c 8/2014: @print{} is stripped from the texi to make docbook.
-@ifclear FOR_PRINT
-L'output del comando @`e preceduto dal glifo ``@print{}'', che
-in genere rappresenta lo standard output del comando.
-@end ifclear
-@ifset FOR_PRINT
-L'output del comando, normalmente il suo standard output, @`e stampato
-@code{in questo modo}.
-@end ifset
-Messaggi di errore e altri output sullo standard error del comando sono
-preceduti dal glifo ``@error{}''. Per esempio:
-
-@example
-$ @kbd{echo ciao su stdout}
-@print{} ciao su stdout
-$ @kbd{echo salve su stderr 1>&2}
-@error{} salve su stderr
-@end example
-
-@ifnotinfo
-Nel testo, quasi tutto ci@`o che riguarda la programmazione,
-per esempio i nomi dei comandi,
-appare in @code{questo font}. I frammenti
-di codice appaiono nello stesso font e tra apici, @samp{in questo modo}.
-Ci@`o che viene sostituito dall'utente o dal programmatore
-appare in @var{questo font}.
-Le opzioni sono stampate cos@`{@dotless{i}}: @option{-f}.
-I @value{FNS} sono indicati in questo modo: @file{/percorso/al/file}.
-@ifclear FOR_PRINT
-Certe cose sono
-evidenziate @emph{in questo modo}, e se un punto dev'essere reso in modo pi@`u
-marcato, viene evidenziato @strong{in questo modo}.
-@end ifclear
-La prima occorrenza di un
-nuovo termine @`e usualmente la sua @dfn{definizione} e appare nello stesso
-font della precedente occorrenza di ``definizione'' in questa frase.
-@end ifnotinfo
-
-I caratteri che si battono sulla tastiera sono scritti come @kbd{questi}. In
-particolare, ci sono caratteri speciali chiamati ``caratteri di controllo''.
-Questi sono caratteri che vengono battuti tenendo premuti il tasto
-@kbd{CONTROL} e un altro tasto contemporaneamente.
-Per esempio, @kbd{Ctrl-d} @`e battuto premendo e tenendo premuto il tasto
-@kbd{CONTROL}, poi premendo il tasto @kbd{d} e infine rilasciando entrambi i
-tasti.
-
-Per amor di brevit@`a, in questo @value{DOCUMENT}, la versione di Brian
-Kernighan di @command{awk} sar@`a citata come ``BWK @command{awk}.''
-(@xref{Altre versioni} per informazioni su questa e altre versioni.)
-
-@ifset FOR_PRINT
-@quotation NOTA
-Note interessanti sono stampate in questo modo.
-@end quotation
-
-@quotation ATTENZIONE
-Note di avviso o raccomandazioni di cautela sono stampate in questo modo.
-@end quotation
-@end ifset
-
-@c fakenode --- for prepinfo
-@unnumberedsubsec Angoli Bui
-@cindex Kernighan, Brian
-@quotation
-@i{Gli angoli bui sono essenzialmente frattali---per quanto vengano
-illuminati, ce n'@`e sempre uno pi@`u piccolo e pi@`u buio.}
-@author Brian Kernighan
-@end quotation
-
-@cindex a.b., si veda angolo buio
-@cindex angolo buio
-Fino allo standard POSIX (e @cite{@value{TITLE}}),
-molte caratteristiche di @command{awk} erano poco documentate o
-non documentate affatto. Le descrizioni di queste caratteristiche
-(chiamate spesso ``angoli bui'') sono segnalate in questo @value{DOCUMENT} con
-@iftex
-il disegno di una torcia elettrica nel margine, come mostrato qui.
-@value{DARKCORNER}
-@end iftex
-@ifnottex
-``(a.b.)''.
-@end ifnottex
-@ifclear FOR_PRINT
-Appaiono anche nell'indice sotto la voce ``angolo buio.''
-@end ifclear
-
-Ma come osservato nella citazione d'apertura, ogni trattazione degli
-angoli bui @`e per definizione incompleta.
-
-@cindex e.c., si veda estensioni comuni
-Estensioni al linguaggio standard di @command{awk} disponibili in pi@`u di una
-implementazione di @command{awk} sono segnate
-@ifclear FOR_PRINT
-``@value{COMMONEXT},'' ed elencate nell'indice sotto ``estensioni comuni''
-e ``comuni, estensioni''.
-@end ifclear
-@ifset FOR_PRINT
-``@value{COMMONEXT}'' per ``estensioni comuni.''
-@end ifset
-
-@node Storia del manuale
-@unnumberedsec Breve storia del Progetto GNU e di questo @value{DOCUMENT}
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Stallman, Richard
-La Free Software Foundation (FSF) @`e un'organizzazione senza scopo di lucro
-dedita alla produzione e distribuzione di software liberamente distribuibile.
-@`E stata fondata da Richard M.@: Stallman, l'autore della prima versione
-dell'editor Emacs. GNU Emacs @`e oggi la versione di Emacs pi@`u largamente usata.
-
-@cindex Progetto GNU
-@cindex GNU, Progetto
-@cindex GPL (General Public License)
-@cindex General Public License, si veda GPL
-@cindex documentazione, online
-Il Progetto GNU@footnote{GNU sta per ``GNU's Not Unix.''}
-@`e un progetto della Free Software
-Foundation in continuo sviluppo per creare un ambiente per computer completo, liberamente
-distribuibile, conforme allo standard POSIX.
-La FSF usa la GNU General Public License (GPL) per assicurare che
-il codice sorgente del loro software sia sempre
-disponibile all'utente finale.
-@ifclear FOR_PRINT
-Una copia della GPL @`e inclusa
-@ifnotinfo
-in questo @value{DOCUMENT}
-@end ifnotinfo
-per la consultazione
-(@pxref{Copia}).
-@end ifclear
-La GPL si applica al codice sorgente in linguaggio C per @command{gawk}.
-Per saperne di pi@`u sulla FSF e sul Progetto GNU,
-si veda @uref{http://www.gnu.org, la pagina principale del Progetto GNU}.
-Questo @value{DOCUMENT} si pu@`o leggere anche dal
-@uref{http://www.gnu.org/software/gawk/manual/, sito di GNU}.
-
-@ifclear FOR_PRINT
-Una shell, un editor (Emacs), compilatori ottimizzanti C, C++ e
-Objective-C altamente portabili, un debugger simbolico e dozzine di grandi e
-piccoli programmi di utilit@`a (come @command{gawk}), sono stati completati e
-sono liberamente disponibili. Il kernel del sistema operativo GNU (noto come
-HURD), @`e stato rilasciato ma @`e ancora allo stato di sviluppo iniziale.
-
-@cindex Linux
-@cindex GNU/Linux
-@cindex sistemi operativi basati su BSD
-In attesa che il sistema operativo GNU venga pi@`u completatamente
-sviluppato, si dovrebbe prendere in considerazione l'uso di GNU/Linux, un
-sistema operativo liberamente distribuibile e basato su Unix disponibile
-per Intel, Power Architecture,
-Sun SPARC, IBM S/390, e altri
-sistemi.@footnote{La terminologia ``GNU/Linux'' @`e spiegata
-nel @ref{Glossario}.}
-Molte distribuzioni GNU/Linux sono
-scaricabili da internet.
-@end ifclear
-
-@ifnotinfo
-Il @value{DOCUMENT} @`e realmente libero---almeno, l'informazione che contiene
-@`e libera per chiunque---. Il codice sorgente del @value{DOCUMENT}, leggibile
-elettronicamente, viene fornito con @command{gawk}.
-@ifclear FOR_PRINT
-(Dare un'occhiata alla Free Documentation
-License in @ref{Licenza per Documentazione Libera GNU (FDL)}.)
-@end ifclear
-@end ifnotinfo
-
-@cindex Close, Diane
-Il @value{DOCUMENT} in s@'e ha gi@`a avuto parecchie edizioni in passato.
-Paul Rubin ha scritto la prima bozza di @cite{The GAWK Manual};, che era
-lunga una quarantina di pagine.
-Diane Close e Richard Stallman l'hanno migliorata arrivando alla
-versione che era
-lunga una novantina di pagine, e descriveva solo la versione originale
-``vecchia'' di @command{awk}.
-Ho iniziato a lavorare con quella versione nell'autunno del 1988.
-Mentre ci stavo lavorando,
-la FSF ha pubblicato parecchie versioni preliminari, numerate 0.@var{x}).
-Nel 1996, l'edizione 1.0 fu rilasciata assieme a @command{gawk} 3.0.0.
-La FSF ha pubblicato le prime due edizioni col
-titolo @cite{GAWK: The GNU Awk User's Guide}.
-@ifset FOR_PRINT
-SSC ha pubblicato due edizioni del @value{DOCUMENT} col
-titolo @cite{Effective awk Programming}, e O'Reilly ha pubblicato
-la terza edizione nel 2001
-@end ifset
-
-Questa edizione mantiene la struttra di base delle edizioni precedenti.
-Per l'edizione FSF 4.0, il contenuto era stato accuratamente rivisto
-e aggiornato. Tutti i riferimenti a versioni di @command{gawk} anteriori alla
-versione 4.0 sono stati eliminati.
-Di particolare interesse in quella edizione era l'aggiunta del @ref{Debugger}.
-
-Per l'edizione FSF
-@ifclear FOR_PRINT
-@value{EDITION},
-@end ifclear
-@ifset FOR_PRINT
-@value{EDITION}
-(la quarta edizione, come pubblicata da O'Reilly),
-@end ifset
-il contenuto @`e stato riorganizzato in parti,
-e le aggiunte pi@`u importanti sono
-@iftex
-il
-@end iftex
-@ref{Calcolo con precisione arbitraria}, e
-@iftex
-il
-@end iftex
-@ref{Estensioni dinamiche}.
-
-Questo @value{DOCUMENT} continuer@`a certamente ad evolversi. Se si trovano
-errori nel @value{DOCUMENT}, si prega di segnalarli! @xref{Bug}
-per informazioni su come inviare le segnalazione di problemi elettronicamente.
-@ifset FOR_PRINT
-@node Restare aggiornati
-@unnumberedsec Come restare aggiornati
-
-Potreste avere una versione di @command{gawk} pi@`u recente di quella
-descritta qui. Per vedere cosa @`e cambiato,
-dovreste prima guardare il file @file{NEWS} nella distribuzione di
-@command{gawk}, che fornisce un sommario ad alto livello dei
-cambiamenti in ciascuna versione.
-
-You can then look at the @uref{http://www.gnu.org/software/gawk/manual/,
-online version} of this @value{DOCUMENT} to read about any new features.
-@end ifset
-
-@ifclear FOR_PRINT
-@node Come contribuire
-@unnumberedsec Come collaborare
-
-Come manutentore di GNU @command{awk}, un tempo pensai che sarei stato in grado
-di gestire una raccolta di programmi @command{awk} pubblicamente disponibili e
-avevo anche esortato a collaborare. Rendere disponibili le cose su Internet
-aiuta a contenere la distribuzione @command{gawk} entro dimensioni gestibili.
-
-L'iniziale raccolta di materiale, come questo, @`e tuttora disponibile
-su @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
-
-Chi fosse @emph{seriamente} interessato a contribuire nell'implementazione
-di un sito Internet dedicato ad argomenti riguardanti il
-linguaggio @command{awk}, @`e pregato di contattarmi.
-
-@ignore
-Nella speranza di
-fare qualcosa di pi@`u esteso, acquisii il dominio @code{awk.info}.
-
-Tuttavia, mi accorsi che non potevo dedicare abbastanza tempo per la gestione
-del codice inviato dai collaboratori: l'archivio non cresceva e il dominio
-rimase in disuso per diversi anni.
-
-Alla fine del 2008, un volontario si assunse il compito di mettere a punto
-un sito web collegato ad @command{awk}---@uref{http://awk.info}---e fece un
-lavoro molto ben fatto.
-
-Se qualcuno ha scritto un programma @command{awk} interessante, o un'estensione
-a @command{gawk} che vuole condividere col resto del mondo, @`e invitato a
-consultare la pagina @uref{http://awk.info/?contribute} per sapere come
-inviarlo per contribuire al sito web.
-
-Mentre scrivo, questo sito @`e in cerca di un responsabile; se qualcuno @`e
-interessato mi contatti.
-@end ignore
-
-@ignore
-Altri collegamenti:
-
-http://www.reddit.com/r/linux/comments/dtect/composing_music_in_awk/
-@end ignore
-@end ifclear
-
-@node Ringraziamenti
-@unnumberedsec Ringraziamenti
-
-La bozza iniziale di @cite{The GAWK Manual} riportava i seguenti ringraziamenti:
-
-@quotation
-Molte persone devono essere ringraziate per la loro assistenza nella produzione
-di questo manuale. Jay Fenlason ha contribuito con molte idee e programmi di
-esempio. Richard Mlynarik e Robert Chassell hanno fatto utili osservazioni
-sulle bozze di questo manuale. Lo scritto
-@cite{A Supplemental Document for AWK} di John W.@: Pierce, del
-Chemistry Department di UC San Diego, fa il punto su diverse questioni rilevanti
-sia per l'implementazione di @command{awk} che per questo manuale, che
-altrimenti ci sarebbero sfuggite.
-@end quotation
-
-@cindex Stallman, Richard
-Vorrei ringraziare Richard M.@: Stallman, per la sua visione di un mondo
-migliore e per il suo coraggio nel fondare la FSF e nel dare inizio al
-Progetto GNU.
-
-@ifclear FOR_PRINT
-Edizioni precedenti di questo @value{DOCUMENT} riportavano i seguenti
-ringraziamenti:
-@end ifclear
-@ifset FOR_PRINT
-La precedente edizione di questo @value{DOCUMENT} riportava
-i seguenti ringraziamenti:
-@end ifset
-
-@quotation
-Le seguenti persone (in ordine alfabetico)
-hanno inviato commenti utili riguardo alle diverse
-versioni di questo libro:
-Rick Adams,
-Dr.@: Nelson H.F. Beebe,
-Karl Berry,
-Dr.@: Michael Brennan,
-Rich Burridge,
-Claire Cloutier,
-Diane Close,
-Scott Deifik,
-Christopher (``Topher'') Eliot,
-Jeffrey Friedl,
-Dr.@: Darrel Hankerson,
-Michal Jaegermann,
-Dr.@: Richard J.@: LeBlanc,
-Michael Lijewski,
-Pat Rankin,
-Miriam Robbins,
-Mary Sheehan,
-e
-Chuck Toporek.
-
-@cindex Berry, Karl
-@cindex Chassell, Robert J.@:
-@c @cindex Texinfo
-Robert J.@: Chassell ha dato preziosissimi consigli
-sull'uso di Texinfo.
-Merita anche un particolare ringraziamento per avermi
-convinto a @emph{non} dare a questo @value{DOCUMENT}
-il titolo @cite{How to Gawk Politely}. [Un gioco di parole in inglese che pu@`o
-significare sia
-@cite{Come usare Gawk educatamente}
-che @cite{Come curiosare educatamente}].
-Karl Berry ha aiutato in modo significativo con la parte @TeX{} di Texinfo.
-
-@cindex Hartholz, Marshall
-@cindex Hartholz, Elaine
-@cindex Schreiber, Bert
-@cindex Schreiber, Rita
-Vorrei ringraziare Marshall ed Elaine Hartholz di Seattle e il Dr.@: Bert e Rita
-Schreiber di Detroit per i lunghi periodi di vacanza trascorsi in tutta
-tranquillit@`a in casa loro, che mi hanno permesso di fare importanti progressi
-nella scrittura di questo @value{DOCUMENT} e con lo stesso @command{gawk}.
-
-@cindex Hughes, Phil
-Phil Hughes di SSC
-ha contribuito in modo molto importante prestandomi il suo portatile col sistema
-GNU/Linux, non una volta, ma due, il che mi ha permesso di fare tantissimo lavoro
-mentre ero fuori casa.
-
-@cindex Trueman, David
-David Trueman merita un riconoscimento speciale; ha fatto un lavoro da sentinella
-durante lo sviluppo di @command{gawk} affinch@'e funzioni bene e senza errori.
-Sebbene non sia pi@`u impegnato con @command{gawk},
-lavorare con lui a questo progetto @`e stato un vero piacere.
-
-@cindex Drepper, Ulrich
-@cindex GNITS mailing list
-@cindex mailing list, GNITS
-Gli intrepidi membri della lista GNITS, con una particolare menzione per Ulrich
-Drepper, hanno fornito un aiuto prezioso e commenti per il progetto
-delle funzionalit@`a di internazionalizzazione.
-
-Chuck Toporek, Mary Sheehan, e Claire Cloutier della O'Reilly & Associates hanno
-fornito un'assistenza editoriale rilevante per questo @value{DOCUMENT} per la
-versione 3.1 di @command{gawk}.
-@end quotation
-
-@cindex Beebe, Nelson H.F.@:
-@cindex Buening, Andreas
-@cindex Collado, Manuel
-@cindex Colombo, Antonio
-@cindex Davies, Stephen
-@cindex Deifik, Scott
-@cindex Demaille, Akim
-@cindex G., Daniel Richard
-@cindex Hankerson, Darrel
-@cindex Jaegermann, Michal
-@cindex Kahrs, J@"urgen
-@cindex Kasal, Stepan
-@cindex Malmberg, John E.
-@cindex Pitts, Dave
-@cindex Ramey, Chet
-@cindex Rankin, Pat
-@cindex Schorr, Andrew
-@cindex Vinschen, Corinna
-@cindex Zaretskii, Eli
-
-Dr.@: Nelson Beebe,
-Andreas Buening,
-Dr.@: Manuel Collado,
-Antonio Colombo,
-Stephen Davies,
-Scott Deifik,
-Akim Demaille,
-Daniel Richard G.,
-Darrel Hankerson,
-Michal Jaegermann,
-J@"urgen Kahrs,
-Stepan Kasal,
-John Malmberg,
-Dave Pitts,
-Chet Ramey,
-Pat Rankin,
-Andrew Schorr,
-Corinna Vinschen,
-ed Eli Zaretskii
-(in ordine alfabetico)
-costituiscono l'attuale ``gruppo di lavoro sulla portabilit@`a'' di
-@command{gawk}. Senza il loro duro lavoro e il loro aiuto,
-@command{gawk} non sarebbe stato neanche lontanamente il buon programma che @`e
-oggi. @`E stato e continua a essere un piacere lavorare con questo gruppo
-di ottimi collaboratori.
-
-Notevoli contributi di codice e documentazione sono arrivati da
-parecchie persone. @xref{Contributori} per l'elenco completo.
-
-@ifset FOR_PRINT
-@cindex Oram, Andy
-Grazie ad Andy Oram della O'Reilly Media per aver iniziato
-la quarta edizione e per il suo aiuto in corso d'opera.
-Grazie a Jasmine Kwityn per il suo lavoro di revisione.
-@end ifset
-
-Grazie a Michael Brennan per le Prefazioni.
-
-@cindex Duman, Patrice
-@cindex Berry, Karl
-Grazie a Patrice Dumas per il nuovo programma @command{makeinfo}.
-Grazie a Karl Berry, che continua a lavorare per tenere
-aggiornato il linguaggio di marcatura Texinfo.
-
-@cindex Kernighan, Brian
-@cindex Brennan, Michael
-@cindex Day, Robert P.J.@:
-Robert P.J.@: Day, Michael Brennan e Brian Kernighan hanno gentilmente
-fatto da revisiori per l'edizione 2015 di questo @value{DOCUMENT}. Le loro
-osservazioni hanno contribuito a migliorare la stesura finale.
-
-Vorrei ringraziare Brian Kernighan per la sua preziosa assistenza durante
-la fase di collaudo e di debug di @command{gawk} e
-per l'aiuto in corso d'opera e i consigli nel chiarire diversi punti sul
-linguaggio. Non avremmo proprio fatto un cos@`{@dotless{i}} buon lavoro su @command{gawk} e
-sulla sua documentazione senza il suo aiuto.
-
-Brian @`e un fuoriclasse sia come programmatore che come autore di manuali
-tecnici. @`E mio dovere ringraziarlo (una volta di pi@`u) per la sua costante
-amicizia e per essere stato per me un modello da seguire ormai da quasi
-30 anni! Averlo come revisiore @`e per me un privilegio eccitante, ma @`e
-stata anche un'esperienza che mi ha fatto sentire molto piccolo@enddots{}
-
-@cindex Robbins, Miriam
-@cindex Robbins, Jean
-@cindex Robbins, Harry
-@cindex D-o
-Devo ringraziare la mia meravigliosa moglie, Miriam, per la sua pazienza nel
-corso delle molte versioni di questo progetto, per la correzione delle bozze e
-per aver condiviso con me il computer.
-Vorrei ringraziare i miei genitori per il loro amore, e per la gentilezza con cui
-mi hanno cresciuto ed educato.
-Infine, devo riconoscere la mia gratitudine a D-o, per le molte opportunit@`a
-che mi ha offerto, e anche per i doni che mi ha elargito, con cui trarre
-vantaggio da quelle opportunit@`a.
-@ifnotdocbook
-@sp 2
-@noindent
-Arnold Robbins @*
-Nof Ayalon @*
-Israel @*
-Febbraio 2015
-@end ifnotdocbook
-
-@ifnotinfo
-@part @value{PART1}Il Linguaggio @command{awk}
-@end ifnotinfo
-
-@ifdocbook
-@part Il Linguaggio @command{awk}
-
-La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
-nel dettaglio. Inizia con le nozioni di base, e continua con tutte le
-funzionalit@`a di @command{awk}. Sono incluse anche molte, ma non tutte, le
-funzionalit@`a di @command{gawk}. Questa parte contiene i
-seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Per iniziare}
-
-@item
-@ref{Invocare Gawk}
-
-@item
-@ref{Espressioni regolari}
-
-@item
-@ref{Leggere file}
-
-@item
-@ref{Stampare}
-
-@item
-@ref{Espressioni}
-
-@item
-@ref{Modelli e azioni}
-
-@item
-@ref{Vettori}
-
-@item
-@ref{Funzioni}
-@end itemize
-@end ifdocbook
-@node Per iniziare
-@chapter Per iniziare con @command{awk}
-@c @cindex @dfn{script}, definizione di
-@c @cindex rule, definizione di
-@c @cindex program, definizione di
-@c @cindex basic function of @command{awk}
-@cindex @command{awk}, funzione di
-
-Il compito fondamentale di @command{awk} @`e quello di ricercare righe (o
-altre unit@`a di testo) in file che corrispondano a certi criteri di ricerca.
-Quando una riga corrisponde a uno dei criteri, @command{awk} esegue su
-quella riga le azioni specificate per quel criterio. @command{awk} continua
-a elaborare righe in input in questo modo, finch@'e non raggiunge la fine delle
-righe nei file in input.
-
-@cindex @command{awk}, uso di
-@cindex linguaggi di programmazione@comma{} guidati-dai-dati/procedurali
-@cindex @command{awk}, programmi
-I programmi scritti in @command{awk} sono differenti dai programmi scritti
-nella maggior parte degli altri linguaggi,
-poich@'e i programmi @command{awk} sono @dfn{guidati dai dati} (ovvero,
-richiedono di descrivere i dati sui quali si vuole operare, e in seguito
-che cosa fare una volta che tali dati siano stati individuati).
-La maggior parte degli altri linguaggi sono @dfn{procedurali}; si deve
-descrivere, in maniera molto dettagliata, ogni passo che il programma
-deve eseguire. Lavorando con linguaggi procedurali, solitamente @`e
-molto pi@`u difficile descrivere chiaramente i dati che il programma
-deve elaborare.
-Per questa ragione i programmi @command{awk} sono spesso piacevolmente
-facili da leggere e da scrivere.
-
-@cindex programma, definizione di
-@cindex regola, definizione di
-Quando si esegue @command{awk}, va specificato un
-@dfn{programma} @command{awk} che
-dice ad @command{awk} cosa fare. Il programma consiste di una serie di
-@dfn{regole} (pu@`o anche contenere @dfn{definizioni di funzioni},
-una funzionalit@`a avanzata che per ora ignoreremo;
-@pxref{Funzioni definite dall'utente}). Ogni regola specifica un
-criterio di ricerca e un'azione da effettuare
-una volta che viene trovato un record corrispondente.
-
-Sintatticamente, una regola consiste in un @dfn{criterio di ricerca}, seguito
-da una @dfn{azione}.
-L'azione @`e racchiusa tra parentesi graffe per separarla dal criterio di
-ricerca.
-Per separare regole, basta andare a capo. Quindi un programma
-@command{awk} ha una struttura simile a questa:
-
-@example
-@var{criterio} @{ @var{azione} @}
-@var{criterio} @{ @var{azione} @}
-@dots{}
-@end example
-
-@menu
-* Eseguire gawk:: Come iniziare a eseguire programmi
- @command{gawk}; comprende la sintassi
- della riga di comando.
-* File dati di esempio:: File di dati di esempio da usare nei
- programmi @command{awk} illustrati in
- questo @value{DOCUMENT}.
-* Molto semplice:: Un esempio molto semplice.
-* Due regole:: Un esempio meno semplice di programma
- di una riga, che usa due regole.
-* Maggiore sofisticazione:: Un esempio pi@`u complesso.
-* Istruzioni/Righe:: Suddividere o riunire istruzioni
- su [una o pi@`u] righe.
-* Altre funzionalit@`a:: Altre funzionalit@`a di @command{awk}.
-* Quando:: Quando usare @command{gawk} e quando
- usare altre cose.
-* Sommario dell'introduzione:: Sommario dell'introduzione.
-@end menu
-
-@node Eseguire gawk
-@section Come iniziare a eseguire programmi @command{gawk}
-
-@cindex programmi @command{awk}, eseguire
-Ci sono vari modi di eseguire un programma @command{awk}. Se il programma @`e
-corto, @`e pi@`u facile includerlo nel comando con cui si invoca @command{awk},
-cos@`{@dotless{i}}:
-
-@example
-awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex riga di comando, formati
-Quando il programma @`e lungo, di solito @`e meglio metterlo in un file
-ed eseguirlo con un comando come questo:
-
-@example
-awk -f @var{file-di-programma} @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} si occupa di entrambe queste modalit@`a insieme
-a parecchie varianti di ciascuna di esse.
-
-@menu
-* Monouso:: Eseguire un breve programma
- @command{awk} di tipo usa-e-getta.
-* Leggere dal terminale:: Senza uso di file in input (input
- immesso da tastiera).
-* Lunghi:: Mettere programmi @command{awk}
- permanenti in file.
-* @dfn{Script} eseguibili:: Preparare programmi @command{awk}
- da eseguire come @dfn{script}.
-* Commenti:: Aggiungere documentazione a programmi
- @command{gawk}.
-* Protezione:: Ulteriore discussione di problemi
- connessi all'uso di apici nella shell.
-@end menu
-
-@node Monouso
-@subsection Eseguire un breve programma @command{awk} usa-e-getta
-
-Una volta acquisita familiarit@`a con @command{awk}, capiter@`a spesso di
-preparare semplici
-programmi nel momento in cui servono. In questo caso si pu@`o scrivere
-il programma come primo argomento del comando @command{awk}, cos@`{@dotless{i}}:
-
-@example
-awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@noindent
-dove @var{programma} consiste in una serie di criteri di ricerca e di
-azioni, come descritto precedentemente.
-
-@cindex apice singolo (@code{'})
-@cindex @code{'} (apice singolo)
-Questo formato di comando chiede alla @dfn{shell}, ossia all'interpretatore
-dei comandi, di richiamare @command{awk} e di usare il @var{programma} per
-trattare record nei file in input.
-Il @var{programma} @`e incluso tra apici in modo che
-la shell non interpreti qualche carattere destinato ad @command{awk} come
-carattere speciale
-della shell. Gli apici fanno inoltre s@`{@dotless{i}} che la shell tratti tutto il
-@var{programma} come un solo argomento per @command{awk}, e permettono che
-@var{programma} sia pi@`u lungo di una riga.
-
-@cindex shell, @dfn{script}
-@cindex programmi @command{awk}, eseguire, da @dfn{script} di shell
-Questo formato @`e utile anche per eseguire programmi @command{awk} di
-dimensioni piccole o medie da @dfn{script} di shell, perch@'e non richiede
-un file separato che contenga il programma @command{awk}. Uno @dfn{script}
-di shell @`e pi@`u affidabile, perch@'e non ci sono altri file che possono
-venirsi a trovare fuori posto.
-
-Pi@`u avanti in questo capitolo,
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ifdocbook
-@value{SECTION}
-@end ifdocbook
-@ref{Molto semplice},
-si vedranno esempi di parecchi programmi,
-brevi, scritti sulla riga di comando.
-
-@node Leggere dal terminale
-@subsection Senza uso di file in input (input immesso da tastiera)
-
-@cindex standard input
-@cindex input, standard
-@cindex file in input, eseguire @command{awk} senza usarli
-Si pu@`o anche eseguire @command{awk} senza indicare alcun file in input. Se
-si immette la seguente riga di comando:
-
-@example
-awk '@var{programma}'
-@end example
-
-@noindent
-@command{awk} prende come input del @var{programma} lo @dfn{standard input},
-che di solito significa qualsiasi cosa venga immesso dalla tastiera.
-Ci@`o prosegue finch@'e non si segnala una fine-file battendo @kbd{Ctrl-d}.
-(In sistemi operativi non-POSIX, il carattere di fine-file pu@`o essere diverso.)
-
-@cindex input, file in, si veda file in input
-@cindex file in input, eseguire @command{awk} senza usarli
-@cindex programmi @command{awk}, eseguire, senza file in input
-Per esempio, il seguente programma stampa un consiglio da amico
-(dalla @cite{Guida galattica per gli autostoppisti} di Douglas Adams ),
-per non lasciarsi spaventare dalle complessit@`a della programmazione per
-computer:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Non v\47allarmate!" @}'}
-@print{} Non v'allarmate!
-@end example
-
-@command{awk} esegue le istruzioni associate a @code{BEGIN} prima di leggere
-qualsiasi input. Se non ci sono altre istruzioni nel proprio programma, come
-in questo caso, @command{awk} si ferma, invece di tentare di leggere input che
-non sa come elaborare.
-Il @samp{\47} @`e un modo straordinario (spiegato pi@`u avanti) per inserire un
-apice singolo nel programma, senza dover ricorrere a fastidiosi meccanismi
-di protezione della shell.
-
-@quotation NOTA
-Se si usa Bash come shell, si dovrebbe digitare il comando @samp{set +H} prima
-eseguire questo programma interattivamente, per non avere una cronologia dei
-comandi nello stile della C shell, che tratta il @samp{!} come un carattere
-speciale. Si raccomanda di inserire quel comando nel proprio file di
-personalizzazione della shell.
-@end quotation
-
-Il seguente semplice programma @command{awk}
-emula il comando @command{cat}; ovvero copia qualsiasi cosa si
-batta sulla tastiera nel suo standard output (perch@'e succede @`e spiegato fra
-poco):
-
-@example
-$ @kbd{awk '@{ print @}'}
-@kbd{Ora @`e il tempo per tutti gli uomini buoni}
-@print{} Ora @`e il tempo per tutti gli uomini buoni
-@kbd{di venire in aiuto al loro paese.}
-@print{} di venire in aiuto al loro paese.
-@kbd{Or sono sedici lustri e sette anni, ...}
-@print{} Or sono sedici lustri e sette anni, ...
-@kbd{Cosa, io preoccupato?}
-@print{} Cosa, io preoccupato?
-@kbd{Ctrl-d}
-@end example
-
-@node Lunghi
-@subsection Eseguire programmi lunghi
-
-@cindex programmi @command{awk}, eseguire
-@cindex programmi @command{awk}, lunghi
-@cindex file, programmi @command{awk} in
-Talora i programmi @command{awk} sono molto lunghi. In tali situazioni
-conviene mettere il programma in un file separato. Per dire ad
-@command{awk} di usare quel file come programma, digitare:
-
-@example
-awk -f @var{file-sorgente} @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex @option{-f}, opzione
-@cindex riga di comando, opzione @option{-f}
-L'opzione @option{-f} dice al comando @command{awk} di ottenere il programma
-@command{awk} dal file @var{file-sorgente} (@pxref{Opzioni}).
-Ogni @value{FN} pu@`o essere usato come @var{file-sorgente}. Per esempio, si
-potrebbe mettere il programma:
-
-@example
-BEGIN @{ print \"Non v'allarmate!\" @}
-@end example
-
-@noindent
-nel file @file{consiglio}. Allora questo comando:
-
-@example
-awk -f consiglio
-@end example
-
-@noindent
-@`e equivalente al comando:
-
-@example
-awk 'BEGIN @{ print \"Non v\47allarmate!\" @}'
-@end example
-
-@cindex protezione, nella riga di comando di @command{gawk}
-@noindent
-Questo @`e gi@`a stato spiegato prima
-(@pxref{Leggere dal terminale}).
-Si noti che normalmente non serve mettere apici singoli nel @value{FN} che si
-fornisce con @option{-f}, perch@'e di solito i @value{FNS} non contengono
-caratteri che sono speciali per la shell. Si noti che in @file{consiglio},
-il programma @command{awk} non ha dei doppi apici che lo delimitano. I
-doppi apici sono necessari solo per programmi scritti direttamente sulla riga
-di comando di @command{awk}.
-(Inoltre, se il programma si trova in un file, @`e possibile usare un apice
-singolo all'interno del programma, invece del magico @samp{\47}.)
-
-@cindex apice singolo (@code{'}), nella riga di comando di @command{gawk}
-@cindex @code{'} (apice singolo), nella riga di comando di @command{gawk}
-Per identificare chiaramente un file di programma @command{awk} come tale,
-si pu@`o aggiungere il suffisso @file{.awk} al @value{FN}. Ci@`o non
-cambia l'esecuzione del programma @command{awk} ma semplifica
-la ``manutenzione''.
-
-@node @dfn{Script} eseguibili
-@subsection Programmi @command{awk} da eseguire come @dfn{script}
-@cindex programmi @command{awk}
-@cindex @code{#} (cancelletto), @code{#!} (@dfn{script} eseguibili)
-@cindex Unix, @dfn{script} @command{awk} e
-@cindex cancelletto (@code{#}), @code{#!} (@dfn{script} eseguibili)
-
-Una volta familiarizzato con @command{awk}, si potrebbero scrivere
-@dfn{script} che richiamano @command{awk}, usando il meccanismo di
-@dfn{script} @samp{#!}. Ci@`o @`e
-possibile in molti sistemi operativi.@footnote{Il meccanismo @samp{#!}
-funziona nei sistemi
-GNU/Linux, in quelli basati su BSD e nei sistemi Unix a pagamento.}
-Per esempio, si potrebbe modificare il file @file{consiglio} e farlo divenire:
-
-@example
-#! /bin/awk -f
-
-BEGIN @{ print \"Non v'allarmate!\" @}
-@end example
-
-@noindent
-Dopo aver reso eseguibile questo file (con il comando @command{chmod}),
-digitare semplicemente @samp{consiglio}
-al prompt della shell e il sistema si preparer@`a a eseguire @command{awk}
-come se si fosse digitato @samp{awk -f consiglio}:
-
-@example
-$ @kbd{chmod +x consiglio}
-$ @kbd{consiglio}
-@print{} Non v'allarmate!
-@end example
-
-@noindent
-(Si suppone che la directory corrente sia tra quelle contenute nella variabile
-che indica il "percorso" di ricerca [solitamente @code{$PATH}]. In caso
-contrario si potrebbe aver bisogno di digitare @samp{./consiglio} nella
-shell.)
-
-@dfn{Script} @command{awk} autocontenuti sono utili se si vuol scrivere un
-programma che gli utenti possono richiamare senza dover essere informati che
-il programma @`e scritto in @command{awk}.
-
-@cindex sidebar, Comprendere @samp{#!}
-@ifdocbook
-@docbook
-<sidebar><title>Comprendere @samp{#!}</title>
-@end docbook
-
-@cindex portabilit@`a, @code{#!} (@dfn{script} eseguibili)
-
-@command{awk} @`e un linguaggio @dfn{interpretato}. Ci@`o significa che il
-comando @command{awk} legge il programma dell'utente e poi elabora i dati
-secondo le istruzioni contenute nel programma (diversamente da un linguaggio
-@dfn{compilato} come il C, dove il programma viene prima compilato in codice
-macchina che @`e eseguito direttamente dal processore del sistema). Il
-programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
-Molti linguaggi moderni sono interpretati.
-
-La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
-interpretatore
-da richiamare, con degli argomenti facoltativi che saranno passati a
-quell'interpretatore sulla riga di comando. Il sistema operativo quindi
-richiama l'interpretatore con gli argomenti dati e con l'intera lista di
-argomenti con cui era stato invocato il programma. Il primo argomento nella
-lista @`e l'intero @value{FN} del programma @command{awk}. Il resto della lista
-degli argomenti contiene opzioni per @command{awk}, oppure @value{DF}, o
-entrambi. (Si noti che in molti sistemi @command{awk} pu@`o essere trovato in
-@file{/usr/bin} invece che in @file{/bin}.)
-
-Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
-32 caratteri. Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
-
-Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
-dopo il percorso del comando @command{awk}. Non funziona. Il sistema
-operativo tratta il resto della riga come un argomento solo, e lo passa ad
-@command{awk}.
-Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni probabilit@`a un
-messaggio di errore di qualche tipo da @command{awk}.
-
-@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
-@cindex portabilit@`a, variabile @code{ARGV}
-Infine, il valore di @code{ARGV[0]}
-(@pxref{Variabili predefinite})
-pu@`o variare a seconda del sistema operativo.
-Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
-di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
-dello @dfn{script} dell'utente (@samp{consiglio}). @value{DARKCORNER}
-Non bisogna fidarsi del valore di @code{ARGV[0]}
-per ottenere il nome del proprio @dfn{script}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Comprendere @samp{#!}}
-
-
-@cindex portabilit@`a, @code{#!} (@dfn{script} eseguibili)
-
-@command{awk} @`e un linguaggio @dfn{interpretato}. Ci@`o significa che il
-comando @command{awk} legge il programma dell'utente e poi elabora i dati
-secondo le istruzioni contenute nel programma (diversamente da un linguaggio
-@dfn{compilato} come il C, dove il programma viene prima compilato in codice
-macchina che @`e eseguito direttamente dal processore del sistema). Il
-programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
-Molti linguaggi moderni sono interpretati.
-
-La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
-interpretatore
-da richiamare, con degli argomenti facoltativi che saranno passati a
-quell'interpretatore sulla riga di comando. Il sistema operativo quindi
-richiama l'interpretatore con gli argomenti dati e con l'intera lista di
-argomenti con cui era stato invocato il programma. Il primo argomento nella
-lista @`e l'intero @value{FN} del programma @command{awk}. Il resto della lista
-degli argomenti contiene opzioni per @command{awk}, oppure @value{DF}, o
-entrambi. (Si noti che in molti sistemi @command{awk} pu@`o essere trovato in
-@file{/usr/bin} invece che in @file{/bin}.)
-
-Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
-32 caratteri. Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
-
-Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
-dopo il percorso del comando @command{awk}. Non funziona. Il sistema
-operativo tratta il resto della riga come un argomento solo, e lo passa ad
-@command{awk}.
-Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni probabilit@`a un
-messaggio di errore di qualche tipo da @command{awk}.
-
-@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
-@cindex portabilit@`a, variabile @code{ARGV}
-Infine, il valore di @code{ARGV[0]}
-(@pxref{Variabili predefinite})
-pu@`o variare a seconda del sistema operativo.
-Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
-di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
-dello @dfn{script} dell'utente (@samp{consiglio}). @value{DARKCORNER}
-Non bisogna fidarsi del valore di @code{ARGV[0]}
-per ottenere il nome del proprio @dfn{script}.
-@end cartouche
-@end ifnotdocbook
-
-@node Commenti
-@subsection Documentare programmi @command{gawk}.
-@cindex @code{#} (cancelletto), commentare
-@cindex cancelletto (@code{#}), commentare
-@cindex commentare
-@cindex programmi @command{awk}, documentazione
-
-Un @dfn{commento} @`e del testo incluso in un programma per aiutare le
-persone che lo leggeranno; non @`e parte del programma eseguibile vero e
-proprio. I commenti possono spiegare cosa fa il programma e come funziona.
-Quasi tutti i linguaggi di programmazione possono contenere commenti, poich@'e
-i programmi sono solitamente difficili da comprendere senza di essi.
-
-Nel linguaggio @command{awk}, un commento inizia con il segno del
-cancelletto (@samp{#}) e continua fino alla fine della riga.
-Il @samp{#} non deve necessariamente essere il primo carattere della riga.
-Il linguaggio @command{awk} ignora il resto di una riga dopo il carattere
-cancelletto.
-Per esempio, potremmo mettere quel che segue in @file{consiglio}:
-
-@example
-# Questo programma stampa uno scherzoso consiglio amichevole.
-# Aiuta a far passare la paura del computer agli utenti novelli.
-BEGIN @{ print "Non v'allarmate!" @}
-@end example
-
-Si possono mettere dei commenti nei programmi @command{awk} usa-e-getta da
-digitare direttamente da tastiera, ma ci@`o solitmanete non serve molto; il
-fine di un commento @`e di aiutare l'utente o qualcun altro a comprendere il
-programma, quando lo rilegge in un secondo tempo.
-
-@cindex protezione, per piccoli programmi awk
-@cindex apice singolo (@code{'}), vs.@: apostrofo
-@cindex @code{'} (apice singolo), vs.@: apostrofo
-@quotation ATTENZIONE
-Come detto in
-@ref{Monouso},
-si possono includere programmi di dimensioni da piccole a medie tra apici
-singoli, per mantenere compatti i propri @dfn{script} di shell
-autocontenuti. Nel far questo, @emph{non} bisogna inserire un apostrofo
-(ossia un apice singolo) in un commento, (o in qualsiasi altra parte del
-vostro programma). La shell interpreta gli apici singoli come delimitatori
-di chiusura dell'intero programma. Di conseguenza, solitamente la shell
-emette un messaggio riguardo ad apici presenti in numero dispari, e se
-@command{awk} viene comunque eseguito, @`e probabile che stampi strani
-messaggi di errori di sintassi.
-Per esempio, nel caso seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Ciao" @} # un'idea brillante'}
->
-@end example
-
-La shell considera il secondo apice singolo come delimitatore del testo
-precedente, e trova che un nuovo testo tra apici ha inizio verso la fine
-della riga di comando. A causa di ci@`o emette una richiesta secondaria di
-input, e si mette in attesa di ulteriore input.
-Con il comando @command{awk} Unix, se si chiude l'ulteriore stringa tra
-apici singoli il risultato @`e il seguente:
-
-@example
-$ @kbd{awk '@{ print "Ciao" @} # un'idea brillante'}
-> @kbd{'}
-@error{} awk: fatale: non riesco ad aprire file `brillante'
-@error{} in lettura (File o directory non esistente)
-@end example
-
-@cindex @code{\} (barra inversa)
-@cindex barra inversa (@code{\})
-Mettere una barra inversa prima dell'apice singolo in @samp{un'idea} non
-risolverebbe, poich@'e le barre inverse non sono speciali all'interno di apici
-singoli.
-La prossima @value{SUBSECTION} descrive le regole di protezione della shell.
-@end quotation
-
-@node Protezione
-@subsection Uso di apici nella shell.
-@cindex shell, uso di apici, regole per
-
-@menu
-* Doppi apici in DOS:: Passaggio di apici in file .BAT Windows.
-@end menu
-
-Per programmi @command{awk} di lunghezza da corta a media spesso conviene
-digitare il programma sulla riga di comando @command{awk}.
-La maniera migliore per farlo @`e racchiudere l'intero programma tra apici
-singoli.
-Questo vale sia che si digiti il programma interattivamente su
-richiesta della shell, sia che lo si scriva come parte di uno @dfn{script}
-di shell di maggiori dimensioni:
-
-@example
-awk '@var{testo del programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex shell, uso di apici, regole per
-@cindex Bourne shell, uso di apici, regole per la
-Quando si lavora con la shell, non guasta avere una conoscenza
-di base sulle regole per l'uso di apici nella shell. Le regole
-seguenti valgono solo per shell in stile Bourne (come Bash, la
-Bourne-Again shell). Se si usa la C shell, si avranno regole differenti.
-
-Prima di immergerci nelle regole, introduciamo un concetto che ricorre
-in tutto questo @value{DOCUMENT}, che @`e quello della stringa @dfn{null},
-o vuota.
-
-La stringa nulla @`e una variabile, di tipo carattere, che non ha un valore.
-In altre parole, @`e vuota. Nei programmi @command{awk} si scrive cos@`{@dotless{i}}:
-@code{""}. Nella shell la si pu@`o scrivere usando apici sia singoli
-che doppi: @code{""} oppure @code{''}. Sebbena la stringa nulla non contenga
-alcun carattere, essa esiste lo stesso. Si consideri questo comando:
-
-@example
-$ @kbd{echo ""}
-@end example
-
-@noindent
-Qui, il comando @command{echo} riceve un solo argomento, anche se
-quell'argomento non contiene alcun carattere. Nel resto di questo
-@value{DOCUMENT}, usiamo indifferentemente i termini @dfn{stringa nulla}
-e @dfn{stringa vuota}. Ora, proseguiamo con le regole relative agli apici:
-
-
-@itemize @value{BULLET}
-@item
-Elementi tra apici possono essere concatenati con elementi non tra apici.
-La shell converte il tutto in un singolo argomento da passare
-al comando.
-
-@item
-Mettere una barra inversa (@samp{\}) prima di qualsiasi singolo carattere
-lo protegge. La shell toglie la barra inversa e passa il carattere
-protetto al comando.
-
-@item
-@cindex @code{\} (barra inversa), nei comandi di shell
-@cindex barra inversa (@code{\}), nei comandi di shell
-@cindex apice singolo (@code{'}), nei comandi di shell
-@cindex @code{'} (apice singolo), nei comandi di shell
-Gli apici singoli proteggono qualsiasi cosa sia inclusa tra un apice di
-apertura e uno di chiusura.
-La shell non interpreta il testo protetto, il quale viene passato cos@`{@dotless{i}} com'@`e
-al comando.
-@`E @emph{impossibile} inserire un apice singolo in un testo racchiuso fra
-apici singoli. Potete trovare in
-@ref{Commenti}
-un esempio di cosa succede se si prova a farlo.
-
-@item
-@cindex doppio apice (@code{"}), nei comandi shell
-@cindex @code{"} (doppio apice), nei comandi shell
-I doppi apici proteggono la maggior parte di quel che @`e racchiuso tra i
-doppi apici di apertura e quelli di chiusura.
-La shell effettua almeno la sostituzione di variabili e di comandi
-sul testo racchiuso tra doppi apici.
-Shell differenti possono fare ulteriori tipi di elaborazione
-sul testo racchiuso tra doppi apici.
-
-Poich@'e alcuni caratteri all'interno di un testo racchiuso tra doppi apici
-sono interpretati dalla shell, essi devono essere @dfn{protetti} all'interno
-del testo stesso. Sono da tener presenti i caratteri
-@samp{$}, @samp{`}, @samp{\}, e @samp{"}, tutti i quali devono essere
-preceduti da una barra inversa quando ricorrono all'interno di un testo
-racchiuso tra doppi apici, per poter essere passati letteralmente al
-programma. (La barra inversa viene tolta prima del passaggio al programma.)
-Quindi, l'esempio visto
-@ifnotinfo
-precedentemente
-@end ifnotinfo
-in @ref{Leggere dal terminale}:
-
-@example
-awk 'BEGIN @{ print "Non v\47allarmate!" @}'
-@end example
-
-@noindent
-si potrebbe scrivere invece cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk "BEGIN @{ print \"Non v'allarmate!\" @}"}
-@print{} Non v'allarmate!
-@end example
-
-@cindex apice singolo (@code{'}), con doppio apice
-@cindex @code{'} (apice singolo), con doppio apice
-Va notato che l'apice singolo non @`e speciale all'interno di un testo
-racchiuso tra doppi apici.
-
-@item
-Le stringhe nulle sono rimosse se presenti come parte di un argomento
-non-nullo sulla riga di comando, mentre oggetti esplicitamente nulli
-sono mantenuti come tali.
-Per esempio, per richiedere che il separatore di campo @code{FS} sia
-impostato alla stringa nulla, digitare:
-
-@example
-awk -F "" '@var{programma}' @var{file} # corretto
-@end example
-
-@noindent
-@cindex stringa nulla come argomento a @command{gawk}, protezione della
-Non @`e invece da usare:
-
-@example
-awk -F"" '@var{programma}' @var{file} # errato!
-@end example
-
-@noindent
-Nel secondo caso, @command{awk} tenta di usare il nome del programma come
-valore di @code{FS}, e il primo @value{FN} come testo del programma!
-Ci@`o come minimo genera un errore di sintassi, e un comportamento confuso nel
-caso peggiore.
-@end itemize
-
-@cindex protezione, nella riga di comando di @command{gawk}, trucchi per
-Mischiare apici singoli e doppi @`e difficile. Occorre utilizzare
-trucchi della shell per gli apici, come questi:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo. <'"'"'>" @}'}
-@print{} Questo @`e un apice singolo. <'>
-@end example
-
-@noindent
-Questo programma stampa tre stringhe tra apici concatenate tra loro.
-La prima e la terza sono rinchiuse tra apici singoli, la seconda tra apici
-doppi.
-
-Quanto sopra pu@`o essere ``semplificato'' cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <'\''>" @}'}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-@noindent
-A voi la scelta del pi@`u leggibile dei due.
-
-Un'altra opzione @`e quella di usare doppi apici, proteggendo i doppi apici
-inclusi, a livello @command{awk}:
-
-@example
-$ @kbd{awk "BEGIN @{ print \"Questo @`e un apice singolo <'>\" @}"}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-@noindent
-Quest'opzione @`e fastidiosa anche perch@'e il doppio apice, la barra inversa e
-il simbolo del dollaro sono molto comuni nei programmi @command{awk} pi@`u
-avanzati.
-
-Una terza opzione @`e quella di usare le sequenze ottali equivalenti
-(@pxref{Sequenze di protezione})
-per i caratteri
-apice singolo e doppio, cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <\47>" @}'}
-@print{} Questo @`e un apice singolo <'>
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un doppio apice <\42>" @}'}
-@print{} Questo @`e un doppio apice <">
-@end example
-
-@noindent
-Questo funziona bene, ma sai dovrebbe commentare chiaramente quel che
-il testo protetto significa.
-
-Una quarta possibilit@`a @`e di usare assegnamenti di variabili sulla riga di
-comando, cos@`{@dotless{i}}:
-
-@example
-@kbd{$ awk -v sq="'" 'BEGIN @{ print "Questo @`e un apice singolo <" sq ">" @}'}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-(Qui, le due stringhe costanti e il valore di @code{sq} sono concatenati in
-un'unica stringa che @`e stampata da @code{print}.)
-
-Se servono veramente sia gli apici singoli che quelli doppi nel proprio
-programma @command{awk}, @`e probabilmente meglio tenerlo in un file separato,
-dove la shell non interferisce, e si potr@`a scrivere quello che si vuole.
-
-@node Doppi apici in DOS
-@subsubsection Doppi apici in file .BAT Windows
-
-@ignore
-Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
-From: jeroen.brink@inter.NL.net
-Subject: (g)awk "contribution"
-To: arnold@skeeve.com
-Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
-
-Hello Arnold,
-
-maybe you can help me out. Found your email on the GNU/awk online manual
-pages.
-
-I've searched hard to figure out how, on Windows, to print double quotes.
-Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
-figured out how to do this myself.
-
-How to print all lines in a file surrounded by double quotes (on Windows):
-
-gawk "{ print \"\042\" $0 \"\042\" }" <file>
-
-Maybe this is a helpfull tip for other (Windows) gawk users. However, i
-don't have a clue as to where to "publish" this tip! Do you?
-
-Kind regards,
-
-Jeroen Brink
-@end ignore
-
-Sebbene questo @value{DOCUMENT} in generale si preoccupi solo di sistemi POSIX
-e della shell POSIX, il problema che stiamo per vedere emerge abbastanza
-spesso presso parecchi utenti, e per questo ne parliamo.
-
-@cindex Brink, Jeroen
-Le ``shell'' nei sistemi Microsoft Windows usaso il carattere doppio apice
-per protezione, e rendono difficile o impossibile inserire un carattere
-doppio apice in uno @dfn{script} scritto su una riga di comando.
-l'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come
-stampare tutte le righe di un file, racchiudendole tra doppi apici:
-
-@example
-gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
-@end example
-
-
-@node File dati di esempio
-@section @value{DDF} per gli esempi
-
-@cindex input file, esempi
-@cindex file di @code{mail-list}
-Molti degli esempi in questo @value{DOCUMENT} hanno come input due @value{DF}
-di esempio. Il primo, @file{mail-list}, contiene una lista di nomi di
-persone, insieme ai loro indirizzi email e a informazioni riguardanti le
-persone stesse.
-Il secondo @value{DF}, di nome @file{inventory-shipped}, contiene
-informazioni riguardo a consegne mensili. In entrambi i file,
-ogni riga @`e considerata come un @dfn{record}.
-
-Nel @file{mail-list}, ogni record contiene il nome di una persona,
-il suo numero di telefono, il suo indirizzo email, e un codice che indica
-la sua relazione con l'autore della lista.
-Le colonne sono allineate usando degli spazi.
-Una @samp{A} nell'ultima colonna indica che quella persona @`e un conoscente
-[Acquaintance]. Una @samp{F} nell'ultima colonna significa che quella
-persona @`e un amico [Friend]. Una @samp{R} vuol dire che quella persona @`e
-un parente [Relative]:
-
-@example
-@c system if test ! -d eg ; then mkdir eg ; fi
-@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi
-@c system if test ! -d eg/data ; then mkdir eg/data ; fi
-@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
-@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
-@c file eg/data/mail-list
-Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-Anthony 555-3412 anthony.asserturo@@hotmail.com A
-Becky 555-7685 becky.algebrarum@@gmail.com A
-Bill 555-1675 bill.drowning@@hotmail.com A
-Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-Camilla 555-2912 camilla.infusarum@@skynet.be R
-Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-Julie 555-6699 julie.perscrutabor@@skeeve.com F
-Martin 555-6480 martin.codicibus@@hotmail.com A
-Samuel 555-3430 samuel.lanceolis@@shu.edu A
-Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@c endfile
-@end example
-
-@cindex file @code{inventory-shipped}
-Il @value{DF} @file{inventory-shipped} contiene
-informazioni sulle consegne effettuate durante l'anno.
-Ogni record contiene il mese, il numero di contenitori verdi spediti,
-il numero di scatole rosse spedite, il numero di borse arancione spedite,
-e il numero di pacchetti blu spediti, in quest'ordine.
-Ci sono 16 record, relativi ai dodici mesi dello scorso anno e ai primi
-quattro mesi dell'anno in corso.
-Una riga vuota separa i data relativi a ciascun anno:
-
-@example
-@c file eg/data/inventory-shipped
-Jan 13 25 15 115
-Feb 15 32 24 226
-Mar 15 24 34 228
-Apr 31 52 63 420
-May 16 34 29 208
-Jun 31 42 75 492
-Jul 24 34 67 436
-Aug 15 34 47 316
-Sep 13 55 37 277
-Oct 29 54 68 525
-Nov 20 87 82 577
-Dec 17 35 61 401
-
-Jan 21 36 64 620
-Feb 26 58 80 652
-Mar 24 75 70 495
-Apr 21 70 74 514
-@c endfile
-@end example
-
-Questi file di esempio sono inclusi nella distribuzione @command{gawk},
-nella directory @file{awklib/eg/data}.
-
-@node Molto semplice
-@section Alcuni esempi molto semplici
-
-I seguenti comandi eseguono un semplice programma @command{awk} che cerca
-nel file in input @file{mail-list} la stringa di caratteri @samp{li} (una
-sequenza di caratteri @`e solitamente chiamato una @dfn{stringa};
-il termine @dfn{stringa} @`e basato su un uso linguistico, del tipo
-``una stringa di perle'' o ``una stringa di luci decorative''):
-
-@example
-awk '/li/ @{ print $0 @}' mail-list
-@end example
-
-@noindent
-Quando si incontra una riga che contiene @samp{li}, la si stampa, perch@'e
-@w{@samp{print $0}} significa "stampa la riga corrente". (Lo scrivere solo
-@samp{print} ha lo stesso significato, quindi avremmo anche potuto
-limitarci a fare cos@`{@dotless{i}}).
-
-Si sar@`a notato che delle barre (@samp{/}) delimitano la stringa @samp{li}
-nel programma @command{awk}. Le barre indicano che @samp{li} @`e il
-modello da ricercare. Questo tipo di notazione @`e definita come
-@dfn{espressione regolare}, e sar@`a trattata pi@`u avanti in maggior dettaglio
-@iftex
-(@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}).
-@end ifnottex
-Il modello pu@`o corrispondere anche solo a una parte di una parola.
-Ci sono
-apici singoli che racchiudono il programma @command{awk} in modo che la
-shell non interpreti alcuna parte di esso come un carattere speciale della
-shell.
-
-Questo @`e quello che il programma stampa:
-
-@example
-$ @kbd{awk '/li/ @{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@end example
-
-@cindex azioni, default
-@cindex criteri di ricerca, default
-In una regola @command{awk}, il criterio di selezione o l'azione possono
-essere omessi, ma non entrambi. Se il criterio @`e omesso, l'azione viene
-applicata a @emph{ogni} riga dell'input.
-Se l'azione viene omessa, per default si stampano tutte le righe che
-sono individuate dal criterio di selezione.
-
-@cindex azioni, omesse
-Quindi, si potrebbe omettere l'azione (l'istruzione @code{print} e le
-graffe) nell'esempio precedente e il risultato sarebbe lo stesso:
-@command{awk} stampa tutte le righe che corrispondono al criterio di
-ricerca @samp{li}. Per confronto, omettendo l'istruzione @code{print} ma
-lasciando le graffe si richiede un'azione nulla, che non fa nulla (cio@`e non
-stampa alcuna riga).
-
-@cindex programmi @command{awk}, esempi molto corti
-Molti programmi @command{awk} pratici sono lunghi solo una o due righe.
-Qui sotto troviamo una collezione di programmi utili e corti, per iniziare.
-Alcuni di questi programmi contengono elementi del linguaggio che non sono
-ancora stati spiegati. (La descrizione del programma fornisce una buona
-idea di quel che si vuole ottenere, ma occorre leggere il resto del
-@value{DOCUMENT} per divenire esperti in @command{awk}!)
-Molti degli esempi usano un @value{DF} di nome @file{data}. Questo serve solo
-a indicare la posizione del nome; se questi programmi devono venir usati per
-se stessi, sostituire i propri @value{FNS} al posto di @file{data}.
-Per futura memoria, si noti che spesso c'@`e pi@`u di un modo per fare qualcosa
-in @command{awk}. In un altro momento, si potrebbe tornare a guardare questi
-esempi per vedere se si riescono a trovare modi differenti per fare le stesse
-cose mostrate qui appresso:
-
-@itemize @value{BULLET}
-@item
-Stampare ogni riga lunga pi@`u di 80 caratteri:
-
-@example
-awk 'length($0) > 80' data
-@end example
-
-L'unica regola presente ha un'espressione di relazione come modello
-e non ha azione---quindi applica l'azione di default, stampando il record.
-
-@item
-Stampare la lunghezza della riga in input pi@`u lunga:
-
-@example
-awk '@{ if (length($0) > max) max = length($0) @}
- END @{ print max @}' data
-@end example
-
-Il codice associato a @code{END} viene eseguito dopo che tutto
-l'input @`e stato letto; @`e l'altra faccia della medaglia di @code{BEGIN}.
-
-@cindex programma @command{expand}
-@cindex @command{expand}, programma
-@item
-Stampare la lunghezza della riga pi@`u lunga in @file{data}:
-
-@example
-expand data | awk '@{ if (x < length($0)) x = length($0) @}
- END @{ print "la lunghezza massima di una riga @`e" x @}'
-@end example
-
-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
-otto spazi bianchi in fase di stampa.]
-
-@item
-Stampare ogni riga che abbia almeno un campo:
-
-@example
-awk 'NF > 0' data
-@end example
-
-Questa @`e una maniera facile per eliminare le righe vuote dal file (o
-piuttosto, per creare un nuovo file, simile al vecchio, ma nel quale le
-linee vuote sono state tolte).
-
-@item
-Stampare sette numeri casuali compresi tra 0 e 100, inclusi:
-
-@example
-awk 'BEGIN @{ for (i = 1; i <= 7; i++)
- print int(101 * rand()) @}'
-@end example
-
-@item
-Stampare il numero totale di byte usato da un @var{elenco-file}:
-
-@example
-ls -l @var{elenco-file} | awk '@{ x += $5 @}
- END @{ print "byte totali: " x @}'
-@end example
-
-@item
-Stampare il numero totale di kilobyte usati da @var{elenco-file}:
-
-@c Don't use \ continuation, not discussed yet
-@c Remember that awk does floating point division,
-@c no need for (x+1023) / 1024
-@example
-ls -l @var{elenco-file} | awk '@{ x += $5 @}
- END @{ print "K-byte totali:", x / 1024 @}'
-@end example
-
-@item
-Stampare una lista in ordine alfabetico di tutti gli utenti del sistema
-[Unix]:
-
-@example
-awk -F: '@{ print $1 @}' /etc/passwd | sort
-@end example
-
-@item
-Contare le righe in un file:
-
-@example
-awk 'END @{ print NR @}' data
-@end example
-
-@item
-Stampare le righe pari nel @value{DF}:
-
-@example
-awk 'NR % 2 == 0' data
-@end example
-
-Se aveste usato invece l'espressione @samp{NR % 2 == 1},
-il programma avrebbe stampato le righe dispari.
-@end itemize
-
-@node Due regole
-@section Un esempio che usa due regole
-@cindex programmi @command{awk}
-
-Il programma @command{awk} legge il file in input una riga alla volta.
-Per ogni riga @command{awk} controlla la corrispondenza con ogni regola.
-Se viene trovata pi@`u di una corrispondenza, vengono eseguite altrettante
-azioni, nell'ordine in cui appaiono nel programma @command{awk}.
-Se non viene trovata nessuna corrispondenza, non viene eseguita alcuna azione.
-
-Dopo aver elaborato tutte le regole che hanno corrispondenza con la riga (e
-pu@'o darsi che nessuna corrisponda), @command{awk} legge la riga successiva. Comunque
-@pxref{Istruzione next},
-@ifdocbook
-e @ref{Istruzione Nextfile}.)
-@end ifdocbook
-@ifnotdocbook
-e anche @pxref{Istruzione nextfile}.)
-@end ifnotdocbook
-Si prosegue cos@`{@dotless{i}} finch@'e il programma raggiunge la fine del file.
-Per esempio, il seguente programma @command{awk} contiene due regole:
-
-@example
-/12/ @{ print $0 @}
-/21/ @{ print $0 @}
-@end example
-
-@noindent
-La prima regola ha la stringa @samp{12} da cercare e
-@samp{print $0} come
-azione. La seconda regola ha la
-stringa @samp{21} da cercare e ha ancora @samp{print $0} come azione.
-L'azione di ciascuna regola @`e racchiusa in una coppia di parentesi graffe.
-
-Questo programma stampa ogni riga che contiene la stringa
-@samp{12} @emph{oppure} la stringa @samp{21}. Se una riga contiene entrambe
-le stringhe, @`e stampata due volte, una volta per ogni regola.
-
-Questo @`e ci@`o che capita se eseguiamo questo programma sui nostri @value{DF},
-@file{mail-list} e @file{inventory-shipped}:
-
-@example
-$ @kbd{awk '/12/ @{ print $0 @}}
-> @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
-@print{} Anthony 555-3412 anthony.asserturo@@hotmail.com A
-@print{} Camilla 555-2912 camilla.infusarum@@skynet.be R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@print{} Jan 21 36 64 620
-@print{} Apr 21 70 74 514
-@end example
-
-@noindent
-Si noti che la riga che inizia con @samp{Jean-Paul}
-nel file @file{mail-list}
-@`e stata stampata due volte, una volta per ogni regola.
-
-@node Maggiore sofisticazione
-@section Un esempio pi@`u complesso
-
-Dopo aver imparato a eseguire alcuni semplici compiti, vediamo cosa possono
-fare i tipici programmi @command{awk}.
-Questo esempio mostra come @command{awk} pu@`o essere usato per riassumere,
-selezionare e riordinare l'output di un altro comando. Sono usate
-funzionalit@`a di cui non si @`e ancora parlato, quindi non ci si deve preoccupare
-se alcuni dettagli risulteranno oscuri:
-
-@example
-ls -l | awk '$6 == "Nov" @{ somma += $5 @}
- END @{ print somma @}'
-@end example
-
-@cindex comando @command{ls}
-Questo comando stampa il numero totale di byte in tutti i file contenuti
-nella directory corrente, la cui data di modifica @`e novembre (di qualsiasi
-anno). La parte @w{@samp{ls -l}} dell'esempio @`e un comando di sistema che
-fornisce un elenco dei file in una directory, con anche la dimensione di
-ogni file e la data di ultima modifica. Il suo output @`e del tipo:
-
-@example
--rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile
--rw-r--r-- 1 arnold user 10809 Nov 7 13:03 awk.h
--rw-r--r-- 1 arnold user 983 Apr 13 12:14 awk.tab.h
--rw-r--r-- 1 arnold user 31869 Jun 15 12:20 awkgram.y
--rw-r--r-- 1 arnold user 22414 Nov 7 13:03 awk1.c
--rw-r--r-- 1 arnold user 37455 Nov 7 13:03 awk2.c
--rw-r--r-- 1 arnold user 27511 Dec 9 13:07 awk3.c
--rw-r--r-- 1 arnold user 7989 Nov 7 13:03 awk4.c
-@end example
-
-@noindent
-@cindex continuazione di riga, nella C shell
-Il primo campo contiene le autorizzazioni di lettura/scrittura [r/w], il
-secondo il numero dei collegamenti al file [cio@`e il numero di nomi con cui
-il file @`e conosciuto], e il terzo campo identifica il proprietario del file.
-Il quarto campo identifica il gruppo a cui appartiene il file.
-Il quinto campo contiene la dimensione del file, in byte.
-Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora,
-rispettivamente, in cui il file @`e stato modificato. Infine, il nono campo
-contiene il @value{FN}.
-
-@c @cindex automatic initialization
-@cindex inizializzazione automatica
-L'espressione @samp{$6 == "Nov"} nel nostro programma @command{awk} controlla
-se il sesto campo dell'output di @w{@samp{ls -l}} corrisponda alla stringa
-@samp{Nov}. Ogni volta che una riga ha la stringa
-@samp{Nov} come suo sesto campo, @command{awk} esegue l'azione
-@samp{somma += $5}. Questo aggiunge il quinto campo (la dimensione del file)
-alla variabile @code{somma}. Come risultato, quando @command{awk} ha finito
-di leggere tutte le righe in input, @code{somma} contiene la somma totale
-delle dimensioni dei file che corrispondono al criterio di ricerca.
-(Ci@`o funziona contando sul fatto che le variabili @command{awk} sono
-automaticamente inizializzate a zero.)
-
-Dopo che l'ultima riga dell'output di @command{ls} @`e stata elaborata, la
-regola @code{END} viene eseguita e viene stampato il valore di @code{somma}.
-In questo esempio, il valore di @code{somma} @`e 80600.
-
-Queste tecniche pi@`u avanzate di @command{awk} sono trattate in
-@value{SECTIONS}
-successive (@pxref{Panoramica sulle azioni}). Prima di poter passare a una
-programmazione pi@`u avanzata con @command{awk}, @`e necessario sapere come
-@command{awk} interpreta i file in input e visualizza quelli in output.
-Modificando campi e usando l'istruzione @code{print} @`e possibile produrre
-dei rapporti molto utili ed esteticamente gradevoli.
-
-@node Istruzioni/Righe
-@section Istruzioni e righe in @command{awk}
-@cindex interruzioni di riga
-@cindex andare a capo
-
-Molto spesso, ogni riga di un programma @command{awk} @`e un'istruzione a s@'e
-stante o una regola isolata, come:
-
-@example
-awk '/12/ @{ print $0 @}
- /21/ @{ print $0 @}' mail-list inventory-shipped
-@end example
-
-@cindex @command{gawk}, andare a capo
-Comunque, @command{gawk} ignora i ritorni a capo dopo ognuno di questi
-simboli e istruzioni:
-
-@example
-, @{ ? : || && do else
-@end example
-
-@noindent
-Un ritorno a capo in ogni altro punto del programma @`e considerato come la
-fine di un'istruzione.@footnote{Il @samp{?} e i @samp{:} elencati sopra sono
-usati nell'espressione condizionale in tre parti descritta in
-@ref{Espressioni condizionali}.
-Il cambio di riga dopo @samp{?} e i @samp{:} @`e un'estensione minore in
-@command{gawk}; specificando @option{--posix} come opzione
-(@pxref{Opzioni}), quest'estensione non @`e valida.}
-
-@cindex @code{\} (barra inversa), continuazione di riga e
-@cindex barra inversa (@code{\}), continuazione di riga e
-Volendo dividere una sola istruzione su due righe in un punto in cui
-andando a capo sarebbe considerata conclusa, @`e possibile @dfn{continuare}
-nella riga successiva terminando la prima riga con un carattere di
-barra inversa (@samp{\}). La barra inversa dev'essere l'ultimo carattere
-sulla riga, per essere riconosciuto come un carattere di continuazione.
-Una barra inversa @`e consentita in ogni parte dell'istruzione, anche in mezzo
-a una stringa o a un'espressione regolare. Per esempio:
-
-@example
-awk '/Questa espressione regolare @`e troppo lunga, quindi\
- la continuiamo sulla riga seguente/ @{ print $1 @}'
-@end example
-
-@noindent
-@cindex portabilit@`a, continuazione di riga con barra inversa e
-Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri
-programmi di esempio. @command{gawk} non pone limiti alla lunghezza di
-una riga, quindi la continuazione tramite barra inversa non @`e mai strettamente
-necessaria; serve soltanto a migliorare la leggibilit@`a del programma.
-Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto
-concise molte istruzioni nei programmi presentati in questo @value{DOCUMENT}.
-La continuazione tramite barra inversa @`e molto utile quando il proprio
-programma @command{awk} si trova in un file sorgente separato, invece di
-essere immesso nella riga di comando. Si noti anche che molte implementazioni
-di @command{awk} presentano delle differenze su dove @`e possibile usare
-la continuazione tramite barra inversa. Per esempio, potrebbero non
-consentire di spezzare una costante di tipo stringa usando la continuazione
-tramite barra inversa. Quindi, per ottenere la massima portabilit@`a dei
-propri programmi @command{awk}, @`e meglio non spezzare le righe nel
-mezzo di un'espressione regolare o di una stringa.
-@c 10/2000: gawk, mawk, and current bell labs awk allow it,
-@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though! sigh.
-
-@cindex comando @command{csh}
-@cindex barra inversa (@code{\}), continuazione di riga e, in @command{csh}
-@cindex @code{\} (barra inversa), continuazione di riga e, in @command{csh}
-@quotation ATTENZIONE
-@emph{la continuazione tramite barra inversa non funziona come sopra descritto
-nella C shell.} Funziona per programmi @command{awk} contenuti in file e
-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
-indicata con una barra inversa. Per esempio:
-
-@example
-% @kbd{awk 'BEGIN @{ \}
-? @kbd{ print \\}
-? @kbd{ "ciao, mondo" \}
-? @kbd{@}'}
-@print{} ciao, mondo
-@end example
-
-@noindent
-Qui, il @samp{%} e il @samp{?} sono i prompt primario e secondario della
-C shell, analogamente a quelli usati nella shell standard @samp{$} e @samp{>}.
-
-Si confronti l'esempio precedente, come viene scritto in una shell conforme
-a POSIX:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{print \}
-> @kbd{"ciao, mondo"}
-> @kbd{@}'}
-@print{} ciao, mondo
-@end example
-@end quotation
-
-@command{awk} @`e un linguaggio orientato alla riga. L'azione relativa a ogni
-regola deve iniziare sulla stessa riga del criterio di selezione. Per avere
-criterio di selezione e azione su righe separate, si
-@emph{deve} usare la continuazione tramite barra inversa; non si pu@`o fare
-diversamente.
-
-@cindex barra inversa (@code{\}), continuazione di riga, commenti e
-@cindex @code{\} (barra inversa), continuazione di riga, commenti e
-@cindex commenti, continuazione di riga con barra inversa e i
-Un'altra cosa da tener presente @`e che la continuazione tramite barra inversa e
-i commenti non possono essere frammisti. Non appena @command{awk} incontra
-un @samp{#} che inizia un commento, ignora @emph{tutto} il resto della riga.
-Per esempio:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "Non allarmarti" # una amichevole \}
-> @kbd{ regola BEGIN}
-> @kbd{@}'}
-@error{} gawk: riga com.:2: regola BEGIN
-@error{} gawk: riga com.:2: ^ syntax error
-@end example
-
-@noindent
-In questo caso, parrebbe che la barra inversa continui il commento sulla riga
-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.
-
-@cindex istruzioni multiple
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Quando le istruzioni @command{awk} all'interno di una regola sono brevi, si
-potrebbe metterne pi@`u d'una su una riga sola. Ci@`o @`e possibile separando le
-istruzioni con un punto e virgola (@samp{;}).
-Questo vale anche per le regole stesse.
-Quindi, il programma visto all'inizio di
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION}
-poteva essere scritto anche cos@`{@dotless{i}}:
-
-@example
-/12/ @{ print $0 @} ; /21/ @{ print $0 @}
-@end example
-
-@quotation NOTA BENE
-La possibilit@`a che pi@`u regole coesistano sulla stessa riga, se sono separate
-da un punto e virgola, non esisteva nel linguaggio @command{awk} originale;
-@`e stata aggiunta per congruenza con quanto @`e consentito per le istruzioni
-all'interno di un'azione.
-@end quotation
-
-@node Altre funzionalit@`a
-@section Altre funzionalit@`a di @command{awk}
-
-@cindex variabili
-Il linguaggio @command{awk} mette a disposizione un numero di variabili
-@dfn{built-in}, o @dfn{predefinite}, che il programma dell'utente pu@`o usare
-per ottenere informazioni da @command{awk}. Ci sono pure altre variabili
-che il programma pu@`o impostare, per definire come @command{awk} deve
-gestire i dati.
-
-Inoltre, @command{awk} mette a disposizione parecchie funzioni predefinite
-[@dfn{built-in}] per effettuare calcoli di tipo comune e operazioni che
-agiscono sulle stringhe di caratteri.
-@command{gawk} mette a disposizione funzioni predefinite per gestire le
-marcature temporali, per effettuare manipolazioni a livello di bit, per
-tradurre stringhe al momento dell'esecuzione del programma
-(internazionalizzazione), per determinare qual @`e il tipo di una variabile,
-e per ordinare dei vettori.
-
-Nel seguito della presentazione del linguaggio @command{awk}, saranno
-introdotte molte delle variabili e parecchie funzioni. Esse sono
-descritte sistematicamente in @ref{Variabili predefinite} e in
-@ref{Funzioni}.
-
-@node Quando
-@section Quando usare @command{gawk}
-
-@cindex @command{awk}, uso di
-Ora che abbiamo visto qualcosa di quel che @command{awk} @`e in grado di fare,
-ci si potr@`a chiedere come @command{awk} potrebbe tornare utile. Usando
-programmi di utilit@`a, criteri di ricerca sofisticati, separatori
-di campo, istruzioni aritmetiche, e altri criteri di selezione, @`e possibile
-produrre degli output molto pi@`u complessi. Il linguaggio @command{awk} @`e
-molto utile per fornire dei tabulati partendo da grandi quantit@`a di dati
-grezzi, per esempio riassumendo informazioni dall'output di altri
-programmi di utilit@`a come @command{ls}.
-(@xref{Maggiore sofisticazione}.)
-
-I programmi scritti con @command{awk} sono normalmente molto pi@`u
-corti dei loro equivalenti in altri linguaggi. Ci@`o rende i programmi
-@command{awk} facili da comporre e da utilizzare. Spesso i programmi
-@command{awk} possono essere scritti al volo a terminale, usati una volta sola
-e buttati via. Poich@'e i programmi @command{awk} sono interpretati, si pu@`o
-evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico
-dello sviluppo software, ossia edita-compila-prova-correggi.
-
-@cindex Brian Kernighan, @command{awk} di
-In @command{awk} sono stati scritti programmi complessi, compreso un assembler
-completo, pluri-piattaforma per
-@ifclear FOR_PRINT
-@iftex
-microprocessori a 8-bit (@pxrefil{Glossario}, per maggiori informazioni),
-@end iftex
-@ifnottex
-microprocessori a 8-bit (@pxref{Glossario}, per maggiori informazioni),
-@end ifnottex
-@end ifclear
-@ifset FOR_PRINT
-microprocessori a 8-bit,
-@end ifset
-e un assembler di microcodice per un computer dedicato esclusivamente
-al linguaggio Prolog.
-Le possibilit@`a dell'originale @command{awk} erano messe a dura prova
-da programmi di questa complessit@`a, ma le versioni moderne sono pi@`u robuste.
-
-@cindex programmi @command{awk}, complessi
-Se capita di scrivere programmi @command{awk} pi@`u lunghi di, diciamo,
-qualche centinaio di righe, si potrebbe considerare la possibilit@`a di usare
-un linguaggio di programmazione differente da @command{awk}.
-La shell consente di ricercare stringhe ed espressioni regolari; inoltre
-consente di usare in maniera efficace i comandi di utilit@`a del sistema.
-Python offre un piacevole equilibrio tra la facilit@`a di una programmazione
-ad alto livello, e la possibilit@`a di interagire a livello di sistema
-operativo.@footnote{Altri linguaggi di @dfn{script} popolari comprendono Ruby
-e Perl.}
-
-@node Sommario dell'introduzione
-@section Sommario
-
-@c FIXME: Review this chapter for summary of builtin functions called.
-@itemize @value{BULLET}
-@item
-I programmi in @command{awk} consistono di coppie di
-@var{criterio di ricerca}--@var{azione}.
-
-@item
-Un'@var{azione} senza una @var{condizione di ricerca} viene sempre eseguita.
-L'@var{azione} di default per una condizione mancante @`e @samp{@{ print $0 @}}.
-
-@item
-Usare
-@samp{awk '@var{programma}' @var{file}}
-oppure
-@samp{awk -f @var{file-programma} @var{file}}
-per eseguire @command{awk}.
-
-@item
-Si pu@`o usare la notazione speciale @samp{#!} nella prima riga per creare
-programmi @command{awk} che siano eseguibili direttamente.
-
-@item
-I commenti nei programmi @command{awk} iniziano con @samp{#} e continuano
-fino alla fine della stessa riga.
-
-@item
-Prestare attenzione ai problemi con gli apici nei programmi @command{awk}
-che facciano parte di uno @dfn{script} della shell (o di un file .BAT di
-MS-Windows).
-
-@item
-Si pu@`o usare la continuazione tramite barra inversa per continuare righe di
-codice sorgente. Le righe sono continuate automaticamente dopo i simboli
-virgola, parentesi aperta, punto interrogativo, punto e virgola,
-@samp{||}, @samp{&&}, @code{do} ed @code{else}.
-@end itemize
-@node Invocare Gawk
-@chapter Eseguire @command{awk} e @command{gawk}
-
-Questo @value{CHAPTER} tratta di come eseguire @command{awk}, delle opzioni da
-riga di comando, sia quelle dello standard POSIX che quelle specifiche di
-@command{gawk}, e di cosa fanno @command{awk} e @command{gawk} con gli
-argomenti che non sono opzioni.
-Prosegue poi spiegando come @command{gawk} cerca i file sorgenti,
-leggendo lo standard input assieme ad altri file, le variabili d'ambiente di
-@command{gawk}, lo stato di ritorno di @command{gawk}, l'uso dei file inclusi,
-e opzioni e/o funzionalit@`a obsolete e non documentate.
-
-Molte delle opzioni e funzionalit@`a qui descritte sono trattate con
-maggior dettaglio nei capitoli successivi del @value{DOCUMENT}; gli argomenti
-presenti in questo @value{CHAPTER} che al momento non interessano si possono
-tranquillamente saltare.
-
-@menu
-* Riga di comando:: Come eseguire @command{awk}.
-* Opzioni:: Opzioni sulla riga di comando e loro
- significato.
-* Altri argomenti:: Nomi dei file in input e assegnamento di
- valori a variabili.
-* Specificare lo standard input:: Come specificare lo standard input insieme ad
- altri file.
-* Variabili d'ambiente:: Le variabili d'ambiente usate da
- @command{gawk}.
-* Codice di ritorno:: Il codice di ritorno all'uscita da
- @command{gawk}.
-* Includere file:: Come includere altri file nel proprio
- programma.
-* Caricare librerie condivise:: Caricare librerie condivise nel
- proprio programma.
-* Parti obsolete:: Opzioni e/o funzionalit@`a obsolete.
-* Non documentato:: Opzioni e funzionalit@`a non documentate.
-* Sommario invocazione:: Sommario invocazione.
-@end menu
-
-@node Riga di comando
-@section Come eseguire @command{awk}
-@cindex riga di comando, eseguire @command{awk} da
-@cindex @command{awk}, eseguire
-@cindex argomenti, riga di comando, eseguire @command{awk}
-@cindex opzioni sulla riga di comando, eseguire @command{awk}
-
-Ci sono due modi di eseguire @command{awk}: con un programma esplicito o con
-uno o pi@`u file di programma. Qui @`e mostrata la sintassi di entrambi; le voci
-racchiuse tra [@dots{}] sono opzionali:
-
-@display
-@command{awk} [@var{opzioni}] @option{-f} @var{file_di _programma} [@option{--}] @var{file} @dots{}
-@command{awk} [@var{opzioni}] [@option{--}] @code{'@var{programma}'} @var{file} @dots{}
-@end display
-
-@cindex GNU, opzioni estese
-@cindex estese, opzioni
-@cindex opzioni estese
-In aggiunta alle tradizionali opzioni di una sola lettera in stile POSIX,
-@command{gawk} consente anche le opzioni estese GNU.
-
-@cindex angolo buio, invocare @command{awk}
-@cindex @dfn{lint}, controlli con programma vuoto
-@`E possibile invocare @command{awk} con un programma vuoto:
-
-@example
-awk '' file_dati_1 file_dati_2
-@end example
-
-@cindex @option{--lint}, opzione
-@noindent
-Fare cos@`{@dotless{i}} ha comunque poco senso; @command{awk} termina
-silenziosamente quando viene fornito un programma vuoto.
-@value{DARKCORNER}
-Se @`e stato specificato @option{--lint} sulla riga di comando,
-@command{gawk} emette un avviso che avverte
-che il programma @`e vuoto.
-
-@node Opzioni
-@section Opzioni sulla riga di comando
-@cindex opzioni sulla riga di comando
-@cindex riga di comando, opzioni
-@cindex GNU, opzioni estese
-@cindex opzioni estese
-
-Le opzioni sono precedute da un trattino e consistono in un unico carattere.
-Le opzioni estese in stile GNU sono precedute da un doppio trattino e
-consistono in una parola
-chiave. La parola chiave pu@`o essere abbreviata, a condizione che
-l'abbreviazione identifichi univocamente l'opzione. Se l'opzione prevede un
-argomento, la parola chiave @`e immediatamente seguita da un segno di uguale
-(@samp{=}) e dal valore dell'argomento, oppure la parola chiave e il valore
-dell'argomento sono separati da spazi.
-Se un'opzione con un valore viene immessa pi@`u di una volta,
-l'ultimo valore @`e quello che conta.
-
-@cindex POSIX @command{awk}, opzioni estese GNU e
-Ogni opzione estesa di @command{gawk} ha una corrispondente opzione
-breve in stile POSIX.
-Le opzioni estese e brevi sono
-intercambiabili in tutti i contesti.
-L'elenco seguente descrive le opzioni richieste dallo standard POSIX:
-
-@table @code
-@item -F @var{fs}
-@itemx --field-separator @var{fs}
-@cindex @option{-F}, opzione
-@cindex @option{--field-separator}, opzione
-@cindex @code{FS}, variabile, l'opzione @code{--field-separator} e
-Imposta la variabile @code{FS} a @var{fs}
-(@pxref{Separatori di campo}).
-
-@item -f @var{file-sorgente}
-@itemx --file @var{file-sorgente}
-@cindex @option{-f}, opzione
-@cindex @option{--file}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-Legge il sorgente del programma @command{awk} da @var{file-sorgente}
-anzich@'e prenderlo dal primo argomento che non @`e un'opzione.
-Quest'opzione pu@`o essere data pi@`u volte; il programma @command{awk}
-@`e formato dalla concatenazione del contenuto di ogni
-@var{file-sorgente} specificato.
-
-@item -v @var{var}=@var{val}
-@itemx --assign @var{var}=@var{val}
-@cindex @option{-v}, opzione
-@cindex @option{--assign}, opzione
-@cindex variabili, impostazione
-Imposta la variabile @var{var} al valore @var{val} @emph{prima} che inizi
-l'esecuzione del programma. Tali valori di variabile sono disponibili
-all'interno della regola @code{BEGIN}
-(@pxref{Altri argomenti}).
-
-L'opzione @option{-v} pu@`o impostare una sola variabile per volta, ma pu@`o
-essere usata pi@`u di una volta, impostando ogni volta una variabile
-differente, in questo modo:
-@samp{awk @w{-v pippo=1} @w{-v pluto=2} @dots{}}.
-
-@cindex predefinite, variabili, opzione @code{-v}@comma{} impostare con
-@cindex variabili predefinite, impostare con opzione @code{-v}
-@quotation ATTENZIONE
-Usare @option{-v} per impostare valori di variabili predefinite
-pu@`o condurre a risultati sorprendenti. @command{awk} reimposter@`a i
-valori di quelle variabili secondo le sue necessit@`a, anche ignorando
-eventuali valori iniziali che possono essere stati assegnati.
-@end quotation
-
-@item -W @var{gawk-opt}
-@cindex @option{-W}, opzione
-Fornisce un'opzione specifica dell'implementazione. Questa @`e la convenzione
-POSIX per fornire opzioni specifiche dell'implementazione.
-Queste opzioni
-hanno anche una corrispondente opzione estesa scritta in stile GNU.
-Si noti che le opzioni estese possono essere abbreviate, sempre che
-le abbreviazioni siano univoche.
-L'elenco completo delle opzioni specifiche di @command{gawk} @`e riportato di
-seguito.
-
-@item --
-@cindex riga di comando, opzioni, fine delle
-@cindex opzioni sulla riga di comando, fine delle
-Segnale della fine delle opzioni da riga di comando. I seguenti argomenti
-non sono trattati come opzioni anche se iniziano con @samp{-}. Questa
-interpretazione di @option{--} segue le convenzioni POSIX per l'analisi degli
-argomenti.
-
-@cindex @code{-} (meno), nomi di file che iniziano con
-@cindex meno (@code{-}), nomi di file che iniziano con
-@`E utile se si hanno @value{FNS} che iniziano con @samp{-},
-o negli @dfn{script} di shell, se si hanno @value{FNS} che devono essere
-specificati dall'utente che potrebbero iniziare con @samp{-}.
-@`E utile anche per passare opzioni al programma @command{awk};
-si veda @ref{Funzione getopt}.
-@end table
-
-L'elenco che segue descrive le opzioni specifiche di @command{gawk}:
-
-@c Have to use @asis here to get docbook to come out right.
-@table @asis
-@item @option{-b}
-@itemx @option{--characters-as-bytes}
-@cindex @option{-b}, opzione
-@cindex @option{--characters-as-bytes}, opzione
-Fa s@`{@dotless{i}} che @command{gawk} tratti tutti i dati in input come caratteri di un solo
-byte. In aggiunta, tutto l'output scritto con @code{print} o @code{printf}
-viene trattato come composto da caratteri contenuti in un solo byte.
-
-Normalmente, @command{gawk} segue lo standard POSIX e cerca di elaborare i suoi
-dati di input in accordo con la localizzazione corrente
-(@pxref{Localizzazioni}).
-Questo spesso pu@`o comportare la conversione di caratteri multibyte in
-caratteri estesi (internamente), e pu@`o
-creare problemi o confusione se i dati di input non contengono caratteri
-multibyte validi. Quest'opzione @`e una maniera facile di dire a @command{gawk}:
-``Gi@`u le mani dai miei dati!''.
-
-@item @option{-c}
-@itemx @option{--traditional}
-@cindex @option{-c}, opzione
-@cindex @option{--traditional}, opzione
-@cindex modalit@`a compatibile di (@command{gawk}), specificare
-Specifica la @dfn{modalit@`a di compatibilit@`a}, nella quale le estensioni GNU al
-linguaggio @command{awk} sono disabilitate; in questo modo @command{gawk} si
-comporta proprio come la versione di BWK @command{awk}.
-
-@xref{POSIX/GNU},
-che riassume le estensioni.
-@ifclear FOR_PRINT
-Si veda anche
-@ref{Modalit@`a di compatibilit@`a}.
-@end ifclear
-
-@item @option{-C}
-@itemx @option{--copyright}
-@cindex @option{-C}, opzione
-@cindex @option{--copyright}, opzione
-@cindex GPL (General Public License), stampare
-Stampa la versione ridotta della General Public License ed esce.
-
-@item @option{-d}[@var{file}]
-@itemx @option{--dump-variables}[@code{=}@var{file}]
-@cindex @option{-d}, opzione
-@cindex @option{--dump-variables}, opzione
-@cindex fornire una lista di tutte le variabili del programma
-@cindex @file{awkvars.out}, file
-@cindex file @file{awkvars.out}
-@cindex variabili globali, stampare una lista delle
-Stampa una lista ordinata di variabili globali, i loro tipi, e i valori finali
-in @var{file}. Se non viene fornito alcun @var{file}, stampa questa lista
-in un file chiamato @file{awkvars.out} nella directory corrente.
-Non sono consentiti spazi tra @option{-d} e @var{file}, se
-@var{file} viene specificato.
-
-@cindex risoluzione di problemi, refusi@comma{} variabili globali
-@cindex problemi, risoluzione di, refusi@comma{} variabili globali
-Avere una lista di tutte le variabili globali @`e un buon modo per cercare
-refusi nei propri programmi.
-Si pu@`o usare quest'opzione anche se si ha un grosso programma con tantissime
-funzioni, e si vuol essere sicuri che le funzioni non usino
-inavvertitamente variabili globali che sarebbero dovute essere locali
-(questo @`e un errore particolarmente facile da fare con nomi di variabile
-semplici come @code{i}, @code{j}, etc.).
-
-@item @option{-D}[@var{file}]
-@itemx @option{--debug}[@code{=}@var{file}]
-@cindex @option{-D}, opzione
-@cindex @option{--debug}, opzione
-@cindex @command{awk}, debug, abilitare
-Abilita l'esecuzione del debug di programmi @command{awk}
-(@pxref{Debugging}).
-Per default, il debugger legge i comandi interattivamente dalla tastiera
-(standard input).
-L'argomento opzionale @var{file} consente di specificare un file con una lista
-di comandi per il debugger da eseguire in maniera non interattiva.
-Non sono consentiti spazi tra @option{-D} e @var{file}, se
-@var{file} viene indicato.
-
-@item @option{-e} @var{testo-del-programma}
-@itemx @option{--source} @var{testo-del-programma}
-@cindex @option{-e}, opzione
-@cindex @option{--source}, opzione
-@cindex codice sorgente, combinare
-Fornisce del codice sorgente nel @var{testo-del-programma}.
-Quest'opzione consente di combinare il codice sorgente contenuto in file
-col codice sorgente immesso sulla riga di comando.
-Questo @`e particolarmente utile quando si hanno funzioni di libreria che si
-vogliono usare dai programmi da riga di comando
-(@pxref{AWKPATH (Variabile)}).
-
-@item @option{-E} @var{file}
-@itemx @option{--exec} @var{file}
-@cindex @option{-E}, opzione
-@cindex @option{--exec}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-@cindex CGI, @command{awk} @dfn{script} per
-Simile a @option{-f}, legge il testo del programma @command{awk} da
-@var{file}. Ci sono due differenze rispetto a @option{-f}:
-
-@itemize @value{BULLET}
-@item
-Quest'opzione fa terminare l'elaborazione delle opzioni; qualsiasi
-altra cosa sulla riga di comando viene inoltrata direttamente al programma
-@command{awk}.
-
-@item
-Le variabili da riga di comando della forma
-@samp{@var{var}=@var{value}} non sono ammesse.
-@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
-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,
-si veda la Sezione 4.4 di @uref{http://www.ietf.org/rfc/rfc3875,
-RFC 3875}. Si veda anche
-@uref{http://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
-note esplicative spedite alla mailing list @command{gawk} bug}.}
-Quest'opzione dovrebbe essere usata
-con @dfn{script} @samp{#!}
-(@pxref{@dfn{Script} eseguibili}), in questo modo:
-
-@example
-#! /usr/local/bin/gawk -E
-
-@var{il programma awk @`e qui @dots{}}
-@end example
-
-@item @option{-g}
-@itemx @option{--gen-pot}
-@cindex @option{-g}, opzione
-@cindex @option{--gen-pot}, opzione
-@cindex portabilit@`a, generare file oggetto
-@cindex file oggetto portabili, generare
-Analizza il programma sorgente e
-genera un file GNU @command{gettext} @dfn{portable object template} sullo
-standard output per tutte le costanti di tipo stringa che sono state marcate
-come da tradurre.
-@xref{Internazionalizzazione},
-per informazioni su quest'opzione.
-
-@item @option{-h}
-@itemx @option{--help}
-@cindex @option{-h}, opzione
-@cindex @option{--help}, opzione
-@cindex GNU, opzioni estese, stampare una lista di
-@cindex opzioni, stampare una lista di
-@cindex stampa, lista di opzioni
-Stampa un messaggio sull'``uso'' riassumendo le opzioni brevi ed estese
-accettate da @command{gawk} ed esce.
-
-@item @option{-i} @var{file-sorgente}
-@itemx @option{--include} @var{file-sorgente}
-@cindex @option{-i}, opzione
-@cindex @option{--include}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-Legge una libreria di sorgenti @command{awk} da @var{file-sorgente}.
-Quest'opzione @`e del tutto equivalente a usare la direttiva @code{@@include}
-all'interno del proprio programma. @`E molto simile all'opzione
-@option{-f}, ma ci sono due differenze importanti. Primo, quando viene usata
-l'opzione @option{-i}, il sorgente del programma non viene caricato se @`e
-stato caricato in precedenza, mentre con @option{-f}, @command{gawk} carica
-sempre il file. Secondo, poich@'e quest'opzione @`e pensata per essere usata
-con librerie di codice, @command{gawk} non riconosce tali file come
-costituenti l'input del programma principale. Cos@`{@dotless{i}}, dopo l'elaborazione di
-un argomento @option{-i}, @command{gawk} si aspetta di trovare il codice
-sorgente principale attraverso l'opzione @option{-f} o sulla riga di comando.
-
-@item @option{-l} @var{ext}
-@itemx @option{--load} @var{ext}
-@cindex @option{-l}, opzione
-@cindex @option{--load}, opzione
-@cindex caricare estensioni
-Carica un'estensione dinamica denominata @var{ext}. Le estensioni sono
-memorizzate come librerie condivise di sistema.
-Quest'opzione ricerca la libreria usando la variabile d'ambiente
-@env{AWKLIBPATH}. Il suffisso corretto per la piattaforma in uso verr@`a
-fornito per default, perci@`o non @`e necessario specificarlo nel nome
-dell'estensione. La routine di inizializzazione dell'estensione dovrebbe
-essere denominata @code{dl_load()}. Un'alternativa @`e quella di usare la
-direttiva @code{@@load} all'interno del programma per caricare una libreria
-condivisa. Questa funzionalit@`a avanzata @`e descritta in dettaglio in
-@ref{Estensioni dinamiche}.
-
-@item @option{-L}[@var{valore}]
-@itemx @option{--lint}[@code{=}@var{valore}]
-@cindex @option{-l}, opzione
-@cindex @option{--lint}, opzione
-@cindex @dfn{lint}, controlli, emissione di avvertimenti
-@cindex avvertimenti, emissione di
-Emette messaggi d'avvertimento relativi a costrutti dubbi o non portabili ad
-altre implementazioni di @command{awk}.
-Non sono consentiti spazi tra @option{-L} e @var{valore}, se
-viene indicato il @var{valore}.
-Alcuni avvertimenti vengono emessi quando @command{gawk} legge preliminarmente
-il programma. Altri vengono emessi quando il programma viene eseguito.
-Con l'argomento opzionale @samp{fatal}, gli avvertimenti @dfn{lint} sono considerati
-come errori gravi. Potrebbe essere una misura drastica, per@`o il suo uso
-incoragger@`a certamente lo sviluppo di programmi @command{awk} pi@`u corretti.
-Con l'argomento opzionale @samp{invalid}, vengono emessi solo gli avvertimenti
-relativi a quello che @`e effettivamente non valido (funzionalit@`a non ancora
-completamente implementata).
-
-Alcuni avvertimenti vengono stampati solo una volta, anche se i costrutti dubbi
-per i quali vengono emessi avvisi ricorrono diverse volte nel programma
-@command{awk}. Perci@`o, nell'eliminazione dei problemi rilevati da
-@option{--lint}, bisogna porre attenzione a cercare tutte le occorrenze di ogni
-costrutto inappropriato. Siccome i programmi @command{awk} generalmente sono
-brevi, questa non @`e un'operazione gravosa.
-
-@item @option{-M}
-@itemx @option{--bignum}
-@cindex @option{-M}, opzione
-@cindex @option{--bignum}, opzione
-Chiede il calcolo con precisione arbitraria sui numeri. Quest'opzione non ha
-alcun effetto se @command{gawk} non @`e compilato per l'uso delle librerie GNU
-MPFR e MP
-(@pxref{Calcolo con precisione arbitraria}).
-
-@item @option{-n}
-@itemx @option{--non-decimal-data}
-@cindex @option{-n}, opzione
-@cindex @option{--non-decimal-data}, opzione
-@cindex esadecimali@comma{} valori, abilitare l'interpretazione di
-@cindex ottali@comma{} valori, abilitare l'interpretazione di
-@cindex risoluzione di problemi, opzione @code{--non-decimal-data}
-Abilita l'interpretazione automatica di valori ottali ed esadecimali
-nei dati di input
-(@pxref{Dati non decimali}).
-
-@quotation ATTENZIONE
-Quest'opzione pu@`o generare gravi malfunzionamenti nei vecchi programmi.
-Usare con cautela. Si noti anche che
-quest'opzione potrebbe non essere pi@`u disponibile in una futura versione di
-@command{gawk}.
-@end quotation
-
-@item @option{-N}
-@itemx @option{--use-lc-numeric}
-@cindex @option{-N}, opzione
-@cindex @option{--use-lc-numeric}, opzione
-Forza l'uso del carattere di separazione decimale della localizzazione
-quando analizza i dati in input
-(@pxref{Localizzazioni}).
-
-@item @option{-o}[@var{file}]
-@itemx @option{--pretty-print}[@code{=}@var{file}]
-@cindex @option{-o}, opzione
-@cindex @option{--pretty-print}, opzione
-Consente la stampa di una versione formattata elegantemente dei programmi
-@command{awk}. Implica l'opzione @option{--no-optimize}.
-Per default il programma di output viene creato in un file
-chiamato @file{awkprof.out} (@pxref{Profilare}).
-L'argomento opzionale @var{file} consente di specificare un
-@value{FN} differente per l'output.
-Non sono consentiti spazi tra @option{-o} e @var{file}, se
-@var{file} viene indicato.
-
-@quotation NOTA
-Nel passato, quest'opzione eseguiva anche il programma.
-Ora non @`e pi@`u cos@`{@dotless{i}}.
-@end quotation
-
-@item @option{-O}
-@itemx @option{--optimize}
-@cindex @option{--optimize}, opzione
-@cindex @option{-O}, opzione
-Abilita le ottimizzazioni di default nella rappresentazione interna del
-programma. Attualmente, questo comprende delle semplificazioni nell'uso
-di costanti e l'eliminazione delle code di chiamata nelle funzioni
-ricorsive [sostituzione della chiamata di funzione con dei salti
-diretti alla funzione].
-
-Queste ottimizzazioni sono abilitate per default.
-Quest'opzione rimane disponibile per compatibilit@`a all'indietro.
-Tuttavia pu@`o essere usata per annullare l'effetto di una precedente
-opzione @option{-s} (si veda pi@`u sotto in questa lista).
-
-@item @option{-p}[@var{file}]
-@itemx @option{--profile}[@code{=}@var{file}]
-@cindex @option{-p}, opzione
-@cindex @option{--profile}, opzione
-@cindex @command{awk}, profilatura, abilitare la
-Abilita la creazione del profilo di esecuzione di programmi @command{awk}
-(@pxref{Profilare}).
-Implicitamente viene forzata l'opzione @option{--no-optimize}.
-Per default, i profili vengono creati in un file chiamato @file{awkprof.out}.
-L'argomento opzionale @var{file} consente di specificare un altro
-@value{FN} per il file del profilo.
-Non sono consentiti spazi tra @option{-p} e @var{file}, se
-viene indicato un @var{file}.
-
-Il profilo contiene il numero di esecuzioni di ogni istruzione sul margine
-sinistro e il conteggio delle chiamate di funzione per ogni funzione.
-
-@item @option{-P}
-@itemx @option{--posix}
-@cindex @option{-P}, opzione
-@cindex @option{--posix}, opzione
-@cindex POSIX, modalit@`a
-@cindex @command{gawk}, estensioni@comma{} disabilitare
-Opera in modalit@`a POSIX rigorosa. Disabilita tutte le estensioni di
-@command{gawk} (proprio come @option{--traditional}) e
-disabilita tutte le estensioni non consentite da POSIX.
-
-@xref{Estensioni comuni}, per un sommario delle estensioni
-di @command{gawk} che sono disabilitate da quest'opzione.
-Inoltre,
-vengono applicate le seguenti
-restrizioni:
-
-@itemize @value{BULLET}
-
-@cindex ritorno a capo
-@cindex spazi vuoti, ritorno a capo invece che
-@item
-I ritorni a capo non sono consentiti dopo @samp{?} o @samp{:}
-(@pxref{Espressioni condizionali}).
-
-
-@cindex @code{FS}, variabile, come carattere TAB
-@item
-Specificando @samp{-Ft} sulla riga di comando non si imposta il valore
-della variabile @code{FS} a un singolo carattere TAB
-(@pxref{Separatori di campo}).
-
-@cindex localizzazione, separatore decimale della
-@cindex separatore decimale, carattere, specifico della localizzazione
-@item
-Il carattere di separatore decimale della localizzazione @`e usato per analizzare
-i dati di input
-(@pxref{Localizzazioni}).
-@end itemize
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex @option{--traditional}, opzione, e opzione @code{--posix}
-@cindex @option{--posix}, opzione, e opzione @code{--traditional}
-Se si forniscono entrambe le opzioni @option{--traditional} e @option{--posix}
-sulla riga di comando, @option{--posix} ha la precedenza. Se vengono fornite
-entrambe le opzioni @command{gawk} emette un avviso.
-
-@item @option{-r}
-@itemx @option{--re-interval}
-@cindex @option{-r}, opzione
-@cindex @option{--re-interval}, opzione
-@cindex espressioni regolari, espressioni di intervallo e
-Consente le espressioni di intervallo
-(@pxref{Operatori di espressioni regolari})
-nelle espressioni regolari.
-Questo @`e ora il comportamento di default di @command{gawk}.
-Tuttavia, quest'opzione rimane (sia per retrocompatibilit@`a
-che per l'uso in combinazione con @option{--traditional}).
-
-@item @option{-s}
-@itemx @option{--no-optimize}
-@cindex @option{--no-optimize}, opzione
-@cindex opzione @option{--no-optimize}
-@cindex @option{-s}, opzione,
-@cindex opzione @option{-s}
-Disabilita le opzioni di ottimizzazione di default di @command{gawk}
-effettuate sulla rappresentazione interna del programma.
-
-@item @option{-S}
-@itemx @option{--sandbox}
-@cindex @option{-S}, opzione
-@cindex @option{--sandbox}, opzione
-@cindex sandbox, modalit@`a
-@cindex prova, modalit@`a di
-Disabilita la funzione @code{system()},
-la ridirezione dell'input con @code{getline},
-la ridirezione dell'output con @code{print} e @code{printf},
-e le estensioni dinamiche.
-@`E particolarmente utile quando si vogliono eseguire @dfn{script} @command{awk}
-da sorgenti dubbie e si vuol essere ricuri che gli @dfn{script} non abbiano
-accesso al sistema (oltre al @value{DF} di input specificato).
-
-@item @option{-t}
-@itemx @option{--lint-old}
-@cindex @option{-L}, opzione
-@cindex @option{--lint-old}, opzione
-Avvisa su costrutti che non sono disponibili nella versione originale di
-@command{awk} dalla versione 7 di Unix
-(@pxref{V7/SVR3.1}).
-
-@item @option{-V}
-@itemx @option{--version}
-@cindex @option{-V}, opzione
-@cindex @option{--version}, opzione
-@cindex @command{gawk}, versioni di, informazioni su@comma{} stampa
-Stampa informazioni sulla versione di questa specifica copia di @command{gawk}.
-Consente di determinare se la copia di @command{gawk} in uso @`e aggiornata
-rispetto a quello che @`e attualmente in distribuzione da parte della Free
-Software Foundation.
-@`E utile anche per la segnalazione di bug
-(@pxref{Bug}).
-@end table
-
-Ogni altra opzione, se @`e stato specificato il testo di un programma
-@`e contrassegnata come non valida con un messaggio di avvertimento,
-altrimenti @`e ignorata.
-
-@cindex @option{-F}, opzione, opzione @option{-Ft} imposta @code{FS} a TAB
-In modalit@`a di compatibilit@`a, come caso particolare, se il valore di @var{fs}
-fornito all'opzione @option{-F} @`e @samp{t}, @code{FS} @`e impostata al carattere
-TAB (@code{"\t"}). Questo @`e vero solo per @option{--traditional} e non
-per @option{--posix}
-(@pxref{Separatori di campo}).
-
-@cindex @option{-f}, opzione, usi multipli
-L'opzione @option{-f} pu@`o essere usata pi@`u di una volta nella riga di comando.
-In questo caso, @command{awk} legge il sorgente del suo programma da tutti i
-file indicati, come se fossere concatenati assieme a formare un unico grande
-file.
-Questo @`e utile per creare librerie di funzioni di @command{awk}. Queste
-funzioni possono venir scritte una volta e in seguito recuperate da una
-posizione standard, invece di doverle includere in ogni singolo programma.
-L'opzione @option{-i} @`e simile in questo senso.
-(Come indicato in
-@ref{Sintassi delle definizioni},
-i nomi di funzione devono essere univoci).
-
-Con @command{awk} standard, le funzioni di libreria si possono ancora usare,
-anche se il programma @`e immesso dalla tastiera,
-specificando @samp{-f /dev/tty}. Dopo aver scritto il programma,
-premere @kbd{Ctrl-d} (il carattere di fine file) per terminarlo.
-(Si potrebbe anche usare @samp{-f -} per leggere il sorgente del programma
-dallo standard input, ma poi non si potr@`a usare lo standard input come sorgente
-di dati).
-
-Siccome @`e scomodo usare il meccanismo di @command{awk} standard per combinare
-file sorgenti e programmi @command{awk} da riga di comando, @command{gawk}
-fornisce l'opzione @option{-e}. Questo non richiede di evitare l'uso dello
-standard input per immettere codice sorgente; consente di combinare
-facilmente codice sorgente da riga di comando e da libreria
-(@pxref{AWKPATH (Variabile)}).
-Come per @option{-f}, le opzioni @option{-e} e @option{-i}
-si possono usare pi@`u volte nella riga di comando.
-
-@cindex @option{-e}, opzione
-Se non sono specificate opzioni @option{-f} o @option{-e}, @command{gawk}
-usa il primo argomento che non @`e un'opzione come testo del
-codice sorgente del programma.
-
-@cindex @env{POSIXLY_CORRECT}, variabile d'ambiente
-@cindex @dfn{lint}, controlli, variabile d'ambiente @env{POSIXLY_CORRECT}
-@cindex POSIX, modalit@`a
-Se la variabile d'ambiente @env{POSIXLY_CORRECT} esiste,
-@command{gawk} si comporta in modalit@`a POSIX rigorosa, esattamente come se
-fosse stata fornita l'opzione @option{--posix}.
-Molti programi GNU cercano questa variabile d'ambiente per eliminare
-estensioni che confliggono con POSIX, ma @command{gawk} si comporta in modo
-diverso: sopprime tutte le estensioni, anche quelle che non confliggono con
-POSIX, e funziona rigorosamente in modalit@`a POSIX.
-Se viene fornita l'opzione @option{--lint} sulla riga di comando e
-@command{gawk} passa alla modalit@`a POSIX a causa di @env{POSIXLY_CORRECT},
-viene emesso un messaggio di avvertimento indicando che @`e attiva la
-modalit@`a POSIX. Normalmente questa variabile si imposta nel file di avvio
-della shell a livello utente.
-Per una shell compatibile con Bourne (come Bash), queste righe andranno
-aggiunte nel file @file{.profile} della directory "home" dell'utente:
-
-@example
-POSIXLY_CORRECT=true
-export POSIXLY_CORRECT
-@end example
-
-@cindex @command{csh}, comando, variabile d'ambiente @env{POSIXLY_CORRECT}
-Per una shell compatibile con C,@footnote{Non raccomandato.}
-questa riga andr@`a aggiunta nel file @file{.login} nella directory "home"
-dell'utente:
-
-@example
-setenv POSIXLY_CORRECT true
-@end example
-
-@cindex portabilit@`a, variabile d'ambiente @env{POSIXLY_CORRECT}
-Avere @env{POSIXLY_CORRECT} impostata non @`e raccomandato per l'uso quotidiano,
-ma @`e utile per provare la portabilit@`a dei programmi su altri
-ambienti.
-
-@node Altri argomenti
-@section Altri argomenti della riga di comando
-@cindex riga di comando, argomenti
-@cindex argomenti, riga di comando
-
-Qualsiasi altro argomento sulla riga di comando @`e trattato normalmente come
-file in input da elaborare nell'ordine con cui @`e specificato. Comunque, un
-argomento che ha la forma @code{@var{var}=@var{valore}}, assegna
-il valore @var{valore} alla variabile @var{var}---non specifica affatto
-un file. (Si veda @ref{Opzioni di assegnamento}.) Nel seguente esempio,
-@var{count=1} @`e un assegnamento di variabile, non un @value{FN}:
-
-@example
-awk -f programma.awk file1 count=1 file2
-@end example
-
-@cindex @command{gawk}, variabile @code{ARGIND} in
-@cindex @code{ARGIND}, variabile, argomenti da riga di comando
-@cindex @code{ARGV}, vettore, indicizzare all'interno di
-@cindex @code{ARGC}/@code{ARGV}, variabili, argomenti da riga di comando
-Tutti gli argomenti da riga di comando sono resi disponibili al programma
-@command{awk} nel vettore @code{ARGV} (@pxref{Variabili predefinite}). Opzioni da
-riga di comando e il testo del programma (se presente) sono esclusi da
-@code{ARGV}. Tutti gli altri argomenti, compresi gli assegnamenti di
-variabile, sono inclusi. Come ogni elemento di @code{ARGV} viene elaborato,
-@command{gawk} imposta @code{ARGIND} all'indice in @code{ARGV}
-dell'elemento corrente.
-
-@c FIXME: One day, move the ARGC and ARGV node closer to here.
-La modifica di @code{ARGC} e @code{ARGV} nel proprio programma @command{awk}
-consente di controllare come @command{awk} elabora i file in input; questo @`e
-descritto pi@`u dettagliatamente in @ref{ARGC e ARGV}.
-
-@cindex file in input, assegnamenti di variabile e
-@cindex assegnamenti di variabile e file in input
-La distinzione tra argomenti che sono @value{FN} e argomenti di assegnamento
-di variabili vien fatta quando @command{awk} deve aprire il successivo file di
-input.
-A quel punto dell'esecuzione, controlla la variabile @value{FN} per vedere se
-@`e piuttosto un assegnamento di variabile; se cos@`{@dotless{i}} @`e, @command{awk} imposta la
-variabile invece di leggere un file.
-
-Dunque, le variabili ricevono effettivamente i valori loro assegnati dopo che
-tutti i file precedentemente specificati sono stati letti. In particolare, i
-valori delle variabili assegnati in questo modo @emph{non} sono disponibili
-all'interno di una regola @code{BEGIN}
-(@pxref{BEGIN/END}),
-poich@'e tali regole vengono eseguite prima che @command{awk} cominci a
-esaminare la lista degli argomenti.
-
-@cindex angolo buio, sequenze di protezione
-I valori delle variabili dati sulla riga di comando sono elaborati per
-rimuovere sequenze di protezione (@pxref{Sequenze di protezione}).
-@value{DARKCORNER}
-
-In alcune implementazioni di @command{awk} molto vecchie, quando un
-assegnamento di variabile capitava prima di un qualsiasi @value{FN},
-l'assegnamento avveniva @emph{prima} che fosse stata eseguita la regola
-@code{BEGIN}. Il comportamento di @command{awk} era in questo modo
-ambiguo; alcuni assegnamenti da riga di comando erano disponibili
-all'interno della regola @code{BEGIN}, mentre altri no. Sfortunatamente,
-alcune applicazioni finivano per essere dipendenti da questa
-``funzionalit@`a''. Quando @command{awk} fu modificato per essere pi@`u
-coerente, fu aggiunta l'opzione @option{-v} a beneficio delle
-applicazioni che dipendevano dal vecchio comportamento.
-
-La funzionalit@`a dell'assegnamento di variabile @`e molto utile per assegnare
-valori a variabili come @code{RS}, @code{OFS}, e @code{ORS}, che controllano i
-formati di input e di output, prima di effettuare la scansione dei @value{DF}.
-@`E utile anche per effettuare passaggi multipli su un o stesso
-@value{DF}. Per esempio:
-
-@cindex file, passaggi multipli su
-@example
-awk 'pass == 1 @{ @var{pass 1 stuff} @}
- pass == 2 @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata
-@end example
-
-Una volta disponibile la funzionalit@`a per assegnare una variabile, l'opzione
-@option{-F} per impostare il valore di @code{FS} non @`e pi@`u strettamente
-necessaria. Rimane per compatibilit@`a all'indietro.
-
-@node Specificare lo standard input
-@section Come specificare lo standard input insieme ad altri file
-
-Capita spesso di voler leggere lo standard input assieme ad altri file.
-Per esempio, leggere un file, leggere lo standard input derivante da una
-@dfn{pipe}, e poi leggere un altro file.
-
-Il modo di indicare lo standard input, con tutte le versioni di @command{awk},
-@`e quello di usare un segno meno o trattino da solo, @samp{-}. Per esempio:
-
-@example
-@var{qualche_comando} | awk -f ilmioprogramma.awk file1 - file2
-@end example
-
-@noindent
-In questo caso, @command{awk} legge prima @file{file1}, poi legge
-l'output di @var{qualche_comando}, e infile legge
-@file{file2}.
-
-Si pu@`o anche usare @code{"-"} per indicare lo standard input quando si leggono
-i file con @code{getline} (@pxref{Getline file}).
-
-In aggiunta, @command{gawk} consente di specificare il
-@value{FN} speciale @file{/dev/stdin}, sia sulla riga di comando che
-quando si usa @code{getline}.
-Anche qualche altra versione di @command{awk} include questa funzionalit@`a,
-ma non @`e standard.
-(Alcuni sistemi operativi prevedono un file @file{/dev/stdin}
-nel filesystem; comunque, @command{gawk} elabora sempre
-questo @value{FN} per conto suo [ossia non importa se il sistema
-operativo rende disponibile il file o no].)
-
-@node Variabili d'ambiente
-@section Le variabili d'ambiente usate da @command{gawk}
-@cindex variabili d'ambiente usate da @command{gawk}
-
-Diverse variabili d'ambiente influiscono sul comportamento
-di @command{gawk}.
-
-@menu
-* AWKPATH (Variabile):: Ricerca di programmi @command{awk}
- in una lista di directory.
-* AWKLIBPATH (Variabile):: Ricerca di librerie condivise
- @command{awk} su varie directory.
-* Altre variabili d'ambiente:: Le variabili d'ambiente.
-@end menu
-
-@node AWKPATH (Variabile)
-@subsection Ricerca di programmi @command{awk} in una lista di directory.
-@cindex @env{AWKPATH}, variabile d'ambiente
-@cindex directory, ricerca di file sorgente
-@cindex percorso di ricerca per file sorgente
-@cindex ricerca, percorso di, per file sorgente
-@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @env{AWKPATH}
-@ifinfo
-Il precedente @value{SECTION} ha descritto come i file di programma di
-@command{awk} possono essere specificati sulla riga di comando con
-l'opzione @option{-f}.
-@end ifinfo
-Nella maggior parte delle implementazioni di @command{awk} si deve indicare il
-percorso completo di ogni file di programma, a meno che il file non
-sia nella directory corrente. Con @command{gawk}, invece, se la
-variabile @value{FN} impostata con le opzioni @option{-f} o @option{-i} non
-contiene un separatore di directory @samp{/}, @command{gawk} cerca un file con
-quel nome in un elenco di directory (chiamato @dfn{percorso di ricerca}),
-scorrendole una per una.
-
-Il percorso di ricerca @`e una stringa di nomi di directory separati da due
-punti@footnote{Punti e virgola in MS-Windows.}. @command{gawk} prende
-il percorso di ricerca dalla variabile d'ambiente @env{AWKPATH}. Se questa
-variabile non esiste, o se ha un come valore la stringa nulla,
-@command{gawk} usa un percorso di default (descritto tra poco).
-
-La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire
-librerie di funzioni di @command{awk}. I file di libreria possono essere messi
-in una directory standard inclusa nel percorso di ricerca
-e richiamati sulla riga di comando con un
-@value{FN} breve. Altrimenti, si dovrebbe scrivere l'intero @value{FN} per
-ciascun file.
-
-Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di
-@command{awk} scritti sulla riga di comando possono usare le funzionalit@`a
-contenute nei file di libreria di @command{awk}
-@iftex
-(@pxrefil{Funzioni di libreria}).
-@end iftex
-@ifnottex
-(@pxref{Funzioni di libreria}).
-@end ifnottex
-La ricerca del percorso non viene eseguita se @command{gawk} @`e in modalit@`a di
-compatibilit@`a, sia con l'opzione @option{--traditional} che con l'opzione
-@option{--posix}.
-@xref{Opzioni}.
-
-Se il file del codice sorgente non viene trovato con una prima ricerca,
-il percorso viene cercato di nuovo dopo aver aggiunto il suffisso
-@samp{.awk} al @value{FN}.
-
-Il meccanismo di ricerca del percorso di @command{gawk} @`e simile a quello
-della shell.
-(Si veda @uref{http://www.gnu.org/software/bash/manual/,
-@cite{The Bourne-Again SHell manual}}.)
-Un elemento nullo nel percorso indica la directory corrente.
-(Un elemento nullo @`e indicato iniziando o terminando il percorso con un segno
-di @samp{:} oppure mettendo due @samp{:} consecutivi [@samp{::}].)
-
-@quotation NOTA
-Per includere la directory corrente nel percorso di ricerca, si pu@`o
-aggiungere @file{.} come un elemento del percorso di ricerca, oppure
-inserire un elemento nullo.
-
-Diverse passate versioni di @command{gawk} avrebbero effettuato anche una
-ricerca esplicita nella directory corrente, prima o dopo aver esaminato il
-percorso di ricerca. A partire dalla @value{PVERSION} 4.1.2, questo non
-vale pi@`u; se si desidera una ricerca nella directory corrente, @`e
-necessario aggiungere @file{.} esplicitamente, oppure aggiungendo un
-elemento nullo al percorso di ricerca.
-@end quotation
-
-Il valore di default di @env{AWKPATH} @`e
-@samp{.:/usr/local/share/awk}.@footnote{La versione di @command{gawk}
-che state usando potrebbe usare una directory diversa; ci@`o dipende da come
-@command{gawk} @`e stato compilato e installato. La directory effettiva @`e il
-valore di @code{$(datadir)} generato quando @`e stato configurato
-@command{gawk}. Non @`e comunque il caso di preoccuparsi per questo.}
-Poich@'e @file{.} @`e incluso all'inizio, @command{gawk} cerca dapprima nella
-directory corrente, e poi in @file{/usr/local/share/awk}.
-In pratica, questo vuol dire che solo raramente ci sar@`a bisogno di cambiare
-il valore di @env{AWKPATH}.
-
-@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
-essere di aiuto per gestire la variabile @env{AWKPATH}.
-
-@command{gawk} memorizza il valore del percorso di ricerca in uso in
-@code{ENVIRON["AWKPATH"]}. Questo consente di aver accesso al valore del
-percorso di ricerca in uso all'interno di un programma @command{awk}.
-
-Sebbene la variabile @code{ENVIRON["AWKPATH"]} possa
-essere cambiata anche all'interno di
-un programma @command{awk}, questo non modifica il comportamento del
-programma in esecuzione. Questo comportamento ha una sua logica: la variabile
-d'ambiente @env{AWKPATH} @`e usata per trovare i file sorgenti del programma; una
-volta che il programma @`e in esecuzione, tutti i file sono stati trovati,
-e @command{gawk} non ha pi@`u bisogno di usare @env{AWKPATH}.
-
-@node AWKLIBPATH (Variabile)
-@subsection Ricerca di librerie condivise @command{awk} su varie directory.
-@cindex @env{AWKLIBPATH}, variabile d'ambiente
-@cindex directory, ricerca di estensioni caricabili
-@cindex percorso di ricerca per estensioni
-@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @code{AWKLIBPATH}
-
-La variabile d'ambiente @env{AWKLIBPATH} @`e simile alla variabile @env{AWKPATH},
-ma @`e usata per ricercare estensioni caricabili (memorizzate come
-librerie condivise di sistema) specificate con l'opzione @option{-l},
-anzich@'e file sorgenti. Se l'estensione non viene trovata, il percorso viene
-cercato nuovamente dopo aver aggiunto il suffisso per la libreria condivisa
-appropriato per la piattaforma. Per esempio, sui sistemi GNU/Linux viene usato
-il suffisso @samp{.so}. Il percorso di ricerca specificato @`e usato anche
-attraverso la direttiva @code{@@load}
-(@pxref{Caricare librerie condivise}).
-
-Se la variabile d'ambiente @env{AWKLIBPATH} non esiste, o se ha come valore
-la stringa nulla, @command{gawk} usa un percorso di ricerca di default;
-questo normalmente vale @samp{/usr/local/lib/gawk}, anche se il suo valore
-pu@`o essere diverso, a seconda di come @`e stato installato @command{gawk}.
-
-@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
-essere di aiuto per gestire la variabile @env{AWKPATH}.
-
-@command{gawk} memorizza il valore del percorso di ricerca in uso in
-@code{ENVIRON["AWKLIBPATH"]}. Questo consente di aver accesso al valore del
-percorso di ricerca in uso all'interno di un programma @command{awk}.
-
-@node Altre variabili d'ambiente
-@subsection Le variabili d'ambiente.
-
-Molte altre variabili d'ambiente influenzano il comportamento di
-@command{gawk}, ma esse sono pi@`u specializzate. Quelle dell'elenco seguente
-sono quelle pi@`u utili agli utenti normali:
-
-@table @env
-@item GAWK_MSEC_SLEEP
-Specifica l'intervallo tra due tentativi di riconnessione,
-in millisecondi. Sui sistemi che non prevedono
-la chiamata di sistema @code{usleep()},
-il valore @`e arrotondato a un numero intero di secondi .
-
-@item GAWK_READ_TIMEOUT
-Specifica per quanto tempo, in millisecondi, @command{gawk}
-aspetta l'input prima di emettere un messaggio di errore.
-
-@item GAWK_SOCK_RETRIES
-Controlla il numero di volte che @command{gawk} cerca di
-ristabilire una connessione bidirezionale TCP/IP (@dfn{socket}) prima di
-rinunciare a farlo.
-@xref{Reti TCP/IP}.
-Si noti che quando @`e attiva l'opzione di continuazione dopo errori di I/O
-(@pxref{Continuazione dopo errori}),
-@command{gawk} tenta di aprire un @dfn{socket} TCP/IP soltanto una volta.
-
-@item POSIXLY_CORRECT
-Provoca il passaggio di @command{gawk} alla modalit@`a di compatibilit@`a POSIX,
-disabilitando tutte le estensioni tradizionali e GNU.
-@xref{Opzioni}.
-@end table
-
-Le variabili d'ambiente nell'elenco che segue sono utili
-soprattutto agli sviluppatori di @command{gawk} per il collaudo e la messa
-a punto del programma. Sono soggette a cambiamenti. Le variabili sono:
-
-@table @env
-@item AWKBUFSIZE
-Questa variabile riguarda solo @command{gawk} installato su sistemi
-conformi a POSIX.
-Col valore di @samp{exact}, @command{gawk} usa la dimensione di ogni file di
-input come dimensione del buffer di memoria da allocare per I/O. Altrimenti,
-il valore dovrebbe essere un numero, e @command{gawk} usa questo numero come
-dimensione del buffer da allocare. (Quando questa variabile non @`e impostata,
-@command{gawk} usa la pi@`u piccola tra le dimensioni del file e la dimensione
-del blocco di ``default'', che normalmente @`e la dimensione del blocco I/O
-del filesystem).
-
-@item AWK_HASH
-Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk}
-usa la funzione hash di GNU Smalltalk per gestire i vettori.
-Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard.
-@item AWKREADFUNC
-Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per
-volta, anzich@'e a blocchi. Questa variabile @`e presente
-per problemi di debug su filesystem di sistemi operativi non POSIX,
-dove l'I/O @`e elaborato a record, non a blocchi.
-
-@item GAWK_MSG_SRC
-Se questa variabile esiste, @command{gawk} include il @value{FN} e il
-numero di riga all'interno del codice sorgente @command{gawk}
-dal quale sono stati generati i messaggi di avvertimento o
-i messaggi di errore grave. Il suo intento @`e quello di aiutare a isolare
-l'origine di un messaggio, poich@'e ci possono essere pi@`u righe di codice che
-producono lo stesso messaggio di avvertimento o di errore.
-
-@item GAWK_LOCALE_DIR
-Specifica la posizione dei file oggetto compilati contenenti la traduzione dei
-messaggi emessi da @command{gawk} stesso. Questa variabile @`e passata alla
-funzione @code{bindtextdomain()} nella fase di partenza di @command{gawk}.
-
-@item GAWK_NO_DFA
-Se questa variabile esiste, @command{gawk} non usa il riconoscitore di
-espressioni regolari ASFD [automa a stati finiti deterministico] per i tipi di
-test di corrispondenza. Questo pu@`o causare un rallentamento di @command{gawk}.
-Il suo intento @`e quello di aiutare a isolare le differenze tra i due
-riconoscitori di espressioni regolari che @command{gawk} usa internamente (non
-dovrebbero esserci differenze, ma a volte la teoria non coincide con la
-pratica).
-
-@item GAWK_STACKSIZE
-Specifica di quanto @command{gawk} dovrebbe accrescere il suo stack di
-valutazione interno, all'occorrenza.
-
-@item INT_CHAIN_MAX
-Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
-su una catena hash per gestire i vettori indicizzati da numeri interi.
-
-@item STR_CHAIN_MAX
-Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
-su una catena hash per gestire i vettori indicizzati da stringhe.
-
-@item TIDYMEM
-Se questa variabile esiste, @command{gawk} usa le chiamate di libreria
-@code{mtrace()} della @dfn{GNU C library} per aiutare a scoprire
-possibili sprechi di memoria.
-@end table
-
-@node Codice di ritorno
-@section Il codice di ritorno all'uscita da @command{gawk}
-
-@cindex codice di ritorno, di @command{gawk}
-@cindex stato d'uscita, di @command{gawk}
-Se l'istruzione @code{exit} viene usata con un valore
-(@pxref{Istruzione exit}), @command{gawk} termina l'esecuzione con il valore
-numerico specificato.
-
-Altrimenti, se non ci sono stati problemi durante l'esecuzione,
-@command{gawk} esce col valore della costante C
-@code{EXIT_SUCCESS}, che normalmente @`e zero.
-
-Se si verifica un errore, @command{gawk} esce col valore della
-costante C @code{EXIT_FAILURE}, che normalmente @`e uguale a uno.
-
-Se @command{gawk} esce a causa di un errore grave, il codice di ritorno
-@`e due. Sui sistemi non POSIX questo valore pu@`o essere mappato
-a @code{EXIT_FAILURE}.
-
-@node Includere file
-@section Come includere altri file nel proprio programma
-
-@c Panos Papadopoulos <panos1962@gmail.com> contributed the original
-@c text for this section.
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-@cindex @code{@@include}, direttiva
-@cindex direttiva @code{@@include}
-@cindex includere file, direttiva @code{@@include}
-La direttiva @code{@@include} pu@`o essere usata per leggere file sorgenti
-di @command{awk} esterni. Questo d@`a la possibilit@`a di suddividere file
-sorgenti di @command{awk} di grandi dimensioni in porzioni pi@`u piccole e pi@`u
-maneggevoli, e anche di riutilizzare codice @command{awk} di uso comune
-da diversi @dfn{script} @command{awk}. In altre parole, si possono
-raggruppare funzioni di @command{awk} usate per eseguire determinati compiti
-all'interno di file esterni. Questi file possono essere usati proprio come
-librerie di funzioni, usando la direttiva @code{@@include} assieme alla
-variabile d'ambiente @env{AWKPATH}. Si noti che i file sorgenti possono
-venire inclusi anche usando l'opzione @option{-i}.
-
-Vediamolo con un esempio.
-Iniziamo con due @dfn{script} @command{awk} (banali), che chiameremo
-@file{test1} e @file{test2}. Questo @`e lo @dfn{script} @file{test1}:
-
-@example
-BEGIN @{
- print "Questo @`e lo script test1."
-@}
-@end example
-
-@noindent
-e questo @`e @file{test2}:
-
-@example
-@@include "test1"
-BEGIN @{
- print "Questo @`e lo script test2."
-@}
-@end example
-
-L'esecuzione di @command{gawk} con @file{test2}
-produce il seguente risultato:
-
-@example
-$ @kbd{gawk -f test2}
-@print{} Questo @`e lo script test1.
-@print{} Questo @`e lo script test2.
-@end example
-
-@command{gawk} esegue lo @dfn{script} @file{test2}, il quale include
-@file{test1}, usando la direttiva @code{@@include}.
-Cos@`{@dotless{i}}, per includere file sorgenti di @command{awk} esterni, basta usare
-@code{@@include} seguito dal nome del file da includere,
-racchiuso tra doppi apici.
-
-@quotation NOTA
-Si tenga presente che questo @`e un costrutto del linguaggio e che @value{FN}
-non pu@`o essere una variabile di tipo stringa, ma solo una costante di tipo
-letterale racchiusa tra doppi apici.
-@end quotation
-
-I file da includere possono essere nidificati; p.es., dato un terzo
-@dfn{script}, che chiameremo @file{test3}:
-
-@example
-@@include "test2"
-BEGIN @{
- print "Questo @`e lo script test3."
-@}
-@end example
-
-@noindent
-L'esecuzione di @command{gawk} con lo @dfn{script} @file{test3} produce i
-seguenti risultati:
-
-@example
-$ @kbd{gawk -f test3}
-@print{} Questo @`e lo script test1.
-@print{} Questo @`e lo script test2.
-@print{} Questo @`e lo script test3.
-@end example
-
-Il @value{FN}, naturalmente, pu@`o essere un nome di percorso.
-Per esempio:
-
-@example
-@@include "../funzioni_di_i_o"
-@end example
-
-@noindent
-e:
-
-@example
-@@include "/usr/awklib/network"
-@end example
-
-@noindent
-sono entrambi percorsi validi. La variabile d'ambiente @env{AWKPATH} pu@`o
-rivestire grande importanza quando si usa @code{@@include}. Le stesse
-regole per l'uso della variabile d'ambiente @env{AWKPATH} nelle ricerche
-da riga di comando
-(@pxref{AWKPATH (Variabile)}) si applicano anche a
-@code{@@include}.
-
-Questo @`e di grande aiuto nella costruzione di librerie di funzioni di
-@command{gawk}. Se si ha uno @dfn{script} di grandi dimensioni contenente
-utili funzioni @command{awk} di uso comune, lo si pu@`o suddividere in file
-di libreria e mettere questi file in una directory dedicata. In seguito si
-possono includere queste ``librerie'' usando il percorso completo dei
-file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e
-quindi usando @code{@@include} con la sola parte del percorso completo che
-designa il file. Naturalmente,
-si possono tenere i file di libreria in pi@`u di una directory;
-pi@`u @`e complesso l'ambiente di lavoro, pi@`u
-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.
-In particolare, @code{@@include} @`e molto utile per scrivere @dfn{script} CGI
-eseguibili da pagine web.
-
-Come @`e stato detto in @ref{AWKPATH (Variabile)}, i file sorgenti vengono
-sempre cercati nella directory corrente, prima di eseguire la ricerca in
-@env{AWKPATH}; questo si applica anche ai file indicati con
-@code{@@include}.
-
-@node Caricare librerie condivise
-@section Caricare librerie condivise nel proprio programma
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-@cindex @code{@@load}, direttiva
-@cindex direttiva @code{@@load}
-@cindex caricare estensioni, direttiva @code{@@load}
-@cindex estensioni, caricamento, direttiva @code{@@load}
-La direttiva @code{@@load} pu@`o essere usata per leggere estensioni di
-@command{awk} esterne (memorizzate come librerie condivise di sistema).
-Questo consente di collegare del codice compilato che pu@`o offrire prestazioni
-migliori o dare l'accesso a funzionalit@`a estese non incluse nel linguaggio
-@command{awk}. La variabile @env{AWKLIBPATH} viene usata per ricercare
-l'estensione. Usare @code{@@load} @'e del tutto equivalente a usare l'opzione da
-riga di comando @option{-l}.
-
-Se l'estensione non viene trovata in @env{AWKLIBPATH}, viene effettuata
-un'altra ricerca dopo aver aggiunto al @value{FN} il suffisso della
-libreria condivisa comunemente in uso per la piattaforma corrente. Per
-esempio, sui sistemi GNU/Linux viene usato il suffisso @samp{.so}:
-
-@example
-$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
-@print{} A
-@end example
-
-@noindent
-Questo @`e equivalente all'esempio seguente:
-
-@example
-$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
-@print{} A
-@end example
-
-@noindent
-Per l'uso da riga di comando @`e pi@`u conveniente l'opzione @option{-l},
-ma @code{@@load} @`e utile da inserire all'interno di un file sorgente di
-@command{awk} che richieda l'accesso a un'estensione.
-
-@ref{Estensioni dinamiche}, descrive come scrivere estensioni (in C or C++)
-che possono essere caricate sia con @code{@@load} che con l'opzione
-@option{-l}. @`E anche descritta l'estensione @code{ordchr}.
-
-@node Parti obsolete
-@section Opzioni e/o funzionalit@`a obsolete
-
-@c update this section for each release!
-
-@cindex opzioni deprecate
-@cindex funzionalit@`a deprecate
-@cindex obsolete, funzionalit@`a
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive funzionalit@`a o opzioni 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 nella prossima
-versione).
-
-I file speciali relativi ai processi @file{/dev/pid}, @file{/dev/ppid},
-@file{/dev/pgrpid} e @file{/dev/user} erano deprecati, ma ancora disponibili,
-in @command{gawk} 3.1. A partire dalla @value{PVERSION} 4.0, non sono
-pi@`u interpretati da @command{gawk} in modo speciale (al loro posto usare
-invece @code{PROCINFO}; si veda @ref{Variabili auto-assegnate}).
-
-@ignore
-This @value{SECTION}
-is thus essentially a place holder,
-in case some option becomes obsolete in a future version of @command{gawk}.
-@end ignore
-
-@node Non documentato
-@section Opzioni e funzionalit@`a non documentate
-@cindex non documentate, funzionalit@`a
-@cindex funzionalit@`a non documentate
-@cindex Skywalker, Luke
-@cindex Kenobi, Obi-Wan
-@cindex Jedi, Cavalieri
-@cindex Cavalieri Jedi
-@quotation
-@i{Usa il codice sorgente, Luke!}
-@author Obi-Wan
-@end quotation
-
-@cindex conchiglie, mare
-@ifnotinfo
-Questa @value{SECTION} @`e stata lasciata intenzionalmente vuota.
-@end ifnotinfo
-@ifinfo
-Questo @value{SECTION} @`e stato lasciato intenzionalmente vuoto.
-@end ifinfo
-
-@ignore
-@c If these came out in the Info file or TeX document, then they wouldn't
-@c be undocumented, would they?
-
-@command{gawk} ha un'opzione non documentata:
-
-@table @code
-@item -W nostalgia
-@itemx --nostalgia
-Stampa il messaggio @samp{awk: bailing out near line 1} e termina
-con un errore grave.
-Quest'opzione @`e stata ispirata dal comportamento comune delle primissime
-versioni di @command{awk} Unix e da una maglietta [con la scritta].
-Il messaggio @emph{NON} viene tradotto in ambienti non inglesi.
-@c so there! nyah, nyah.
-@end table
-
-Le prime versioni di @command{awk} non richiedevano alcun separatore (a capo
-
-o @samp{;}) tra le regole nei programmi @command{awk}. Quindi,
-era normale vedere programmi di una riga come:
-
-@example
-awk '@{ sum += $1 @} END @{ print sum @}'
-@end example
-
-@command{gawk} in realt@`a consente questo stile, ma la cosa non @`e
-documentata per non incoraggiare la pratica. Il modo corretto per scrivere
-quel programma @`e uno dei
-seguenti:
-
-@example
-awk '@{ sum += $1 @} ; END @{ print sum @}'
-@end example
-
-@noindent
-oppure:
-
-@example
-awk '@{ sum += $1 @}
- END @{ print sum @}' data
-@end example
-
-@noindent
-@xref{Istruzioni/Righe}, per una spiegazione pi@`u ampia.
-
-Si possono inserire righe bianche dopo @samp{;} nei cicli @code{for}.
-Questa sembre essere stata una funzionalit@`a a lungo non documentata in
-@command{awk} Unix.
-
-Analogamente, si possono usare istruzioni @code{print} o @code{printf}
-nelle parti @var{valore-iniziale} e @var{incremento} di un ciclo
-@code{for}. Questa @`e un'altra funzionalit@`a a lungo non documentata in
-@command{awk} Unix.
-
-@command{gawk} consente di usare come nomi di parametro dei
-nomi di funzioni predefinite che facciano parte delle estensioni
-@command{gawk}, all'interno di funzioni definite dall'utente.
-Questo avviene per ``salvaguardare per il futuro'' vecchi programmi che
-utilizzino nomi di funzioni aggiunte da @command{gawk} dopo che questi
-programmi erano stati scritti.
-Le funzioni predefinite standard di command{awk}, per esempio
-@code{sin()} o @code{substr()} @emph{non} ammettono questa possibilit@`a.
-
-Il vettore @code{PROCINFO["argv"]} contiene tutti gli argomenti della
-riga di comando (una volta espansi i metacaratteri ed elaborata la
-ridirezione, nelle piattaforme in cui ci@`o dev'essere fatto manualmente
-dal programma), con indici che vanno da 0 as @code{argc} @minus{} 1.
-Per esempio, @code{PROCINFO["argv"][0]} conterr@`a il nome con cui @`e
-stato invocato @command{gawk}. L'esempio seguente mostra come @`e
-possibile usare questa funzionalit@`a:
-
-@example
-awk '
-BEGIN @{
- for (i = 0; i < length(PROCINFO["argv"]); i++)
- print i, PROCINFO["argv"][i]
-@}'
-@end example
-
-@`E da tener presente che questo vettore @`e diverso dal vettore
-standard @code{ARGV} che non comprende quegli argomenti della riga di
-comando che sono gi@`a stati elaborati da
-@command{gawk} (@pxref{ARGC e ARGV}).
-
-@end ignore
-
-@node Sommario invocazione
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Per eseguire @command{awk} usare, o
-@samp{awk '@var{programma}' @var{file}}
-o
-@samp{awk -f @var{file-del-programma} @var{file}}.
-
-@item
-Le tre opzioni standard per tutte le versioni di @command{awk} sono
-@option{-f}, @option{-F} e @option{-v}. @command{gawk} fornisce queste e
-molte altre, come pure le opzioni estese corrispondenti scritte in stile GNU.
-
-@item
-Gli argomenti da riga di comando che non sono opzioni sono trattati normalmente
-come @value{FNS}, a meno che non abbiano la forma @samp{@var{var}=@var{valore}};
-nel qual caso vengono riconosciuti come assegnamenti di variabile da eseguire
-in quel punto
-nell'elaborazione dell'input.
-
-@item
-Tutti gli argomenti da riga di comando che non sono opzioni, escluso il testo
-del programma, vengono messe nel vettore @code{ARGV}. Modifiche a @code{ARGC}
-e @code{ARGV} influiscono su come @command{awk} elabora l'input.
-
-@item
-Si pu@`o usare un segno meno a s@'e stante (@samp{-}) per designare lo standard
-input sulla riga di comando. @command{gawk} consente anche di usare il
-@value{FN} speciale @file{/dev/stdin}.
-
-
-@item
-@command{gawk} tiene conto di diverse variabili d'ambiente;
-@env{AWKPATH}, @env{AWKLIBPATH} e @env{POSIXLY_CORRECT} sono le
-pi@`u importanti.
-
-@item
-Lo stato d'uscita di @command{gawk} invia informazioni al programma che lo
-ha invocato. Usare l'istruzione @code{exit} dall'interno di un programma
-@command{awk} per impostare il codice di ritorno.
-
-@item
-@command{gawk} consente di includere nel proprio programma file sorgenti di
-@command{awk} con la direttiva @code{@@include} o con le opzioni da riga di
-comando @option{-i} e @option{-f}.
-
-@item
-@command{gawk} consente di caricare funzioni aggiuntive scritte in C
-o C++ con la direttiva @code{@@load} e/o con l'opzione @option{-l}
-(questa funzionalit@`a avanzata @`e descritta pi@`u avanti, in
-@ref{Estensioni dinamiche}).
-@end itemize
-@node Espressioni regolari
-@chapter Espressioni regolari
-@cindex @dfn{regexp}
-@cindex espressioni regolari
-
-Una @dfn{espressione regolare}, o @dfn{regexp}, @`e un modo per descrivere un
-insieme di stringhe.
-Poich@'e le espressioni regolari sono una parte fondamentale della
-programmazione in @command{awk}, il loro formato e il loro uso meritano un
-@value{CHAPTER} a s@'e stante.
-
-@cindex barra (@code{/}), per delimitare le espressioni regolari
-@cindex @code{/} (barra), per delimitare le espressioni regolari
-Un'espressione regolare racchiusa tra barre (@samp{/})
-@`e un modello di ricerca @command{awk} che individua tutti i record in input
-il cui testo corrisponde al modello stesso.
-L'espressione regolare pi@`u semplice @`e una sequenza di lettere o di numeri, o
-di entrambi. Una tale @dfn{regexp} individua ogni stringa che contenga quella
-particolare sequenza.
-Quindi, la @dfn{regexp} @samp{pippo} individua ogni stringa che contenga
-@samp{pippo}. In altre parole, al modello di ricerca @code{/pippo/} corrisponde
-ogni record in input che contiene i cinque caratteri consecutivi @samp{pippo}
-@emph{in qualsiasi parte} del record. Altri tipi di @dfn{regexp} permettono
-di specificare classi di stringhe molto pi@`u complesse.
-
-@ifnotinfo
-All'inizio, gli esempi in questo @value{CHAPTER} sono semplici.
-Man mano che entriamo nei dettagli su
-come funzionano le espressioni regolari utilizzeremo formulazioni pi@`u
-complesse.
-@end ifnotinfo
-
-@menu
-* Uso di @dfn{regexp}:: Come usare le espressioni regolari.
-* Sequenze di protezione:: Come scrivere caratteri non stampabili.
-* Operatori di espressioni regolari:: Operatori di espressioni regolari.
-* Espressioni tra parentesi quadre:: Cosa possono contenere @samp{[...]}.
-* Pi@`u lungo da sinistra:: Quanto @`e lungo il testo individuato.
-* Espressioni regolari calcolate:: Usare @dfn{regexp} dinamiche.
-* Operatori di @dfn{regexp} GNU:: Operatori propri del software GNU.
-* Maiuscolo-Minuscolo:: Fare confronti ignorando
- maiuscolo/minuscolo.
-* Sommario espressioni regolari:: Sommario delle espressioni regolari.
-@end menu
-
-@node Uso di @dfn{regexp}
-@section Uso di espressioni regolari
-
-@cindex espressioni regolari, come criteri di ricerca
-Un'espressione regolare pu@`o essere usata come modello di ricerca
-racchiudendola tra barre. L'espressione regolare @`e quindi confrontata
-con tutto il testo di ogni record (normalmente, basta che corrisponda a
-una parte qualsiasi del testo per risultare soddisfatta). Per esempio,
-il seguente programma stampa il secondo campo di ogni record in cui compaia
-la stringa @samp{li}, in qualsiasi parte del record:
-
-@example
-$ @kbd{awk '/li/ @{ print $2 @}' mail-list}
-@print{} 555-5553
-@print{} 555-0542
-@print{} 555-6699
-@print{} 555-3430
-@end example
-
-@cindex espressioni regolari, operatori
-@cindex operatori, ricerca in stringhe
-@c @cindex operators, @code{~}
-@cindex ricerca in stringhe, operatori
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@c @cindex operatori, @code{!~}
-@cindex @code{if}, istruzione, uso di espressioni regolari in
-@cindex @code{while}, istruzione, uso di espressioni regolari in
-@cindex @code{do}-@code{while}, istruzione, uso di espressioni regolari in
-@c @cindex istruzione @code{if}
-@c @cindex istruzione @code{while}
-@c @cindex istruzione @code{do}
-Espressioni regolari possono anche essere usate in espressioni di confronto.
-Queste espressioni consentono di specificare le stringhe da riconoscere;
-non devono necessariamente comprendere l'intero record corrente. I due
-operatori @samp{~} e @samp{!~} confrontano espressioni regolari. Le
-espressioni che usano questi operatori possono essere usate come modelli di
-ricerca, o nelle istruzioni @code{if}, @code{while}, @code{for}, e @code{do}.
-(@xref{Istruzioni}.)
-Per esempio:
-
-@example
-@var{exp} ~ /@var{regexp}/
-@end example
-
-@noindent
-@`e verificata se l'espressione @var{exp} (intesa come stringa)
-corrisponde a @var{regexp}. L'esempio che segue individua, o sceglie,
-tutti i record in input in cui la lettera maiuscola @samp{J} @`e presente da
-qualche parte nel primo campo:
-
-@example
-$ @kbd{awk '$1 ~ /J/' inventory-shipped}
-@print{} Jan 13 25 15 115
-@print{} Jun 31 42 75 492
-@print{} Jul 24 34 67 436
-@print{} Jan 21 36 64 620
-@end example
-
-Lo stesso risultato si pu@`o ottenere anche cos@`{@dotless{i}}:
-
-@example
-awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
-@end example
-
-Il prossimo esempio chiede che l'espressione @var{exp}
-(intesa come stringa)
-@emph{NON} corrisponda a @var{regexp}:
-
-@example
-@var{exp} !~ /@var{regexp}/
-@end example
-
-L'esempio che segue individua o sceglie tutti i record in input il cui
-primo campo @emph{NON} contiene
-la lettera maiuscola @samp{J}:
-
-@example
-$ @kbd{awk '$1 !~ /J/' inventory-shipped}
-@print{} Feb 15 32 24 226
-@print{} Mar 15 24 34 228
-@print{} Apr 31 52 63 420
-@print{} May 16 34 29 208
-@dots{}
-@end example
-
-@cindex @dfn{regexp}, costanti
-@cindex costanti @dfn{regexp}
-@cindex espressioni regolari, costanti, si veda costanti @dfn{regexp}
-Quando una @dfn{regexp} @`e racchiusa tra barre, come @code{/pippo/}, la chiamiamo
-una @dfn{costante regexp}, proprio come @code{5.27} @`e una costante
-numerica e @code{"pippo"} @`e una costante [di tipo] stringa.
-
-@node Sequenze di protezione
-@section Sequenze di protezione
-
-@cindex sequenze di protezione, in stringhe
-@cindex barra inversa (@code{\}), in sequenze di protezione
-@cindex @code{\} (barra inversa), in sequenze di protezione
-Alcuni caratteri non possono essere inclusi letteralmente in costanti
-stringa (@code{"pippo"}) o in costanti @dfn{regexp} (@code{/pippo/}).
-Vanno invece rappresentati usando @dfn{sequenze di protezione},
-ossia sequenze di caratteri preceduti da una barra inversa (@samp{\}).
-Una sequenza di protezione pu@`o essere usata per includere un carattere di
-"doppio apice" in una costante stringa. Poich@'e un semplice doppio apice
-termina la stringa, va usato @samp{\"} per richiedere che un doppio apice sia
-presente all'interno di una stringa. Per esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Egli le disse \"ciao!\"." @}'}
-@print{} Egli le disse "ciao!".
-@end example
-
-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{"\"\\"}.
-
-Altre sequenze di protezione rappresentano caratteri non stampabili
-come TAB o il ritorno a capo. Anche se @`e possibile immettere la maggior parte dei
-caratteri non stampabili direttamente in una costante stringa o
-@dfn{regexp}, essi possono non essere di facile comprensione.
-
-La seguente lista elenca
-tutte le sequenze di protezione usate in @command{awk} e
-cosa rappresentano. Se non @`e detto altrimenti, tutte queste sequenze di
-protezione valgono sia per costanti stringa che per costanti @dfn{regexp}:
-
-@table @code
-@item \\
-Barra inversa letterale, @samp{\}.
-
-@c @cindex @command{awk} language, V.4 version
-@cindex @code{\} (barra inversa), @code{\a}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\a}, sequenza di protezione
-@item \a
-Il carattere ``campanello'', @kbd{Ctrl-g}, codice ASCII 7 (BEL).
-(Spesso genera qualche tipo di segnale sonoro udibile.)
-
-@cindex @code{\} (barra inversa), @code{\b}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\b}, sequenza di protezione
-@item \b
-Barra inversa, @kbd{Ctrl-h}, codice ASCII 8 (BS).
-
-@cindex @code{\} (barra inversa), @code{\f}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\f}, sequenza di protezione
-@item \f
-Nuova pagina, @kbd{Ctrl-l}, codice ASCII 12 (FF).
-
-@cindex @code{\} (barra inversa), @code{\n}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\n}, sequenza di protezione
-@item \n
-A capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
-
-@cindex @code{\} (barra inversa), @code{\r}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\r}, sequenza di protezione
-@item \r
-Ritorno del carrello, @kbd{Ctrl-m}, codice ASCII 13 (CR).
-
-@cindex @code{\} (barra inversa), @code{\t}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\t}, sequenza di protezione
-@item \t
-Tabulazione orizzontale, @kbd{Ctrl-i}, codice ASCII 9 (HT).
-
-@c @cindex @command{awk} language, V.4 version
-@cindex @code{\} (barra inversa), @code{\v}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\v}, sequenza di protezione
-@item \v
-Tabulazione verticale, @kbd{Ctrl-k}, codice ASCII 11 (VT).
-
-@cindex @code{\} (barra inversa), @code{\}@var{nnn}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\}@var{nnn}, sequenza di protezione
-@item \@var{nnn}
-Il valore ottale @var{nnn}, dove @var{nnn} pu@`o essere da 1 a 3 cifre ottali,
-tra @samp{0} e @samp{7}. Per esempio, il codice per il carattere ASCII ESC
-(escape) @`e @samp{\033}.
-
-@c @cindex @command{awk} language, V.4 version
-@c @cindex @command{awk} language, POSIX version
-@cindex @code{\} (barra inversa), @code{\x}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\x}, sequenza di protezione
-@cindex comuni, estensioni@comma{} @code{\x}, sequenza di protezione
-@cindex estensioni comuni, @code{\x}, sequenza di protezione
-@item \x@var{hh}@dots{}
-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}
-(La sequenza di protezione @samp{\x} non @`e permessa in POSIX awk.)
-
-@quotation ATTENZIONE
-In ISO C, la sequenza di protezione continua fino a raggiungere il primo
-carattere che non sia una cifra esadecimale.
-In passato, @command{gawk} avrebbe continuato ad aggiungere
-cifre esadecimali al valore finch@'e non trovava una cifra non esadecimale
-oppure fino a raggiungere la fine della stringa.
-Comunque usare pi@`u di due cifre esadecimali produceva risultati indefiniti.
-Dalla @value{PVERSION} 4.2,
-vengono elaborate solo due cifre.
-@end quotation
-
-@cindex @code{\} (barra inversa), @code{\/}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\/}, sequenza di protezione
-@item \/
-Una barra (necessario solo per costanti @dfn{regexp}).
-Questa sequenza si usa per inserire una costante @dfn{regexp}
-che contiene una barra
-(come @code{/.*:\/home\/[[:alnum:]]+:.*/}; la notazione @samp{[[:alnum:]]}
-verr@`a spiegata pi@`u avanti,
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Espressioni tra parentesi quadre}).
-Poich@'e una @dfn{regexp} @`e racchiusa tra
-barre, si deve proteggere ogni barra che sia parte dell'espressione, per dire
-ad @command{awk} di andare avanti a scandire il resto della @dfn{regexp}.
-
-@cindex @code{\} (barra inversa), @code{\"}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\"}, sequenza di protezione
-@item \"
-Un doppio apice (necessario solo per costanti stringa).
-Questa sequenza si usa per inserire in una costante stringa il carattere
-doppio apice
-(come @code{"Egli le disse \"ciao!\"."}).
-Poich@'e la stringa @`e racchiusa tra
-doppi apici, si deve proteggere ogni doppio apice che sia parte della stringa
-per dire ad @command{awk} di andare avanti a elaborare il resto della stringa.
-@end table
-
-In @command{gawk}, parecchie altre sequenze di due caratteri inizianti con
-con una barra inversa hanno un significato speciale nelle @dfn{regexp}.
-@ref{Operatori di @dfn{regexp} GNU}.
-
-In una @dfn{regexp}, una barra inversa che preceda un carattere non presente
-nella lista precedente, e non elencato in
-@ref{Operatori di @dfn{regexp} GNU},
-significa che il carattere seguente dovrebbe essere preso letteralmente,
-anche se normalmente sarebbe un operatore di @dfn{regexp}. Per esempio,
-@code{/a\+b/} individua i tre caratteri @samp{a+b}.
-
-@cindex barra inversa (@code{\}), in sequenze di protezione
-@cindex @code{\} (barra inversa), in sequenze di protezione
-@cindex portabilit@`a
-Per una completa portabilit@`a, non usare una barra inversa prima di qualsiasi
-carattere non incluso nella lista precedente, o che non sia un operatore.
-@c 11/2014: Moved so as to not stack sidebars
-@cindex sidebar, Barra inversa prima di un carattere normale
-@ifdocbook
-@docbook
-<sidebar><title>Barra inversa prima di un carattere normale</title>
-@end docbook
-
-@cindex portabilit@`a, barra inversa in sequenze di protezione
-@cindex POSIX @command{awk}, barre inverse in costanti stringa
-@cindex barra inversa (@code{\}), in sequenze di protezione, POSIX e
-@cindex @code{\} (barra inversa), in sequenze di protezione, POSIX e
-
-@cindex risoluzione di problemi, barra inversa prima di caratteri non speciali
-@cindex problemi, risoluzione di, barra inversa prima di caratteri non speciali
-Se si mette una barra inversa in una costante stringa prima di qualcosa che
-non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
-lascia indefinito il comportamento. Ci sono due possibilit@`a:
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex Brian Kernighan, @command{awk} di
-@table @asis
-@item Togliere la barra inversa
-Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
-Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
-(Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
-probabilit@`a, @command{gawk} lo segnala).
-Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
-ossia delle barre verticali precedute e seguite da almeno uno spazio,
-occorre mettere due barre inverse nella stringa:
-@samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
-@c I did this! This is why I added the warning.
-
-@cindex @command{gawk}, sequenze di protezione
-@cindex Unix @command{awk}, barre inverse in sequenze di protezione
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
-Alcune altre implementazioni di @command{awk} fanno questo.
-In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
-@code{"a\\qc"}.
-@end table
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Barra inversa prima di un carattere normale}
-
-
-@cindex portabilit@`a, barra inversa in sequenze di protezione
-@cindex POSIX @command{awk}, barre inverse in costanti stringa
-@cindex barra inversa (@code{\}), in sequenze di protezione, POSIX e
-@cindex @code{\} (barra inversa), in sequenze di protezione, POSIX e
-
-@cindex risoluzione di problemi, barra inversa prima di caratteri non speciali
-@cindex problemi, risoluzione di, barra inversa prima di caratteri non speciali
-Se si mette una barra inversa in una costante stringa prima di qualcosa che
-non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
-lascia indefinito il comportamento. Ci sono due possibilit@`a:
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex Brian Kernighan, @command{awk} di
-@table @asis
-@item Togliere la barra inversa
-Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
-Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
-(Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
-probabilit@`a, @command{gawk} lo segnala).
-Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
-ossia delle barre verticali precedute e seguite da almeno uno spazio,
-occorre mettere due barre inverse nella stringa:
-@samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
-@c I did this! This is why I added the warning.
-
-@cindex @command{gawk}, sequenze di protezione
-@cindex Unix @command{awk}, barre inverse in sequenze di protezione
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
-Alcune altre implementazioni di @command{awk} fanno questo.
-In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
-@code{"a\\qc"}.
-@end table
-@end cartouche
-@end ifnotdocbook
-Ricapitolando:
-
-@itemize @value{BULLET}
-@item
-Le sequenze di protezione nella lista di cui sopra sono sempre elaborate
-per prime, sia per le costanti stringa che per le costanti @dfn{regexp}. Questo
-viene fatto quasi subito, non appena @command{awk} legge il programma.
-
-@item
-@command{gawk} elabora sia costanti @dfn{regexp} che @dfn{regexp} dinamiche
-(@pxref{Espressioni regolari calcolate}),
-per gli operatori speciali elencati in
-@ref{Operatori di @dfn{regexp} GNU}.
-
-@item
-Una barra inversa prima di ogni altro carattere richiede di trattare quel
-carattere letteralmente.
-@end itemize
-
-@cindex sidebar, Sequenze di protezione per metacaratteri
-@ifdocbook
-@docbook
-<sidebar><title>Sequenze di protezione per metacaratteri</title>
-@end docbook
-
-@cindex metacaratteri, sequenze di protezione per
-
-Supponiamo che si usi una protezione ottale o esadecimale
-per rappresentare un metacarattere di @dfn{regexp}
-(si veda @ref{Operatori di espressioni regolari}).
-@command{awk} considera il carattere come un carattere letterale o
-come un operatore di @dfn{regexp}?
-
-@cindex angolo buio, sequenze di protezione, per metacaratteri
-Storicamente, tali caratteri erano considerati letteralmente.
-@value{DARKCORNER}
-Invece, lo standard POSIX richiede che siano considerati
-come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
-In modalit@`a compatibile (@pxref{Opzioni}),
-@command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
-letteramente, quando sono usati in costanti @dfn{regexp}. Quindi,
-@code{/a\52b/} @`e equivalente a @code{/a\*b/}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Sequenze di protezione per metacaratteri}
-
-
-@cindex metacaratteri, sequenze di protezione per
-
-Supponiamo che si usi una protezione ottale o esadecimale
-per rappresentare un metacarattere di @dfn{regexp}
-(si veda @ref{Operatori di espressioni regolari}).
-@command{awk} considera il carattere come un carattere letterale o
-come un operatore di @dfn{regexp}?
-
-@cindex angolo buio, sequenze di protezione, per metacaratteri
-Storicamente, tali caratteri erano considerati letteralmente.
-@value{DARKCORNER}
-Invece, lo standard POSIX richiede che siano considerati
-come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
-In modalit@`a compatibile (@pxref{Opzioni}),
-@command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
-letteramente, quando sono usati in costanti @dfn{regexp}. Quindi,
-@code{/a\52b/} @`e equivalente a @code{/a\*b/}.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di espressioni regolari
-@section Operatori di espressioni regolari
-@cindex espressioni regolari, operatori
-@cindex metacaratteri in espressioni regolari
-
-@`E possibile inserire in espressioni regolari dei caratteri speciali,
-detti @dfn{operatori di espressioni regolari} o @dfn{metacaratteri}, per
-aumentarne il potere e la versatilit@`a.
-
-Le sequenze di protezione descritte
-@ifnotinfo
-prima
-@end ifnotinfo
-in @ref{Sequenze di protezione}
-sono valide all'interno di una @dfn{regexp}. Sono precedute da una @samp{\} e
-sono riconosciute e convertite nei caratteri reali corrispondenti nella
-primissima fase dell'elaborazione delle @dfn{regexp}.
-
-Ecco una lista dei metacaratteri. Tutti i caratteri che non sono sequenze
-di protezione e che non sono elencati qui rappresentano se stessi:
-
-@c Use @asis so the docbook comes out ok. Sigh.
-@table @asis
-@cindex barra inversa (@code{\}), operatore @dfn{regexp}
-@cindex barra inversa (@code{\}), operatore @dfn{regexp}
-@cindex @code{\} (barra inversa), operatore @dfn{regexp}
-@item @code{\}
-Si usa per togliere il significato speciale a un carattere quando si effettuano
-confronti. Per esempio, @samp{\$}
-individua il carattere @samp{$}.
-
-@cindex espressioni regolari, ancore nelle
-@cindex Texinfo, inizi di capitolo nei file
-@cindex @code{^} (circonflesso), operatore @dfn{regexp}
-@cindex circonflesso (@code{^}), operatore @dfn{regexp}
-@item @code{^}
-Si usa per indicare l'inizio di una stringa. Per esempio, @samp{^@@chapter}
-individua @samp{@@chapter} all'inizio di una stringa e si pu@`o usare per
-identificare inizi di capitoli in file sorgenti Texinfo.
-Il simbolo @samp{^} @`e conosciuto come @dfn{@`ancora}, perch@'e @`ancora la ricerca
-solo all'inizio della stringa.
-
-@`E importante notare che @samp{^} non individua un inizio di riga
-(il punto subito dopo un ritorno a capo @samp{\n}) che si trovi all'interno
-di una stringa. La condizione non @`e verificata nell'esempio seguente:
-
-@example
-if ("riga1\nRIGA 2" ~ /^R/) @dots{}
-@end example
-
-@cindex @code{$} (dollaro), operatore @dfn{regexp}
-@cindex dollaro (@code{$}), operatore @dfn{regexp}
-@item @code{$}
-Simile a @samp{^}, ma serve a indicare la fine di una stringa.
-Per esempio, @samp{p$}
-individua un record che termina con la lettera @samp{p}. Il @samp{$} @`e
-un'@`ancora e non individua una fine di riga (il punto immediatamente prima
-di un carattere di ritorno a capo @samp{\n})
-contenuta in una stringa.
-La condizione nell'esempio seguente non @`e verificata:
-
-@example
-if ("riga1\nRIGA 2" ~ /1$/) @dots{}
-@end example
-
-@cindex @code{.} (punto), operatore @dfn{regexp}
-@cindex punto (@code{.}), operatore @dfn{regexp}
-@item @code{.} (punto)
-Individua un qualsiasi carattere,
-@emph{incluso} il carattere di ritorno a capo. Per esempio, @samp{.P}
-individua ogni carattere in una stringa che sia seguito da una @samp{P}.
-Usando la concatenazione, si pu@`o formare un'espressione regolare come
-@samp{U.A}, che individua qualsiasi sequenza di tre caratteri che inizia con
-@samp{U} e finisce con @samp{A}.
-
-@cindex POSIX @command{awk}, uso del punto (@code{.})
-In modalit@`a POSIX stretta (@pxref{Opzioni}),
-@samp{.} non individua il carattere @sc{nul},
-ossia il carattere con tutti i bit uguali a zero.
-In altri contesti, @sc{nul} @`e solo un carattere qualsiasi. Altre versioni
-di @command{awk} possono non essere in grado di individuare il carattere
-@sc{nul}.
-
-@cindex @code{[]} (parentesi quadre), operatore @dfn{regexp}
-@cindex parentesi quadre (@code{[]}), operatore @dfn{regexp}
-@cindex espressioni tra parentesi
-@cindex insiemi di caratteri, si veda anche espressioni tra parentesi quadre
-@cindex liste di caratteri, si veda espressioni tra parentesi quadre
-@cindex classi di caratteri, si veda espressioni tra parentesi quadre
-@item @code{[}@dots{}@code{]}
-Questa @`e chiamata una @dfn{espressione tra parentesi quadre}.@footnote{In
-altri testi, un'espressione tra parentesi quadre potrebbe essere
-definita come @dfn{insieme di caratteri}, @dfn{classe di caratteri} o
- @dfn{lista di caratteri}.}
-Individua @emph{uno} qualsiasi dei caratteri racchiusi tra
-parentesi quadre. Per esempio, @samp{[MVX]} individua uno qualsiasi
-dei caratteri @samp{M}, @samp{V}, o @samp{X} in una stringa. Una spiegazione
-esauriente di quel che si pu@`o mettere all'interno di un'espressione tra
-parentesi quadre @`e data in
-@ref{Espressioni tra parentesi quadre}.
-
-@cindex espressioni tra parentesi quadre, complementate
-@item @code{[^}@dots{}@code{]}
-Questa @`e una @dfn{espressione tra parentesi quadre complementata}. Il primo
-carattere dopo la @samp{[} @emph{deve} essere un @samp{^}. Individua
-qualsiasi carattere
-@emph{tranne} quelli tra parentesi quadre. Per esempio, @samp{[^awk]}
-individua qualsiasi carattere che non sia una @samp{a}, @samp{w}, o @samp{k}.
-
-@cindex @code{|} (barra verticale)
-@cindex barra verticale (@code{|})
-@item @code{|}
-Questo @`e un @dfn{operatore alternativa} ed @`e usato per specificare delle
-alternative. La @samp{|} ha la precedenza pi@`u bassa tra tutti gli operatori
-di espressioni regolari. Per esempio, @samp{^P|[aeiouy]} individua tutte le
-stringhe corrispondenti a @samp{^P} oppure a @samp{[aeiouy]}. Ci@`o significa
-che individua qualsiasi stringa che inizi con @samp{P} o contenga (in
-qualsiasi posizione al suo interno) una vocale inglese minuscola.
-
-L'alternativa si applica alle @dfn{regexp} pi@`u ampie individuabili in ogni
-lato.
-
-@cindex @code{()} (parentesi), operatore @dfn{regexp}
-@cindex parentesi (@code{()}), operatore @dfn{regexp}
-@item @code{(}@dots{}@code{)}
-Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia
-in quelle aritmetiche. Si possono usare per concatenare espressioni regolari
-che contengono l'operatore alternativa, @samp{|}. Per esempio,
-@samp{@@(samp|code)\@{[^@}]+\@}} individua sia @samp{@@code@{pippo@}} sia
-@samp{@@samp@{pluto@}}.
-(Queste sono sequenze in linguaggio Texinfo per controllare la formattazione.
-Il significato di @samp{+} @`e
-spiegato pi@`u avanti in questa lista.)
-
-@cindex @code{*} (asterisco), operatore @code{*}, come operatore @dfn{regexp}
-@cindex asterisco (@code{*}), operatore @code{*}, come operatore @dfn{regexp}
-@item @code{*}
-Questo simbolo richiede che la precedente espressione regolare sia
-ripetuta tante volte quanto serve per trovare una corrispondenza. Per
-esempio, @samp{ph*} applica il simbolo
-@samp{*} al carattere @samp{h} che lo precede immediatamente e ricerca
-corrispondenze costituite da una @samp{p} seguita da un numero qualsiasi di
-@samp{h}. Viene individuata anche solo la @samp{p}, se non ci sono
-@samp{h}.
-
-Ci sono due sfumature da capire sul funzionamento di @samp{*}.
-Primo, @samp{*} tiene conto solo del singolo componente dell'espressione
-regolare che lo precede (p.es., in @samp{ph*} vale solo per @samp{h}).
-Per fare s@`{@dotless{i}} che @samp{*} si applichi a una sottoespressione pi@`u estesa,
-occorre metterla tra parentesi:
-@samp{(ph)*} individua @samp{ph}, @samp{phph}, @samp{phphph} e cos@`{@dotless{i}} via.
-
-Secondo, @samp{*} trova quante pi@`u ripetizioni siano possibili. Se il testo
-da ricercare @`e @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} individua tutte le
-@samp{h}.
-
-@cindex @code{+} (pi@`u), operatore @dfn{regexp}
-@cindex pi@`u (@code{+}), 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
-@samp{wh+y} individuerebbe @samp{why} e @samp{whhy}, ma non @samp{wy}, mentre
-@samp{wh*y} li troverebbe tutti e tre.
-
-@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
-@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
-@item @code{?}
-Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione che
-precede pu@`o essere trovata una volta sola oppure non trovata
-affatto. Per esempio, @samp{fe?d}
-individua @samp{fed} e @samp{fd}, ma nient'altro.
-
-@cindex espressioni di intervallo, (@dfn{regexp})
-@item @code{@{}@var{n}@code{@}}
-@itemx @code{@{}@var{n}@code{,@}}
-@itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
-Uno o due numeri tra parentesi graffe rappresentano una
-@dfn{espressione di intervallo}.
-Se c'@`e un numero tra graffe, la @dfn{regexp} precedente @`e ripetuta
-@var{n} volte.
-Se ci sono due numeri separati da una virgola, la @dfn{regexp} precedente @`e
-ripetuta da @var{n} a @var{m} volte.
-Se c'@`e un numero seguito da una virgola, allora la @dfn{regexp} precedente
-@`e ripetuta almeno @var{n} volte:
-
-@table @code
-@item wh@{3@}y
-Riconosce @samp{whhhy}, ma non @samp{why} o @samp{whhhhy}.
-
-@item wh@{3,5@}y
-Riconosce soltanto @samp{whhhy}, @samp{whhhhy}, o @samp{whhhhhy}.
-
-@item wh@{2,@}y
-Riconosce @samp{whhy}, @samp{whhhy} e cos@`{@dotless{i}} via.
-@end table
-
-@cindex POSIX @command{awk}, espressioni di intervallo in
-Le espressioni di intervallo non erano tradizionalmente disponibili in
-@command{awk}. Sono state aggiunte come parte dello standard POSIX per
-rendere @command{awk} ed @command{egrep} coerenti tra di loro.
-
-@cindex @command{gawk}, espressioni di intervallo e
-In passato, poich@'e vecchi programmi possono usare @samp{@{} e @samp{@}} in
-costanti @dfn{regexp},
-@command{gawk} @emph{non} riconosceva espressioni di intervallo
-nelle @dfn{regexp}.
-
-Comunque, a partire dalla @value{PVERSION} 4.0,
-@command{gawk} riconosce espressioni di intervallo per default.
-Ci@`o accade perch@'e la compatibilit@`a con POSIX @`e ritenuta pi@`u
-importante da molti utenti @command{gawk} rispetto alla compatibilit@`a con
-dei vecchi programmi.
-
-Per programmi che usano @samp{@{} e @samp{@}} in costanti @dfn{regexp},
-@`e buona pratica proteggerli sempre con una barra inversa. Allora le
-costanti @dfn{regexp} sono valide e si comportano come desiderato, usando
-qualsiasi versione di @command{awk}.@footnote{@`E meglio usare due barre inverse
-se si sta usando una costante stringa con un operatore @dfn{regexp} o una
-funzione.}
-
-Infine, quando @samp{@{} e @samp{@}} appaiono in costanti @dfn{regexp}
-in un modo non interpretabile come espressione di intervallo
-(come in @code{/q@{a@}/}), allora sono prese letteralmente.
-@end table
-
-@cindex precedenza, operatore @dfn{regexp}
-@cindex espressioni regolari, operatori, precedenza di
-Nelle espressioni regolari, gli operatori @samp{*}, @samp{+}, e @samp{?},
-come pure le parentesi graffe @samp{@{} e @samp{@}},
-hanno
-la precedenza pi@`u alta, seguiti dalla concatenazione, e infine da @samp{|}.
-Come nell'algebra, le parentesi possono cambiare il raggruppamento degli
-operatori.
-@cindex POSIX @command{awk}, espressioni regolari e
-@cindex @command{gawk}, espressioni regolari, precedenza
-In POSIX @command{awk} e in @command{gawk}, gli operatori @samp{*},
-@samp{+}, e @samp{?} rappresentano se stessi quando non c'@`e nulla
-nella @dfn{regexp} che li precede. Per esempio, @code{/+/} individua un
-semplice segno pi@`u. Comunque, molte altre versioni di @command{awk}
-trattano una simile notazione come un errore di sintassi.
-
-Se @command{gawk} @`e in modalit@`a compatibile (@pxref{Opzioni}), le espressioni
-di intervallo non si possono usare nelle espressioni regolari.
-
-@node Espressioni tra parentesi quadre
-@section Usare espressioni tra parentesi quadre
-@cindex espressioni tra parentesi quadre
-@cindex espressioni tra parentesi quadre, espressioni di intervallo
-@cindex espressioni di intervallo, (@dfn{regexp})
-@cindex elenchi di caratteri in un'espressione regolare
-@cindex caratteri, elenchi di, in un'espressione regolare
-
-Come detto sopra, un'espressione tra parentesi quadre individua qualsiasi
-carattere incluso tra le parentesi quadre aperta e chiusa.
-
-All'interno di un'espressione tra parentesi quadre, una
-@dfn{espressione di intervallo} @`e formata da due caratteri separati da un
-trattino. Individua ogni singolo carattere compreso tra i due caratteri,
-ordinati secondo l'insieme di caratteri in uso nel sistema. Per esempio,
-@samp{[0-9]} @`e equivalente a @samp{[0123456789]}.
-(Si veda @ref{Intervalli e localizzazione} per una spiegazione di come
-lo standard POSIX e @command{gawk} sono cambiati nel corso degli anni.
-La cosa ha un interesse principalmente storico.)
-
-Con la crescente popolarit@`a dello
-@uref{http://www.unicode.org, standard di caratteri Unicode},
-c'@`e un'ulteriore dettaglio da tenere in conto. Le sequenze di
-protezione ottali ed esadecimali utilizzabili per inserire
-valori all'interno di espressioni tra parentesi quadre
-sono considerate contenere solo caratteri
-che occupano un unico byte (caratteri il cui valore stia
-nell'intervallo 0--256). Per individuare un intervallo di
-caratteri in cui i punti di inizio e fine dell'intervello
-abbiano valori maggiori di 256, occorre immettere direttamente
-le codifiche multi-byte dei caratteri in questione.
-
-@cindex @code{\} (barra inversa), in espressioni tra parentesi quadre
-@cindex barra inversa (@code{\}), in espressioni tra parentesi quadre
-@cindex @code{^} (circonflesso), in espressioni tra parentesi quadre
-@cindex circonflesso (@code{^}), in espressioni tra parentesi quadre
-@cindex @code{-} (meno), in espressioni tra parentesi quadre
-@cindex meno (@code{-}), in espressioni tra parentesi quadre
-Per includere uno dei caratteri @samp{\}, @samp{]}, @samp{-}, o @samp{^} in
-un'espressione tra parentesi quadre, occorre inserire un @samp{\} prima del
-carattere stesso. Per esempio:
-
-@example
-[d\]]
-@end example
-
-@noindent
-individua sia @samp{d} che @samp{]}.
-Inoltre, se si mette una @samp{]} subito dopo la
-@samp{[} aperta, la parentesi quadra chiusa @`e considerata come uno dei
-caratteri da individuare.
-
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e
-@cindex espressioni regolari estese (ERE)
-@cindex ERE (espressioni regolari estese)
-@cindex @command{egrep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{egrep}
-L'utilizzo di @samp{\} nelle espressioni tra parentesi quadre
-@`e compatibile con altre implementazioni di @command{awk} ed @`e anche richiesto
-da POSIX.
-Le espressioni regolari in @command{awk} sono un insieme pi@`u esteso delle
-specificazioni POSIX per le espressioni regolari estese (ERE).
-Le ERE POSIX sono basate sulle espressioni regolari accettate dal
-tradizionale programma di utilit@`a @command{egrep}.
-
-@cindex espressioni tra parentesi quadre, classi di caratteri
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
-Le @dfn{classi di caratteri} sono una funzionalit@`a introdotta nello standard
-POSIX. Una classe di caratteri @`e una particolare notazione per descrivere
-liste di caratteri cha hanno un attributo specifico, ma i caratteri
-veri e propri possono variare da paese a paese e/o
-da insieme di caratteri a insieme di caratteri. Per esempio, la nozione di
-cosa sia un carattere alfabetico @`e diversa tra gli Stati Uniti e la Francia.
-
-Una classe di caratteri @`e valida solo in una @dfn{regexp} @emph{contenuta}
-tra le parentesi quadre di un'espressione tra parentesi quadre. Le classi di
-caratteri consistono di @samp{[:},
-una parola chiave che segnala la classe, e @samp{:]}. La
-@ref{tabella-caratteri-classe} elenca le classi di caratteri definite dallo
-standard POSIX.
-
-@float Tabella,tabella-caratteri-classe
-@caption{classi di caratteri POSIX}
-@multitable @columnfractions .15 .85
-@headitem Classe @tab Significato
-@item @code{[:alnum:]} @tab Caratteri alfanumerici.
-@item @code{[:alpha:]} @tab Caratteri alfabetici.
-@item @code{[:blank:]} @tab Caratteri spazio e TAB.
-@item @code{[:cntrl:]} @tab Caratteri di controllo.
-@item @code{[:digit:]} @tab Caratteri numerici.
-@item @code{[:graph:]} @tab Caratteri che sono stampabili e visibili.
-(Uno @dfn{spazio} @`e stampabile ma non visibile, mentre una @samp{a} @`e l'uno e
-l'altro.)
-@item @code{[:lower:]} @tab Caratteri alfabetici minuscoli.
-@item @code{[:print:]} @tab Caratteri stampabili (caratteri che non sono
-caratteri di controllo).
-@item @code{[:punct:]} @tab Caratteri di punteggiatura (caratteri che non
-sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
-@item @code{[:space:]} @tab Caratteri di spazio (come @dfn{spazio}, TAB, e
-@dfn{formfeed}, per citarne alcuni).
-@item @code{[:upper:]} @tab Caratteri alfabetici maiuscoli.
-@item @code{[:xdigit:]} @tab Caratteri che sono cifre esadecimali.
-@end multitable
-@end float
-
-Per esempio, prima dello standard POSIX, si doveva scrivere
-@code{/[A-Za-z0-9]/} per individuare i
-caratteri alfanumerici. Se l'insieme
-di caratteri in uso comprendeva altri caratteri alfabetici, l'espressione
-non li avrebbe individuati.
-Con le classi di caratteri POSIX si pu@`o scrivere
-@code{/[[:alnum:]]/} per designare i caratteri alfabetici e numerici
-dell'insieme di caratteri in uso.
-
-@c Thanks to
-@c Date: Tue, 01 Jul 2014 07:39:51 +0200
-@c From: Hermann Peifer <peifer@gmx.eu>
-Alcuni programmi di utilit@`a che cercano espressioni regolari prevedono
-una classe di caratteri, non standard,
-@samp{[:ascii:]}; @command{awk} non la prevede. Tuttavia, @`e possibile ottenere
-lo stesso risultato utilizzando @samp{[\x00-\x7F]}. Quest'espressione
-individua tutti i valori numerici tra zero e 127, che @`e l'intervallo definito
-dell'insieme di caratteri ASCII. Usando una lista di caratteri che esclude
-(@samp{[^\x00-\x7F]}) si individuano tutti i caratteri mono-byte che non
-sono nell'intervallo ASCII.
-
-@cindex espressioni tra parentesi quadre, elementi di collazione
-@cindex espressioni tra parentesi quadre, non-ASCII
-@cindex elementi di collazione
-In espressioni tra parentesi quadre possono apparire due ulteriori sequenze
-speciali. Riguardano insiemi di caratteri non-ASCII, che possono avere
-simboli singoli (chiamati @dfn{elementi di collazione}) che sono rappresentati
-con pi@`u di un carattere. Possono designare anche parecchi caratteri che sono
-equivalenti tra loro ai fini della @dfn{collazione}, o dell'ordinamento.
-(Per esempio, in francese, la semplice ``e'' e la sua versione con accento grave ``@`e''
-sono equivalenti). Queste sequenze sono:
-
-@table @asis
-@cindex espressioni tra parentesi quadre, elementi di collazione
-@cindex elementi di collazione
-@item elementi di collazione
-Elementi di collazione multi-byte racchiusi fra
-@samp{[.} e @samp{.]}. Per esempio, se @samp{ch} @`e un elemento di collazione,
-@samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di
-collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere
-@samp{c} o @samp{h}.
-
-@cindex espressioni tra parentesi quadre, classi di equivalenza
-@item classi di equivalenza
-Sono nomi, specifici a una particolare localizzazione, per una lista di
-caratteri equivalenti tra loro. Il nome @`e racchiuso fra
-@samp{[=} e @samp{=]}.
-Per esempio, il nome @samp{e} potrebbe essere usato per designare
-``e'', ``@^e'', ``@`e'', e ``@'e''. In questo caso, @samp{[[=e=]]} @`e una @dfn{regexp}
-che corrisponde a @samp{e}, @samp{@^e}, @samp{@`e} e @samp{@'e}.
-@end table
-
-Queste funzionalit@`a sono molto utili in localizzazioni non inglesi.
-
-@cindex internazionalizzazione, localizzazione, classi di caratteri
-@cindex @command{gawk}, classi di caratteri e
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
-@quotation ATTENZIONE
-Le funzioni di libreria che @command{gawk} usa per individuare le espressioni
-regolari per ora riconoscono solo le classi di caratteri POSIX;
-non riconoscono simboli di collazione o classi di equivalenza.
-@end quotation
-@c maybe one day ...
-
-In un'espressione tra parentesi quadre, una parentesi aperta (@samp{[})
-che non costituisca l'inizio della specificazione di una classe di
-caratteri, di simboli di collazione o di una classe di equivalenza
-@`e interpretata letteralmente. Questo vale anche per @samp{.} e @samp{*}.
-
-@node Pi@`u lungo da sinistra
-@section Quanto @`e lungo il testo individuato?
-
-@cindex espressioni regolari, corrispondenza pi@`u a sinistra
-@c @cindex matching, leftmost longest
-Si consideri il caso seguente:
-
-@example
-echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
-@end example
-
-Questo esempio usa la funzione @code{sub()} per modificare il record in input.
-(@code{sub()} sostituisce la prima ricorrenza in ogni testo individuato dal
-primo argomento con la stringa fornita come secondo argomento;
-@pxref{Funzioni per stringhe}.) Qui, la @dfn{regexp} @code{/a+/} richiede
-``uno o pi@`u caratteri @samp{a},'' e il testo da sostituire @`e @samp{<A>}.
-
-L'input contiene quattro caratteri @samp{a}.
-Le espressioni regolari @command{awk} (e POSIX) individuano sempre
-la sequenza @emph{pi@`u lunga}, partendo da sinistra, di caratteri in input che
-corrispondono. Quindi, tutti e quattro i caratteri @samp{a} sono
-rimpiazzati con @samp{<A>} in questo esempio:
-
-@example
-$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
-@print{} <A>bcd
-@end example
-
-Per semplici test corrisponde/non corrisponde, la cosa ha poca importanza.
-Ma se si sta controllando un testo o si fanno sostituzioni usando le funzioni
-@code{match()}, @code{sub()}, @code{gsub()} e @code{gensub()},
-@`e invece molto importante.
-@ifinfo
-@xref{Funzioni per stringhe},
-Per maggiori informazioni su queste funzioni.
-@end ifinfo
-Tenere in conto questo principio @`e importante anche quando si suddividono
-record e campi usando delle @dfn{regexp} (@pxref{Record},
-e anche @pxref{Separatori di campo}).
-
-@node Espressioni regolari calcolate
-@section Usare @dfn{regexp} dinamiche
-
-@cindex espressioni regolari calcolate
-@cindex espressioni regolari dinamiche
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@c @cindex operators, @code{~}
-@c @cindex operators, @code{!~}
-L'espressione a destra di un operatore @samp{~} o @samp{!~} non deve
-necessariamente essere una costante @dfn{regexp} (cio@`e, una stringa di
-caratteri tra barre). Pu@`o essere una qualsiasi
-espressione. L'espressione @`e valutata e convertita in una stringa
-se necessario; il contenuto della stringa @`e poi usato come una @dfn{regexp}.
-Una @dfn{regexp} calcolata in questo modo @`e detta una @dfn{regexp dinamica}
-o una @dfn{regexp calcolata}:
-
-@example
-BEGIN @{ @dfn{regexp}_numerica = "[[:digit:]]+" @}
-$0 ~ @dfn{regexp}_numerica @{ print @}
-@end example
-
-@noindent
-Questo @dfn{script} imposta @code{regexp_numerica} come una @dfn{regexp} che
-descrive una o pi@`u cifre, e poi controlla se un record in input corrisponde a
-questa regexp.
-
-@quotation NOTA
-Usando gli operatori @samp{~} e @samp{!~}, si tenga presente che c'@`e
-una differenza tra una costante @dfn{regexp} racchiusa tra barre e una
-costante stringa racchiusa tra doppi apici.
-Se si intende utilizzare una costante stringa, occorre comprendere che
-la stringa @`e, in sostanza, scandita @emph{due volte}: la prima volta quando
-@command{awk} legge il programma, e la seconda volta quando va a
-confrontare la stringa a sinistra dell'operatore con il modello che sta
-alla sua destra. Questo vale per ogni espressione (come la
-@code{regexp_numerica}, vista nel precedente esempio), non solo per le
-costanti stringa.
-@end quotation
-
-@cindex costanti @dfn{regexp}, barre vs.@: doppi apici
-@cindex @code{\} (barra inversa), in costanti @dfn{regexp}
-@cindex barra inversa (@code{\}), in costanti @dfn{regexp}
-@cindex @code{"} (doppio apice), in costanti @dfn{regexp}
-@cindex doppio apice (@code{"}), in costanti @dfn{regexp}
-Che differenza fa la doppia scansione di una stringa?
-La risposta ha a che vedere con le sequenze di protezione e particolarmente
-con le barre inverse. Per inserire una barra inversa in un'espressione
-regolare all'interno di una stringa, occorre inserire @emph{due} barre
-inverse.
-
-Per esempio, @code{/\*/} @`e una costante @dfn{regexp} per designare un @samp{*}
-letterale.
-@`E richiesta una sola barra inversa. Per fare lo stesso con una stringa,
-occorre immettere @code{"\\*"}. La prima barra inversa protegge la
-seconda in modo che la stringa in realt@`a contenga i
-due caratteri @samp{\} e @samp{*}.
-
-@cindex risoluzione di problemi, costanti @dfn{regexp} vs.@: costanti stringa
-@cindex problemi, risoluzione di, costanti @dfn{regexp} vs.@: costanti stringa
-@cindex costanti @dfn{regexp}, vs.@: costanti stringa
-@cindex costanti stringa, vs.@: costanti @dfn{regexp}
-Dato che si possono usare sia costanti @dfn{regexp} che costanti stringa per
-descrivere espressioni regolari, qual @`e da preferire? La risposta @`e
-``costanti @dfn{regexp}'', per molti motivi:
-
-@itemize @value{BULLET}
-@item
-Le costanti stringa sono pi@`u complicate da scrivere e pi@`u difficili
-da leggere. Usare costanti @dfn{regexp} rende i programmi
-meno inclini all'errore. Non comprendere la differenza tra i due tipi di
-costanti @`e una fonte frequente di errori.
-
-@item
-@`E pi@`u efficiente usare costanti @dfn{regexp}. @command{awk} pu@`o accorgersi
-che @`e stata fornita una @dfn{regexp} e memorizzarla internamente in una forma
-che rende la ricerca di corrispondenze pi@`u efficiente. Se si usa una costante
-stringa, @command{awk} deve prima convertire la stringa nel suo formato
-interno e quindi eseguire la ricerca di corrispondenze.
-
-@item
-Usare costanti @dfn{regexp} @`e la forma migliore; lascia comprendere
-chiaramente che si vuole una corrispondenza con una @dfn{regexp}.
-@end itemize
-
-@cindex sidebar, Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche
-@ifdocbook
-@docbook
-<sidebar><title>Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche</title>
-@end docbook
-
-@cindex espressioni regolari dinamiche, contenenti dei ritorni a capo
-@cindex ritorno a capo, in @dfn{regexp} dinamiche
-
-Alcune delle prime versioni di @command{awk} non consentono di usare il
-carattere di ritorno
-a capo all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
-dinamiche:
-
-@example
-$ @kbd{awk '$0 ~ "[ \t\n]"'}
-@error{} awk: newline in character class [
-@error{} ]...
-@error{} source line number 1
-@error{} context is
-@error{} $0 ~ "[ >>> \t\n]" <<<
-@end example
-
-@cindex ritorno a capo, in costanti @dfn{regexp}
-Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
-
-@example
-$ @kbd{awk '$0 ~ /[ \t\n]/'}
-@kbd{ecco una riga di esempio}
-@print{} ecco una riga di esempio
-@kbd{Ctrl-d}
-@end example
-
-@command{gawk} non ha questo problema, e non dovrebbe accadere spesso
-in pratica, ma val la pena di notarlo a futura memoria.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche}
-
-
-@cindex espressioni regolari dinamiche, contenenti dei ritorni a capo
-@cindex ritorno a capo, in @dfn{regexp} dinamiche
-
-Alcune delle prime versioni di @command{awk} non consentono di usare il
-carattere di ritorno
-a capo all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
-dinamiche:
-
-@example
-$ @kbd{awk '$0 ~ "[ \t\n]"'}
-@error{} awk: newline in character class [
-@error{} ]...
-@error{} source line number 1
-@error{} context is
-@error{} $0 ~ "[ >>> \t\n]" <<<
-@end example
-
-@cindex ritorno a capo, in costanti @dfn{regexp}
-Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
-
-@example
-$ @kbd{awk '$0 ~ /[ \t\n]/'}
-@kbd{ecco una riga di esempio}
-@print{} ecco una riga di esempio
-@kbd{Ctrl-d}
-@end example
-
-@command{gawk} non ha questo problema, e non dovrebbe accadere spesso
-in pratica, ma val la pena di notarlo a futura memoria.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di @dfn{regexp} GNU
-@section Operatori @dfn{regexp} propri di @command{gawk}
-
-@c This section adapted (long ago) from the regex-0.12 manual
-
-@cindex espressioni regolari, operatori, @command{gawk}
-@cindex @command{gawk}, espressioni regolari, operatori
-@cindex operatori, specifici per GNU
-@cindex espressioni regolari, operatori, per parole
-@cindex parola, definizione in @dfn{regexp}
-Il software GNU che ha a che fare con espressioni regolari comprende alcuni
-operatori @dfn{regexp} aggiuntivi. Questi
-operatori sono descritti in
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION} e sono specificamente
-per @command{gawk}; non sono disponibili in altre implementazioni di
-@command{awk}.
-La maggior parte degli operatori aggiuntivi riguarda l'identificazione di
-parole. Ai nostri fini, una @dfn{parola} @`e una sequenza di uno o pi@`u lettere,
-cifre, o trattini bassi (@samp{_}):
-
-@table @code
-@c @cindex operatori, @code{\s} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\s}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\s}, operatore (@command{gawk})
-@item \s
-Corrisponde a ogni carattere bianco.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[[:space:]]}}.
-
-@c @cindex operatori, @code{\S} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\S}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\S}, operatore (@command{gawk})
-@item \S
-Corrisponde a ogni carattere che non @`e uno spazio bianco.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[^[:space:]]}}.
-
-@c @cindex operatori, @code{\w} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\w}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\w}, operatore (@command{gawk})
-@item \w
-Corrisponde a ogni carattere che componga una parola; ovvero, corrisponde a
-ogni lettera, cifra, o trattino basso.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[[:alnum:]_]}}.
-
-@c @cindex operatori, @code{\W} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\W}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\W}, operatore (@command{gawk})
-@item \W
-Corrisponde a ogni carattere che non @`e parte di una parola.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[^[:alnum:]_]}}.
-
-@c @cindex operatori, @code{\<} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\<}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\<}, operatore (@command{gawk})
-@item \<
-Individua la stringa nulla all'inizio di una parola.
-Per esempio, @code{/\<via/} individua @samp{via} ma non
-@samp{funivia}.
-
-@c @cindex operatori, @code{\>} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\>}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\>}, operatore (@command{gawk})
-@item \>
-Individua la stringa nulla alla fine di una parola.
-Per esempio, @code{/via\>/} individua @samp{via} ma non @samp{viadotto}.
-
-@c @cindex operatori, @code{\y} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\y}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\y}, operatore (@command{gawk})
-@cindex limite-di-parola, individuare il
-@item \y
-Individua la stringa nulla o alla fine o all'inizio di una parola.
-(cio@`e, il limite di una parola - @dfn{boundar@strong{y}} in inglese).
-Per esempio, @samp{\yradar?\y}
-individua sia @samp{rada} che @samp{radar}, come parole separate.
-
-@c @cindex operatori, @code{\B} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\B}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\B}, operatore (@command{gawk})
-@item \B
-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}.
-@end table
-
-@cindex buffer, operatori per
-@cindex espressioni regolari, operatori, per buffer
-@cindex operatori, ricerca in stringhe, per buffer
-Ci sono due altri operatori che operano sui buffer. In Emacs un
-@dfn{buffer} @`e, naturalmente, un buffer di Emacs. In altri programmi GNU,
-fra cui @command{gawk}, le routine di libreria delle @dfn{regexp} considerano
-come buffer l'intera stringa su cui effettuare il confronto.
-Gli operatori sono:
-
-@table @code
-@item \`
-@c @cindex operatori, @code{\`} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\`}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\`}, operatore (@command{gawk})
-Individua la stringa nulla che occorre all'inizio di un buffer
-(di una stringa)
-
-@c @cindex operatori, @code{\'} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\'}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\'}, operatore (@command{gawk})
-@item \'
-Individua la stringa nulla che occorre alla fine di un buffer
-(di una stringa)
-@end table
-
-@cindex @code{^} (circonflesso), operatore @dfn{regexp}
-@cindex circonflesso (@code{^}), operatore @dfn{regexp}
-@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
-@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
-Poich@'e @samp{^} e @samp{$} si riferiscono sempre all'inizio e alla
-fine di stringhe, questi operatori non aggiungono nuove funzionalit@`a
-ad @command{awk}. Sono inclusi per compatibilit@`a con altro
-software GNU.
-
-@cindex @command{gawk}, operatore limite-di-parola
-@cindex limite-di-parola, operatore (@command{gawk})
-@cindex operatori, limite-di-parola (@command{gawk})
-In altro software GNU, l'operatore di limite-di-parola @`e @samp{\b}. Questo,
-comunque, @`e in conflitto con la definizione, nel linguaggio @command{awk},
-di @samp{\b} come
-backspace, quindi @command{gawk} usa una lettera differente.
-Un metodo alternativo sarebbe stato di richiedere due barre inverse negli
-operatori GNU, ma questo @`e stato ritenuto troppo arzigogolato. Il metodo
-corrente di usare @samp{\y} al posto del @samp{\b} di GNU sembra essere
-il male minore.
-
-@cindex espressioni regolari, @command{gawk}, opzioni sulla riga di comando
-@cindex @command{gawk}, opzioni sulla riga di comando, ed espressioni regolari
-Le varie opzioni sulla riga di comando
-(@pxref{Opzioni})
-controllano come @command{gawk} interpreta i caratteri nelle @dfn{regexp}:
-
-@table @asis
-@item Nessuna opzione
-Per default, @command{gawk} fornisce tutte le funzionalit@`a delle
-regexp POSIX e gli
-operatori @dfn{regexp} GNU
-@ifnotinfo
-predecentemente descritti.
-@end ifnotinfo
-@ifnottex
-@ifnotdocbook
-Sono descritti
-in @ref{Operatori di espressioni regolari}.
-@end ifnotdocbook
-@end ifnottex
-
-@item @code{--posix}
-Sono ammesse solo le @dfn{regexp} POSIX; gli operatori GNU non sono
-speciali (p.es., @samp{\w} individua una semplice lettera @samp{w}).
-Le espressioni di intervallo sono ammesse.
-
-@cindex Brian Kernighan, @command{awk} di
-@item @code{--traditional}
-Le @dfn{regexp} Unix tradizionali di @command{awk} sono ammesse. Gli
-operatori GNU non sono speciali, e le espressioni
-di intervallo non sono ammesse.
-Le classi di caratteri POSIX (@samp{[[:alnum:]]}, etc.) sono ammesse,
-poich@'e BWK @command{awk} le prevede.
-I caratteri descritti usando sequenze di protezione ottali ed esadecimali sono
-trattati letteralmente, anche se rappresentano metacaratteri di @dfn{regexp}.
-
-@item @code{--re-interval}
-Sono consentite espressioni di intervallo in @dfn{regexp},
-se @option{--traditional} @`e stata specificata.
-Altrimenti, le espressioni di intervallo sono disponibili per default.
-@end table
-
-@node Maiuscolo-Minuscolo
-@section Fare confronti ignorando maiuscolo/minuscolo
-
-@cindex espressioni regolari, maiuscolo/minuscolo
-@cindex @dfn{regexp}, maiuscolo/minuscolo
-@cindex maiuscolo/minuscolo e @dfn{regexp}
-Il tipo di carattere (maiuscolo/minuscolo) @`e normalmente rilevante nelle
-espressioni regolari, sia nella ricerca di
-caratteri normali (cio@`e, non metacaratteri), sia all'interno di espressioni
-fra parentesi. Quindi, una @samp{w} in un'espressione regolare individua
-solo una @samp{w} e non la corrispondente maiuscola @samp{W}.
-
-Il modo pi@`u semplice per richiedere una ricerca non sensibile al
-maiuscolo/minuscolo @`e di usare un'espressione tra parentesi quadre, per
-esempio @samp{[Ww]}. Comunque, questo pu@`o essere pesante se si usa spesso,
-e pu@`o rendere le espressioni regolari di difficile lettura.
-Ci sono due alternative che potrebbero essere preferibili.
-
-Un modo per fare un confronto non sensibile a maiuscolo/minuscolo in un
-particolare punto del programma
-@`e di convertire i dati in un solo tipo (o minuscole o maiuscole),
-usando le funzioni di stringa
-predefinite @code{tolower()} o @code{toupper()} (che non
-abbiamo ancora introdotto;
-@pxref{Funzioni per stringhe}).
-Per esempio:
-
-@example
-tolower($1) ~ /foo/ @{ @dots{} @}
-@end example
-
-@noindent
-converte il primo campo in minuscole, prima di fare un confronto.
-Questo funziona in ogni @command{awk} conforme allo standard POSIX.
-
-@cindex @command{gawk}, espressioni regolari, differenza maiuscolo/minuscolo
-@cindex distinzione maiuscolo/minuscolo, @command{gawk}
-@cindex differenze tra @command{awk} e @command{gawk}, espressioni regolari
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@cindex @code{IGNORECASE}, variabile, con operatori @code{~} e @code{!~}
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@c @cindex variables, @code{IGNORECASE}
-Un altro metodo, proprio di @command{gawk}, @`e di impostare la variabile
-@code{IGNORECASE} a un valore diverso da zero (@pxref{Variabili predefinite}).
-Quando @code{IGNORECASE} @`e diverso da zero, @emph{tutte} le operazioni con
-regexp e stringhe ignorano la distinzione maiuscolo/minuscolo.
-
-Il cambio del valore di @code{IGNORECASE} controlla dinamicamente la
-sensibilit@`a a maiuscolo/minuscolo del programma quando @`e in esecuzione.
-Il tipo di carattere (maiuscolo/minuscolo) @`e rilevante per default,
-poich@'e @code{IGNORECASE} (come la maggior parte delle variabili) @`e
-inizializzata a zero:
-
-@example
-x = "aB"
-if (x ~ /ab/) @dots{} # questo test non risulter@`a verificato
-
-IGNORECASE = 1
-if (x ~ /ab/) @dots{} # adesso sar@`a verificato
-@end example
-
-In generale, non @`e possibile usare @code{IGNORECASE} per rendere certe regole
-non sensibili a maiuscolo/minuscolo e altre regole invece s@`{@dotless{i}}, perch@'e non c'@`e
-una maniera diretta per impostare
-@code{IGNORECASE} solo per l'espressione di
-una particolare regola.@footnote{Programmatori esperti in C e C++ noteranno
-che questo @`e possible, usando qualcosa come
-@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
-e
-@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
-Comunque, questo @`e un po' tortuoso e non @`e raccomandato.}
-Per fare questo, si usino espressioni tra parentesi quadre oppure
-@code{tolower()}. Comunque, una cosa che si pu@`o fare con @code{IGNORECASE}
-soltanto @`e di utilizzare o di ignorare la sensibilit@`a a maiuscolo/minuscolo
-per tutte le regole contemporaneamente.
-
-@code{IGNORECASE} @`e impostabile dalla riga di comando o in una regola
-@code{BEGIN} (@pxref{Altri argomenti}; e
-@pxref{Usare BEGIN/END}).
-Impostare @code{IGNORECASE} dalla riga di comando @`e un modo per rendere
-un programma insensibile a maiuscolo/minuscolo senza doverlo modificare.
-
-@c @cindex ISO 8859-1
-@c @cindex ISO Latin-1
-In localizzazioni multibyte,
-le equivalenze tra caratteri maiuscoli
-e minuscoli sono controllate usando i valori in formato esteso
-dell'insieme di caratteri della localizzazione.
-Per il resto, i caratteri sono controllati usando l'insieme di caratteri
-ISO-8859-1 (ISO Latin-1).
-Questo insieme di caratteri @`e un'estensione del tradizionale insieme con 128
-caratteri ASCII, che include anche molti caratteri adatti
-per le lingue europee.@footnote{Se questo sembra oscuro,
-non c'@`e ragione di preoccuparsi; significa solo che @command{gawk} fa
-la cosa giusta.}
-
-Il valore di @code{IGNORECASE} non ha effetto se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}).
-Il tipo di carattere (maiuscolo o minuscolo) @`e sempre rilevante in modalit@`a
-compatibile.
-
-@node Sommario espressioni regolari
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Le espressioni regolari descrivono insiemi di stringhe da confrontare.
-In @command{awk}, le costanti @dfn{regexp} sono scritte racchiuse
-fra barre: @code{/}@dots{}@code{/}.
-
-@item
-Le costanti @dfn{regexp} possono essere usate da sole in modelli di ricerca e
-in espressioni condizionali, o come parte di espressioni di ricerca
-usando gli operatori @samp{~} e @samp{!~}.
-
-@item
-Le sequenze di protezione consentono di rappresentare caratteri non stampabili
-e consentono anche di rappresentare metacaratteri @dfn{regexp} come caratteri
-letterali per i quali cercare corrispondenze.
-
-@item
-Gli operatori @dfn{regexp} consentono raggruppamento, alternativa e
-ripetizione.
-
-@item
-Le espressioni tra parentesi quadre sono delle notazioni abbreviate per
-specificare insiemi di caratteri che possono avere corrispondenze in un
-punto particolare di una @dfn{regexp}.
-All'interno di espressioni tra parentesi quadre, le classi di caratteri POSIX
-consentono di specificare certi gruppi di caratteri in maniera indipendente
-dalla localizzazione.
-
-@item
-Le espressioni regolari individuano il testo pi@`u lungo possibile, a partire
-da sinistra nella stringa in esame. Questo ha importanza nei casi in cui
-serve conoscere la lunghezza della corrispondenza, come nella sostituzione di
-testo e quando il separatore di record sia una @dfn{regexp}.
-
-@item
-Espressioni di ricerca possono usare @dfn{regexp} dinamiche, ossia, i valori
-delle stringhe sono considerato come espressioni regolari.
-
-@item
-La variabile @command{gawk} @code{IGNORECASE} consente di controllare la
-differenza maiuscolo/minuscolo nel confronto mediante @dfn{regexp}. In altre
-versioni di @command{awk}, vanno usate invece le funzioni @code{tolower()} o
-@code{toupper()}.
-
-@end itemize
-
-@node Leggere file
-@chapter Leggere file in input
-
-@cindex leggere file in input
-@cindex file in input, leggere
-@cindex file in input
-@cindex @code{FILENAME}, variabile
-@cindex variabile @code{FILENAME}
-Nel tipico programma @command{awk},
-@command{awk} legge tutto l'input sia dallo standard input
-(per default @`e la tastiera, ma spesso @`e una @dfn{pipe} da un altro comando)
-o da file i cui nomi vengono specificati sulla riga di comando di
-@command{awk}. Se si specificano file in input, @command{awk} li legge
-nell'ordine, elaborando tutti i dati di uno prima di passare al successivo.
-Il nome del file in input corrente si trova nella variabile predefinita
-@code{FILENAME}
-(@pxref{Variabili predefinite}).
-
-@cindex record
-@cindex campi
-L'input @`e letto in unit@`a chiamate @dfn{record}, e viene elaborato, secondo le
-regole del programma, un record alla volta.
-Per default, ogni record @`e una riga. Ogni
-record @`e suddiviso automaticamente in "pezzi" chiamati @dfn{campi}.
-Questo rende pi@`u pratico far lavorare i programmi sulle parti di un record.
-
-@cindex @code{getline}, comando
-In rare occasioni, si potrebbe aver bisogno di usare il comando
-@code{getline}. Il comando @code{getline} @`e utile sia perch@'e pu@`o procurare
-un input esplicito da un numero indeterminato di file, sia perch@'e non vanno
-specificati sulla riga di comando di @command{awk} i nomi dei file usati con
-getline (@pxref{Getline}).
-
-@menu
-* Record:: Controllare come i dati sono suddivisi
- in record.
-* Campi:: Un'introduzione ai campi.
-* Campi non costanti:: Numeri di campo variabili.
-* Cambiare i campi:: Cambiare il contenuto di un campo.
-* Separatori di campo:: I separatori di campo, e come
- cambiarli.
-* Dimensione costante:: Leggere campi di larghezza costante.
-* Separazione in base al contenuto:: Definire campi dal loro contenuto.
-* Righe multiple:: Leggere record che sono su pi@`u righe.
-* Getline:: Leggere file sotto il controllo del
- programma, usando la funzione
- @code{getline}.
-* Timeout in lettura:: Leggere input entro un tempo limite.
-* Proseguire dopo errore in input:: Elaborare ulteriore input dopo certi
- errori di I/O.
-* Directory su riga di comando:: Cosa succede mettendo una directory
- sulla riga di comando.
-* Sommario di Input:: Sommario di Input.
-* Esercizi su Input:: Esercizi.
-@end menu
-
-@node Record
-@section Controllare come i dati sono suddivisi in record
-
-@cindex input, suddividere in record
-@cindex record, suddividere l'input in
-@cindex @code{NR}, variabile
-@cindex @code{FNR}, variabile
-@command{awk} suddivide l'input per il programma in record e campi.
-Tiene traccia del numero di record gi@`a letti dal
-file in input corrente. Questo valore @`e memorizzato in una variabile
-predefinita chiamata @code{FNR} che @`e reimpostata a zero ogni volta che si
-inizia un nuovo file. Un'altra variabile predefinita, @code{NR}, registra il
-numero totale di record in input gi@`a letti da tutti i @value{DF}.
-Il suo valore iniziale @`e zero ma non viene mai reimpostata a zero
-automaticamente.
-
-@menu
-* awk divisione record:: Come @command{awk} standard divide i record.
-* gawk divisione record:: Come @command{gawk} divide i record.
-@end menu
-
-@node awk divisione record
-@subsection Come @command{awk} standard divide i record.
-
-@cindex separatori di record
-@cindex record, separatori di
-I record sono separati da un carattere chiamato @dfn{separatore di record}.
-Per default, il separatore di record @`e il carattere di ritorno a capo.
-Questo @`e il motivo per cui i record sono, per default, righe singole.
-Per usare un diverso carattere come separatore di record
-basta assegnare quel carattere alla variabile predefinita @code{RS}.
-
-@cindex ritorno a capo, come separatore di record
-@cindex a capo, come separatore di record
-@cindex @code{RS}, variabile
-Come per ogni altra variabile,
-il valore di @code{RS} pu@`o essere cambiato nel programma @command{awk}
-con l'operatore di assegnamento, @samp{=}
-(@pxref{Operatori di assegnamento}).
-Il nuovo separatore di record dovrebbe essere racchiuso tra doppi apici,
-per indicare una costante di stringa. Spesso il momento giusto per far questo
-@`e all'inizio dell'esecuzione, prima che sia elaborato qualsiasi input,
-in modo che il primo record sia letto col separatore appropriato.
-Per far ci@`o, si usa il criterio speciale @code{BEGIN}
-(@pxref{BEGIN/END}).
-Per esempio:
-
-@example
-awk 'BEGIN @{ RS = "u" @}
- @{ print $0 @}' mail-list
-@end example
-
-@noindent
-cambia il valore di @code{RS} in @samp{u}, prima di leggere qualsiasi input.
-Il nuovo valore @`e una stringa il cui primo carattere @`e la lettera ``u''; come
-risultato, i record sono separati dalla lettera ``u''. Poi viene letto il
-file in input, e la seconda regola nel programma @command{awk} (l'azione
-eseguita se non si specifica un criterio)
-stampa ogni record. Poich@'e ogni istruzione @code{print} aggiunge
-un ritorno a capo alla fine del suo output, questo programma
-@command{awk} copia l'input con ogni @samp{u} trasformato in un ritorno
-a capo. Qui vediamo il risultato dell'esecuzione del programma sul file
-@file{mail-list}:
-
-@example
-$ @kbd{awk 'BEGIN @{ RS = "u" @}}
-> @kbd{@{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiac
-@print{} sq
-@print{} e@@gmail.com F
-@print{} Anthony 555-3412 anthony.assert
-@print{} ro@@hotmail.com A
-@print{} Becky 555-7685 becky.algebrar
-@print{} m@@gmail.com A
-@print{} Bill 555-1675 bill.drowning@@hotmail.com A
-@print{} Broderick 555-0542 broderick.aliq
-@print{} otiens@@yahoo.com R
-@print{} Camilla 555-2912 camilla.inf
-@print{} sar
-@print{} m@@skynet.be R
-@print{} Fabi
-@print{} s 555-1234 fabi
-@print{} s.
-@print{} ndevicesim
-@print{} s@@
-@print{} cb.ed
-@print{} F
-@print{} J
-@print{} lie 555-6699 j
-@print{} lie.perscr
-@print{} tabor@@skeeve.com F
-@print{} Martin 555-6480 martin.codicib
-@print{} s@@hotmail.com A
-@print{} Sam
-@print{} el 555-3430 sam
-@print{} el.lanceolis@@sh
-@print{} .ed
-@print{} A
-@print{} Jean-Pa
-@print{} l 555-2127 jeanpa
-@print{} l.campanor
-@print{} m@@ny
-@print{} .ed
-@print{} R
-@print{}
-@end example
-
-@noindent
-Si noti che la voce relativa al nome @samp{Bill} non @`e divisa.
-Nel @value{DF} originale
-(@pxref{File dati di esempio}),
-la riga appare in questo modo:
-
-@example
-Bill 555-1675 bill.drowning@@hotmail.com A
-@end example
-
-@noindent
-Essa non contiene nessuna @samp{u}, per cui non c'@`e alcun motivo di dividere
-il record, diversamente dalle altre, che hanno una o pi@`u ricorrenze della
-@samp{u}. Infatti, questo record @`e trattato come parte del record precedente;
-il ritorno a capo che li separa nell'output @`e l'originale ritorno a capo nel
-@value{DF}, non quella aggiunta da @command{awk} quando ha stampato il record!
-
-@cindex separatori di record, cambiare i
-@cindex record, separatori di
-Un altro modo per cambiare il separatore di record @`e sulla riga di comando,
-usando la funzionalit@`a dell'assegnamento di variabile
-(@pxref{Altri argomenti}):
-
-@example
-awk '@{ print $0 @}' RS="u" mail-list
-@end example
-
-@noindent
-Questo imposta @code{RS} a @samp{u} prima di elaborare @file{mail-list}.
-
-Usando un carattere alfabetico come @samp{u} come separatore di record
-@`e molto probabile che si ottengano risultati strani.
-Usando un carattere insolito come @samp{/} @`e pi@`u probabile
-che si ottenga un comportamento corretto nella maggioranza dei casi, ma non
-c'@`e nessuna garanzia. La morale @`e: conosci i tuoi dati!
-
-Quando si usano caratteri normali come separatore di record,
-c'@`e un caso insolito che capita quando @command{gawk}
-@`e reso completamente conforme a POSIX (@pxref{Opzioni}).
-In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente
-@samp{1}:
-
-@example
-$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'
-@print{} 1
-@end example
-
-C'@`e un solo campo, consistente in un ritorno a capo. Il valore della
-variabile predefinita @code{NF} @`e il numero di campi nel record corrente.
-(Normalmente @command{gawk} tratta il ritorno a capo come uno spazio
-vuoto, stampando @samp{0} come risultato. Anche molte altre versioni di
-@command{awk} agiscono in questo modo.)
-
-@cindex angolo buio, file in input
-Il raggiungimento della fine di un file in input fa terminare il record di
-input corrente, anche se l'ultimo carattere nel file non @`e il carattere in
-@code{RS}. @value{DARKCORNER}
-
-@cindex stringhe vuote
-@cindex stringhe nulle
-@c @cindex strings, empty, see null strings
-La stringa nulla @code{""} (una stringa che non contiene alcun carattere)
-ha un significato particolare come
-valore di @code{RS}. Significa che i record sono separati
-soltanto da una o pi@`u righe vuote.
-@xref{Righe multiple} per maggiori dettagli.
-
-Se si cambia il valore di @code{RS} nel mezzo di un'esecuzione di
-@command{awk}, il nuovo valore @`e usato per delimitare i record successivi, ma
-non riguarda il record in corso di elaborazione e neppure quelli gi@`a
-elaborati.
-
-@cindex @command{gawk}, variabile @code{RT} in
-@cindex @code{RT}, variabile
-@cindex record, fine dei
-@cindex differenze tra @command{awk} e @command{gawk}, separatori di record
-@cindex espressioni regolari, come separatori di record
-@cindex record, separatori di, espressioni regolari come
-@cindex separatori di record, espressioni regolari come
-Dopo che @`e stata determinata la fine di un record, @command{gawk}
-imposta la variabile @code{RT} al testo nell'input che corrisponde a
-@code{RS}.
-
-@node gawk divisione record
-@subsection Divisione dei record con @command{gawk}
-
-@cindex estensioni comuni, @code{RS} come espressione regolare
-@cindex comuni, estensioni@comma{} @code{RS} come espressione regolare
-Quando si usa @command{gawk},
-il valore di @code{RS} non @`e limitato a una stringa costituita da un solo
-carattere, ma pu@`o essere qualsiasi espressione regolare
-@iftex
-(@pxrefil{Espressioni regolari}). @value{COMMONEXT}
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}). @value{COMMONEXT}
-@end ifnottex
-In generale, ogni record termina alla stringa pi@`u vicina che corrisponde
-all'espressione regolare; il record successivo inizia alla fine della stringa
-che corrisponde. Questa regola generale @`e in realt@`a applicata anche nel caso
-normale, in cui @code{RS} contiene solo un ritorno a capo: un record
-termina all'inizio della prossima stringa che corrisponde (il prossimo
-ritorno a capo nell'input), e il record seguente inizia subito dopo la
-fine di questa stringa (al primo carattere della riga seguente).
-Il ritorno a capo, poich@'e corrisponde a @code{RS}, non appartiene a
-nessuno dei due record.
-
-Quando @code{RS} @`e un singolo carattere, @code{RT}
-contiene lo stesso singolo carattere. Peraltro, quando @code{RS} @`e
-un'espressione regolare, @code{RT} contiene l'effettivo testo in input
-corrispondente all'espressione regolare.
-
-Se il file in input termina senza che vi sia un testo che corrisponda a
-@code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
-
-Il seguente esempio illustra entrambe queste caratteristiche.
-In quest'esempio @code{RS} @`e impostato a un'espressione regolare che
-cerca sia un ritorno a capo che una serie di una o pi@`u lettere
-maiuscole con uno spazio vuoto opzionale iniziale e/o finale:
-
-@example
-$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
-> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
-> @kbd{@{ print "Record =", $0,"e RT = [" RT "]" @}'}
-@print{} Record = record 1 e RT = [ AAAA ]
-@print{} Record = record 2 e RT = [ BBBB ]
-@print{} Record = record 3 e RT = [
-@print{} ]
-@end example
-
-@noindent
-Le parentesi quadre racchiudono il contenuto di @code{RT}, rendendo visibile
-lo spazio vuoto iniziale e quello finale. L'ultimo valore di
-@code{RT} @`e un ritorno a capo.
-@xref{Programma sed semplice} per un esempio pi@`u utile
-su @code{RS} come espressione regolare e su @code{RT}.
-
-Se si imposta @code{RS} a un'espressione regolare che consente del testo
-finale opzionale, come @samp{RS = "abc(XYZ)?"} @`e possibile, per via di
-limitazioni dell'implementazione, che @command{gawk} possa trovare la parte
-iniziale dell'espressione regolare, ma non la parte finale, in modo
-particolare se il testo di input che potrebbe avere una corrispondenza con la
-parte finale @`e piuttosto lungo. @command{gawk} cerca di evitare questo
-problema, ma al momento non ci sono garanzie che questo funzioni sempre.
-
-@quotation NOTA
-Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e
-@samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la
-fine di una @emph{riga}. Come risultato, qualcosa come
-@samp{RS = "^[[:upper:]]"} pu@`o solo corrispondere all'inizio di un file.
-Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa
-in cui possono essere presenti dei caratteri di ritorno a capo.
-@`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}.
-@end quotation
-
-@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
-L'uso di @code{RS} come espressione regolare e la variabile @code{RT} sono
-estensioni @command{gawk}; non sono disponibili in
-modalit@`a compatibile
-(@pxref{Opzioni}).
-In modalit@`a compatibile, solo il primo carattere del valore di
-@code{RS} determina la fine del record.
-
-@cindex sidebar, @code{RS = "\0"} non @`e portabile
-@ifdocbook
-@docbook
-<sidebar><title>@code{RS = "\0"} non @`e portabile</title>
-@end docbook
-
-@cindex portabilit@`a, file di dati come un unico record
-Ci sono casi in cui capita di dover trattare un intero @value{DF} come
-un record unico. L'unico modo di far questo @`e quello di dare a @code{RS}
-un valore che non ricorre nel file in input. Ci@`o @`e difficile da fare in modo
-generale, cos@`{@dotless{i}} che un programma possa
-funzionare con file in input arbitrari.
-
-Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
-consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
-usare per @code{RS} in questo caso:
-
-@example
-BEGIN @{ RS = "\0" @} # l'intero file diventa un record?
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe, memorizzazione
-@command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
-come separatore di record.
-Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
-GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
-Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
-implementazioni di @command{awk}.
-
-@cindex angolo buio, stringhe, memorizzazione
-Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
-che ci sono note.} memorizzano internamente le stringhe come stringhe
-in stile C. Le stringhe in stile C usano il carattere @sc{NUL} come
-terminatore di stringa. In effetti, questo significa che
-@samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
-@value{DARKCORNER}
-
-Capita che recenti versioni di @command{mawk} possano usare i carattere
-@sc{NUL} come separatore di record. Comunque questo @`e un caso particolare:
-@command{mawk} non consente di includere caratteri @sc{NUL} nelle stringhe.
-(Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
-
-@cindex record, trattare un file come un solo
-@cindex trattare un file, come un solo record
-@xref{Funzione readfile} per un modo interessante di leggere
-file interi. Se si usa @command{gawk}, si veda
-@ref{Esempio di estensione Readfile} per un'altra opzione.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@code{RS = "\0"} non @`e portabile}
-
-
-@cindex portabilit@`a, file di dati come un unico record
-Ci sono casi in cui capita di dover trattare un intero @value{DF} come
-un record unico. L'unico modo di far questo @`e quello di dare a @code{RS}
-un valore che non ricorre nel file in input. Ci@`o @`e difficile da fare in modo
-generale, cos@`{@dotless{i}} che un programma possa
-funzionare con file in input arbitrari.
-
-Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
-consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
-usare per @code{RS} in questo caso:
-
-@example
-BEGIN @{ RS = "\0" @} # l'intero file diventa un record?
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe, memorizzazione
-@command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
-come separatore di record.
-Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
-GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
-Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
-implementazioni di @command{awk}.
-
-@cindex angolo buio, stringhe, memorizzazione
-Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
-che ci sono note.} memorizzano internamente le stringhe come stringhe
-in stile C. Le stringhe in stile C usano il carattere @sc{NUL} come
-terminatore di stringa. In effetti, questo significa che
-@samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
-@value{DARKCORNER}
-
-Capita che recenti versioni di @command{mawk} possano usare i carattere
-@sc{NUL} come separatore di record. Comunque questo @`e un caso particolare:
-@command{mawk} non consente di includere caratteri @sc{NUL} nelle stringhe.
-(Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
-
-@cindex record, trattare un file come un solo
-@cindex trattare un file, come un solo record
-@xref{Funzione readfile} per un modo interessante di leggere
-file interi. Se si usa @command{gawk}, si veda
-@ref{Esempio di estensione Readfile} per un'altra opzione.
-@end cartouche
-@end ifnotdocbook
-
-@node Campi
-@section Un'introduzione ai campi
-
-@cindex esaminare i campi
-@cindex campi
-@cindex accesso ai campi
-@cindex campi, esame dei
-Quando @command{awk} legge un record in input, il record @`e
-automaticamente @dfn{analizzato} o separato da @command{awk} in "pezzi"
-chiamati @dfn{campi}. Per default, i campi sono separati da
-@dfn{spazi vuoti}, come le parole in una riga stampata.
-Uno spazio vuoto in @command{awk} @`e qualsiasi stringa composta da uno o pi@`u
-spazi, segni di tabulazione o ritorni a capo;
-altri caratteri, come interruzione di pagina, tabulazione verticale, etc., che
-sono considerati spazi vuoti in altri linguaggi, @emph{non} sono considerati
-tali da @command{awk}.
-
-Lo scopo dei campi @`e quello di rendere pi@`u conveniente per l'utente far
-riferimento a questi frammenti dei record. Non @`e necessario usarli---si pu@`o
-operare sull'intero record, se si vuole---ma i campi sono ci@`o che rende
-cos@`{@dotless{i}} potenti dei semplici programmi @command{awk}.
-
-@cindex operatore di campo @code{$}
-@cindex @code{$} (dollaro), operatore di campo @code{$}
-@cindex dollaro (@code{$}), operatore di campo @code{$}
-@cindex operatore di campo, dollaro come
-Si usa il simbolo del dollaro (@samp{$})
-per far riferimento a un campo in un programma @command{awk},
-seguito dal numero del campo desiderato. Quindi, @code{$1}
-si riferisce al primo campo, @code{$2} al secondo, e cos@`{@dotless{i}} via.
-(Diversamente che nelle shell Unix, i numeri di campo non sono limitati a una
-sola cifra; @code{$127} @`e il centoventisettesimo campo nel record.)
-Per esempio, supponiamo che la seguente sia una riga in input:
-
-@example
-Questo pare essere un esempio proprio carino.
-@end example
-
-@noindent
-Qui il primo campo, o @code{$1}, @`e @samp{Questo}, il secondo campo, o
-@code{$2}, @`e @samp{pare}, e via dicendo. Si noti che l'ultimo campo,
-@code{$7}, @`e @samp{carino.}. Poich@'e non ci sono spazi tra la
-@samp{o} e il @samp{.}, il punto @`e considerato parte del settimo
-campo.
-
-@cindex @code{NF}, variabile
-@cindex campi, numero dei
-@code{NF} @`e una variabile predefinita il cui valore @`e il numero di campi nel
-record corrente. @command{awk} aggiorna automaticamente il valore di
-@code{NF} ogni volta che legge un record. Indipendentemente da quanti campi
-ci possano essere, l'ultimo campo in un record pu@`o essere rappresentato da
-@code{$NF}. Cos@`{@dotless{i}}, @code{$NF} @`e lo stesso di @code{$7}, che @`e @samp{carino.}.
-Se si cerca di far riferimento a un campo oltre l'ultimo
-(come @code{$8} quando il record ha solo sette campi), si ottiene
-la stringa nulla. (Se usato in un'operazione numerica si ottiene zero.)
-
-L'uso di @code{$0}, che sarebbe come un riferimento al campo ``numero zero'',
-@`e un caso particolare: rappresenta l'intero record in input. Si usa quando
-non si @`e interessati a un campo specifico. Vediamo qualche altro esempio:
-
-@example
-$ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@end example
-
-@noindent
-Questo esempio stampa ogni record del file @file{mail-list} il cui primo campo
-contiene la stringa @samp{li}.
-
-Per converso, il seguente esempio cerca @samp{li} @emph{nell'intero record} e
-stampa il primo e l'ultimo campo di ogni record in input per cui @`e stata
-trovata una corrispondenza:
-
-@example
-$ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
-@print{} Amelia F
-@print{} Broderick R
-@print{} Julie F
-@print{} Samuel A
-@end example
-
-@node Campi non costanti
-@section Numeri di campo variabili
-@cindex campi, numero dei
-@cindex numeri di campo
-
-Un numero di campo non @`e necessario che sia una costante. Nel linguaggio
-@command{awk} si pu@`o usare qualsiasi espressione dopo @samp{$} per far
-riferimento a un campo. Il valore dell'espressione specifica il numero di
-campo. Se il valore @`e una stringa, piuttosto che un numero, viene convertito
-in un numero. Consideriamo questo esempio:
-
-@example
-awk '@{ print $NR @}'
-@end example
-
-@noindent
-Ricordiamo che @code{NR} @`e il numero dei record letti fino a questo punto: uno
-nel primo record, due nel secondo, etc. Cos@`{@dotless{i}} quest'esempio stampa il primo
-campo del primo record, il secondo campo del secondo record, e cos@`{@dotless{i}} via.
-Per il ventesimo record, @`e stampato il campo numero 20; molto probabilmente il
-record ha meno di 20 campi, perci@`o stampa una riga vuota.
-Questo @`e un altro esempio sull'uso di espressioni come numeri di campo:
-
-@example
-awk '@{ print $(2*2) @}' mail-list
-@end example
-
-@command{awk} calcola l'espressione @samp{(2*2)} e usa il suo valore come
-numero del campo da stampare. Qui @samp{*} rappresenta la
-moltiplicazione, quindi l'espressione @samp{2*2} ha il valore quattro. Le
-parentesi vengono usate affinch@'e la moltiplicazione sia eseguita prima
-dell'operazione @samp{$}; sono necessarie ogni volta che c'@`e un operatore
-binario@footnote{A un @dfn{operatore binario}, come @samp{*} per la
-moltiplicazione, servono due operandi. La distinzione @`e necessaria poich@'e
-@command{awk} ha anche operatori unari (un operando) e ternari (tre
-operandi).}
-nell'espressione del numero di campo. Questo esempio, dunque, stampa il
-tipo di relazione (il quarto campo) per ogni riga del file
-@file{mail-list}. (Tutti gli operatori di @command{awk} sono elencati, in
-ordine decrescente di precedenza, in
-@ref{Precedenza}.)
-
-Se il numero di campo calcolato @`e zero, si ottiene l'intero record.
-Quindi, @samp{$(2-2)} ha lo stesso valore di @code{$0}. Numeri di campo
-negativi non sono consentiti; tentare di far riferimento a uno di essi
-normalmente fa terminare il programma. (Lo standard POSIX non chiarisce
-cosa succede quando si fa riferimento a un numero di campo negativo.
-@command{gawk} avvisa di questo e fa terminare il programma. Altre
-implementazioni di @command{awk} possono comportarsi in modo diverso.)
-
-Come accennato in @ref{Campi},
-@command{awk} memorizza il numero di campi del record corrente nella variabile
-predefinita @code{NF} (@pxref{Variabili predefinite}). Quindi,
-l'espressione @code{$NF} non @`e una funzionalit@`a speciale---@`e la diretta
-conseguenza della valutazione di @code{NF} e dell'uso di questo valore come
-numero di campo.
-
-@node Cambiare i campi
-@section Cambiare il contenuto di un campo
-
-@cindex campi, cambiare il contenuto dei
-Il contenuto di un campo, cos@`{@dotless{i}} come @`e visto da @command{awk}, pu@`o essere
-cambiato all'interno di un programma @command{awk}; questo cambia quello che
-@command{awk} percepisce come record in input corrente. (Il reale file in
-input non viene toccato; @command{awk} non modifica @emph{mai} il file in
-input).
-Si consideri il seguente esempio e il suo output:
-
-@example
-$ @kbd{awk '@{ numero_pacchi = $3 ; $3 = $3 - 10}
-> @kbd{print numero_pacchi, $3 @}' inventory-shipped}
-@print{} 25 15
-@print{} 32 22
-@print{} 24 14
-@dots{}
-@end example
-
-@noindent
-Il programma per prima cosa salva il valore originale del campo tre nella
-variabile @code{numero_pacchi}.
-Il segno @samp{-} rappresenta la sottrazione, cos@`{@dotless{i}} questo programma riassegna
-il campo tre, @code{$3}, come il valore originale del campo meno dieci:
-@samp{$3 - 10}. (@xref{Operatori aritmetici}.)
-Poi stampa il valore originale e quello nuovo del campo tre.
-(Qualcuno nel magazzino ha fatto un errore ricorrente nell'inventariare le
-scatole rosse.)
-
-Perch@'e questo funzioni, il testo in @code{$3} deve poter essere riconosciuto
-come un numero; la stringa di caratteri dev'essere convertita in un numero
-affich@'e il computer possa eseguire operazioni aritmetiche su di essa. Il
-numero che risulta dalla sottrazione viene nuovamente convertito in
-una stringa di caratteri che quindi diventa il campo tre.
-@xref{Conversione}.
-
-Quando il valore di un campo @`e cambiato (come percepito da @command{awk}), il
-testo del record in input viene ricalcolato per contenere il nuovo campo al
-posto di quello vecchio. In altre parole, @code{$0} cambia per riflettere il
-campo modificato. Questo programma
-stampa una copia del file in input, con 10 sottratto dal secondo campo di ogni
-riga:
-
-@example
-$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
-@print{} Jan 3 25 15 115
-@print{} Feb 5 32 24 226
-@print{} Mar 5 24 34 228
-@dots{}
-@end example
-
-@`E possibile inoltre assegnare contenuti a campi che sono fuori
-intervallo. Per esempio:
-
-@example
-$ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
-> @kbd{ print $6 @}' inventory-shipped}
-@print{} 168
-@print{} 297
-@print{} 301
-@dots{}
-@end example
-
-@cindex aggiungere, campi
-@cindex campi, aggiungere
-@noindent
-Abbiamo appena creato @code{$6}, il cui valore @`e la somma dei campi
-@code{$2}, @code{$3}, @code{$4} e @code{$5}. Il segno @samp{+}
-rappresenta l'addizione. Per il file @file{inventory-shipped}, @code{$6}
-rappresenta il numero totale di pacchi spediti in un determinato mese.
-
-La creazione di un nuovo campo cambia la copia interna di @command{awk} nel
-record in input corrente, che @`e il valore di @code{$0}. Cos@`{@dotless{i}}, se si scrive
-@samp{print $0} dopo aver aggiunto un campo, il record stampato include il
-nuovo campo, col numero di separatori di campo appropriati tra esso e i
-campi originariamente presenti.
-
-@cindex @code{OFS}, variabile
-@cindex output, separatore di campo, si veda @code{OFS}, variabile
-@cindex campo, separatori di, si veda anche @code{OFS}
-@cindex separatori di campo, si veda anche @code{OFS}
-Questa ridefinizione influenza ed @`e influenzata da
-@code{NF} (il numero dei campi; @pxref{Campi}).
-Per esempio, il valore di @code{NF} @`e impostato al numero del campo pi@`u
-elevato che @`e stato creato.
-Il formato preciso di @code{$0} @`e influenzato anche da una funzionalit@`a che
-non @`e ancora stata trattata: il @dfn{separatore di campo di output},
-@code{OFS}, usato per separare i campi (@pxref{Separatori di output}).
-
-Si noti, comunque, che il mero @emph{riferimento} a un campo fuori
-intervallo @emph{non} cambia il valore di @code{$0} o di @code{NF}.
-Far riferimento a un campo fuori intervallo produce solo una stringa nulla.
-Per esempio:
-
-@example
-if ($(NF+1) != "")
- print "non @`e possibile"
-else
- print "@`e tutto normale"
-@end example
-
-@noindent
-dovrebbe stampare @samp{@`e tutto normale}, perch@'e @code{NF+1} @`e certamente
-fuori intervallo. (@xref{Istruzione if}
-per maggiori informazioni sulle istruzioni @code{if-else} di @command{awk}.
-@xref{Tipi di variabile e confronti}
-per maggiori informazioni sull'operatore @samp{!=}.)
-
-@`E importante notare che facendo un assegnamento a un campo esistente cambia
-il valore di @code{$0} ma non cambia il valore di @code{NF},
-anche qualora si assegni a un campo la stringa nulla. Per esempio:
-
-@example
-$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
-> @kbd{print $0; print NF @}'}
-@print{} a::c:d
-@print{} 4
-@end example
-
-@noindent
-Il campo @`e ancora l@`{@dotless{i}}; ha solo un valore vuoto, delimitato dai due "due punti"
-tra @samp{a} e @samp{c}.
-Questo esempio mostra cosa succede se si crea un nuovo campo:
-
-@example
-$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "nuovo"}
-> @kbd{print $0; print NF @}'}
-@print{} a::c:d::nuovo
-@print{} 6
-@end example
-
-@noindent
-Il campo intermedio, @code{$5}, @`e creato con un valore vuoto
-(indicato dalla seconda coppia di due punti adiacenti),
-e @code{NF} @`e aggiornato col valore sei.
-
-@cindex angolo buio, variabile @code{NF}, decremento
-@cindex @code{NF}, variable, decremento
-Decrementando @code{NF} si eliminano i campi
-dopo il nuovo valore di @code{NF} e si ricalcola @code{$0}.
-@value{DARKCORNER}
-Vediamo un esempio:
-
-@example
-$ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
-> @kbd{ NF = 3; print $0 @}'}
-@print{} NF = 6
-@print{} a b c
-@end example
-
-@cindex portabilit@`a, variabile @code{NF}@comma{} decremento
-@quotation ATTENZIONE
-Alcune versioni di @command{awk} non
-ricostruiscono @code{$0} quando @code{NF} viene diminuito.
-@end quotation
-
-Infine, ci sono casi in cui conviene forzare
-@command{awk} a ricostruire l'intero record, usando i valori correnti
-dei campi e @code{OFS}. Per far ci@`o, si usa
-l'apparentemente innocuo assegnamento:
-
-@example
-$1 = $1 # forza la ricostruzione del record
-print $0 # o qualsiasi altra cosa con $0
-@end example
-
-@noindent
-Questo forza @command{awk} a ricostruire il record. Aggiungere un commento
-rende tutto pi@`u chiaro, come abbiamo appena visto.
-
-C'@`e un rovescio della medaglia nella relazione tra @code{$0} e
-i campi. Qualsiasi assegnamento a @code{$0} fa s@`{@dotless{i}} che il record sia
-rianalizzato (sintatticamente) e ridiviso in campi usando il valore
-@emph{corrente} di @code{FS}. Questo si applica anche a qualsiasi funzione
-predefinita che aggiorna @code{$0}, come @code{sub()} e @code{gsub()}
-(@pxref{Funzioni per stringhe}).
-
-@cindex sidebar, Comprendere @code{$0}
-@ifdocbook
-@docbook
-<sidebar><title>Comprendere @code{$0}</title>
-@end docbook
-
-
-@`E importante ricordare che @code{$0} @`e @emph{l'intero}
-record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
-vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
-separa i campi.
-
-@`E un errore comune tentare di cambiare il separatore di campo in un record
-semplicemente impostando @code{FS} e @code{OFS}, e poi
-aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
-modificato.
-
-Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
-stesso record. Invece, si deve forzare la ricostruzione del record,
-tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
-in precedenza.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Comprendere @code{$0}}
-
-
-
-@`E importante ricordare che @code{$0} @`e @emph{l'intero}
-record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
-vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
-separa i campi.
-
-@`E un errore comune tentare di cambiare il separatore di campo in un record
-semplicemente impostando @code{FS} e @code{OFS}, e poi
-aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
-modificato.
-
-Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
-stesso record. Invece, si deve forzare la ricostruzione del record,
-tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
-in precedenza.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Separatori di campo
-@section Specificare come vengono separati i campi
-
-@menu
-* Separatori di campo di default:: Come di solito sono separati i campi.
-* Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori.
-* Campi di un solo carattere:: Fare di ogni carattere un campo
- separato.
-* 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
- campo solo.
-* Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
- sommario.
-@end menu
-
-@cindex @code{FS}, variabile
-@cindex campi, separare
-@cindex campo, separatori di
-Il @dfn{separatore di campo}, che @`e un carattere singolo o un'espressione
-regolare, controlla il modo in cui @command{awk} suddivide un record in input
-in campi. @command{awk} fa una scansione del record in input per trovare i
-caratteri che individuano il separatore; i campi sono il testo compreso tra i
-separatori trovati.
-
-Nell'esempio che segue, usiamo il simbolo del punto elenco (@bullet{}) per
-rappresentare gli spazi nell'output.
-Se il separatore di campo @`e @samp{oo}, la seguente riga:
-
-@example
-moo goo gai pan
-@end example
-
-@noindent
-@`e suddivisa in tre campi: @samp{m}, @samp{@bullet{}g}, e
-@samp{@bullet{}gai@bullet{}pan}.
-Notare gli spazi iniziali nei valori del secondo e del terzo campo.
-
-@cindex risoluzione di problemi, @command{awk} usa @code{FS} anzich@'e @code{IFS}
-@cindex problemi, risoluzione di, @command{awk} usa @code{FS} anzich@'e @code{IFS}
-Il separatore di campo @`e rappresentato dalla variable predefinita @code{FS}.
-I programmatori di shell notino: @command{awk} @emph{non} usa il
-nome @code{IFS} che @`e usato dalle shell conformi a POSIX (come
-la Unix Bourne shell, @command{sh}, o Bash).
-
-@cindex @code{FS}, variabile, cambiare il valore di una
-Il valore di @code{FS} si pu@`o cambiare nel programma @command{awk} con
-l'operatore di assegnamento, @samp{=} (@pxref{Operatori di assegnamento}).
-Spesso il momento giusto per far ci@`o @`e all'inizio dell'esecuzione
-prima che sia stato elaborato qualsiasi input, cos@`{@dotless{i}} che il primo record
-sia letto col separatore appropriato. Per far questo, si usa il modello di
-ricerca speciale
-@code{BEGIN}
-(@pxref{BEGIN/END}).
-Per esempio, qui impostiamo il valore di @code{FS} alla stringa
-@code{","}:
-
-@example
-awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca
-@noindent
-Data la riga in input:
-
-@example
-John Q. Smith, 29 Oak St., Walamazoo, MI 42139
-@end example
-
-@noindent
-questo programma @command{awk} estrae e stampa la stringa
-@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
-
-@cindex separatori di campo, scelta dei
-@cindex espressioni regolari come separatori di campo
-@cindex separatori di campo, espressioni regolari come
-A volte i dati in input contengono caratteri separatori che non
-separano i campi nel modo in cui ci si sarebbe atteso. Per esempio, il
-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
-@end example
-
-@noindent
-Lo stesso programma estrarrebbe @samp{@bullet{}LXIX} invece di
-@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
-Se ci si aspetta che il programma stampi l'indirizzo,
-si rimarr@`a sorpresi. La morale @`e quella di scegliere la struttura dei dati
-e i caratteri di separazione attentamente per evitare questi problemi.
-(Se i dati non sono in una forma facile da elaborare, pu@`o darsi che
-si possano manipolare con un programma @command{awk} separato.)
-
-
-@node Separatori di campo di default
-@subsection Lo spazio vuoto normalmente separa i campi
-
-@cindex spazi vuoti, come separatori 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
-di campo @code{FS} @`e una stringa contenente un singolo spazio, @w{@code{" "}}.
-Se @command{awk} interpretasse questo valore nel modo usuale, ogni carattere
-di spazio separerebbe campi, quindi due spazi in una riga creerebbero un campo
-vuoto tra di essi. Il motivo per cui questo non succede @`e perch@'e un singolo
-spazio come valore di @code{FS} @`e un caso particolare: @`e preso per specificare
-il modo di default di delimitare i campi.
-
-Se @code{FS} @`e qualsiasi altro carattere singolo, come @code{","}, ogni
-ricorrenza di quel carattere separa due campi. Due ricorrenze consecutive
-delimitano un campo vuoto. Se il carattere si trova all'inizio o alla fine
-della riga, anche quello delimita un campo vuoto. Il carattere di spazio @`e
-il solo carattere singolo che non segue queste
-regole.
-
-@node Separare campi con @dfn{regexp}
-@subsection Usare @dfn{regexp} come separatori di campo
-
-@cindex espressioni regolari, come separatori di campo
-@cindex separatori di campo, espressioni regolari come
-La precedente @value{SUBSECTION}
-ha illustrato l'uso di caratteri singoli o di stringhe semplici come
-valore di @code{FS}.
-Pi@`u in generale, il valore di @code{FS} pu@`o essere una stringa contenente
-qualsiasi espressione regolare. Se questo @`e il caso, ogni corrispondenza nel
-record con l'espressione regolare separa campi. Per esempio, l'assegnamento:
-
-@example
-FS = ", \t"
-@end example
-
-@noindent
-trasforma ogni parte di una riga in input che consiste di una virgola seguita
-da uno spazio e una tabulazione in un separatore di campo.
-@ifinfo
-(@samp{\t}
-@`e una @dfn{sequenza di protezione} che sta per un segno di tabulazione;
-@pxref{Sequenze di protezione},
-per l'elenco completo di sequenze di protezione simili.)
-@end ifinfo
-
-Per un esempio meno banale di espressione regolare, si provi a usare spazi
-singoli per separare campi nel modo in cui sono usate le virgole. @code{FS}
-pu@`o essere impostato a @w{@code{"[@ ]"}} (parentesi quadra sinistra, spazio,
-parentesi quadra destra). Quest'espressione regolare corrisponde a uno spazio
-@iftex
-singolo e niente pi@`u. (@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-singolo e niente pi@`u. (@pxref{Espressioni regolari}).
-@end ifnottex
-C'@`e una differenza importante tra i due casi di @samp{FS = @w{" "}}
-(uno spazio singolo) e @samp{FS = @w{"[ \t\n]+"}}
-(un'espressione regolare che individua uno o pi@`u spazi, tabulazioni o
-ritorni a capo). Per entrambi i valori di @code{FS}, i campi sono
-separati da @dfn{serie} (ricorrenze adiacenti multiple) di spazi, tabulazioni
-e/o ritorni a capo. Comunque, quando il valore di @code{FS} @`e
-@w{@code{" "}}, @command{awk} prima toglie lo spazio vuoto iniziale e finale
-dal record e poi stabilisce dove sono i campi.
-Per esempio, la seguente @dfn{pipeline} stampa @samp{b}:
-
-@example
-$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
-@print{} b
-@end example
-
-@noindent
-Invece la @dfn{pipeline} che segue stampa @samp{a} (notare lo spazio extra
-intorno a ogni lettera):
-
-@example
-$ @kbd{echo ' a b c d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
-> @kbd{@{ print $2 @}'}
-@print{} a
-@end example
-
-@noindent
-@c @cindex null strings
-@cindex stringhe nulle
-@cindex stringhe vuote, si veda stringhe nulle
-In questo caso, il primo campo @`e nullo, o vuoto.
-Il taglio degli spazi vuoti iniziale e finale ha luogo anche
-ogniqualvolta @code{$0} @`e ricalcolato.
-Per esempio, si consideri questa @dfn{pipeline}:
-
-@example
-$ @kbd{echo ' a b c d' | awk '@{ print; $2 = $2; print @}'}
-@print{} a b c d
-@print{} a b c d
-@end example
-
-@noindent
-La prima istruzione @code{print} stampa il record cos@`{@dotless{i}} come @`e stato letto,
-con lo spazio vuoto intatto. L'assegnamento a @code{$2} ricostruisce
-@code{$0} concatenando insieme @code{$1} fino a @code{$NF},
-separati dal valore di @code{OFS} (che @`e uno spazio per default).
-Poich@'e lo spazio vuoto iniziale @`e stato ignorato quando si @`e trovato
-@code{$1}, esso non fa parte del nuovo @code{$0}. Alla fine, l'ultima
-istruzione @code{print} stampa il nuovo @code{$0}.
-
-@cindex @code{FS}, contenente @code{^}
-@cindex @code{^} (circonflesso), in @code{FS}
-@cindex angolo buio, @code{^}, in @code{FS}
-C'@`e un'ulteriore sottigliezza da considerare quando si usano le espressioni
-regolari per separare i campi.
-Non @`e ben specificato nello standard POSIX, n@'e altrove, cosa
-significhi @samp{^} nella divisione dei campi. Il @samp{^} cerca
-corrispondenze solo all'inizio dell'intero record? Oppure ogni separatore di
-campo @`e una nuova stringa? Di fatto versioni differenti di @command{awk}
-rispondono a questo quesito in modo diverso, e non si dovrebbe far affidamento
-su alcun comportamento specifico nei propri programmi.
-@value{DARKCORNER}
-
-@cindex Brian Kernighan, @command{awk} di
-Di sicuro, BWK @command{awk} individua con @samp{^}
-solo l'inizio del record. Anche @command{gawk}
-funziona in questo modo. Per esempio:
-
-@example
-$ @kbd{echo 'xxAA xxBxx C' |}
-> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
-> @kbd{ printf "-->%s<--\n", $i @}'}
-@print{} --><--
-@print{} -->AA<--
-@print{} -->xxBxx<--
-@print{} -->C<--
-@end example
-
-@node Campi di un solo carattere
-@subsection Fare di ogni carattere un campo separato
-
-@cindex estensioni comuni, campi di un solo carattere
-@cindex comuni, estensioni, campi di un solo carattere
-@cindex differenze tra @command{awk} e @command{gawk}, campi di un solo carattere
-@cindex singolo carattere, campi
-@cindex campi di un solo carattere
-Ci sono casi in cui si abbia la necessit@`a di analizzare ciascun carattere di un
-record separatamente. Questo si pu@`o fare in @command{gawk} semplicemente
-assegnando la stringa nulla (@code{""}) a @code{FS}. @value{COMMONEXT}
-In questo caso,
-ogni singolo carattere nel record diventa un campo separato.
-Per esempio:
-
-@example
-$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
-> @kbd{@{}
-> @kbd{for (i = 1; i <= NF; i = i + 1)}
-> @kbd{print "Il campo", i, "@`e", $i}
-> @kbd{@}'}
-@print{} Il campo 1 @`e a
-@print{} Il campo 2 @`e
-@print{} Il campo 3 @`e b
-@end example
-
-@cindex angolo buio, @code{FS} come stringa nulla
-@cindex @code{FS}, variabile, come stringa nulla
-Tradizionalmente, il comportamento di @code{FS} quando @`e impostato a
-@code{""} non @`e stato definito. In questo caso, la maggior parte delle
-versioni UNIX di @command{awk} trattano l'intero record come se avesse un
-unico campo.
-@value{DARKCORNER}
-In modalit@`a di compatibilit@`a
-(@pxref{Opzioni}),
-se @code{FS} @`e la stringa nulla, anche @command{gawk}
-si comporta in questo modo.
-
-@node Separatori campo da riga di comando
-@subsection Impostare @code{FS} dalla riga di comando
-@cindex @option{-F}, opzione sulla riga di comando
-@cindex separatore di campo, specificare sulla riga di comando
-@cindex riga di comando, impostare @code{FS} sulla
-@cindex @code{FS}, variabile, impostare da riga di comando
-
-@code{FS} pu@`o essere impostata sulla riga di comando. Per far questo si usa
-l'opzione @option{-F}. Per esempio:
-
-@example
-awk -F, '@var{programma}' @var{i-file-di-input}
-@end example
-
-@noindent
-imposta @code{FS} al carattere @samp{,}. Si noti che l'opzione richiede
-un carattere maiuscolo @samp{F} anzich@'e minuscolo @samp{f}. Quest'ultima
-opzione (@option{-f}) serve a specificare il file contenente un programma
-@command{awk}.
-
-Il valore usato per l'argomento di @option{-F} @`e elaborato esattamente nello
-stesso modo degli assegnamenti alla variabile predefinita @code{FS}. Qualsiasi
-carattere speciale nel separatore di campo dev'essere protetto in modo
-appropriato. Per esempio, per usare un @samp{\} come separatore di campo
-sulla riga di comando, si dovrebbe battere:
-
-@example
-# equivale a FS = "\\"
-awk -F\\\\ '@dots{}' file @dots{}
-@end example
-
-@noindent
-@cindex @code{\} (barra inversa), come separatore di campo
-@cindex barra inversa (@code{\}), come separatore di campo
-Poich@'e @samp{\} @`e usato nella shell per proteggere caratteri, a @command{awk}
-arriva @samp{-F\\}. Quindi @command{awk} elabora @samp{\\} per caratteri di
-protezione (@pxref{Sequenze di protezione}), producendo alla fine
-un unico @samp{\} da usare come separatore di campo.
-
-@c @cindex historical features
-Come caso particolare, in modalit@`a di compatibilit@`a
-(@pxref{Opzioni}),
-se l'argomento di @option{-F} @`e @samp{t}, @code{FS} @`e impostato al
-carattere di tabulazione. Se si immette @samp{-F\t} nella
-shell, senza che sia tra apici, @samp{\} viene cancellata,
-cos@`{@dotless{i}} @command{awk}
-conclude che si vuole realmente che i campi siano separati da tabulazioni e
-non da delle @samp{t}. Si usi @samp{-v FS="t"} o @samp{-F"[t]"} sulla riga di
-comando se si vuole separare i campi con delle @samp{t}.
-Quando non si @`e in modalit@`a di compatibilit@`a si deve usare @samp{-F '\t'} per
-specificare che le tabulazioni separano i campi.
-
-Come esempio, usiamo un file di programma @command{awk} chiamato
-@file{edu.awk} che contiene il criterio di ricerca @code{/edu/} e l'azione
-@samp{print $1}:
-
-@example
-/edu/ @{ print $1 @}
-@end example
-
-Impostiamo inoltre @code{FS} al carattere @samp{-} ed eseguiamo il programma
-sul file @file{mail-list}. Il seguente comando stampa un elenco dei nomi
-delle persone che lavorano all'universit@`a o che la frequentano, e le prime tre
-cifre dei loro numeri di telefono:
-
-@example
-$ @kbd{awk -F- -f edu.awk mail-list}
-@print{} Fabius 555
-@print{} Samuel 555
-@print{} Jean
-@end example
-
-@noindent
-Si noti la terza riga di output. La terza riga
-nel file originale @`e simile a questa:
-
-@example
-Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-Il @samp{-} che fa parte del nome della persona @`e stato usato come
-separatore di campo, al posto del @samp{-} presente nel numero di telefono,
-che ci si aspettava venisse usato.
-Questo lascia intuire il motivo per cui si deve stare attenti nella scelta
-dei separatori di campo e di record.
-
-@cindex Unix @command{awk}, file di password, separatori di campo e
-Forse l'uso pi@`u comune di un solo carattere come separatore di campo avviene
-quando si elabora il file delle password di un sistema Unix. Su molti sistemi
-Unix, ogni utente @`e descritto da un elemento nel file delle password del
-sistema, che contiene una riga singola per ogni utente. In queste righe le
-informazioni sono separate da dei caratteri ":". Il
-primo campo @`e il nome di login dell'utente e il secondo @`e la password
-dell'utente criptata o oscurata (una password oscurata @`e indicata dalla
-presenza di una sola @samp{x} nel secondo campo). Una riga nel file delle
-password potrebbe essere simile a questa:
-
-@cindex Robbins, Arnold
-@example
-arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
-@end example
-
-Il seguente programma esamina il file delle password di sistema e stampa le
-voci relative agli utenti il cui nome completo non @`e presente nel file:
-
-@example
-awk -F: '$5 == ""' /etc/passwd
-@end example
-
-@node Campo intera riga
-@subsection Fare di una riga intera un campo solo
-
-Occasionalmente, @`e utile trattare l'intera riga in input come un solo campo.
-Questo si pu@`o fare facilmente e in modo portabile semplicemente impostando
-@code{FS} a @code{"\n"} (un ritorno a capo).@footnote{Grazie ad
-Andrew Schorr per questo suggerimento.}
-
-@example
-awk -F'\n' '@var{programma}' @var{file @dots{}}
-@end example
-
-@noindent
-In questo caso, @code{$1} coincide con @code{$0}.
-
-
-@cindex sidebar, Cambiare @code{FS} non incide sui campi
-@ifdocbook
-@docbook
-<sidebar><title>Cambiare @code{FS} non incide sui campi</title>
-@end docbook
-
-
-@cindex POSIX @command{awk}, separatori di campo e
-@cindex separatore di campo, POSIX e il
-Secondo lo standard POSIX, si suppone che @command{awk} si comporti
-come se ogni record sia stato diviso in campi nel momento in cui @`e stato
-letto. In particolare, ci@`o vuol dire che se si cambia il valore di
-@code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
-la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
-valore di @code{FS}, non quello nuovo.
-
-@cindex angolo buio, separatori di campo
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
-funzionano in questo modo. Invece, rimandano la divisione dei campi
-fino a quando si fa effettivamente riferimento a un campo. I campi sono
-divisi usando il valore @emph{corrente} di @code{FS}!
-@value{DARKCORNER}
-Questo comportamento pu@`o essere di difficile
-identificazione. Il seguente esempio illustra la differenza
-tra i due metodi. Lo script
-
-@example
-sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
-@end example
-
-@noindent
-normalmente stampa:
-
-@example
-@print{} root
-@end example
-
-@noindent
-su un'implementazione non standard di @command{awk}, mentre @command{gawk}
-stampa l'intera prima riga del file, qualcosa come:
-
-@example
-root:x:0:0:Root:/:
-@end example
-
-(Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
-``editore di flusso''. Anche il suo comportamento @`e definito dallo standard
-POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Cambiare @code{FS} non incide sui campi}
-
-
-
-@cindex POSIX @command{awk}, separatori di campo e
-@cindex separatore di campo, POSIX e il
-Secondo lo standard POSIX, si suppone che @command{awk} si comporti
-come se ogni record sia stato diviso in campi nel momento in cui @`e stato
-letto. In particolare, ci@`o vuol dire che se si cambia il valore di
-@code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
-la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
-valore di @code{FS}, non quello nuovo.
-
-@cindex angolo buio, separatori di campo
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
-funzionano in questo modo. Invece, rimandano la divisione dei campi
-fino a quando si fa effettivamente riferimento a un campo. I campi sono
-divisi usando il valore @emph{corrente} di @code{FS}!
-@value{DARKCORNER}
-Questo comportamento pu@`o essere di difficile
-identificazione. Il seguente esempio illustra la differenza
-tra i due metodi. Lo script
-
-@example
-sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
-@end example
-
-@noindent
-normalmente stampa:
-
-@example
-@print{} root
-@end example
-
-@noindent
-su un'implementazione non standard di @command{awk}, mentre @command{gawk}
-stampa l'intera prima riga del file, qualcosa come:
-
-@example
-root:x:0:0:Root:/:
-@end example
-
-(Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
-``editore di flusso''. Anche il suo comportamento @`e definito dallo standard
-POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
-@end cartouche
-@end ifnotdocbook
-
-@node Sommario sulla separazione campi
-@subsection Sommario sulla separazione dei campi
-
-@`E importante ricordare che quando si assegna una costante stringa
-come valore di @code{FS}, questa subisce una normale elaborazione di stringa
-da parte di @command{awk}. Per esempio, con Unix @command{awk} e
-@command{gawk}, l'assegnamento @samp{FS = "\.."} assegna la stringa di
-caratteri @code{".."}
-a @code{FS} (la barra inversa @`e tolta). Questo crea un'espressione regolare
-che significa ``i campi sono separati da ricorrenze di due caratteri
-qualsiasi''. Se invece si vuole che i campi siano separati da un punto
-seguito da un qualsiasi carattere singolo, si deve usare @samp{FS = "\\.."}.
-
-Il seguente elenco riassume come i campi vengono divisi, in base al valore
-di @code{FS} (@samp{==} significa ``@`e uguale a''):
-
-@table @code
-@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.
-
-@item FS == @var{qualsiasi altro carattere singolo}
-I campi sono separati da ogni ricorrenza del carattere. Ricorrenze
-successive multiple delimitano campi vuoti, e lo stesso fanno le ricorrenze
-iniziali e finali del carattere.
-Il carattere pu@`o essere anche un metacarattere di espressione regolare, che
-non @`e necessario proteggere.
-
-@item FS == @var{espressione regolare}
-I campi sono separati da ricorrenze di caratteri che corrispondono alla
-@var{espressione regolare}. Corrispondenze iniziali e finali della
-@dfn{regexp} delimitano campi vuoti.
-@item FS == ""
-Ogni sinngolo carattere nel record diventa un campo separato.
-(Questa @`e un'estensione comune; non @`e specificata dallo standard POSIX.)
-@end table
-
-@cindex sidebar, @code{FS} e @code{IGNORECASE}
-@ifdocbook
-@docbook
-<sidebar><title>@code{FS} e @code{IGNORECASE}</title>
-@end docbook
-
-La variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente})
-influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
-@`e un'espressione regolare. Non ha nessun effetto quando @code{FS} @`e un
-singolo carattere, anche se quel carattere @`e una lettera. Quindi, nel
-seguente codice:
-
-@example
-FS = "c"
-IGNORECASE = 1
-$0 = "aCa"
-print $1
-@end example
-
-@noindent
-L'output @`e @samp{aCa}. Se si vuol veramente dividere i campi su un carattere
-alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
-regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}). In questo
-caso, @code{IGNORECASE} avr@`a effetto.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@code{FS} e @code{IGNORECASE}}
-
-
-La variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente})
-influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
-@`e un'espressione regolare. Non ha nessun effetto quando @code{FS} @`e un
-singolo carattere, anche se quel carattere @`e una lettera. Quindi, nel
-seguente codice:
-
-@example
-FS = "c"
-IGNORECASE = 1
-$0 = "aCa"
-print $1
-@end example
-
-@noindent
-L'output @`e @samp{aCa}. Se si vuol veramente dividere i campi su un carattere
-alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
-regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}). In questo
-caso, @code{IGNORECASE} avr@`a effetto.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Dimensione costante
-@section Leggere campi di larghezza costante
-
-
-@cindex campi di larghezza costante
-@cindex larghezza costante, campi di
-@cindex funzionalit@`a avanzate, campi di larghezza costante
-@c O'Reilly doesn't like it as a note the first thing in the section.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta una funzionalit@`a avanzata
-di @command{gawk}. Se si @`e un utente alle prime armi di @command{awk},
-la si pu@`o saltare in prima lettura.
-
-@command{gawk} fornisce una funzionalit@`a per il trattamento di campi
-a larghezza fissa senza un separatore di campo distintivo. Per esempio,
-dati di questo tipo si trovano nell'input per vecchi programmi Fortran dove
-dei numeri sono elencati uno dopo l'altro, o nell'output di programmi che
-non prevedono che il loro output sia dato in input ad altri programmi.
-
-Un esempio di quest'ultimo caso @`e una tabella dove tutte le colonne sono
-allineate usando un numero variabile di spazi e dove @emph{i campi vuoti
-sono solo spazi}. Chiaramente, la normale divisione in campi di
-@command{awk} basata su @code{FS} non funziona bene in questa situazione.
-Sebbene un programma @command{awk}
-portabile possa usare una serie di chiamate @code{substr()} su @code{$0}
-(@pxref{Funzioni per stringhe}),
-questo @`e scomodo e inefficiente se il numero dei campi @`e elevato.
-
-@cindex risoluzione di problemi, errori fatali, specificare larghezza dei campi
-@cindex problemi, risoluzione di, errori fatali, specificare larghezza dei campi
-@cindex @command{w}, programma di utilit@`a
-@cindex programma di utilit@`a @command{w}
-@cindex @code{FIELDWIDTHS}, variabile
-@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
-La suddivisione di un record in input in campi a larghezza fissa viene
-specificata assegnando una stringa contenente numeri separati da spazi alla
-variabile predefinita @code{FIELDWIDTHS}. Ogni numero specifica la larghezza
-del campo, @emph{comprese} le colonne tra i campi. Se si vogliono ignorare le
-colonne tra i campi si pu@`o specificare la loro larghezza come un campo
-separato che verr@`a poi ignorato.
-@`E un errore fatale definire una larghezza di campo che abbia un valore
-negativo. I dati seguenti costituiscono l'output del programma di utilit@`a
-Unix @command{w}. @`E utile per spiegare l'uso di @code{FIELDWIDTHS}:
-
-@example
-@group
- 10:06pm up 21 days, 14:04, 23 users
-User tty login@ idle JCPU PCPU what
-hzuo ttyV0 8:58pm 9 5 vi p24.tex
-hzang ttyV3 6:37pm 50 -csh
-eklye ttyV5 9:53pm 7 1 em thes.tex
-dportein ttyV6 8:17pm 1:47 -csh
-gierd ttyD3 10:00pm 1 elm
-dave ttyD4 9:47pm 4 4 w
-brent ttyp0 26Jun91 4:46 26:46 4:41 bash
-dave ttyq4 26Jun9115days 46 46 wnewmail
-@end group
-@end example
-
-Il seguente programma prende l'input sopra mostrato, converte il tempo di
-inattivit@`a
-in numero di secondi, e stampa i primi due campi e il tempo di inattivit@`a
-calcolato:
-
-@example
-BEGIN @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
-NR > 2 @{
- inat = $4
- sub(/^ +/, "", inat) # togli spazi prima del valore
- if (inat == "")
- inat = 0
- if (inat ~ /:/) @{
- split(inat, t, ":")
- inat = t[1] * 60 + t[2]
- @}
- if (inat ~ /days/)
- inat *= 24 * 60 * 60
-
- print $1, $2, inat
-@}
-@end example
-
-@quotation NOTA
-Questo programma usa diverse funzionalit@`a di @command{awk} non
-ancora trattate.
-@end quotation
-
-L'esecuzione del programma sui dati produce il seguente risultato:
-
-@example
-hzuo ttyV0 0
-hzang ttyV3 50
-eklye ttyV5 0
-dportein ttyV6 107
-gierd ttyD3 1
-dave ttyD4 0
-brent ttyp0 286
-dave ttyq4 1296000
-@end example
-
-Un altro esempio (forse pi@`u pratico) di dati di input con larghezza costante @`e
-l'input da un mazzo di schede elettorali. In alcune parti degli Stati Uniti,
-i votanti marcano le loro scelte perforando delle schede elettroniche.
-
-Queste schede vengono poi elaborate per contare i voti espressi per ogni
-singolo candidato o su ogni determinato quesito. Siccome un votante pu@`o
-scegliere di non votare su alcune questioni, qualsiasi colonna della scheda
-pu@`o essere vuota. Un programma @command{awk} per elaborare tali dati potrebbe
-usare la funzionalit@`a @code{FIELDWIDTHS} per semplificare la lettura dei dati.
-(Naturalmente, riuscire a eseguire @command{gawk} su un sistema con lettori di
-schede @`e un'altra storia!)
-
-@cindex @command{gawk}, separazione in campi e
-L'assegnazione di un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} usi @code{FS}
-per separare nuovamente i campi. Si pu@`o usare @samp{FS = FS} per ottenere
-questo effetto, senza dover conoscere il valore corrente di @code{FS}.
-Per vedere quale tipo di separazione sia in atto,
-si pu@`o usare @code{PROCINFO["FS"]}
-(@pxref{Variabili auto-assegnate}).
-Il suo valore @`e @code{"FS"} se si usa la normale separazione in campi,
-o @code{"FIELDWIDTHS"} se si usa la separazione in campi a larghezza fissa:
-
-@example
-if (PROCINFO["FS"] == "FS")
- @var{separazione in campi normale}@dots{}
-else if (PROCINFO["FS"] == "FIELDWIDTHS")
- @var{separazione in campi a larghezza fissa}@dots{}
-else
- @var{separazione dei campi in base al contenuto}@dots{} @ii{(si veda
-@ifnotinfo
-la @value{SECTION} successiva)}
-@end ifnotinfo
-@ifinfo
-il @value{SECTION} successivo)}
-@end ifinfo
-@end example
-
-Quest'informazione @`e utile quando si scrive una funzione che
-necessita di cambiare temporaneamente @code{FS} o @code{FIELDWIDTHS},
-leggere alcuni record, e poi ripristinare le impostazioni originali
-(@pxref{Funzioni Passwd},
-per un esempio di tale funzione).
-
-@node Separazione in base al contenuto
-@section Definire i campi in base al contenuto
-
-@c O'Reilly doesn't like it as a note the first thing in the section.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta una funzionalit@`a avanzata
-di @command{gawk}. Se si @`e un utente alle prime armi di @command{awk},
-la si pu@`o saltare in prima lettura.
-
-@cindex funzionalit@`a avanzate, specificare il contenuto dei campi
-Normalmente, quando si usa @code{FS}, @command{gawk} definisce i campi come
-le parti del record che si trovano tra due separatori di campo. In altre
-parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa
-@emph{@`e}.
-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.
-
-Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated
-value} (CSV). Molti fogli elettronici, per esempio, possono esportare i dati
-in file di testo, dove ogni record termina con un ritorno a capo e i campi
-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
-contiene una virgola @emph{al suo interno}.
-In queste situazioni, la maggioranza dei programmi include il campo fra
-doppi apici.@footnote{Il formato CSV non ha avuto, per molti anni, una
-definizione standard formale.
-@uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
-standardizza le pratiche pi@`u comuni.}
-Cos@`{@dotless{i}}, potremmo avere dei dati di questo tipo:
-
-@example
-@c file eg/misc/addresses.csv
-Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
-@c endfile
-@end example
-
-@cindex @command{gawk}, variabile @code{FPAT} in
-@cindex @code{FPAT}, variabile
-La variabile @code{FPAT} offre una soluzione per casi come questo.
-Il valore di @code{FPAT} dovrebbe essere una stringa formata da un'espressione
-regolare. L'espressione regolare descrive il contenuto di ciascun campo.
-
-Nel caso dei dati CSV visti prima, ogni campo @`e ``qualsiasi cosa che non
-sia una virgola,'' oppure ``doppi apici, seguiti da qualsiasi cosa che non
-siano doppi apici, e doppi apici di chiusura''. Se fosse scritta come una
-costante @dfn{regexp}
-@iftex
-(@pxrefil{Espressioni regolari}),
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}),
-@end ifnottex
-sarebbe @code{/([^,]+)|("[^"]+")/}.
-Dovendola scrivere come stringa si devono proteggere i doppi apici,
-e quindi si deve scrivere:
-
-@example
-FPAT = "([^,]+)|(\"[^\"]+\")"
-@end example
-
-Come esempio pratico, si pu@`o vedere questo semplice programma che analizza
-e divide i dati:
-
-@example
-@c file eg/misc/simple-csv.awk
-BEGIN @{
- FPAT = "([^,]+)|(\"[^\"]+\")"
-@}
-
-@{
- print "NF = ", NF
- for (i = 1; i <= NF; i++) @{
- printf("$%d = <%s>\n", i, $i)
- @}
-@}
-@c endfile
-@end example
-
-Eseguendolo, avendo in input la riga vista sopra, si ottiene:
-
-@example
-$ @kbd{gawk -f simple-csv.awk addresses.csv}
-NF = 7
-$1 = <Robbins>
-$2 = <Arnold>
-$3 = <"1234 A Pretty Street, NE">
-$4 = <MyTown>
-$5 = <MyState>
-$6 = <12345-6789>
-$7 = <USA>
-@end example
-
-Si noti la virgola contenuta nel valore del campo @code{$3}.
-
-Un semplice miglioramento se si elaborano dati CSV di questo tipo potrebbe
-essere quello di rimuovere i doppi apici, se presenti, con del codice di
-questo tipo:
-
-@example
-if (substr($i, 1, 1) == "\"") @{
- len = length($i)
- $i = substr($i, 2, len - 2) # Ottiene il testo tra doppi apici
-@}
-@end example
-
-Come per @code{FS}, la variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente}) ha effetto sulla separazione dei
-campi con @code{FPAT}.
-
-Se si assegna un valore a @code{FPAT} la divisione in campi non viene
-effettuata utilizzando @code{FS} o @code{FIELDWIDTHS}.
-Analogamente a @code{FIELDWIDTHS}, il valore di @code{PROCINFO["FS"]}
-sar@`a @code{"FPAT"} se @`e in uso la suddivisione in campi in base al contenuto.
-
-@quotation NOTA
-Alcuni programmi esportano dei dati CSV che contengono dei ritorni a capo al
-loro interno in campi rinchiusi tra doppi apici. @command{gawk} non @`e in
-grado di trattare questi dati. Malgrado esista una specifica ufficiale
-per i dati CSV, non c'@`e molto da fare; il meccanismo di @code{FPAT} fornisce
-una soluzione elegante per la maggioranza dei casi, e per gli sviluppatori di
-@command{gawk} ci@`o pu@`o bastare.
-@end quotation
-
-Come visto, l'espressione regolare usata per @code{FPAT} richiede
-che ogni campo contenga almeno un carattere. Una semplice modifica
-(cambiare il primo @samp{+} con @samp{*}) permette che siano presenti dei
-campi vuoti:
-
-@example
-FPAT = "([^,]*)|(\"[^\"]+\")"
-@end example
-
-@c FIXME: 4/2015
-@c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
-@c (star in latter part of value) to allow quoted strings to be empty.
-@c Per email from Ed Morton <mortoneccc@comcast.net>
-
-Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile
-per suddividere normali stringhe (@pxref{Funzioni per stringhe}).
-
-Per ricapitolare, @command{gawk} fornisce tre metodi indipendenti per
-suddividere in campi i record in input.
-Il meccanismo usato @`e determinato da quella tra le tre
-variabili---@code{FS}, @code{FIELDWIDTHS}, o @code{FPAT}---a cui
-sia stato assegnato un valore pi@`u recentemente.
-
-@node Righe multiple
-@section Record su righe multiple
-
-@cindex righe multiple, record su
-@cindex record multiriga
-@cindex input, record multiriga
-@cindex file, lettura dei record multiriga
-@cindex input, file in, si veda file in input
-In alcune banche-dati, una sola riga non pu@`o contenere in modo adeguato
-tutte le informazioni di una voce. In questi casi si possono usare record
-multiriga.
-Il primo passo @`e quello di scegliere il formato dei dati.
-
-@cindex separatori di record, per record multiriga
-Una tecnica @`e quella di usare un carattere o una stringa non usuali per
-separare i record. Per esempio, si pu@`o usare il carattere di interruzione di
-pagina (scritto @samp{\f} sia in @command{awk} che in C) per separarli,
-rendendo ogni record una pagina del file. Per far ci@`o, basta impostare la
-variabile @code{RS} a @code{"\f"} (una stringa contenente il carattere di
-interruzione di pagina). Si potrebbe ugualmente usare qualsiasi altro
-carattere, sempre che non faccia parte dei dati di un record.
-
-@cindex @code{RS}, variabile, record multiriga e
-Un'altra tecnica @`e quella di usare righe vuote per separare i record.
-Per una particolare
-convenzione, una stringa nulla come valore di @code{RS} indica che i record
-sono separati da una o pi@`u righe vuote. Quando @code{RS} @`e impostato alla
-stringa nulla, ogni record termina sempre alla prima riga vuota che @`e stata
-trovata. Il record successivo non inizia prima della successiva riga non
-vuota. Indipendentemente dal numero di righe vuote presenti in successione,
-esse costituiscono sempre un unico separatore di record.
-(Le righe vuote devono essere completamente vuote; righe che contengono
-spazi bianchi @emph{non} sono righe vuote.)
-
-@cindex stringa pi@`u lunga da sinistra, individuare la
-@cindex individuare la stringa pi@`u lunga da sinistra
-Si pu@`o ottenere lo stesso effetto di @samp{RS = ""} assegnando la stringa
-@code{"\n\n+"} a @code{RS}. Quest'espressione regolare individua
-il ritorno a capo alla fine del record e una o pi@`u righe vuote dopo il
-record. In aggiunta, un'espressione regolare individua sempre la sequenza pi@`u
-lunga possibile quando una tale stringa sia presente.
-(@pxref{Pi@`u lungo da sinistra}).
-Quindi, il record successivo non inizia prima della successiva riga non
-vuota; indipendentemente dal numero di righe vuote presenti in una voce di
-banca-dati, esse sono considerate come un unico separatore di record.
-
-@cindex angolo buio, record multiriga
-Comunque, c'@`e una sostanziale differenza tra @samp{RS = ""} e @samp{RS =
-"\n\n+"}. Nel primo caso, i ritorni a capo iniziali nel @value{DF} di
-input vengono ignorati, e se un file termina senza righe vuote aggiuntive dopo
-l'ultimo record, il ritorno a capo viene rimosso dal record. Nel secondo
-caso, questa particolare elaborazione non viene fatta.
-@value{DARKCORNER}
-
-@cindex separatore di campo, nei record multiriga
-@cindex @code{FS}, nei record multiriga
-Ora che l'input @`e separato in record, il secondo passo @`e quello di separare i
-campi all'interno dei record. Un modo per farlo @`e quello di dividere in
-campi ognuna delle righe in input
-nel modo solito. Questo viene fatto per default tramite una
-speciale funzionalit@`a. Quando @code{RS} @`e impostato alla stringa nulla
-@emph{e} @code{FS} @`e impostato a un solo carattere, il carattere di
-ritorno a capo agisce @emph{sempre} come separatore di campo.
-Questo in aggiunta a tutte le separazioni di campo che risultano da
-@code{FS}.@footnote{Quando @code{FS} @`e la stringa nulla (@code{""}), o
-un'espressione regolare, questa particolare funzionalit@`a di @code{RS} non
-viene applicata; si applica al separatore di campo quando @`e costituito da un
-solo spazio:
-@samp{FS = @w{" "}}.}
-
-La motivazione originale per questa particolare eccezione probabilmente era
-quella di prevedere un comportamento che fosse utile nel caso di default
-(cio@`e, @code{FS} uguale a @w{@code{" "}}). Questa funzionalit@`a pu@`o
-costituire un problema se non si vuole che il carattere di ritorno a capo
-faccia da separatore tra i campi, perch@'e non c'@`e alcun modo per impedirlo.
-Tuttavia, si pu@`o aggirare il problema usando la funzione @code{split()}
-per spezzare i record manualmente.
-(@pxref{Funzioni per stringhe}).
-Se si ha un separatore di campo costituito da un solo carattere, si pu@`o
-aggirare la funzionalit@`a speciale in modo diverso, trasformando @code{FS}
-in un'espressione regolare contenente
-quel carattere singolo. Per esempio, se il separatore di campo @`e
-un carattere di percentuale, al posto di
-@samp{FS = "%"}, si pu@`o usare @samp{FS = "[%]"}.
-
-Un altro modo per separare i campi @`e quello di
-mettere ciascun campo su una riga separata: per far questo basta impostare la
-variabile @code{FS} alla stringa @code{"\n"}.
-(Questo separatore di un solo carattere individua un singolo ritorno a capo.)
-Un esempio pratico di un @value{DF} organizzato in questo modo potrebbe essere
-un elenco di indirizzi, in cui delle righe vuote fungono da separatore fra
-record. Si consideri un elenco di indirizzi in un file chiamato
-@file{indirizzi}, simile a questo:
-
-@example
-Jane Doe
-123 Main Street
-Anywhere, SE 12345-6789
-
-John Smith
-456 Tree-lined Avenue
-Smallville, MW 98765-4321
-@dots{}
-@end example
-
-@noindent
-Un semplice programma per elaborare questo file @`e il seguente:
-
-@example
-# addrs.awk --- semplice programma per una lista di indirizzi postali
-
-# I record sono separati da righe bianche
-# Ogni riga @`e un campo.
-BEGIN @{ RS = "" ; FS = "\n" @}
-
-@{
- print "Il nome @`e:", $1
- print "L'indirizzo @`e:", $2
- print "Citt@`a e Stato sono:", $3
- print ""
-@}
-@end example
-
-L'esecuzione del programma produce questo output:
-
-@example
-$ @kbd{awk -f addrs.awk addresses}
-@print{} Il nome @`e: Jane Doe
-@print{} L'indirizzo @`e: 123 Main Street
-@print{} Citt@`a e Stato sono: Anywhere, SE 12345-6789
-@print{}
-@print{} Il nome @`e: John Smith
-@print{} L'indirizzo @`e: 456 Tree-lined Avenue
-@print{} Citt@`a e Stato sono: Smallville, MW 98765-4321
-@print{}
-@dots{}
-@end example
-
-@xref{Programma labels}, per un programma pi@`u realistico per gestire
-elenchi di indirizzi. Il seguente elenco riassume come sono divisi i record,
-a seconda del valore assunto da
-@ifinfo
-@code{RS}.
-(@samp{==} significa ``@`e uguale a.'')
-@end ifinfo
-@ifnotinfo
-@code{RS}:
-@end ifnotinfo
-
-@table @code
-@item RS == "\n"
-I record sono separati dal carattere di ritorno a capo (@samp{\n}). In
-effetti, ogni riga nel @value{DF} @`e un record separato, comprese le righe
-vuote. Questo @`e il comportamento di default.
-
-@item RS == @var{qualsiasi carattere singolo}
-I record sono separati da ogni ricorrenza del carattere specificato. Pi@`u
-ricorrenze adiacenti delimitano record vuoti.
-
-@item RS == ""
-I record sono separati da una o pi@`u righe vuote.
-Quando @code{FS} @`e un carattere singolo,
-il carattere di ritorno a capo
-serve sempre come separatore di campo, in aggiunta a qualunque valore possa
-avere @code{FS}. I ritorni a capo all'inizio e alla fine del file sono
-ignorati.
-
-@item RS == @var{regexp}
-I record sono separati da ricorrenze di caratteri corrispondenti a
-@var{regexp}. Le corrispondenze iniziali e finali di
-@var{regexp} designano record vuoti.
-(Questa @`e un'estensione di @command{gawk}; non @`e specificata dallo
-standard POSIX.)
-@end table
-
-@cindex @command{gawk}, @code{RT} variabile in
-@cindex @code{RT}, variabile
-Se non @`e eseguito in modalit@`a di compatibilit@`a (@pxref{Opzioni}),
-@command{gawk} imposta @code{RT} al testo di input corrispondente
-al valore specificato da @code{RS}.
-Ma se al termine del file in input non @`e stato trovato un testo che
-corrisponde a @code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
-
-@node Getline
-@section Richiedere input usando @code{getline}
-
-@cindex @code{getline}, comando, input esplicito con
-@cindex input esplicito
-Finora abbiamo ottenuto i dati di input dal flusso di input principale di
-@command{awk}: lo standard input (normalmente la tastiera, a volte
-l'output di un altro programma) o i
-file indicati sulla riga di comando. Il linguaggio @command{awk} ha uno
-speciale comando predefinito chiamato @code{getline} che
-pu@`o essere usato per leggere l'input sotto il diretto controllo dell'utente.
-
-Il comando @code{getline} @`e usato in molti modi diversi e
-@emph{non} dovrebbe essere usato dai principianti.
-L'esempio che segue alla spiegazione del comando @code{getline}
-comprende del materiale che ancora non @`e stato trattato. Quindi, @`e meglio
-tornare indietro e studiare il comando @code{getline} @emph{dopo} aver rivisto
-il resto
-@ifinfo
-di questo @value{DOCUMENT}
-@end ifinfo
-@ifhtml
-di questo @value{DOCUMENT}
-@end ifhtml
-@ifnotinfo
-@ifnothtml
-delle Parti I e II
-@end ifnothtml
-@end ifnotinfo
-e avere acquisito una buona conoscenza di come funziona @command{awk}.
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile, con comando @command{getline}
-@cindex differenze tra @command{awk} e @command{gawk}, comando @code{getline}
-@cindex @code{getline}, comando, valori di ritorno
-@cindex @option{--sandbox}, opzione, ridirezione dell'input con @code{getline}
-
-Il comando @code{getline} restituisce 1 se trova un record e 0 se
-trova la fine del file. Se si verifica qualche errore cercando di leggere
-un record, come un file che non pu@`o essere aperto, @code{getline}
-restituisce @minus{}1. In questo caso, @command{gawk} imposta la variabile
-@code{ERRNO} a una stringa che descrive l'errore in questione.
-
-Se il messaggio di errore @code{ERRNO} indica che l'operazione di I/O pu@`o
-essere ritentata e la variabile @code{PROCINFO["@var{input}", "RETRY"]} @`e
-impostata a 1, @code{getline} restituisce un codice di ritorno @minus{}2
-invece che @minus{}1, e si pu@`o provare a chiamare ulterioriormente
-@code{getline}. @xref{Proseguire dopo errore in input} per ulteriori
-informazioni riguardo a questa funzionalit@`a.
-
-Negli esempi seguenti, @var{comando} sta per un valore di stringa che
-rappresenta un comando della shell.
-
-@quotation NOTA
-Quando @`e stata specificata l'opzione @option{--sandbox} (@pxref{Opzioni}),
-la lettura di input da file, @dfn{pipe} e coprocessi non @`e possibile.
-@end quotation
-
-@menu
-* Getline semplice:: Usare @code{getline} senza argomenti.
-* Getline variabile:: Usare @code{getline} in una variabile.
-* Getline file:: Usare @code{getline} da un file.
-* Getline variabile file:: Usare @code{getline} in una variabile da un
- file.
-* Getline @dfn{pipe}:: Usare @code{getline} da una @dfn{pipe}.
-* Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile da una
- @dfn{pipe}.
-* Getline coprocesso:: Usare @code{getline} da un coprocesso.
-* Getline variabile coprocesso:: Usare @code{getline} in una variabile da un
- coprocesso.
-* Note su getline:: Cose importanti da sapere su @code{getline}.
-* Sommario di getline:: Sommario delle varianti di @code{getline}.
-@end menu
-
-@node Getline semplice
-@subsection Usare @code{getline} senza argomenti
-
-Il comando @code{getline} pu@`o essere usato senza argomenti per leggere l'input
-dal file in input corrente. Tutto quel che fa in questo caso @`e leggere il
-record in input successivo e dividerlo in campi. Questo @`e utile se @`e
-finita l'elaborarezione del record corrente, e si vogliono fare delle
-elaborazioni particolari sul record successivo @emph{proprio adesso}.
-Per esempio:
-
-@example
-# rimuovere il testo tra /* e */, compresi
-@{
- if ((i = index($0, "/*")) != 0) @{
- prima = substr($0, 1, i - 1) # la parte iniziale della stringa
- dopo = substr($0, i + 2) # ... */ ...
- j = index(dopo, "*/") # */ @`e nella parte finale?
- if (j > 0) @{
- dopo = substr(dopo, j + 2) # rimozione del commento
- @} else @{
- while (j == 0) @{
- # passa ai record seguenti
- if (getline <= 0) @{
- print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
- exit
- @}
- # incrementare la riga usando la concatenazione di stringhe
- dopo = dopo $0
- j = index(dopo, "*/") # @`e */ nella parte finale?
- if (j != 0) @{
- dopo = substr(dopo, j + 2)
- break
- @}
- @}
- @}
- # incrementare la riga di output usando la concatenazione
- # di stringhe
- $0 = prima dopo
- @}
- print $0
-@}
-@end example
-
-@c 8/2014: Here is some sample input:
-@ignore
-mon/*comment*/key
-rab/*commen
-t*/bit
-horse /*comment*/more text
-part 1 /*comment*/part 2 /*comment*/part 3
-no comment
-@end ignore
-
-Questo programma @command{awk} cancella i commenti in stile C
-(@samp{/* @dots{} */}) dall'input.
-Usa diverse funzionalit@`a che non sono ancora state trattate, incluse la
-concatenazione di stringhe
-(@pxref{Concatenazione})
-e le funzioni predefinite @code{index()} e @code{substr()}
-(@pxref{Funzioni per stringhe}).
-Sostituendo @samp{print $0} con altre
-istruzioni, si possono effettuare elaborazioni pi@`u complesse sull'input
-decommentato, come ricercare corrispondenze di un'espressione regolare.
-(Questo programma ha un piccolo problema: non funziona se c'@`e pi@`u di un
-commento che inizia e finisce
-sulla stessa riga.)
-
-Questa forma del comando @code{getline} imposta @code{NF},
-@code{NR}, @code{FNR}, @code{RT} e il valore di @code{$0}.
-
-@quotation NOTA
-Il nuovo valore di @code{$0} @`e usato per verificare
-le espressioni di ricerca di ogni regola successiva. Il valore originale
-di @code{$0} che ha attivato la regola che ha eseguito la @code{getline}
-viene perso.
-A differenza di @code{getline}, l'istruzione @code{next} legge un nuovo record
-ma inizia a elaborarlo normalmente, a partire dalla prima
-regola presente nel programma. @xref{Istruzione next}.
-@end quotation
-
-@node Getline variabile
-@subsection Usare @code{getline} in una variabile
-@cindex @code{getline} in una variabile
-@cindex variabili, usare in comando @code{getline}
-
-Si pu@`o usare @samp{getline @var{var}} per leggere il record successivo
-in input ad @command{awk} nella variabile @var{var}. Non vien fatta
-nessun'altra elaborazione.
-Per esempio, supponiamo che la riga successiva sia un commento o una stringa
-particolare, e la si voglia leggere senza innescare nessuna regola. Questa
-forma di @code{getline} permette di leggere quella riga e memorizzarla in una
-variabile in modo che il ciclo principale di @command{awk} che "legge una riga
-e controlla ogni regola" non la veda affatto.
-L'esempio seguente inverte tra loro a due a due le righe in input:
-
-@example
-@{
- if ((getline tmp) > 0) @{
- print tmp
- print $0
- @} else
- print $0
-@}
-@end example
-
-@noindent
-Prende la seguente lista:
-
-@example
-wan
-tew
-free
-phore
-@end example
-
-@noindent
-e produce questo risultato:
-
-@example
-tew
-wan
-phore
-free
-@end example
-
-Il comando @code{getline} usato in questo modo imposta solo le variabili
-@code{NR}, @code{FNR} e @code{RT} (e, naturalmente, @var{var}).
-Il record non viene
-suddiviso in campi, e quindi i valori dei campi (compreso @code{$0}) e
-il valore di @code{NF} non cambiano.
-
-@node Getline file
-@subsection Usare @code{getline} da un file
-
-@cindex @code{getline} da un file
-@cindex input, ridirezione dell'
-@cindex ridirezione dell'input
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<} (I/O)
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<} (I/O)
-@cindex operatori di input/output
-Si usa @samp{getline < @var{file}} per leggere il record successivo da
-@var{file}. Qui, @var{file} @`e un'espressione di tipo stringa che
-specifica il @value{FN}. @samp{< @var{file}} @`e una cosidetta
-@dfn{ridirezione} perch@'e richiede che l'input provenga da un posto
-differente. Per esempio, il seguente programma
-legge il suo record in input dal file @file{secondary.input} quando
-trova un primo campo con un valore uguale a 10 nel file in input
-corrente:
-
-@example
-@{
- if ($1 == 10) @{
- getline < "secondary.input"
- print
- @} else
- print
-@}
-@end example
-
-Poich@'e non viene usato il flusso principale di input, i valori di @code{NR} e
-@code{FNR} restano immutati. Comunque, il record in input viene diviso in
-modo normale, per cui vengono cambiati i valori di @code{$0} e degli altri
-campi, producendo un nuovo valore di @code{NF}.
-Viene impostato anche @code{RT}.
-
-@cindex POSIX @command{awk}, operatore @code{<} e
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{getline < @var{espressione}} @`e ambiguo se
-@var{espressione} contiene operatori che non sono all'interno di parentesi,
-ad esclusione di @samp{$}; per esempio, @samp{getline < dir "/" file} @`e
-ambiguo perch@'e l'operatore di concatenazione (non ancora trattato;
-@pxref{Concatenazione}) non @`e posto tra parentesi.
-Si dovrebbe scrivere invece @samp{getline < (dir "/" file)}, se il
-programma dev'essere portabile su tutte le implementazioni di @command{awk}.
-
-@node Getline variabile file
-@subsection Usare @code{getline} in una variabile da un file
-@cindex variabili, usare in comando @code{getline}
-
-Si usa @samp{getline @var{var} < @var{file}} per leggere l'input
-dal file
-@var{file}, e metterlo nella variabile @var{var}. Come prima, @var{file}
-@`e un'espressione di tipo stringa che specifica il file dal quale
-legggere.
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
-cambiata e il record non @`e diviso in campi. La sola variabile cambiata @`e
-@var{var}.@footnote{Questo non @`e completamente vero. @code{RT} pu@`o essere
-cambiato se @code{RS} @`e un'espressione regolare.}
-Per esempio, il seguente programma copia tutti i file in input nell'output, ad
-eccezione dei record che dicono @w{@samp{@@include @var{nomefile}}}.
-Tale record @`e sostituito dal contenuto del file
-@var{nomefile}:
-
-@example
-@{
- if (NF == 2 && $1 == "@@include") @{
- while ((getline line < $2) > 0)
- print line
- close($2)
- @} else
- print
-@}
-@end example
-
-Si noti come il nome del file in input aggiuntivo non compaia all'interno del
-programma; @`e preso direttamente dai dati, e precisamente dal secondo campo
-della riga di @code{@@include}.
-
-La funzione @code{close()} viene chiamata per assicurarsi che se nell'input
-appaiono due righe @code{@@include} identiche, l'intero file specificato sia
-incluso ogni volta.
-@xref{Chiusura file e @dfn{pipe}}.
-
-Una carenza di questo programma @`e che non gestisce istruzioni
-@code{@@include} nidificate
-(cio@`e, istruzioni @code{@@include} contenute nei file inclusi)
-nel modo in cui ci si aspetta che funzioni un vero preelaboratore di macro.
-@xref{Programma igawk} per un programma
-che gestisce le istruzioni @code{@@include} nidificate.
-
-@node Getline @dfn{pipe}
-@subsection Usare @code{getline} da una @dfn{pipe}
-
-@c From private email, dated October 2, 1988. Used by permission, March 2013.
-@cindex Kernighan, Brian
-@quotation
-@i{L'onniscienza ha molti aspetti positivi.
-Se non si pu@`o ottenerla, l'attenzione ai dettagli pu@`o aiutare.}
-@author Brian Kernighan
-@end quotation
-
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
-@cindex input, @dfn{pipeline}
-@cindex @dfn{pipe}, input
-@cindex operatori, input/output
-L'output di un comando pu@`o anche essere convogliato in @code{getline}, usando
-@samp{@var{comando} | getline}. In
-questo caso, la stringa @var{comando} viene eseguita come comando di shell e
-il suo output @`e passato ad @command{awk} per essere usato come input.
-Questa forma di @code{getline} legge un record alla volta dalla @dfn{pipe}.
-Per esempio, il seguente programma copia il suo input nel suo output,
-ad eccezione delle righe che iniziano con @samp{@@execute}, che sono
-sostituite dall'output prodotto dall'esecuzione del resto della riga
-costituito da un comando di shell.
-
-@example
-@{
- if ($1 == "@@execute") @{
- tmp = substr($0, 10) # Rimuove "@@execute"
- while ((tmp | getline) > 0)
- print
- close(tmp)
- @} else
- print
-@}
-@end example
-
-@noindent
-La funzione @code{close()} viene chiamata per assicurarsi che, se appaiono
-nell'input due righe @samp{@@execute} identiche, il comando sia eseguito per
-ciascuna di esse.
-@ifnottex
-@ifnotdocbook
-@xref{Chiusura file e @dfn{pipe}}.
-@end ifnotdocbook
-@end ifnottex
-@c This example is unrealistic, since you could just use system
-Dato l'input:
-
-@example
-pippo
-pluto
-paperino
-@@execute who
-gastone
-@end example
-
-@noindent
-il programma potrebbe produrre:
-
-@cindex Robbins, Bill
-@cindex Robbins, Miriam
-@cindex Robbins, Arnold
-@example
-pippo
-pluto
-paperino
-arnold ttyv0 Jul 13 14:22
-miriam ttyp0 Jul 13 14:23 (murphy:0)
-bill ttyp1 Jul 13 14:23 (murphy:0)
-gastone
-@end example
-
-@noindent
-Si osservi che questo programma ha eseguito @command{who} e stampato il
-risultato. (Eseguendo questo programma, @`e chiaro che ciascun utente otterr@`a
-risultati diversi, a seconda di chi @`e collegato al sistema.)
-
-Questa variante di @code{getline} divide il record in campi, imposta il valore
-di @code{NF}, e ricalcola il valore di @code{$0}. I valori di
-@code{NR} e @code{FNR} non vengono cambiati.
-Viene impostato @code{RT}.
-
-@cindex POSIX @command{awk}, operatore I/O @code{|} e
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{@var{espressione} | getline} @`e ambiguo se
-@var{espressione} contiene operatori che non sono all'interno di parentesi,
-ad esclusione di @samp{$}. Per esempio,
-@samp{@w{"echo "} "date" | getline} @`e ambiguo perch@'e
-l'operatore di concatenazione non @`e tra parentesi. Si dovrebbe scrivere
-invece @samp{(@w{"echo "} "date") | getline}, se il programma dev'essere
-portabile su tutte le implementazioni di @command{awk}.
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@quotation NOTA
-Sfortunatamente, @command{gawk} non ha un comportamento uniforme nel
-trattare un costrutto come @samp{@w{"echo "} "date" | getline}.
-La maggior parte delle versioni, compresa la versione corrente, lo tratta
-come @samp{@w{("echo "} "date") | getline}.
-(Questo @`e anche il comportamento di BWK @command{awk}.)
-Alcune versioni invece lo trattano come
-@samp{@w{"echo "} ("date" | getline)}.
-(Questo @`e il comportamento di @command{mawk}.)
-In breve, per evitare problemi, @`e @emph{sempre} meglio usare parentesi
-esplicite.
-@end quotation
-
-@node Getline variabile @dfn{pipe}
-@subsection Usare @code{getline} in una variabile da una @dfn{pipe}
-@cindex variabili, usare in comando @code{getline}
-
-Quando si usa @samp{@var{comando} | getline @var{var}},
-l'output di @var{comando} @`e inviato tramite una @dfn{pipe} a
-@code{getline} ad una variabile @var{var}. Per esempio, il
-seguente programma legge la data e l'ora corrente nella variabile
-@code{current_time}, usando il programma di utilit@`a @command{date}, e poi lo
-stampa:
-
-@example
-BEGIN @{
- "date" | getline current_time
- close("date")
- print "Report printed on " current_time
-@}
-@end example
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
-cambiata e il record non @`e diviso in campi. In ogni caso, @code{RT} viene
-impostato.
-
-@ifinfo
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{@var{espressione} | getline @var{var}} @`e ambiguo
-se @var{espressione} contiene operatori che non sono all'interno di parentesi
-ad esclusione di @samp{$}; per esempio,
-@samp{@w{"echo "} "date" | getline @var{var}} @`e ambiguo
-perch@'e l'operatore di concatenazione non @`e tra parentesi. Si dovrebbe
-scrivere invece @samp{(@w{"echo "} "date") | getline @var{var}} se il
-programma dev'essere portabile su tutte le implementazioni di @command{awk}.
-@end ifinfo
-
-@node Getline coprocesso
-@subsection Usare @code{getline} da un coprocesso
-@cindex coprocessi, @code{getline} da
-@cindex @code{getline}, comando, coprocessi@comma{} usare dal
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
-
-Leggere dell'input in @code{getline} da una @dfn{pipe} @`e un'operazione
-unidirezionale.
-Il comando avviato con @samp{@var{comando} | getline} invia dati
-@emph{al} programma @command{awk}.
-
-Occasionalmente, si potrebbe avere la necessit@`a di inviare dei dati a un altro
-programma che li elabori, per poi leggere il risultato che esso genera.
-@command{gawk} permette di avviare un @dfn{coprocesso}, col quale sono
-possibili comunicazioni bidirezionali. Questo vien fatto con l'operatore
-@samp{|&}.
-Tipicamente, dapprima si inviano dati al coprocesso e poi si leggono
-i risultati da esso prodotto, come mostrato di seguito:
-
-@example
-print "@var{some query}" |& "db_server"
-"db_server" |& getline
-@end example
-
-@noindent
-esso invia una richiesta a @command{db_server} e poi legge i risultati.
-
-I valori di @code{NR} e
-@code{FNR} non vengono cambiati,
-perch@'e non @`e cambiato il flusso principale.
-In ogni caso, il record @`e diviso in campi
-nel solito modo, cambiando cos@`{@dotless{i}} i valori di @code{$0}, degli altri campi,
-e di @code{NF} e @code{RT}.
-
-I coprocessi sono una funzionalit@`a avanzata. Vengono trattati qui solo perch@'e
-@ifnotinfo
-questa @`e la
-@end ifnotinfo
-@ifinfo
-questo @`e il
-@end ifinfo
-@value{SECTION} su @code{getline}.
-@xref{I/O bidirezionale},
-dove i coprocessi vengono trattati pi@`u dettagliatamente.
-
-@node Getline variabile coprocesso
-@subsection Usare @code{getline} in una variabile da un coprocesso
-@cindex variabili, usare in comando @code{getline}
-
-Quando si usa @samp{@var{comando} |& getline @var{var}}, l'output dal
-coprocesso @var{comando} viene inviato tramite una @dfn{pipe} bidirezionale a
-@code{getline} e nella variabile @var{var}.
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite
-viene cambiata e il record non viene diviso in campi. La sola variabile che
-cambia @`e @var{var}.
-In ogni caso, @code{RT} viene impostato.
-
-@ifinfo
-I coprocessi sono una funzionalit@`a avanzata. Vengono trattati qui solo perch@'e
-questo @`e il @value{SECTION} su @code{getline}.
-@xref{I/O bidirezionale},
-dove i coprocessi vengono trattati pi@`u dettagliatamente.
-@end ifinfo
-
-@node Note su getline
-@subsection Cose importanti da sapere riguardo a @code{getline}
-Qui sono elencate diverse considerazioni su @code{getline}
-da tener presenti:
-
-@itemize @value{BULLET}
-@item
-Quando @code{getline} cambia il valore di @code{$0} e @code{NF},
-@command{awk} @emph{non} salta automaticamente all'inizio del
-programma per iniziare a provare il nuovo record su ogni criterio di ricerca.
-Comunque, il nuovo record viene provato su ogni regola successiva.
-
-@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
-@cindex implementazione, problemi, @command{gawk}, limiti
-@cindex @command{awk}, implementazioni, limiti
-@cindex @command{gawk}, problemi di implementazioni, limiti
-@item
-Alcune tra le prime implementazioni di @command{awk} limitano a una sola il
-numero di @dfn{pipeline} che un programma @command{awk} pu@`o tenere aperte.
-In @command{gawk}, non c'@`e questo limite.
-Si possono aprire tante @dfn{pipeline} (e coprocessi) quante ne permette il
-sistema operativo in uso.
-
-@cindex effetti collaterali, variabile @code{FILENAME}
-@cindex @code{FILENAME}, variabile, impostare con @code{getline}
-@cindex angolo buio, variabile @code{FILENAME}
-@cindex @code{getline}, comando, variabile @code{FILENAME} e
-@cindex @code{BEGIN}, criterio di ricerca, @code{getline} e
-@item
-Un interessante effetto collaterale si ha se si usa @code{getline}, senza
-una ridirezione, all'interno di una regola @code{BEGIN}. Poich@'e una
-@code{getline} non ridiretta legge dai @value{DF} specificati nella riga di
-comando, il primo comando @code{getline} fa s@`{@dotless{i}} che @command{awk} imposti
-il valore di @code{FILENAME}. Normalmente, @code{FILENAME} non ha ancora un
-valore all'interno delle regole @code{BEGIN}, perch@'e non si @`e ancora
-iniziato a elaborare il
-@value{DF} della riga di comando.
-@value{DARKCORNER}
-(Si veda @ref{BEGIN/END};
-e @pxref{Variabili auto-assegnate}.)
-
-@item
-Usare @code{FILENAME} con @code{getline}
-(@samp{getline < FILENAME})
-pu@`o essere fonte di
-confusione. @command{awk} apre un flusso separato di input, diverso dal
-file in input corrente. Comunque, poich@'e non si usa una variabile,
-@code{$0} e @code{NF} vengono aggiornati. Se si sta facendo questo, @`e
-probabilmente per sbaglio, e si dovrebbe rivedere quello che si sta cercando
-di fare.
-
-@item
-@ifdocbook
-La prossima @value{SECTION}
-@end ifdocbook
-@ifnotdocbook
-@ref{Sommario di getline},
-@end ifnotdocbook
-contiene una tabella che sintetizza le
-varianti di @code{getline} e le variabili da esse modificate.
-@`E degno di nota che le varianti che non usano la ridirezione
-possono far s@`{@dotless{i}} che @code{FILENAME} venga aggiornato se chiedono ad
-@command{awk} di iniziare a leggere un nuovo file in input.
-
-@item
-@cindex Moore, Duncan
-Se la variabile assegnata @`e un'espressione con effetti collaterali, versioni
-differenti di @command{awk} si comportano in modo diverso quando trovano la
-fine-del-file [EOF]. Alcune versioni non valutano l'espressione; molte
-versioni (compreso @command{gawk}) lo fanno. Si veda un esempio, gentilmente
-fornito da Duncan Moore:
-
-@ignore
-Date: Sun, 01 Apr 2012 11:49:33 +0100
-From: Duncan Moore <duncan.moore@@gmx.com>
-@end ignore
-
-@example
-BEGIN @{
- system("echo 1 > f")
- while ((getline a[++c] < "f") > 0) @{ @}
- print c
-@}
-@end example
-
-@noindent
-Qui l'effetto secondario @`e @samp{++c}. Se viene trovata la fine del file
-@emph{prima} di assegnare l'elemento @code{a}, @code{c} @`e incrementato o no?
-
-@command{gawk} tratta @code{getline} come una chiamata di funzione, e valuta
-l'espressione @samp{a[++c]} prima di cercare di leggere da @file{f}.
-Comunque, alcune versioni di @command{awk} valutano l'espressione solo
-se c'@`e un valore di stringa da assegnare.
-@end itemize
-
-@node Sommario di getline
-@subsection Sommario delle varianti di @code{getline}
-@cindex @code{getline}, comando, varianti
-
-La @ref{tabella-varianti-getline}
-riassume le otto varianti di @code{getline},
-elencando le variabili predefinite che sono impostate da ciascuna di esse,
-e se la variante @`e standard o @`e un'estensione di @command{gawk}.
-Nota: per ogni variante, @command{gawk} imposta la variabile predefinita
-@code{RT}.
-
-@float Tabella,tabella-varianti-getline
-@caption{Varianti di @code{getline} e variabili impostate da ognuna}
-@multitable @columnfractions .33 .38 .27
-@headitem Variante @tab Effetto @tab @command{awk} / @command{gawk}
-@item @code{getline} @tab Imposta @code{$0}, @code{NF}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
-@item @code{getline} @var{var} @tab Imposta @var{var}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
-@item @code{getline <} @var{file} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
-@item @code{getline @var{var} < @var{file}} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
-@item @var{comando} @code{| getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
-@item @var{comando} @code{| getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
-@item @var{comando} @code{|& getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{gawk}
-@item @var{comando} @code{|& getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{gawk}
-@end multitable
-@end float
-
-@node Timeout in lettura
-@section Leggere input entro un tempo limite
-@cindex tempo limite, leggere input
-@cindex @dfn{timeout}, si veda tempo limite
-
-@cindex differenze tra @command{awk} e @command{gawk}, tempo limite per lettura
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@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
-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}
-(@pxref{Variabili auto-assegnate}):
-
-@example
-PROCINFO["nome_input", "READ_TIMEOUT"] = @var{tempo limite in millisecondi}
-@end example
-
-Se @`e impostato, @command{gawk} smette di attendere una risposta e restituisce
-insuccesso se non sono disponibili dati da leggere entro il limite di tempo
-specificato. Per esempio, un cliente TCP pu@`o decidere di abbandonare se
-non riceve alcuna risposta dal server dopo un certo periodo di tempo:
-
-@example
-Service = "/inet/tcp/0/localhost/daytime"
-PROCINFO[Service, "READ_TIMEOUT"] = 100
-if ((Service |& getline) > 0)
- print $0
-else if (ERRNO != "")
- print ERRNO
-@end example
-
-Qui vediamo come ottenere dati interattivamente dall'utente@footnote{Questo
-presuppone che lo standard input provenga dalla tastiera.} aspettando per
-non pi@`u di cinque secondi:
-
-@example
-PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
-while ((getline < "/dev/stdin") > 0)
- print $0
-@end example
-
-@command{gawk} termina l'operazione di lettura se l'input non
-arriva entro il periodo di tempo limite, restituisce insuccesso
-e imposta @code{ERRNO} a una stringa di valore adeguato.
-Un valore del tempo limite negativo o pari a zero equivale a non specificare
-affatto un tempo limite.
-
-Si pu@`o impostare un tempo limite anche per leggere dalla tastiera nel ciclo
-implicito che legge i record in input e li confronta coi criteri di ricerca,
-come:
-
-@example
-$ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
-> @kbd{@{ print "You entered: " $0 @}'}
-@kbd{gawk}
-@print{} You entered: gawk
-@end example
-
-In questo caso, la mancata risposta entro cinque secondi d@`a luogo al seguente
-messaggio di errore:
-
-@example
-@c questo @`e l'output effettivo - Antonio
-@error{} gawk: linea com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
-@error{} file in input `-': Connessione scaduta
-@end example
-
-Il tempo limite pu@`o essere impostato o cambiato in qualsiasi momento, e avr@`a
-effetto al tentativo successivo di leggere dal dispositivo di input. Nel
-seguente esempio, partiamo con un valore di tempo limite di un secondo e
-lo riduciamo progressivamente di un decimo di secondo finch@'e l'attesa
-per l'input diventa illimitata.
-
-@example
-PROCINFO[Service, "READ_TIMEOUT"] = 1000
-while ((Service |& getline) > 0) @{
- print $0
- PROCINFO[Service, "READ_TIMEOUT"] -= 100
-@}
-@end example
-
-@quotation NOTA
-Non si deve dare per scontato che l'operazione di lettura si blocchi
-esattamente dopo che @`e stato stampato il decimo record. @`E possibile che
-@command{gawk} legga e tenga in memoria i dati di pi@`u di un record
-la prima volta. Per questo, cambiare il valore del tempo
-limite come nell'esempio appena visto non @`e molto utile.
-@end quotation
-
-Se l'elemento di @code{PROCINFO} non @`e presente e la variabile d'ambiente
-@env{GAWK_READ_TIMEOUT} esiste,
-@command{gawk} usa il suo valore per inizializzare il valore di tempo limite.
-L'uso esclusivo della variabile d'ambiente per specificare il tempo limite
-ha lo svantaggio di non essere
-adattabile per ogni comando o per ogni connessione.
-
-@command{gawk} considera errore un superamento di tempo limite anche se
-il tentativo di leggere dal dispositivo sottostante potrebbe riuscire
-in un tentativo successivo. Questa @`e una limitazione, e inoltre
-significa che non @`e possibile usarlo per ottenere input multipli,
-provenienti da due o pi@`u sorgenti. @xref{Proseguire dopo errore in input}
-per una modalit@`a che consente di tentare ulteriori operazioni di I/O.
-
-Assegnare un valore di tempo limite previene un blocco a tempo indeterminato
-legato a operazioni di lettura. Si tenga per@`o presente che ci sono altre
-situazioni in cui @command{gawk} pu@`o restare bloccato in attesa che un
-dispositivo di input sia pronto. Un cliente di rete a volte pu@`o impiegare
-molto tempo per stabilire una
-connessione prima di poter iniziare a leggere qualsiasi dato,
-oppure il tentativo di aprire un file speciale FIFO in lettura pu@`o bloccarsi
-indefinitamente in attesa che qualche altro processo lo apra in scrittura.
-
-@node Proseguire dopo errore in input
-@section Elaborare ulteriore input dopo certi errori di I/O
-@cindex proseguire dopo errore in input
-@cindex errore in input, possibilit@`a di proseguire
-
-@cindex differenze tra @command{awk} e @command{gawk}, proseguire dopo errore in input
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-Qualora @command{gawk} incontri un errore durante la lettura dell'input,
-per default @code{getline} ha come codice di ritorno @minus{}1, e i
-successivi tentativi di leggere dallo stesso file restituiscono una
-indicazione di fine-file. @`E tuttavia possibile chiedere a
-@command{gawk} di consentire un ulteriore tentativo di lettura in presenza
-di certi errori, impostando uno speciale elemento del vettore
-@code{PROCINFO} (@pxref{Variabili auto-assegnate}):
-
-@example
-PROCINFO["@var{nome_input_file}", "RETRY"] = 1
-@end example
-
-Quando un tale elemento esiste, @command{gawk} controlla il valore della
-variabile di sistema
-(nel linguaggio C)
-@code{errno} quando si verifica un errore di I/O.
-Se @code{errno} indica che un ulteriore tentativo di lettura pu@`o
-terminare con successo, @code{getline} ha come codice di ritorno @minus{}2
-e ulteriori chiamate a @code{getline} possono terminare correttamente.
-Questo vale per i seguenti valori di @code{errno}: @code{EAGAIN},
-@code{EWOULDBLOCK}, @code{EINTR}, e @code{ETIMEDOUT}.
-
-Questa funzionalit@`a @`e utile quando si assegna un valore all'elemento
-@code{PROCINFO["@var{nome_input_file}", "READ_TIMEOUT"]} o in situazioni
-in cui un descrittore di file sia stato configurato per comportarsi in
-modo non bloccante.
-
-@node Directory su riga di comando
-@section Directory sulla riga di comando
-@cindex differenze tra @command{awk} e @command{gawk}, directory sulla riga di comando
-@cindex directory, riga di comando
-@cindex riga di comando, directory su
-
-Per lo standard POSIX, i file che compaiono sulla riga di comando di
-@command{awk} devono essere file di testo; @`e un errore fatale se non lo sono.
-La maggior parte delle versioni di @command{awk} genera un errore fatale
-quando trova una directory sulla riga di comando.
-
-Per default, @command{gawk} emette un avvertimento se c'@`e una directory sulla
-riga di comando, e in ogni caso la ignora. Questo rende pi@`u facile usare
-metacaratteri di shell col proprio programma @command{awk}:
-
-@example
-$ @kbd{gawk -f whizprog.awk *} @ii{Le directory potrebbero far fallire il programma}
-@end example
-
-Se viene data una delle opzioni @option{--posix}
-o @option{--traditional}, @command{gawk} considera invece
-una directory sulla riga di comando come un errore fatale.
-
-@xref{Esempio di estensione Readdir} per un modo di trattare le directory
-come dati usabili da un programma @command{awk}.
-
-@sp 2
-@node Sommario di Input
-@section Sommario di Input
-
-@itemize @value{BULLET}
-@item
-L'input @`e diviso in record in base al valore di @code{RS}.
-Le possibilit@`a sono le seguenti:
-
-@multitable @columnfractions .28 .45 .40
-@headitem Valore di @code{RS} @tab Record separati da @dots{} @tab @command{awk} / @command{gawk}
-@item Un carattere singolo @tab Quel carattere @tab @command{awk}
-@item La stringa nulla (@code{""}) @tab Serie di due o pi@`u ritorni a capo @tab @command{awk}
-@item Un'espressione regolare @tab Testo corrispondente alla @dfn{regexp} @tab @command{gawk}
-@end multitable
-
-@item
-@code{FNR} indica quanti record sono stati letti dal file in input corrente;
-@code{NR} indica quanti record sono stati letti in totale.
-
-@item
-@command{gawk} imposta @code{RT} al testo individuato da @code{RS}.
-
-@item
-Dopo la divisione dell'input in record, @command{awk} divide
-i record in singoli campi, chiamati @code{$1}, @code{$2} e cos@`{@dotless{i}}
-via. @code{$0} @`e l'intero record, e @code{NF} indica quanti campi
-contiene. Il metodo di default per dividere i campi utilizza i
-caratteri di spazio vuoto.
-
-@item Si pu@`o far riferimento ai campi usando una variabile, come in @code{$NF}.
-Ai campi possono anche essere assegnati dei valori, e questo implica che il
-valore di @code{$0} sia ricalcolato se ad esso si fa riferimento in seguito.
-Fare un assegnamento a un campo con un numero maggiore di @code{NF} crea il
-campo e ricostruisce il record, usando @code{OFS} per separare i campi.
-Incrementare @code{NF} fa la stessa cosa. Decrementare @code{NF} scarta dei
-campi e ricostruisce il record.
-
-@item
-Separare i campi @`e pi@`u complicato che separare i record.
-
-@multitable @columnfractions .40 .40 .20
-@headitem Valore del separatore di campo @tab Campi separati @dots{} @tab @command{awk} / @command{gawk}
-@item @code{FS == " "} @tab Da serie di spazi vuoti @tab @command{awk}
-@item @code{FS == @var{un solo carattere}} @tab Da quel carattere @tab @command{awk}
-@item @code{FS == @var{espr. reg.}} @tab Dal testo che corrisponde alla @dfn{regexp} @tab @command{awk}
-@item @code{FS == ""} @tab Cos@`{@dotless{i}} ogni singolo carattere @`e un campo separato @tab @command{gawk}
-@item @code{FIELDWIDTHS == @var{lista di colonne}} @tab Basata sulla posizione del carattere @tab @command{gawk}
-@item @code{FPAT == @var{regexp}} @tab Dal testo attorno al testo corrispondente alla @dfn{regexp} @tab @command{gawk}
-@end multitable
-
-@item
-Usando @samp{FS = "\n"} l'intero record sar@`a un unico campo
-(nell'ipotesi che i record siano separati da caratteri di ritorno a capo).
-
-@item
-@code{FS} pu@`o essere impostato dalla riga di comando con l'opzione
-@option{-F}.
-Si pu@`o fare la stessa cosa usando un assegnamento di variabile da riga di
-comando.
-
-@item
-@code{PROCINFO["FS"]} permette di sapere come i campi sono separati.
-
-@item
-@code{getline} nelle sue diverse forme serve per leggere record aggiuntivi
-provenienti dal flusso di input di default, da un file, o da una @dfn{pipe}
-o da un coprocesso.
-
-@item
-@code{PROCINFO[@var{file}, "READ_TIMEOUT"]} si pu@`o usare per impostare un
-tempo limite alle operazioni di lettura da @var{file}.
-
-@item
-Le directory sulla riga di comando generano un errore fatale per
-@command{awk} standard;
-@command{gawk} le ignora se non @`e in modalit@`a POSIX.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi su Input
-@section Esercizi
-
-@enumerate
-@item
-Usando la variabile @code{FIELDWIDTHS} (@pxref{Dimensione costante}),
-scrivere un programma per leggere i dati delle elezioni, dove ogni record
-rappresenta i voti di un votante. Trovare un modo per definire quali colonne
-sono associate a ogni quesito elettorale, e stampare i voti totali,
-comprese le astensioni, per ciascun quesito.
-@item
-La @ref{Getline semplice}, ha illustrato un programma per rimuovere i commenti
-in stile C (@samp{/* @dots{} */}) dall'input. Quel programma
-non funziona se un commento termina in una riga e il successivo commento
-inizia nella stessa riga.
-Il problema si pu@`o risolvere con una semplice modifica. Quale?
-
-@end enumerate
-@c EXCLUDE END
-
-@node Stampare
-@chapter Stampare in output
-
-@cindex stampare
-@cindex output, stampare, si veda stampare
-Una delle azioni che un programma fa pi@`u comunemente, @`e quella di produrre
-@dfn{stampe}, ossia scrivere in output l'input letto, tutto o in parte.
-Si pu@`o usare l'istruzione @code{print} per una stampa semplice, e l'istruzione
-@code{printf} per una formattazione dell'output pi@`u sofisticata.
-L'istruzione @code{print} non ha un limite al numero di elementi quando
-calcola @emph{quali} valori stampare. Peraltro, con due eccezioni,
-non @`e possibile specificare @emph{come} stamparli: quante
-colonne, se usare una notazione esponenziale o no, etc.
-(Per le eccezioni, @pxref{Separatori di output} e
-la @ref{OFMT}.)
-Per stampare fornendo delle specifiche, @`e necessario usare
-l'istruzione @code{printf}
-(@pxref{Printf}).
-
-@cindex istruzione @code{print}
-@cindex istruzione @code{printf}
-Oltre alla stampa semplice e formattata, questo @value{CHAPTER}
-esamina anche le ridirezioni di I/O verso file e @dfn{pipe}, introduce
-i @value{FNS} speciali che @command{gawk} elabora internamente,
-e parla della funzione predefinita @code{close()}.
-
-@menu
-* Print:: L'istruzione @code{print}.
-* Esempi su print:: Semplici esempi di
- istruzioni @code{print}.
-* Separatori di output:: I separatori di output e come
- modificarli.
-* OFMT:: Controllare l'output di numeri con
- @code{print}.
-* Printf:: l'istruzione @code{printf}.
-* Ridirezione:: Come ridirigere l'output a diversi
- file e @dfn{pipe}.
-* FD speciali:: I/O con FD [Descrittori File]
- speciali.
-* File speciali:: Interpretazione nomi file in
- @command{gawk}. @command{gawk}
- Permette di accedere a descrittori
- file gi@`a aperti a inizio esecuzione
-* Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e
- @dfn{pipe}.
-* Continuazione dopo errori:: Abilitare continuazione dopo errori
- in output.
-* Sommario di Output:: Sommario di Output.
-* Esercizi su Output:: Esercizi.
-@end menu
-
-@node Print
-@section L'istruzione @code{print}
-
-L'istruzione @code{print} si usa per produrre dell'output formattato in
-maniera semplice, standardizzata. Si
-specificano solo le stringhe o i numeri
-da stampare, in una lista separata da virgole. Questi elementi sono stampati,
-separati tra loro da spazi singoli, e alla fine viene stampato un ritorno a
-capo. L'istruzione @`e simile a questa:
-
-@example
-print @var{elemento1}, @var{elemento2}, @dots{}
-@end example
-
-@noindent
-L'intera lista di elementi pu@`o facoltativamente essere racchiusa fra
-parentesi. Le parentesi sono obbligatorie se qualche espressione presente
-in uno degli elementi usa l'operatore relazionale @samp{>}, che potrebbe
-essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
-
-Gli elementi da stampare possono essere stringhe costanti o numeri, campi
-del record corrente (come @code{$1}), variabili, o quasiasi espressione
-@command{awk}. I valori numerici sono convertiti in stringhe prima di essere
-stampati.
-
-@cindex record, stampare
-@cindex righe, vuote, stampare
-@cindex testo, stampare
-Una semplice istruzione @samp{print} senza specificare elementi equivale a
-@samp{print $0}: stampa l'intero record corrente. Per stampare una riga
-vuota, si usa @samp{print ""}.
-Per stampare un testo che non cambia, si usi come elemento una costante
-stringa, per esempio @w{@code{"Non v'allarmate"}}. Dimenticandosi di mettere
-i doppi apici, il testo @`e preso per un'espressione @command{awk},
-e probabilmente verr@`a emesso un messaggio di errore. Occorre tener presente
-che tra ogni coppia di elementi viene stampato uno spazio.
-
-Si noti che l'istruzione @code{print} @`e un'istruzione, e non
-un'espressione: non @`e possibile usarla nella parte modello [di ricerca] di
-un'istruzione @dfn{criterio di ricerca--azione}, per esempio.
-
-@node Esempi su print
-@section Esempi di istruzioni @code{print}
-
-Ogni istruzione @code{print} produce almeno una riga in output. Comunque,
-non @`e limitata a una sola riga. Se il valore di un elemento @`e una stringa
-che contiene un ritorno a capo, il ritorno a capo @`e stampato insieme al
-resto della stringa. Una
-singola istruzione @code{print} pu@`o in questo modo generare un numero
-qualsiasi di righe.
-
-@cindex ritorno a capo, stampare un
-Quel che segue @`e un esempio di stampa di una stringa che contiene al suo
-interno dei
-@ifinfo
-ritorni a capo
-(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
-carattere di ritorno a capo; @pxref{Sequenze di protezione}):
-@end ifinfo
-@ifhtml
-ritorni a capo
-(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
-carattere di ritorno a capo; @pxref{Sequenze di protezione}):
-@end ifhtml
-@ifnotinfo
-@ifnothtml
-ritorni a capo:
-@end ifnothtml
-@end ifnotinfo
-
-@example
-$ @kbd{awk 'BEGIN @{ print "riga uno\nriga due\nriga tre" @}'}
-@print{} riga uno
-@print{} riga due
-@print{} riga tre
-@end example
-
-@cindex campi, stampare
-Il prossimo esempio, eseguito sul file @file{inventory-shipped},
-stampa i primi due campi di ogni record in input, separandoli con uno
-spazio:
-
-@example
-$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
-@print{} Jan 13
-@print{} Feb 15
-@print{} Mar 15
-@dots{}
-@end example
-
-@cindex istruzione @code{print}, virgole, omettere
-@cindex debug, istruzione @code{print}@comma{} omissione virgole
-Un errore frequente usando l'istruzione @code{print} @`e quello di tralasciare
-la virgola tra due elementi. Questo ha spesso come risultato la stampa di
-elementi attaccati tra loro, senza lo spazio di separazione. Il motivo per
-cui ci@`o accade @`e che la scrittura di due
-espressioni di stringa in @command{awk} ne indica la concatenazione. Qui si
-vede l'effetto dello stesso programma,
-senza le virgole:
-
-@example
-$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
-@print{} Jan13
-@print{} Feb15
-@print{} Mar15
-@dots{}
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, intestazioni, aggiungere
-Per chi non conosce il file @file{inventory-shipped} nessuno
-dei due output di esempio risulta molto comprensibile. Una riga iniziale di
-intestazione li renderebbe pi@`u chiari.
-Aggiungiamo qualche intestazione alla nostra tabella dei mesi
-(@code{$1}) e dei contenitori verdi spediti (@code{$2}). Lo facciamo usando
-una regola @code{BEGIN} (@pxref{BEGIN/END}) in modo che le intestazioni siano
-stampate una volta sola:
-
-@example
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, $2 @}' inventory-shipped
-@end example
-
-@noindent
-Una volta eseguito, il programma stampa questo:
-
-@example
-Mese Contenitori
------ -----------
-Jan 13
-Feb 15
-Mar 15
-@dots{}
-@end example
-
-@noindent
-Il solo problema, in effetti, @`e che le intestazioni e i dati della tabella
-non sono allineati! Possiamo provvedere stampando alcuni spazi tra i due
-campi:
-
-@example
-@group
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, " ", $2 @}' inventory-shipped
-@end group
-@end example
-
-@cindex istruzione @code{printf}, colonne@comma{} allineamento
-@cindex colonne, allineamento
-Allineare le colonne in questo modo pu@`o diventare piuttosto
-complicato, quando ci sono parecchie colonne da tenere allineate. Contare gli
-spazi per due o tre colonne @`e semplice, ma oltre questo limite comincia a
-volerci molto tempo. Ecco perch@'e @`e disponibile l'istruzione @code{printf}
-(@pxref{Printf});
-una delle possibilit@`a che offre @`e quella di allineare colonne di dati.
-
-@cindex continuazione di riga, in istruzione @code{print}
-@cindex istruzione @code{print}, continuazione di riga e
-@cindex @code{print}, istruzione, continuazione di riga e
-@quotation NOTA
-Si pu@`o continuare su pi@`u righe sia l'istruzione @code{print} che l'istruzione
-@code{printf} semplicemente mettendo un ritorno a capo dopo una virgola
-qualsiasi
-(@pxref{Istruzioni/Righe}).
-@end quotation
-
-@node Separatori di output
-@section I separatori di output e come modificarli
-
-@cindex variabile @code{OFS}
-Come detto sopra, un'istruzione @code{print} contiene una lista di elementi
-separati da virgole. Nell'output, gli elementi sono solitamente separati
-da spazi singoli. Non @`e detto tuttavia che debba sempre essere cos@`{@dotless{i}}; uno
-spazio singolo @`e semplicemnte il valore di default. Qualsiasi stringa di
-caratteri pu@`o essere usata come
-@dfn{separatore di campo in output} impostando la variabile
-predefinita @code{OFS}. Il valore iniziale di questa variabile @`e
-la stringa @w{@code{" "}} (cio@`e, uno spazio singolo).
-
-L'output di un'istruzione @code{print} completa @`e detto un @dfn{record di
-output}. Ogni istruzione @code{print} stampa un record di output, e alla fine
-ci aggiunge una stringa detta @dfn{separatore record in output} (o
-@code{ORS}). Il valore iniziale di @code{ORS} @`e la stringa @code{"\n"}
-(cio@`e, un carattere di ritorno a capo). Quindi, ogni istruzione
-@code{print} normalmente genera [almeno] una riga a s@'e stante.
-
-@cindex output, record
-@cindex separatore di record in output, si veda @code{ORS}, variabile
-@cindex @code{ORS}, variabile
-@cindex @code{BEGIN}, criterio di ricerca, variabili @code{OFS}/@code{ORS}, assegnare valori a
-Per cambiare il tipo di separazione in output di campi e record, si impostano
-valori differenti alle variabili @code{OFS} e @code{ORS}. Il posto pi@`u
-indicato per farlo @`e nella regola @code{BEGIN}
-(@pxref{BEGIN/END}), in modo che l'assegnazione abbia effetto prima
-dell'elaborazione di ogni record in input. Questi valori si possono
-anche impostare dalla riga di comando, prima della lista dei file in input,
-oppure usando l'opzione della riga di comando @option{-v}
-(@pxref{Opzioni}).
-L'esempio seguente stampa il primo e il secondo campo di ogni record in input,
-separati da un punto e virgola, con una riga vuota aggiunta dopo ogni
-ritorno a capo:
-
-
-@example
-$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
-> @kbd{@{ print $1, $2 @}' mail-list}
-@print{} Amelia;555-5553
-@print{}
-@print{} Anthony;555-3412
-@print{}
-@print{} Becky;555-7685
-@print{}
-@print{} Bill;555-1675
-@print{}
-@print{} Broderick;555-0542
-@print{}
-@print{} Camilla;555-2912
-@print{}
-@print{} Fabius;555-1234
-@print{}
-@print{} Julie;555-6699
-@print{}
-@print{} Martin;555-6480
-@print{}
-@print{} Samuel;555-3430
-@print{}
-@print{} Jean-Paul;555-2127
-@print{}
-@end example
-
-Se il valore di @code{ORS} non contiene un ritorno a capo, l'output del
-programma viene scritto tutto su un'unica riga.
-
-@node OFMT
-@section Controllare l'output di numeri con @code{print}
-@cindex numerico, formato di output
-@cindex formati numerici di output
-Quando si stampano valori numerici con l'istruzione @code{print},
-@command{awk} converte internamente ogni numero in una stringa di caratteri
-e stampa quella stringa. @command{awk} usa la funzione @code{sprintf()}
-per effettuare questa conversione
-(@pxref{Funzioni per stringhe}).
-Per ora, basta dire che la funzione @code{sprintf()}
-accetta una @dfn{specifica di formato} che indica come formattare
-i numeri (o le stringhe), e che ci sono svariati modi per formattare i
-numeri. Le differenti specifiche di formato sono trattate pi@`u
-esaurientemente
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Lettere di controllo}.
-
-@cindexawkfunc{sprintf}
-@cindex @code{OFMT}, variabile
-@cindex output, specificatore di formato@comma{} @code{OFMT}
-La variabile predefinita @code{OFMT} contiene la specifica di formato
-che @code{print} usa con @code{sprintf()} per convertire un numero in
-una stringa per poterla stampare.
-Il valore di default di @code{OFMT} @`e @code{"%.6g"}.
-Il modo in cui @code{print} stampa i numeri si pu@`o cambiare
-fornendo una specifica di formato differente
-per il valore di @code{OFMT}, come mostrato nell'esempio seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{OFMT = "%.0f" # Stampa numeri come interi (arrotonda)}
-> @kbd{print 17.23, 17.54 @}'}
-@print{} 17 18
-@end example
-
-@noindent
-@cindex angolo buio, variabile @code{OFMT}
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex variabile @code{OFMT}, POSIX @command{awk} e
-Per lo standard POSIX, il comportamento di @command{awk} @`e indefinito
-se @code{OFMT} contiene qualcosa di diverso da una specifica di conversione
-di un numero a virgola mobile.
-@value{DARKCORNER}
-
-@node Printf
-@section Usare l'istruzione @code{printf} per stampe sofisticate
-
-@cindex istruzione @code{printf}
-@cindex @code{printf}, istruzione
-@cindex output, formattato
-@cindex formattare l'output
-Per un controllo pi@`u ampio sul formato di output di quello fornito da
-@code{print}, si pu@`o usare @code{printf}.
-Con @code{printf} si pu@`o
-specificare lo spazio da utilizzare per ogni elemento, e anche le varie
-scelte di formattazione disponibile per i numeri (come la base da usare in
-output, se stampare con notazione esponenziale, se inserire un segno, e quante
-cifre stampare dopo il separatore decimale).
-
-@menu
-* Printf Fondamenti:: Sintassi dell'istruzione
- @code{printf}.
-* Lettere di controllo:: Lettere di controllo del formato.
-* Modificatori di formato:: Modificatori specifiche di formato.
-* Esempi su printf:: Numerosi esempi.
-@end menu
-
-@node Printf Fondamenti
-@subsection Sintassi dell'istruzione @code{printf}
-
-@cindex istruzione @code{printf}, sintassi dell'
-@cindex @code{printf}, sintassi dell'istruzione
-Una semplice istruzione @code{printf} @`e qualcosa di simile a questo:
-
-@example
-printf @var{formato}, @var{elemento1}, @var{elemento2}, @dots{}
-@end example
-
-@noindent
-Come nel caso di @code{print}, l'intera lista degli argomenti pu@`o
-facoltativamente essere racchiusa fra
-parentesi. Anche qui, le parentesi sono obbligatorie se l'espressione di
-qualche elemento usa l'operatore
-relazionale @samp{>}, che potrebbe
-essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
-
-@cindex specificatori di formato
-La differenza tra @code{printf} e @code{print} @`e l'argomento @var{formato}.
-Questo @`e un'espressione il cui valore @`e visto come una stringa;
-specifica come scrivere in output ognuno degli altri argomenti. @`E chiamata
-@dfn{stringa di formato}.
-
-La stringa di formato @`e molto simile a quella usata dalla funzione di
-libreria ISO C @code{printf()}. Buona parte del @var{formato} @`e testo da
-stampare cos@`{@dotless{i}} come @`e scritto.
-All'interno di questo testo ci sono degli @dfn{specificatori di formato},
-uno per ogni elemento da stampare.
-Ogni specificatore di formato richiede di stampare l'elemento successivo
-nella lista degli argomenti
-in quella posizione del formato.
-
-L'istruzione @code{printf} non aggiunge in automatico un ritorno a capo
-al suo output. Scrive solo quanto specificato dalla stringa di formato.
-Quindi, se serve un ritorno a capo, questo va incluso nella stringa di formato.
-Le variabili di separazione dell'output @code{OFS} e @code{ORS} non hanno
-effetto sulle istruzioni @code{printf}.
-Per esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{ORS = "\nAHI!\n"; OFS = "+"}
-> @kbd{msg = "Non v\47allarmate!"}
-> @kbd{printf "%s\n", msg}
-> @kbd{@}'}
-@print{} Non v'allarmate!
-@end example
-
-@noindent
-Qui, n@'e il @samp{+} n@'e l'esclamazione @samp{AHI!} compaiono nel messaggio
-in output.
-
-@node Lettere di controllo
-@subsection Lettere di controllo del formato
-@cindex istruzione @code{printf}, lettere di controllo del formato
-@cindex @code{printf}, istruzione, lettere di controllo del formato
-@cindex specificatori di formato, istruzione @code{printf}
-
-Uno specificatore di formato inizia col carattere @samp{%} e termina con
-una @dfn{lettera di controllo del formato}; e dice all'istruzione
-@code{printf} come stampare un elemento. La lettera di controllo del
-formato specifica che @emph{tipo}
-di valore stampare. Il resto dello specificatore di formato @`e costituito da
-@dfn{modificatori} facoltativi che controllano @emph{come} stampare il valore,
-per esempio stabilendo la larghezza del campo. Ecco una lista delle
-lettere di controllo del formato:
-
-@c @asis for docbook to come out right
-@table @asis
-@item @code{%c}
-Stampa un numero come un carattere; quindi, @samp{printf "%c",
-65} stampa la lettera @samp{A}. L'output per un valore costituito da una
-stringa @`e il primo carattere della stringa stessa.
-
-@cindex angolo buio, caratteri di controllo del formato
-@cindex @command{gawk}, caratteri di controllo del formato
-@quotation NOTA
-Lo standard POSIX richiede che il primo carattere di una stringa sia stampato.
-In localizzazioni con caratteri multibyte, @command{gawk} tenta di
-convertire i primi byte della stringa in un carattere multibyte valido
-e poi di stampare la codifica multibyte di quel carattere.
-Analogamente, nella stampa di un valore numerico, @command{gawk} ammette che
-il valore appartenga all'intervallo numerico di valori che possono essere
-contenuti in un carattere multibyte.
-Se la conversione alla codifica multibyte non riesce, @command{gawk}
-usa gli ultimi otto bit della cifra (quelli meno significativi) come
-carattere da stampare.
-
-Altre versioni di @command{awk} generalmente si limitano a stampare
-il primo byte di una stringa o i valori numerici che possono essere
-rappresentati in un singolo byte (0--255).
-@end quotation
-
-
-@item @code{%d}, @code{%i}
-Stampa un numero intero in base decimale.
-Le due lettere di controllo sono equivalenti.
-(La specificazione @samp{%i} @`e ammessa per compatibilit@`a con ISO C.)
-
-@item @code{%e}, @code{%E}
-Stampa un numero nella notazione scientifica (con uso di esponente).
-Per esempio:
-
-@example
-printf "%4.3e\n", 1950
-@end example
-
-@noindent
-stampa @samp{1.950e+03}, con un totale di quattro cifre significative, tre
-delle quali
-seguono il punto che separa la parte intera da quella decimale
-[in Italia si usa la virgola al posto del punto]
-(L'espressione @samp{4.3} rappresenta due modificatori,
-introdotti nella prossima @value{SUBSECTION}).
-@samp{%E} usa @samp{E} invece di @samp{e} nell'output.
-
-@item @code{%f}
-Stampa un numero in notazione a virgola mobile.
-Per esempio:
-
-@example
-printf "%4.3f", 1950
-@end example
-
-@noindent
-stampa @samp{1950.000}, con un totale di quattro cifre significative, tre
-delle quali vengono dopo il punto decimale.
-(L'espressione @samp{4.3} rappresenta due modificatori,
-introdotti nella prossima @value{SUBSECTION}).
-
-In sistemi che implementano il formato a virgola mobile, come specificato
-dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come
-@samp{-inf} o @samp{-infinity},
-e l'infinito positivo come
-@samp{inf} o @samp{infinity}.
-Il valore speciale ``not a number'' [non @`e un numero] viene scritto come
-@samp{-nan} o @samp{nan}
-(@pxref{Definizioni matematiche}).
-
-@item @code{%F}
-Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti
-in lettere maiuscole.
-
-Il formato @samp{%F} @`e un'estensione POSIX allo standard ISO C; non tutti
-i sistemi lo prevedono. In tali casi,
-@command{gawk} usa il formato @samp{%f}.
-
-@item @code{%g}, @code{%G}
-Stampa un numero usando o la notazione scientifica o quella a virgola
-mobile, scegliendo la forma pi@`u concisa; se il risultato @`e stampato usando la
-notazione scientifica, @samp{%G} usa @samp{E} invece di @samp{e}.
-
-@item @code{%o}
-Stampa un numero intero in ottale, senza segno
-(@pxref{Numeri non-decimali}).
-
-@item @code{%s}
-Stampa una stringa.
-
-@item @code{%u}
-Stampa un numero intero decimale, senza segno.
-(Questo formato @`e poco usato, perch@'e tutti i numeri in @command{awk}
-sono a virgola mobile; @`e disponibile principalmente per compatibilit@`a col
-linguaggio C.)
-
-@item @code{%x}, @code{%X}
-Stampa un intero esadecimale senza segno;
-@samp{%X} usa le lettere da @samp{A} a @samp{F}
-invece che da @samp{a} a @samp{f}
-(@pxref{Numeri non-decimali}).
-
-@item @code{%%}
-Stampa un solo carattere @samp{%}.
-Questa notazione non serve per stampare alcun
-argomento e ignora eventuali modificatori.
-@end table
-
-@cindex angolo buio, caratteri di controllo del formato
-@cindex @command{gawk}, caratteri di controllo del formato
-@quotation NOTA
-Quando si usano lettere di controllo del formato per numeri interi
-per stampare valori esterni all'intervallo massimo disponibile nel
-linguaggio C per i numeri interi,
-@command{gawk} usa lo
-specificatore di formato @samp{%g}. Se si specifica l'opzione @option{--lint}
-sulla riga di comando (@pxref{Opzioni}), @command{gawk}
-emette un messaggio di avvertimento. Altre versioni di @command{awk} possono
-stampare valori non validi, o comportarsi in modo completamente differente.
-@value{DARKCORNER}
-@end quotation
-
-@node Modificatori di formato
-@subsection Modificatori per specifiche di formato @code{printf}
-
-@cindex istruzione @code{printf}, modificatori
-@cindex @code{printf}, istruzione, modificatori
-@cindex modificatori@comma{} in specificatori di formato
-Una specifica di formato pu@`o anche includere dei @dfn{modificatori} che
-possono controllare che parte stampare del valore dell'elemento, e anche
-quanto spazio utilizzare per stamparlo.
-I modificatori sono posizionati tra il @samp{%} e la lettera che controlla
-il formato.
-Negli esempi seguenti verr@`a usato il simbolo del punto elenco ``@bullet{}'' per
-rappresentare
-spazi nell'output. Questi sono i modificatori previsti, nell'ordine in
-cui possono apparire:
-
-@table @asis
-@cindex differenze tra @command{awk} e @command{gawk}, tra istruzioni @code{print} e @code{printf}
-@cindex istruzione @code{printf}, specificatori posizionali
-@cindex @code{printf}, istruzione, specificatori posizionali
-@c the code{} does NOT start a secondary
-@cindex specificatori posizionali, istruzione @code{printf}
-@item @code{@var{N}$}
-Una costante intera seguita da un @samp{$} @`e uno @dfn{specificatore posizionale}.
-Normalmente, le specifiche di formato sono applicate agli argomenti
-nell'ordine in cui appaiono nella stringa di formato. Con uno specificatore
-posizionale, la specifica di formato @`e applicata a un argomento
-indicato per numero, invece che a quello che
-sarebbe il prossimo argomento nella lista. Gli specificatori posizionali
-iniziano a contare partendo da uno. Quindi:
-
-@example
-printf "%s %s\n", "Non", "v'allarmate"
-printf "%2$s %1$s\n", "v'allarmate", "Non"
-@end example
-
-@noindent
-stampa per due volte il famoso consiglio amichevole.
-
-A prima vista, questa funzionalit@`a non sembra di grande utilit@`a.
-Si tratta in effetti di un'estensione @command{gawk}, pensata per essere
-usata nella traduzione di messaggi emessi in fase di esecuzione.
-@xref{Ordinamento di printf},
-che descrive come e perch@'e usare specificatori posizionali.
-Per ora li possiamo ignorare.
-
-@item - @code{-} (Segno meno)
-Il segno meno, usato prima del modificatore di larghezza (si veda pi@`u avanti
-in questa lista),
-richiede di allineare a sinistra
-l'argomento mantenendo la larghezza specificata. Normalmente, l'argomento
-@`e stampato allineato a destra, con la larghezza specificata. Quindi:
-
-@example
-printf "%-6s", "pippo"
-@end example
-
-@noindent
-stampa @samp{pippo@bullet{}}.
-
-@item @var{spazio}
-Applicabile a conversioni numeriche, richiede di inserire uno spazio prima
-dei valori positivi e un segno meno prima di quelli negativi.
-
-@item @code{+}
-Il segno pi@`u, usato prima del modificatore di larghezza (si veda pi@`u avanti
-in questa lista),
-richiede di mettere sempre un segno nelle conversioni numeriche, anche se
-il dato da formattare ha valore positivo. Il @samp{+} prevale sul
-modificatore @dfn{spazio}.
-
-@item @code{#}
-Richiede di usare una ``forma alternativa'' per alcune lettere di controllo.
-Per @samp{%o}, preporre uno zero.
-Per @samp{%x} e @samp{%X}, preporre @samp{0x} o @samp{0X} se il
-numero @`e diverso da zero.
-Per @samp{%e}, @samp{%E}, @samp{%f}, e @samp{%F}, il risultato deve contenere
-sempre un separatore decimale.
-Per @code{%g} e @code{%G}, gli zeri finali non significativi non sono
-tolti dal numero stampato.
-
-@item @code{0}
-Uno @samp{0} (zero) iniziale serve a richiedere che l'output sia
-riempito con zeri (invece che con spazi), prima delle cifre significative.
-Questo si applica solo ai formati di output di tipo numerico.
-Questo @dfn{flag} ha un effetto solo se la larghezza del campo @`e maggiore
-di quella del valore da stampare.
-
-@item @code{'}
-Un carattere di apice singolo o un apostrofo @`e un'estensione POSIX allo
-standard ISO C.
-Indica che la parte intera di un valore a virgola mobile, o la parte intera
-di un valore decimale intero, ha un carattere di separazione delle migliaia.
-Ci@`o @`e applicabile solo alle localizzazioni che prevedono un tale carattere.
-Per esempio:
-
-@example
-$ @kbd{cat migliaia.awk} @ii{Visualizza il programma sorgente}
-@print{} BEGIN @{ printf "%'d\n", 1234567 @}
-$ @kbd{LC_ALL=C gawk -f migliaia.awk}
-@print{} 1234567 @ii{Risultato nella localizzazione} "C"
-$ @kbd{LC_ALL=en_US.UTF-8 gawk -f migliaia.awk}
-@print{} 1,234,567 @ii{Risultato nella localizzazione UTF inglese americana}
-@end example
-
-@noindent
-Per maggiori informazioni relative a localizzazioni e internazionalizzazioni,
-si veda @ref{Localizzazioni}.
-
-@quotation NOTA
-Il @dfn{flag} @samp{'} @`e una funzionalit@`a interessante, ma utilizza un
-carattere che @`e fonte di complicazioni, perch@'e risulta difficila da usare nei
-programmi scritti direttamente sulla riga di comando. Per informazioni sui
-metodi appropriati per gestire la cosa, si veda @ref{Protezione}.
-@end quotation
-
-@item @var{larghezza}
-Questo @`e un numero che specifica la larghezza minima che deve occupare un
-campo. L'inserimento di un numero tra il segno @samp{%} e il carattere
-di controllo del formato fa s@`{@dotless{i}} che il campo si espanda a quella larghezza.
-Il modo di default per fare questo @`e di aggiungere degli spazi a
-sinistra. Per esempio:
-
-@example
-printf "%6s", "pippo"
-@end example
-
-@noindent
-stampa @samp{@bullet{}pippo}.
-
-il valore di @var{larghezza} indica la larghezza minima, non la massima. Se
-il valore dell'elemento richiede pi@`u caratteri della @var{larghezza}
-specificata, questa pu@`o essere aumentata secondo necessit@`a.
-Quindi, per esempio:
-
-@example
-printf "%6s", "pippo-pluto"
-@end example
-
-@noindent
-stampa @samp{pippo-pluto}.
-
-Anteponendo un segno meno alla @var{larghezza} si richiede che l'output sia
-esteso con spazi a destra, invece che a sinistra.
-
-@item @code{.@var{precisione}}
-Un punto, seguito da una costante intera
-specifica la precisione da usare nella stampa.
-Il tipo di precisione varia a seconda della lettera di controllo:
-
-@table @asis
-@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
-Minimo numero di cifre da stampare.
-
-@item @code{%e}, @code{%E}, @code{%f}, @code{%F}
-Numero di cifre alla destra del separatore decimale.
-
-@item @code{%g}, @code{%G}
-Massimo numero di cifre significative.
-
-@item @code{%s}
-Massimo numero di caratteri della stringa che possono essere stampati.
-@end table
-
-Quindi, l'istruzione:
-
-@example
-printf "%.4s", "foobar"
-@end example
-
-@noindent
-stampa @samp{foob}.
-@end table
-
-Le funzionalit@`a di @var{larghezza} e @var{precisione} dinamiche (cio@`e,
-@code{"%*.*s"}) disponibili nell'istruzione @code{printf} della libreria C sono
-utilizzabili.
-Invece che fornire esplicitamente una @var{larghezza} e/o una @var{precisione}
-nella stringa di formato, queste sono fornite come parte della lista degli
-argomenti. Per esempio:
-
-@example
-w = 5
-p = 3
-s = "abcdefg"
-printf "%*.*s\n", w, p, s
-@end example
-
-@noindent
-equivale esattamente a:
-
-@example
-s = "abcdefg"
-printf "%5.3s\n", s
-@end example
-
-@noindent
-Entrambi i programmi stampano @samp{@w{@bullet{}@bullet{}abc}}.
-Versioni pi@`u datate di @command{awk} non consentivano questa possibilit@`a.
-Dovendo usare una di queste versioni, @`e possibile simulare questa
-funzionalit@`a usando la concatenazione per costruire una stringa di formato,
-come per esempio:
-
-@example
-w = 5
-p = 3
-s = "abcdefg"
-printf "%" w "." p "s\n", s
-@end example
-
-@noindent
-Questo codice non @`e di facile lettura, ma funziona.
-
-@c @cindex controlli @command @{lint}
-@cindex debug, errori fatali, @code{printf}, stringhe di formato
-@cindex POSIX @command{awk}, stringhe di formato @code{printf} e
-Chi programma in C probabilmente @`e abituato a specificare modificatori
-addizionali (@samp{h}, @samp{j}, @samp{l}, @samp{L}, @samp{t} e @samp{z}) nelle
-stringhe di formato di @code{printf}. Questi modificatori non sono validi
-in @command{awk}. La maggior parte della implementazioni di @command{awk} li
-ignora senza emettere messaggi. Se si specifica l'opzione @option{--lint}
-sulla riga di comando (@pxref{Opzioni}), @command{gawk} emette un messaggio
-di avvertimento quando li si usa. Se si specifica l'opzione @option{--posix},
-il loro uso genera un errore fatale.
-
-@node Esempi su printf
-@subsection Esempi d'uso di @code{printf}
-
-Il seguente semplice esempio mostra
-come usare @code{printf} per preparare una tabella allineata:
-
-@example
-awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-@noindent
-Questo comando
-stampa i nomi delle persone (@code{$1}) nel file
-@file{mail-list} come una stringa di 10 caratteri allineati a sinistra.
-Stampa anche i numeri telefonici (@code{$2}) a fianco, sulla stessa riga.
-Il risultato @`e una tabella allineata, contenente due colonne, di nomi e numeri
-telefonici, come si pu@`o vedere qui:
-
-@example
-$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
-@print{} Amelia 555-5553
-@print{} Anthony 555-3412
-@print{} Becky 555-7685
-@print{} Bill 555-1675
-@print{} Broderick 555-0542
-@print{} Camilla 555-2912
-@print{} Fabius 555-1234
-@print{} Julie 555-6699
-@print{} Martin 555-6480
-@print{} Samuel 555-3430
-@print{} Jean-Paul 555-2127
-@end example
-
-In questo caso, i numeri telefonici debbono essere stampati come stringhe,
-poich@'e includono un trattino. Una stampa dei numeri telefonici come numeri
-semplici avrebbe visualizzato solo le prime tre cifre: @samp{555},
-e questo non sarebbe stato di grande utilit@`a.
-
-Non era necessario specificare una larghezza per i numeri telefonici poich@'e
-sono nell'ultima colonnna di ogni riga. Non c'@`e bisogno di avere un
-allineamento di spazi dopo di loro.
-
-La tabella avrebbe potuto essere resa pi@`u leggibile aggiungendo
-intestazioni in cima
-alle colonne. Questo si pu@`o fare usando una regola @code{BEGIN}
-(@pxref{BEGIN/END})
-in modo che le intestazioni siano stampate una sola volta, all'inizio del
-programma @command{awk}:
-
-@example
-awk 'BEGIN @{ print "Nome Numero"
- print "---- ------" @}
- @{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-L'esempio precedente usa sia l'istruzione @code{print} che l'istruzione
-@code{printf} nello stesso programma. Si possono ottenere gli stessi
-risultati usando solo istruzioni @code{printf}:
-
-@example
-awk 'BEGIN @{ printf "%-10s %s\n", "Nome", "Numero"
- printf "%-10s %s\n", "----", "------" @}
- @{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-@noindent
-Stampare ogni intestazione di colonna con la stessa specifica di formato
-usata per gli elementi delle colonne ci d@`a la certezza che le intestazioni
-sono allineate esattamente come le colonne.
-
-Il fatto che usiamo per tre volte la stessa specifica di formato si pu@`o
-evidenziare memorizzandola in una variabile, cos@`{@dotless{i}}:
-
-@example
-awk 'BEGIN @{ format = "%-10s %s\n"
- printf format, "Nome", "Numero"
- printf format, "----", "------" @}
- @{ printf format, $1, $2 @}' mail-list
-@end example
-
-
-@node Ridirezione
-@section Ridirigere l'output di @code{print} e @code{printf}
-
-@cindex output, ridirezione
-@cindex ridirezione dell'output
-@cindex @option{--sandbox}, opzione, ridirezione dell'output con @code{print}, @code{printf}
-Finora, l'output di @code{print} e @code{printf} @`e stato diretto
-verso lo standard output,
-che di solito @`e lo schermo. Sia @code{print} che @code{printf} possono
-anche inviare il loro output in altre direzioni.
-@`E quel che si chiama @dfn{ridirezione}.
-
-@quotation NOTA
-Quando si specifica @option{--sandbox} (@pxref{Opzioni}),
-la ridirezione dell'output verso file, @dfn{pipe} e coprocessi non @`e
-consentita.
-@end quotation
-
-Una ridirezione @`e posta dopo l'istruzione @code{print} o @code{printf}.
-Le ridirezioni in @command{awk} sono scritte come le ridirezioni nei
-comandi della shell, l'unica differenza @`e che si trovano all'interno di
-un programma @command{awk}.
-
-@c the commas here are part of the see also
-@cindex istruzione @code{print}, si veda anche ridirezione dell'output
-@cindex istruzione @code{printf}, si veda anche ridirezione dell'output
-Ci sono quattro forme di ridirezione dell'output:
-output scritto su un file,
-output aggiunto in fondo a un file,
-output che fa da input a un altro comando (usando una @dfn{pipe}) e
-output diretto a un coprocesso.
-Vengono descritti per l'istruzione @code{print},
-ma funzionano allo stesso modo per @code{printf}:
-
-@table @code
-@cindex @code{>} (parentesi acuta destra), operatore @code{>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>} (I/O)
-@cindex operatori, input/output
-@item print @var{elementi} > @var{output-file}
-Questa ridirezione stampa gli elementi nel file di output chiamato
-@var{output-file}. Il @value{FN} @var{output-file} pu@`o essere
-una qualsiasi espressione. Il suo valore @`e trasformato in una stringa e
-quindi usato come
-@iftex
-@value{FN} (@pxrefil{Espressioni}).
-@end iftex
-@ifnottex
-@value{FN} (@pxref{Espressioni}).
-@end ifnottex
-Quando si usa questo tipo di ridirezione, il file @var{output-file} viene
-cancellato prima che su di esso sia stato scritto il primo record in uscita.
-Le successive scritture verso lo stesso file @var{output-file} non cancellano
-@var{output-file}, ma continuano ad aggiungervi record.
-(Questo comportamento @`e differente da quello delle ridirezioni usate negli
-script della shell.)
-Se @var{output-file} non esiste, viene creato. Per esempio, ecco
-come un programma @command{awk} pu@`o scrivere una lista di nomi di persone
-su un file di nome @file{lista-nomi}, e una lista di numeri telefonici
-su un altro file di nome @file{lista-telefoni}:
-
-@example
-$ @kbd{awk '@{ print $2 > "lista-telefoni"}
-> @kbd{print $1 > "lista-nomi" @}' mail-list}
-$ @kbd{cat lista-telefoni}
-@print{} 555-5553
-@print{} 555-3412
-@dots{}
-$ @kbd{cat lista-nomi}
-@print{} Amelia
-@print{} Anthony
-@dots{}
-@end example
-
-@noindent
-Ogni file in output contiene un nome o un numero su ogni riga.
-
-@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
-@item print @var{elementi} >> @var{output-file}
-Questa ridirezione stampa gli elementi in un file di output preesistente,
-di nome @var{output-file}. La differenza tra questa ridirezione e quella
-con un solo @samp{>} @`e che il precedente contenuto (se esiste) di
-@var{output-file} non viene cancellato. Invece, l'output di @command{awk} @`e
-aggiunto in fondo al file.
-Se @var{output-file} non esiste, viene creato.
-
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex @dfn{pipe}, output
-@cindex output, a @dfn{pipe}
-@item print @var{elementi} | @var{comando}
-@`E possibile inviare output a un altro programma usando una @dfn{pipe}
-invece di inviarlo a un file. Questa ridirezione apre una @dfn{pipe} verso
-@var{comando}, e invia i valori di @var{elementi}, tramite questa
-@dfn{pipe}, a un altro processo creato per eseguire @var{comando}.
-
-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,
-il seguente programma produce due file, una lista non ordinata di nomi di
-persone e una lista ordinata in ordine alfabetico inverso:
-
-@ignore
-10/2000:
-This isn't the best style, since COMMAND is assigned for each
-record. It's done to avoid overfull hboxes in TeX. Leave it
-alone for now and let's hope no-one notices.
-@end ignore
-
-@example
-awk '@{ print $1 > "nomi.non.ordinati"
- comando = "sort -r > nomi.ordinati"
- print $1 | comando @}' mail-list
-@end example
-
-La lista non ordinata @`e scritta usando una ridirezione normale, mentre
-la lista ordinata @`e scritta inviando una @dfn{pipe} in input al programma
-di utilit@`a @command{sort}.
-
-Il prossimo esempio usa la ridirezione per inviare un messaggio alla
-mailing list @code{bug-sistema}. Questo pu@`o tornare utile se si hanno
-problemi con uno script @command{awk} eseguito periodicamente per la
-manutenzione del sistema:
-
-@example
-report = "mail bug-sistema"
-print("Script awk in errore:", $0) | report
-print("al record numero", FNR, "di", NOME_FILE) | report
-close(report)
-@end example
-
-La funzione @code{close()} @`e stata chiamata perch@'e @`e una buona idea chiudere
-la @dfn{pipe} non appena tutto l'output da inviare alla @dfn{pipe} @`e stato
-inviato. @xref{Chiusura file e @dfn{pipe}}
-per maggiori informazioni.
-
-Questo esempio illustra anche l'uso di una variabile per rappresentare
-un @var{file} o un @var{comando}; non @`e necessario usare sempre
-una costante stringa. Usare una variabile @`e di solito una buona idea,
-perch@'e (se si vuole riusare lo stesso file o comando)
-@command{awk} richiede che il valore della stringa sia sempre scritto
-esattamente nello stesso modo.
-
-@cindex coprocessi
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
-@item print @var{elementi} |& @var{comando}
-Questa ridirezione stampa gli elementi nell'input di @var{comando}.
-La differenza tra questa ridirezione e quella
-con la sola @samp{|} @`e che l'output da @var{comando}
-pu@`o essere letto tramite @code{getline}.
-Quindi, @var{comando} @`e un @dfn{coprocesso}, che lavora in parallelo al
-programma @command{awk}, ma @`e al suo servizio.
-
-Questa funzionalit@`a @`e un'estensione @command{gawk}, e non @`e disponibile in
-POSIX @command{awk}.
-@ifnotdocbook
-@xref{Getline coprocesso},
-per una breve spiegazione.
-@ref{I/O bidirezionale}
-per un'esposizione pi@`u esauriente.
-@end ifnotdocbook
-@ifdocbook
-@xref{Getline coprocesso}
-per una breve spiegazione.
-@xref{I/O bidirezionale}
-per un'esposizione pi@`u esauriente.
-@end ifdocbook
-@end table
-
-Ridirigere l'output usando @samp{>}, @samp{>>}, @samp{|} o @samp{|&}
-richiede al sistema di aprire un file, una @dfn{pipe} o un coprocesso solo se
-il particolare @var{file} o @var{comando} che si @`e specificato non @`e gi@`a
-stato utilizzato in scrittura dal programma o se @`e stato chiuso
-dopo l'ultima scrittura.
-
-@cindex debug, stampare
-@`E un errore comune usare la ridirezione @samp{>} per la prima istruzione
-@code{print} verso un file, e in seguito usare @samp{>>} per le successive
-scritture in output:
-
-@example
-# inizializza il file
-print "Non v'allarmate" > "guida.txt"
-@dots{}
-# aggiungi in fondo al file
-print "Evitate generatori di improbabilit@`a" >> "guide.txt"
-@end example
-
-@noindent
-Questo @`e il modo in cui le ridirezioni devono essere usate lavorando
-con la shell. Ma in @command{awk} ci@`o non @`e necessario. In casi di questo
-genere, un programma dovrebbe
-usare @samp{>} per tutte le istruzioni @code{print}, perch@'e il file di
-output @`e aperto una sola volta.
-(Usando sia @samp{>} che @samp{>>} nello stesso programma, l'output @`e prodotto
-nell'ordine atteso.
-Tuttavia il mischiare gli operatori per lo stesso file @`e sintomo di uno
-stile di programmazione inelegante, e pu@`o causare confusione in chi legge
-il programma.)
-
-@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
-@cindex problemi di implementazione, @command{gawk}, limitazioni
-@cindex @command{awk}, problemi di implementazione, @dfn{pipe}
-@cindex @command{gawk}, problemi di implementazione, @dfn{pipe}
-@ifnotinfo
-Come visto in precedenza
-(@pxref{Note su getline}),
-molte
-@end ifnotinfo
-@ifnottex
-@ifnotdocbook
-@ifnothtml
-Molte
-@end ifnothtml
-@end ifnotdocbook
-@end ifnottex
-tra le pi@`u vecchie implementazioni di
-@command{awk} limitano il numero di @dfn{pipeline} che un programma
-@command{awk} pu@`o mantenere aperte a una soltanto! In @command{gawk}, non c'@`e
-un tale limite. @command{gawk} consente a un programma di
-aprire tante @dfn{pipeline} quante ne consente il sistema operativo su cui
-viene eseguito.
-
-@cindex sidebar, Inviare @dfn{pipe} alla @command{sh}
-@ifdocbook
-@docbook
-<sidebar><title>Inviare @dfn{pipe} alla @command{sh}</title>
-@end docbook
-
-@cindex shell, inviare comandi tramite @dfn{pipe} alla
-
-Una maniera particolarmente efficace di usare la ridirezione @`e quella di
-preparare righe di comando da passare
-come @dfn{pipe} alla shell,
-@command{sh}. Per esempio, si supponga di avere una lista di file provenienti
-da un sistema in cui tutti i
-@value{FNS} sono memorizzari in maiuscolo, e di volerli rinominare
-in modo da avere nomi tutti in
-minuscolo. Il seguente programma @`e
-sia semplice che efficiente:
-
-@c @cindex @command{mv} utility
-@example
-@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
-
-END @{ close("sh") @}
-@end example
-
-La funzione @code{tolower()} restituisce la stringa che gli viene passata
-come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
-(@pxref{Funzioni per stringhe}).
-Il programma costruisce una lista di righe di comando,
-usando il programma di utilit@`a @command{mv} per rinominare i file.
-Poi invia la lista alla shell per l'elaborazione.
-
-@xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
-righe di comando da passare alla shell.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Inviare @dfn{pipe} alla @command{sh}}
-
-
-@cindex shell, inviare comandi tramite @dfn{pipe} alla
-
-Una maniera particolarmente efficace di usare la ridirezione @`e quella di
-preparare righe di comando da passare
-come @dfn{pipe} alla shell,
-@command{sh}. Per esempio, si supponga di avere una lista di file provenienti
-da un sistema in cui tutti i
-@value{FNS} sono memorizzari in maiuscolo, e di volerli rinominare
-in modo da avere nomi tutti in
-minuscolo. Il seguente programma @`e
-sia semplice che efficiente:
-
-@c @cindex @command{mv} utility
-@example
-@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
-
-END @{ close("sh") @}
-@end example
-
-La funzione @code{tolower()} restituisce la stringa che gli viene passata
-come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
-(@pxref{Funzioni per stringhe}).
-Il programma costruisce una lista di righe di comando,
-usando il programma di utilit@`a @command{mv} per rinominare i file.
-Poi invia la lista alla shell per l'elaborazione.
-
-@xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
-righe di comando da passare alla shell.
-@end cartouche
-@end ifnotdocbook
-
-@node FD speciali
-@section File speciali per flussi standard di dati pre-aperti
-@cindex standard input
-@cindex input, standard
-@cindex standard output
-@cindex output, standard
-@cindex errore, output
-@cindex standard error
-@cindex descrittori di file
-@cindex file, descrittori, si veda descrittori di file
-
-I programmi in esecuzione hanno convenzionalmente tre flussi di input e
-output a disposizione, gi@`a aperti per la lettura e la scrittura.
-Questi sono noti come
-lo @dfn{standard input}, lo @dfn{standard output} e lo @dfn{standard
-error output}. A questi flussi aperti (e a tutti gli altri file aperti o
-@dfn{pipe}) si fa spesso riferimento usando il termine tecnico
-@dfn{descrittori di file} [FD].
-
-Questi flussi sono, per default, associati alla tastiera e allo schermo,
-ma spesso sono ridiretti, nella shell, utilizzando gli operatori
-@samp{<}, @samp{<<}, @samp{>}, @samp{>>}, @samp{>&} e @samp{|}.
-Lo standard error @`e tipicamente usato per scrivere messaggi di errore;
-la ragione per cui ci sono due flussi distinti,
-standard output e standard error, @`e per poterli ridirigere indipendentemente
-l'uno dall'altro.
-
-@cindex differenze tra @command{awk} e @command{gawk}, messaggi di errore
-@cindex gestione errori
-@cindex errori, gestione degli
-Nelle tradizionali implementazioni di @command{awk}, il solo modo per
-scrivere un messaggio di errore allo
-standard error in un programma @command{awk} @`e il seguente:
-
-@example
-print "Ho trovato un errore grave!" | "cat 1>&2"
-@end example
-
-@noindent
-Con quest'istruzione si apre una @dfn{pipeline} verso un comando della shell
-che @`e in grado di accedere al flusso di standard error che eredita dal
-processo @command{awk}.
-@c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
-Questo @`e molto poco elegante, e richiede anche di innescare un processo
-separato. Per questo chi scrive programmi @command{awk} spesso
-non usa questo metodo. Invece, invia i messaggi di errore allo
-schermo, in questo modo:
-
-@example
-print "Ho trovato un errore grave!" > "/dev/tty"
-@end example
-
-@noindent
-(@file{/dev/tty} @`e un file speciale fornito dal sistema operativo
-ed @`e connesso alla tastiera e allo schermo. Rappresenta il
-``terminale'',@footnote{``tty'' in @file{/dev/tty} @`e un'abbreviazione di
-``TeleTYpe'' [telescrivente], un terminale seriale.} che nei sistemi odierni
-@`e una tastiera e uno schermo, e non una @dfn{console} seriale).
-Questo ha generalmente lo stesso effetto, ma non @`e sempre detto: sebbene il
-flusso di standard error sia solitamente diretto allo schermo, potrebbe
-essere stato
-ridiretto; se questo @`e il caso, scrivere verso lo schermo non serve. In
-effetti, se @command{awk} @`e chiamato da un lavoro che non @`e eseguito
-interattivamente,
-pu@`o non avere a disposizione alcun terminale su cui scrivere.
-In quel caso, l'apertura di @file{/dev/tty} genera un errore.
-
-@command{gawk}, BWK @command{awk}, e @command{mawk} mettono a disposizione
-speciali @value{FNS} per accedere ai tre flussi standard.
-Se il @value{FN} coincide con uno di questi nomi speciali, quando
-@command{gawk} (o uno degli altri) ridirige l'input o l'output, usa
-direttamente il descrittore di file identificato dal @value{FN}. Questi
-@value{FNS} sono gestiti cos@`{@dotless{i}} in tutti i sistemi operativi nei quali
-@command{gawk} @`e disponibile, e non solo in quelli che aderiscono allo
-standard POSIX:
-
-@cindex estensioni comuni, file speciale @code{/dev/stdin}
-@cindex estensioni comuni, file speciale @code{/dev/stdout}
-@cindex estensioni comuni, file speciale @code{/dev/stderr}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdin}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdout}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stderr}
-@cindex nomi di file, flussi standard in @command{gawk}
-@cindex @code{/dev/@dots{}}, file speciali
-@cindex file, file speciali @code{/dev/@dots{}}
-@cindex @code{/dev/fd/@var{N}}, file speciali (in @command{gawk})
-@table @file
-@item /dev/stdin
-Lo standard input (descrittore di file 0).
-
-@item /dev/stdout
-Lo standard output (descrittore di file 1).
-
-@item /dev/stderr
-Lo standard error output (descrittore di file 2).
-@end table
-
-Usando questa funzionalit@`a
-la maniera corretta di scrivere un messaggio di errore diviene quindi:
-
-@example
-print "Ho trovato un errore grave!" > "/dev/stderr"
-@end example
-
-@cindex debug, doppio apice con nomi di file
-Si noti l'uso di doppi apici per racchiudere il @value{FN}.
-Come per ogni altra ridirezione, il valore dev'essere una stringa.
-@`E un errore comune omettere i doppi apici, il che conduce a
-risultati inattesi.
-
-@command{gawk} non tratta questi @value{FNS} come speciali quando opera
-in modalit@`a di compatibilit@`a POSIX. Comunque, poich@'e BWK @command{awk}
-li prevede, @command{gawk} li ammette anche quando viene
-invocato con l'opzione @option{--traditional} (@pxref{Opzioni}).
-
-@node File speciali
-@section @value{FFNS} speciali in @command{gawk}
-@cindex @command{gawk}, nomi di file in
-
-Oltre all'accesso a standard input, standard output e standard error,
-@command{gawk} consente di accedere a ogni descrittore di file aperto.
-In pi@`u, ci sono dei @value{FNS} speciali riservati per accedere a
-reti TCP/IP.
-
-@menu
-* Altri file ereditati:: Accedere ad altri file aperti con
- @command{gawk}.
-* Reti speciali:: File speciali per comunicazioni con la rete.
-* Avvertimenti speciali:: Cose a cui prestare attenzione.
-@end menu
-
-@node Altri file ereditati
-@subsection Accedere ad altri file aperti con @command{gawk}
-
-Oltre ai valori speciali di @value{FNS}
-@code{/dev/stdin}, @code{/dev/stdout} e @code{/dev/stderr}
-gi@`a menzionati, @command{gawk} prevede una sintassi
-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}
-(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.
-@end table
-
-I @value{FNS} @file{/dev/stdin}, @file{/dev/stdout} e @file{/dev/stderr}
-sono essenzialmente alias per @file{/dev/fd/0}, @file{/dev/fd/1} e
-@file{/dev/fd/2}, rispettivamente. Comunque, i primi nomi sono pi@`u
-autoesplicativi.
-
-Si noti che l'uso di @code{close()} su un @value{FN} della forma
-@code{"/dev/fd/@var{N}"}, per numeri di descrittore di file
-oltre il due, effettivamente chiude il descrittore di file specificato.
-
-@node Reti speciali
-@subsection File speciali per comunicazioni con la rete
-@cindex reti, funzionalit@`a per
-@cindex TCP/IP, funzionalit@`a per
-
-I programmi @command{gawk}
-possono aprire una connessione bidirezionale
-TCP/IP, fungendo o da @dfn{client} o da @dfn{server}.
-Questo avviene usando uno speciale @value{FN} della forma:
-
-@example
-@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}
-@end example
-
-il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
-Il @var{protocollo} pu@`o essere @samp{tcp} o @samp{udp},
-e gli altri campi rappresentano gli altri dati essenziali
-necessari per realizzare una connessione di rete.
-Questi @value{FNS} sono usati con l'operatore @samp{|&} per comunicare
-con un coprocesso
-(@pxref{I/O bidirezionale}).
-Questa @`e una funzionalit@`a avanzata, qui riferita solo per completezza.
-Una spiegazione esauriente sar@`a fornita nella
-@ref{Reti TCP/IP}.
-
-@node Avvertimenti speciali
-@subsection Avvertimenti speciali sui @value{FNS}
-
-Sono qui elencate alcune cose da tener presente usando i
-@value{FNS} speciali forniti da @command{gawk}:
-
-@itemize @value{BULLET}
-@cindex modalit@`a compatibile di (@command{gawk}), nomi di file
-@cindex nomi di file, nella modalit@`a compatibile di @command{gawk}
-@item
-Il riconoscimento dei @value{FNS} per i tre file standard pre-aperti
-@`e disabilitato solo in modalit@`a POSIX.
-
-@item
-Il riconoscimento degli altri @value{FNS} speciali @`e disabilitato se
-@command{gawk} @`e in modalit@`a compatibile
-(o @option{--traditional} o @option{--posix};
-@pxref{Opzioni}).
-
-@item
-@command{gawk} interpreta @emph{sempre}
-questi @value{FNS} speciali.
-Per esempio, se si usa @samp{/dev/fd/4}
-per l'output, si scrive realmente sul descrittore di file 4, e non su un nuovo
-descrittore di file generato duplicando (con @code{dup()}) il descrittore
-file 4. Solitamente questo non ha importanza; comunque, @`e importante
-@emph{non} chiudere alcun file correlato ai descrittori di file 0, 1 e 2.
-Se lo si fa, il comportamente risultante @`e imprevedibile.
-@end itemize
-
-@node Chiusura file e @dfn{pipe}
-@section Chiudere ridirezioni in input e in output
-@cindex output, file in, si veda file in output
-@cindex input, file in, chiusura
-@cindex output, file in, chiusura
-@cindex @dfn{pipe}, chiusura
-@cindex coprocessi, chiusura
-@cindex @code{getline}, comando, coprocessi@comma{} usare dal
-
-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}),
-il file viene aperto (o il comando viene eseguito) solo la prima volta.
-A quel punto, il primo record in input @`e letto da quel file o comando.
-La prossima volta che lo stesso file o comando @`e usato con @code{getline},
-un altro record @`e letto da esso, e cos@`{@dotless{i}} via.
-
-Analogamente, quando un file o una @dfn{pipe} sono aperti in output,
-@command{awk} ricorda
-il @value{FN} o comando a essi associato, e le successive
-scritture verso lo stesso file o comando sono accodate alle precedenti
-scritture.
-Il file o la @dfn{pipe} rimangono aperti fino al termine dell'esecuzione
-di @command{awk}.
-
-@cindexawkfunc{close}
-Questo implica che sono necessari dei passi speciali per rileggere nuovamente
-lo stesso file dall'inizio, o per eseguire di nuovo un comando di shell
-(invece che leggere ulteriore output dal precedente comando). La funzione
-@code{close()} rende possibile fare queste cose:
-
-@example
-close(@var{NOME_FILE})
-@end example
-
-@noindent
-o:
-
-@example
-close(@var{comando})
-@end example
-
-l'argomento @var{NOME_FILE} o @var{comando} pu@`o essere qualsiasi espressione,
-il cui valore dev'essere @emph{esattamente} uguale alla stringa
-usata per aprire il file o eseguire il comando (spazi e altri caratteri
-``irrilevanti'' inclusi). Per esempio, se si apre una @dfn{pipe} cos@`{@dotless{i}}:
-
-@example
-"sort -r nomi" | getline pippo
-@end example
-
-@noindent
-essa va chiusa in questo modo:
-
-@example
-close("sort -r nomi")
-@end example
-
-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.
-Il precedente esempio cambia come segue:
-
-@example
-sortcom = "sort -r nomi"
-sortcom | getline pippo
-@dots{}
-close(sortcom)
-@end example
-
-@noindent
-Questo aiuta a evitare nei programmi @command{awk} errori di battitura
-difficili da scoprire. Queste sono alcune delle ragioni per cui @`e bene
-chiudere un file di output:
-
-@itemize @value{BULLET}
-@item
-Scrivere un file e rileggerlo in seguito all'interno dello stesso programma
-@command{awk}. Occorre chiudere il file dopo aver finito di scriverlo, e poi
-iniziare a rileggerlo con @code{getline}.
-
-@item
-Per scrivere numerosi file, uno dopo l'altro, nello stesso programma
-@command{awk}. Se i file non vengono chiusi, prima o poi @command{awk} pu@`o
-superare il limite di sistema per il numero di file aperti in un processo.
-@`E meglio chiudere ogni file quando il programma ha finito di scriverlo.
-
-@item
-Per terminare un comando. Quando l'output @`e ridiretto usando una @dfn{pipe},
-il comando che legge la @dfn{pipe} normalmente continua a tentare di leggere
-input finch@'e la @dfn{pipe} rimane aperta. Spesso questo vuol dire che
-il comando non pu@`o eseguire il compito a lui assegnato finch@'e la @dfn{pipe}
-non viene chiusa. Per esempio, se l'output @`e ridiretto al programma
-@command{mail}, il messaggio non @`e effettivamente inviato finch@'e la @dfn{pipe}
-non viene chiusa.
-
-@item
-Eseguire lo stesso programma una seconda volta, con gli stessi argomenti.
-Questo non equivale a fornire ulteriore input alla prima esecuzione!
-
-Per esempio, si supponga che una programma invii tramite una @dfn{pipe}
-dell'output al programma @command{mail}.
-Se invia parecchie linee ridirigendole a questa @dfn{pipe} senza chiuderla,
-queste costituiscono un solo messaggio di parecchie righe. Invece, se il
-programma chiude la @dfn{pipe} dopo ogni riga dell'output, allora ogni riga
-costituisce un messaggio separato.
-@end itemize
-
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex portabilit@`a, funzione @code{close()}
-@cindex funzione @code{close()}, portabilit@`a
-@cindex @code{close()}, funzione, portabilit@`a
-Se si usano file in numero superiore a quelli che il sistema permette
-di mantenere aperti,
-@command{gawk} tenta di riutilizzare i file aperti disponibili fra
-i @value{DF}. La possibilit@`a che @command{gawk} lo faccia dipende dalle
-funzionalit@`a del sistema operativo, e quindi non @`e detto che questo riesca
-sempre. @`E quindi sia una buona pratica
-che un buon suggerimento per la portabilit@`a quello di usare sempre
-@code{close()} sui file, una volta che si @`e finito di operare su di essi.
-In effetti, se si usano molte @dfn{pipe}, @`e fondamentale che i comandi
-vengano chiusi, una volta finita la loro elaborazione. Per esempio, si
-consideri qualcosa del tipo:
-
-@example
-@{
- @dots{}
- comando = ("grep " $1 " /qualche/file | un_mio_programma -q " $3)
- while ((comando | getline) > 0) @{
- @var{elabora output di} comando
- @}
- # qui serve close(comando)
-@}
-@end example
-
-Questo esempio crea una nuova @dfn{pipeline} a seconda dei dati contenuti in
-@emph{ogni} record.
-Senza la chiamata a @code{close()} indicata come commento, @command{awk}
-genera processi-figlio per eseguire i comandi, fino a che non finisce per
-esaurire i descrittori di file
-necessari per creare ulteriori @dfn{pipeline}.
-
-Sebbene ogni comando sia stato completato (come si deduce dal codice di
-fine-file restituito dalla @code{getline}), il processo-figlio non @`e
-terminato;@footnote{La terminologia tecnica @`e piuttosto macabra.
-Il processo-figlio terminato @`e chiamato ``zombie,'' e la pulizia alla fine
-dello stesso @`e chiamata ``reaping'' [mietitura].}
-@c Good old UNIX: give the marketing guys fits, that's the ticket
-inoltre, e questo @`e ci@`o che pi@`u ci interessa, il descrittore di file
-per la @dfn{pipe} non @`e chiuso e liberato finch@'e non si chiama
-@code{close()} o finch@'e il programma @command{awk} non termina.
-
-@code{close()} non fa nulla (e non emette messaggi) se le viene fornito come
-argomento una stringa che non rappresenta un file, una @dfn{pipe} o un
-coprocesso che sia stato aperto mediante una ridirezione. In quel caso,
-@code{close()} restituisce un valore di ritorno negativo, che indica un
-errore. Inoltre, @command{gawk} imposta @code{ERRNO}
-a una stringa che indica il tipo di errore.
-
-Si noti anche che @samp{close(NOME_FILE)} non ha effetti ``magici'' sul ciclo
-implicito che legge ogni record dei file indicati nella riga di comando.
-Si tratta, con ogni probabilit@`a, della chiusura di un file che non era mai
-stato aperto con una ridirezione,
-e per questo @command{awk} silenziosamente non fa nulla, tranne impostare un
-codice di ritorno negativo.
-
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O), @dfn{pipe}@comma{} chiusura
-Quando si usa l'operatore @samp{|&} per comunicare con un coprocesso,
-@`e talora utile essere in grado di chiudere un lato della @dfn{pipe}
-bidirezionale, senza chiudere l'altro lato.
-Questo @`e possibile fornendo un secondo argomento a @code{close()}.
-Come in ogni altra invocazione di @code{close()},
-il primo argomento @`e il nome del comando o file speciale usato
-per iniziare il coprocesso.
-Il secondo argomento dovrebbe essere una stringa, con uno dei due valori
-@code{"to"} [a] oppure @code{"from"} [da]. Maiuscolo/minuscolo non fa
-differenza. Poich@'e questa @`e una funzionalit@`a avanzata, la trattazione @`e
-rinviata alla
-@ref{I/O bidirezionale},
-che ne parla pi@`u dettagliatamente e fornisce un esempio.
-
-@cindex sidebar, Usare il valore di ritorno di @code{close()}
-@ifdocbook
-@docbook
-<sidebar><title>Usare il valore di ritorno di @code{close()}</title>
-@end docbook
-
-@cindex angolo buio, funzione @code{close()}
-@cindex funzione @code{close()}, valore di ritorno
-@cindex @code{close()}, funzione, valore di ritorno
-@cindex valore di ritorno@comma{} funzione @code{close()}
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex Unix @command{awk}, funzione @code{close()} e
-
-In molte versioni di Unix @command{awk}, la funzione @code{close()}
-@`e in realt@`a un'istruzione.
-@value{DARKCORNER}
-@`E un errore di sintassi tentare di usare il valore
-di ritorno da @code{close()}:
-
-@example
-comando = "@dots{}"
-comando | getline info
-retval = close(comando) # errore di sintassi in parecchi Unix awk
-@end example
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex variabile @code{ERRNO}, con funzione @command{close()}
-@cindex @code{ERRNO}, variabile, con funzione @command{close()}
-@command{gawk} gestisce @code{close()} come una funzione.
-Il valore di ritorno @`e @minus{}1 se l'argomento designa un file
-che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
-sistema nella chiusura del file o del processo.
-In tal caso, @command{gawk} imposta la variabile predefinita
-@code{ERRNO} a una stringa che descrive il problema.
-
-In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
-quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
-il valore di ritorno @`e quello restituito dal comando,
-come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
-della @value{PVERSION} 4.2, il valore di ritorno dopo la chiusura di
-una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
-contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
-Altrimenti, @`e il valore di ritorno dalla chiamata alle funzione
-di sistema @code{close()} o alla funzione C @code{fclose()}
-se si sta chiudendo un file in input o in output, rispettivamente.
-Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
-
-@float Tabella,table-close-pipe-return-values
-@caption{Valori di ritorno dalla @code{close()} di una @dfn{pipe}}
-@multitable @columnfractions .50 .50
-@headitem Situazione @tab Valore restituito da @code{close()}
-@item Uscita normale dal comando @tab Il codice di ritorno del comando
-@item Uscita dal comando per @dfn{signal} @tab 256 + numero del segnale assassino
-@item Uscita dal comando per @dfn{signal} con @dfn{dump} @tab 512 + numero del segnale assassino
-@item Errore di qualsiasi tipo @tab @minus{}1
-@end multitable
-@end float
-
-Lo standard POSIX @`e molto generico; dice che @code{close()}
-restituisce zero se @`e terminata correttamente, e un valore diverso da zero
-nell'altro caso. In generale,
-implementazioni differenti variano in quel che restituiscono chiudendo una
-@dfn{pipe}; quindi, il valore di ritorno non pu@`o essere usato in modo
-portabile.
-@value{DARKCORNER}
-In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
-quando chiude una @dfn{pipe}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Usare il valore di ritorno di @code{close()}}
-
-
-@cindex angolo buio, funzione @code{close()}
-@cindex funzione @code{close()}, valore di ritorno
-@cindex @code{close()}, funzione, valore di ritorno
-@cindex valore di ritorno@comma{} funzione @code{close()}
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex Unix @command{awk}, funzione @code{close()} e
-
-In molte versioni di Unix @command{awk}, la funzione @code{close()}
-@`e in realt@`a un'istruzione.
-@value{DARKCORNER}
-@`E un errore di sintassi tentare di usare il valore
-di ritorno da @code{close()}:
-
-@example
-comando = "@dots{}"
-comando | getline info
-retval = close(comando) # errore di sintassi in parecchi Unix awk
-@end example
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex variabile @code{ERRNO}, con funzione @command{close()}
-@cindex @code{ERRNO}, variabile, con funzione @command{close()}
-@command{gawk} gestisce @code{close()} come una funzione.
-Il valore di ritorno @`e @minus{}1 se l'argomento designa un file
-che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
-sistema nella chiusura del file o del processo.
-In tal caso, @command{gawk} imposta la variabile predefinita
-@code{ERRNO} a una stringa che descrive il problema.
-
-In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
-quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
-il valore di ritorno @`e quello restituito dal comando,
-come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
-della @value{PVERSION} 4.2, il valore di ritorno dopo la chiusura di
-una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
-contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
-Altrimenti, @`e il valore di ritorno dalla chiamata alle funzione
-di sistema @code{close()} o alla funzione C @code{fclose()}
-se si sta chiudendo un file in input o in output, rispettivamente.
-Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
-
-@float Tabella,table-close-pipe-return-values
-@caption{Valori di ritorno dalla @code{close()} di una @dfn{pipe}}
-@multitable @columnfractions .50 .50
-@headitem Situazione @tab Valore restituito da @code{close()}
-@item Uscita normale dal comando @tab Il codice di ritorno del comando
-@item Uscita dal comando per @dfn{signal} @tab 256 + numero del segnale assassino
-@item Uscita dal comando per @dfn{signal} con @dfn{dump} @tab 512 + numero del segnale assassino
-@item Errore di qualsiasi tipo @tab @minus{}1
-@end multitable
-@end float
-
-Lo standard POSIX @`e molto generico; dice che @code{close()}
-restituisce zero se @`e terminata correttamente, e un valore diverso da zero
-nell'altro caso. In generale,
-implementazioni differenti variano in quel che restituiscono chiudendo una
-@dfn{pipe}; quindi, il valore di ritorno non pu@`o essere usato in modo
-portabile.
-@value{DARKCORNER}
-In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
-quando chiude una @dfn{pipe}.
-@end cartouche
-@end ifnotdocbook
-
-@node Continuazione dopo errori
-@section Abilitare continuazione dopo errori in output
-
-Questa @value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-In @command{awk} standard, l'output con @code{print} o @code{printf}
-a un file che non esiste, o qualche altro errore di I/O (come p.es.
-esaurire lo spazio disponibile su disco) @`e un errore fatale (termina
-l'esecuzione del programma).
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "ciao" > "/file/non/esistente" @}'}
-@error{} gawk: riga com.:1: fatale: non riesco a ri-dirigere a
-@error{} `/file/non/esistente' (/file o directory non esistente)
-@end example
-
-@command{gawk} rende possibile accorgersi che c'@`e stato un errore,
-permettendo di tentare di rimediare, o almeno di stampare un messaggio
-di errore prima di terminare il programma.
-@`E possibile fare questo in due modi differenti:
-
-@itemize @bullet
-@item
-Per tutti i file in output, assegnando un valore qualsiasi a
-@code{PROCINFO["NONFATAL"]}.
-
-@item
-Specificamente per un solo file, assegnando un valore qualsiasi a
-@code{PROCINFO[@var{nome_file}, "NONFATAL"]}.
-@var{nome_file} @`e il nome del file per il quale
-si desidera che l'errore di output non faccia terminare il programma.
-@end itemize
-
-Una volta abilitata la continuazione dopo un errore di output, si dovr@`a
-controllare la variabile @code{ERRNO} dopo ogni istruzione
-@code{print} o @code{printf} diretta a quel file, per controllare che
-tutto sia andato a buon fine. @`E anche una buona idea inizializzare
-@code{ERRNO} a zero prima di tentare l'operazione di scrittura.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ PROCINFO["NONFATAL"] = 1}
-> @kbd{ ERRNO = 0}
-> @kbd{ print "ciao" > "/file/non/esistente"}
-> @kbd{ if (ERRNO) @{}
-> @kbd{ print("Output non riuscito:", ERRNO) > "/dev/stderr"}
-> @kbd{ exit 1}
-> @kbd{ @}}
-> @kbd{@}'}
-@error{} Output non riuscito: No such file or directory
-@end example
-
-@command{gawk} non genera un errore fatale; permette invece
-al programma @command{awk} di rendersi conto del problema e di gestirlo.
-
-Questo meccanismo si applica anche allo standard output e allo standard error.
-Per lo standard output, si pu@`o usare @code{PROCINFO["-", "NONFATAL"]}
-o @code{PROCINFO["/dev/stdout", "NONFATAL"]}.
-Per lo standard error, occorre
-usare @code{PROCINFO["/dev/stderr", "NONFATAL"]}.
-
-Se si tenta di aprire un @dfn{socket} TCP/IP (@pxref{Reti TCP/IP}),
-@command{gawk} tenta di farlo per un certo numero di volte.
-La variabile d'ambiente @env{GAWK_SOCK_RETRIES}
-(@pxref{Altre variabili d'ambiente}) consente di alterare il numero di
-tentativi che @command{gawk} farebbe per default. Tuttavia,
-una volta abilitata la continuazione dopo un errore di I/O per un certo
-@dfn{socket}, @command{gawk} si limita a un solo tentativo,
-lasciando al codice del programma @command{awk} il compito di gestire
-l'eventuale problema.
-
-@node Sommario di Output
-@section Sommario.
-
-@itemize @value{BULLET}
-@item
-L'istruzione @code{print} stampa una lista di espressioni separate da virgole.
-Le espressioni sono separate tra loro dal valore di @code{OFS} e completate
-dal valore di @code{ORS}. @code{OFMT} fornisce il formato di conversione
-dei valori numerici per l'istruzione @code{print}.
-
-@item
-L'istruzione @code{printf} fornisce un controllo pi@`u preciso sull'output,
-con lettere di controllo del formato per diversi tipi di dati e vari
-modificatori
-che cambiano il comportamento delle lettere di controllo del formato.
-
-@item
-L'output sia di @code{print} che di @code{printf} pu@`o essere ridiretto a
-file, @dfn{pipe}, e coprocessi.
-
-@item
-@command{gawk} fornisce @value{FNS} speciali per accedere allo
-standard input, standard output e standard error, e per comunicazioni di rete.
-
-@item
-Usare @code{close()} per chiudere file aperti, @dfn{pipe} e ridirezioni a
-coprocessi.
-Per i coprocessi, @`e possibile chiudere anche soltanto una delle due
-direzioni di comunicazione.
-
-@item
-Normalmente se si verificano errori eseguendo istruzioni @code{print} o
-@code{printf}, questi causano la fine del programma.
-@command{gawk} consente di proseguire l'elaborazione anche in questo
-caso, o per un errore su qualsiasi file in output, o per un errore
-relativo a qualche file in particolare.
-Resta a carico del programma controllare se si sono verificati errori
-dopo l'esecuzione di ogni istruzione di output interessata.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi su Output
-@section Esercizi
-
-@enumerate
-@item
-Riscrivere il programma:
-
-@example
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, $2 @}' inventory-shipped
-@end example
-
-@noindent
-come
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Separatori di output}, usando un nuovo valore per @code{OFS}.
-
-@item
-Usare l'istruzione @code{printf} per allineare le intestazioni e i dati
-della tabella
-per il file di esempio @file{inventory-shipped} utilizzato nella @ref{Print}.
-
-@item
-Spiegare cosa succede se si dimenticano i doppi apici ridirigendo l'output,
-come nel caso che segue:
-
-@example
-BEGIN @{ print "Ho trovato un errore grave!" > /dev/stderr @}
-@end example
-
-@end enumerate
-@c EXCLUDE END
-
-
-@node Espressioni
-@chapter Espressioni
-@cindex espressioni
-
-Le espressioni sono i mattoni fondamentali dei modelli di ricerca e delle
-azioni di @command{awk}. Un'espressione genera un valore che si
-pu@`o stampare, verificare o passare a una funzione. Oltre a ci@`o, un'espressione
-pu@`o assegnare un nuovo valore a una variabile o a un campo usando un operatore
-di assegnamento.
-
-Un'espressione pu@`o servire come modello di ricerca o istruzione di azione a
-s@'e stante. La maggior parte degli altri tipi di istruzione contengono una o
-pi@`u espressioni che specificano i dati sui quali operare. Come in altri
-linguaggi, le espressioni in @command{awk} possono includere variabili,
-riferimenti a vettori e a costanti, e chiamate di funzione, come pure
-combinazioni tra questi usando diversi operatori.
-
-@menu
-* Valori:: Costanti, variabili ed espressioni regolari.
-* Tutti gli operatori:: Gli operatori di @command{gawk}.
-* Valori e condizioni di verit@`a:: Determinare Vero/Falso.
-* Chiamate di funzione:: Una chiamata di funzione pu@`o essere
- un'espressione.
-* Precedenza:: Come si nidificano i vari operatori.
-* Localizzazioni:: Come la localizzazione influenza la
- gestione dati.
-* Sommario delle espressioni:: Sommario delle espressioni.
-@end menu
-
-@node Valori
-@section Costanti, variabili e conversioni
-
-Le espressioni sono costruite a partire da valori e dalle operazioni eseguite
-su di essi. Questa @value{SECTION} descrive gli oggetti elementari
-che forniscono i valori usati nelle espressioni.
-
-@menu
-* Costanti:: Costanti di tipo stringa, numeriche ed
- espressioni regolari
-* Usare le costanti @dfn{regexp}:: Quando e come usare una costante
- specificata tramite espressioni regolari
-* Variabili:: Le variabili permettono di
- definire valori da usare in seguito.
-* Conversione:: La conversione di stringhe in numeri
- e viceversa.
-@end menu
-
-@node Costanti
-@subsection Espressioni costanti
-
-@cindex costanti, tipi di
-
-Il tipo di espressione pi@`u semplice @`e una @dfn{costante}, che ha sempre lo
-stesso valore. Ci sono tre tipi di costanti: numeriche, di stringa e di
-espressione regolare.
-
-Ognuna di esse si usa nel contesto appropriato quando occorre assegnare ai
-dati un valore che non dovr@`a essere cambiato. Le costanti numeriche possono
-avere forme diverse, ma sono memorizzate internamente sempre allo stesso modo.
-
-@menu
-* Costanti scalari:: Costanti numeriche e stringhe.
-* Numeri non-decimali:: Cosa sono i numeri ottali ed esadecimali.
-* Costanti come espressioni regolari:: Costanti fornite tramite espressioni
- regolari.
-@end menu
-
-@node Costanti scalari
-@subsubsection Costanti numeriche e stringhe
-
-@cindex costanti numeriche
-@cindex numeriche, costanti
-Una @dfn{costante numerica} @`e un numero. Questo numero pu@`o essere un
-numero intero, una frazione decimale o un numero in notazione scientifica
-(esponenziale).@footnote{La rappresentazione interna di tutti i numeri,
-compresi gli interi, usa numeri in virgola mobile a doppia precisione.
-Sui sistemi pi@`u moderni, questi sono nel formato standard IEEE 754.
-@xref{Calcolo con precisione arbitraria}, per maggiori informazioni.}
-Ecco alcuni esempi di costanti numeriche che hanno tutte lo stesso
-valore:
-
-@example
-105
-1.05e+2
-1050e-1
-@end example
-
-@cindex costanti stringa
-Una @dfn{costante stringa} @`e formata da una sequenza di caratteri racchiusi tra
-doppi apici. Per esempio:
-
-@example
-"pappagallo"
-@end example
-
-@noindent
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe
-@cindex stringhe, limitazioni della lunghezza
-rappresenta la stringa il cui contenuto @`e la parola @samp{pappagallo}.
-Le stringhe in
-@command{gawk} possono essere di qualsiasi lunghezza, e possono contenere
-tutti i possibili caratteri ASCII a otto bit, compreso il carattere ASCII
-@sc{nul} (carattere con codice zero).
-Altre implementazioni di @command{awk} possono avere difficolt@`a con alcuni
-particolari codici di carattere.
-
-@node Numeri non-decimali
-@subsubsection Numeri ottali ed esadecimali
-@cindex ottali, numeri
-@cindex esadecimali, numeri
-@cindex numeri ottali
-@cindex numeri esadecimali
-
-In @command{awk}, tutti i numeri sono espressi nel sistema decimale (cio@`e a
-base 10).
-Molti altri linguaggi di programmazione consentono di specificare i numeri in
-altre basi, spesso in ottale (base 8) e in esadecimale (base 16).
-Nel sistema ottale i numeri hanno la sequenza 0, 1, 2, 3, 4, 5, 6, 7, 10, 11,
-12, e cos@`{@dotless{i}} via. Come @samp{11} decimale @`e una volta 10 pi@`u 1, cos@`{@dotless{i}}
-@samp{11} ottale @`e una volta 8 pi@`u 1. Questo equivale a 9 nel sistema decimale.
-Nell'esadecimale ci sono 16 cifre. Poich@'e l'usuale sistema numerico decimale
-ha solo dieci cifre (@samp{0}--@samp{9}), le lettere da
-@samp{a} a @samp{f} rappresentano le cifre ulteriori.
-(normalmente @`e irrilevante se le lettere sono maiuscole o minuscole; gli
-esadecimali @samp{a} e @samp{A} hanno lo stesso valore).
-Cos@`{@dotless{i}}, @samp{11} esadecimale @`e 1 volta 16 pi@`u 1,
-il che equivale a 17 decimale.
-
-Guardando solamente un @samp{11} puro e semplice, non si capisce in quale base
-sia. Cos@`{@dotless{i}}, in C, C++, e in altri linguaggi derivati da C,
-@c such as PERL, but we won't mention that....
-c'@`e una speciale notazione per esprimere la base.
-I numeri ottali iniziano con uno @samp{0},
-e i numeri esadecimali iniziano con uno @samp{0x} o @samp{0X}:
-
-@table @code
-@item 11
-Valore decimale 11
-
-@item 011
-11 ottale, valore decimale 9
-
-@item 0x11
-11 esadecimale, valore decimale 17
-@end table
-
-Quest'esempio mostra le differenze:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'}
-@print{} 9, 11, 17
-@end example
-
-Poter usare costanti ottali ed esadecimali nei propri programmi @`e molto utile
-quando si lavora con dati che non possono essere rappresentati
-convenientemente come caratteri o come numeri regolari, come i dati binari di
-vario tipo.
-
-@cindex @command{gawk}, numeri ottali e
-@cindex @command{gawk}, numeri esadecimali e
-@command{gawk} permette l'uso di costanti ottali ed esadecimali nel testo di
-un programma. Comunque, se numeri non-decimali sono presenti tra i dati in
-input, essi non sono trattati in maniera speciale; trattarli in modo speciale
-per default significherebbe che vecchi programmi @command{awk} produrrebbero
-risultati errati.
-(Se si vuole che i numeri siano trattati in maniera speciale, si deve
-specificare l'opzione da riga di comando
-@option{--non-decimal-data};
-@pxref{Dati non decimali}.)
-Se si devono gestire dati ottali o esadecimali,
-si pu@`o usare la funzione @code{strtonum()}
-(@pxref{Funzioni per stringhe})
-per convertire i dati in numeri.
-La maggior parte delle volte, le costanti ottali o esadecimali si usano quando
-si lavora con le funzioni predefinite di manipolazione di bit;
-si veda @ref{Funzioni a livello di bit}
-per maggiori informazioni.
-
-Diversamente da alcune tra le prime implementazioni di C, @samp{8} e @samp{9}
-non sono cifre valide nelle costanti ottali. Per esempio, @command{gawk}
-tratta @samp{018} come un 18 decimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "021 @`e", 021 ; print 018 @}'}
-@print{} 021 @`e 17
-@print{} 18
-@end example
-
-@cindex modalit@`a compatibile di (@command{gawk}), numeri ottali
-@cindex numeri ottali nella modalit@`a compatibile di (@command{gawk})
-@cindex modalit@`a compatibile di (@command{gawk}), numeri esadecimali
-@cindex numeri esadecimali nella modalit@`a compatibile di (@command{gawk})
-@cindex compatibile, modalit@`a (@command{gawk}), numeri ottali
-@cindex compatibile, modalit@`a (@command{gawk}), numeri esadecimali
-Le costanti ottali ed esadecimali nel codice sorgente sono un'estensione di
-@command{gawk}. Se @command{gawk} @`e in modalit@`a compatibile
-(@pxref{Opzioni}),
-non sono disponibili.
-
-@cindex sidebar, La base di una costante non influisce sul suo valore
-@ifdocbook
-@docbook
-<sidebar><title>La base di una costante non influisce sul suo valore</title>
-@end docbook
-
-
-Una volta che una costante numerica @`e stata
-convertita internamente in un numero [decimale],
-@command{gawk} non considera pi@`u
-la forma originale della costante; viene sempre usato il valore
-interno. Questo ha delle precise conseguenze per la conversione dei
-numeri in stringhe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "0x11 vale <%s>\n", 0x11 @}'}
-@print{} 0x11 vale <17>
-@end example
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{La base di una costante non influisce sul suo valore}
-
-
-
-Una volta che una costante numerica @`e stata
-convertita internamente in un numero [decimale],
-@command{gawk} non considera pi@`u
-la forma originale della costante; viene sempre usato il valore
-interno. Questo ha delle precise conseguenze per la conversione dei
-numeri in stringhe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "0x11 vale <%s>\n", 0x11 @}'}
-@print{} 0x11 vale <17>
-@end example
-@end cartouche
-@end ifnotdocbook
-
-@node Costanti come espressioni regolari
-@subsubsection Costanti fornite tramite espressioni regolari
-
-@cindex @dfn{regexp}, costanti
-@cindex costanti @dfn{regexp}
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-Una @dfn{costante regexp} @`e la descrizione di un'espressione regolare
-delimitata
-da barre, come @code{@w{/^inizio e fine$/}}. La maggior parte delle
-@dfn{regexp} usate nei programmi @command{awk} sono costanti, ma gli operatori
-di confronto @samp{~} e @samp{!~} possono confrontare anche @dfn{regexp}
-calcolate o dinamiche (che tipicamente sono solo stringhe ordinarie o
-variabili che contengono un'espressione regolare, ma potrebbero anche essere
-espressioni pi@`u complesse).
-
-@node Usare le costanti @dfn{regexp}
-@subsection Usare espressioni regolari come costanti
-
-Le costanti @dfn{regexp} sono costituite da testo che descrive un'espressione
-regolare, racchiusa fra barre (come p.e. @code{/la +risposta/}).
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta del comportamento di tali costanti in
-POSIX @command{awk} e in @command{gawk}, e prosegue descrivendo le
-@dfn{costanti @dfn{regexp} fortemente tipizzate}, che sono
-un'estensione @command{gawk}.
-
-@menu
-* Costanti @dfn{regexp} normali:: Costanti @dfn{regexp} normali in
- @command{awk}.
-* Costanti @dfn{regexp} forti:: Costanti @dfn{regexp} fortemente tipizzate.
-@end menu
-
-@node Costanti @dfn{regexp} normali
-@subsubsection Costanti @dfn{regexp} normali in @command{awk}.
-
-@cindex angolo buio, costanti @dfn{regexp}
-Quand'@`e usata a destra degli operatori @samp{~} o @samp{!~},
-una costante @dfn{regexp} rappresenta semplicemente l'espressione regolare che
-dev'essere confrontata. Comunque, le costanti @dfn{regexp} (come @code{/pippo/})
-possono essere usate come semplici espressioni.
-Quando una
-costante @dfn{regexp} compare da sola, ha lo stesso significato di quando
-compare in un criterio di ricerca (cio@`e @samp{($0 ~ /pippo/)}).
-@value{DARKCORNER}
-@xref{Espressioni come criteri di ricerca}.
-Ci@`o vuol dire che i due frammenti di codice seguenti:
-
-@example
-if ($0 ~ /barfly/ || $0 ~ /camelot/)
- print "trovato"
-@end example
-
-@noindent
-e:
-
-@example
-if (/barfly/ || /camelot/)
- print "trovato"
-@end example
-
-@noindent
-sono esattamente equivalenti.
-Una conseguenza piuttosto bizzarra di questa regola @`e che la seguente
-espressione booleana @`e valida, ma non fa quel che probabilmente l'autore
-si aspettava:
-
-@example
-# Notare che /pippo/ @`e alla @emph{sinistra} della ~
-if (/pippo/ ~ $1) print "trovato pippo"
-@end example
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex @command{gawk}, costanti @dfn{regexp} e
-@cindex costanti @dfn{regexp}, in @command{gawk}
-@noindent
-Questo codice ``ovviamente'' intende verificare se @code{$1} contiene
-l'espressione regolare @code{/pippo/}. Ma in effetti l'espressione
-@samp{/pippo/ ~ $1} significa realmente @samp{($0 ~ /pippo/) ~ $1}. In altre
-parole, prima confronta il record in input con l'espressione regolare
-@code{/pippo/}. Il risultato @`e zero o uno, a seconda che il confronto dia esito
-positivo o negativo. Questo risultato
-@`e poi confrontato col primo campo nel record.
-Siccome @`e improbabile che qualcuno voglia mai fare realmente questo genere di
-test, @command{gawk} emette un avvertimento quando vede questo costrutto in
-un programma.
-Un'altra conseguenza di questa regola @`e che l'istruzione di assegnamento:
-
-@example
-confronta = /pippo/
-@end example
-
-@noindent
-assegna zero o uno alla variabile @code{confronta}, a seconda
-del contenuto del record in input corrente.
-
-@cindex differenze tra @command{awk} e @command{gawk}, costanti @dfn{regexp}
-@cindex angolo buio, costanti @dfn{regexp}, come argomenti a funzioni definite dall'utente
-@cindexgawkfunc{gensub}
-@cindexawkfunc{sub}
-@cindexawkfunc{gsub}
-Le espressioni regolari costanti possono essere usate anche come primo
-argomento delle
-funzioni @code{gensub()}, @code{sub()}, e @code{gsub()}, come secondo argomento
-della funzione @code{match()},
-e come terzo argomento delle funzioni @code{split()} e @code{patsplit()}
-(@pxref{Funzioni per stringhe}).
-Le moderne implementazioni di @command{awk}, incluso @command{gawk}, permettono
-di usare come terzo argomento di @code{split()} una costante @dfn{regexp}, ma
-alcune implementazioni pi@`u vecchie non lo consentono.
-@value{DARKCORNER}
-Poich@'e alcune funzioni predefinite accettano costanti @dfn{regexp} come
-argomenti, pu@`o generare confusione l'uso di costanti @dfn{regexp} come
-argomenti di funzioni definite dall'utente
-(@pxref{Funzioni definite dall'utente}). Per esempio:
-
-@example
-function mysub(modello, sostituzione, stringa, globale)
-@{
- if (globale)
- gsub(modello, sostituzione, stringa)
- else
- sub(modello, sostituzione, stringa)
- return stringa
-@}
-
-@{
- @dots{}
- text = "salve! salve a te!"
- mysub(/salve/, "ciao", text, 1)
- @dots{}
-@}
-@end example
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-In quest'esempio, il programmatore vuol passare una costante @dfn{regexp} alla
-funzione definita dall'utente @code{mysub()}, che a sua volta la passa o a
-@code{sub()} o a @code{gsub()}. Comunque, quel che realmente succede @`e che
-al parametro @code{modello} @`e assegnato un valore di uno o zero, a seconda
-che @code{$0} corrisponda a @code{/salve/} o no.
-@command{gawk} emette un avvertimento quando vede una costante @dfn{regexp}
-usata come parametro di una funzione definita dall'utente, poich@'e
-passare un valore vero/falso in questo modo probabilmente non @`e quello che
-si intendeva fare.
-
-@node Costanti @dfn{regexp} forti
-@subsubsection Costanti @dfn{regexp} fortemente tipizzate
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-Come visto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ifdocbook
-@value{SECTION}
-@end ifdocbook
-precedente,
-le costanti @dfn{regexp} (@code{/@dots{}/}) hanno uno strano posto nel
-linguaggio @command{awk}. In molti contesti, si comportano come
-un'espressione:
-@samp{$0 ~ /@dots{}/}. In altri contesti, denotano solo una @dfn{regexp} da
-individuare. In nessun caso esse sono davvero ``cittadine di serie A'' del
-linguaggio. Ovvero, non @`e possibile definire una variabile scalare il cui
-tipo sia ``@dfn{regexp}'' nello stesso senso in cui si pu@`o definire una
-variabile che sia un numero o una stringa:
-
-@example
-num = 42 @ii{Variabile numerica}
-str = "hi" @ii{Variabile di tipo stringa}
-re = /pippo/ @ii{Errore!} re @ii{@`e il risultato di} $0 ~ /pippo/
-@end example
-
-Per alcuni casi di uso pi@`u avanzati,
-sarebbe bello poter avere costanti @dfn{regexp} che sono
-@dfn{fortemente tipizzate}; in altre parole, che sostituiscono
-una @dfn{regexp} utile per effettuare dei confronti,
-e non una semplice espressione regolare.
-
-@command{gawk} prevede questa funzionalit@`a. Un'espressione regolare
-fortemente tipizzata @`e molto simile a un'espressione regolare normale,
-tranne per il fatto di essere preceduta dal simbolo @samp{@@}:
-
-@example
-re = @@/foo/ @ii{variabile @dfn{regexp} fortemente tipizzata}
-@end example
-
-Le variabili @dfn{regexp} fortemente tipizzate @emph{non possono} essere
-usate in ogni istruzione in cui compare un'espressione regolare normale.
-perch@'e ci@`o renderebbe il linguaggio ancora pi@`u fuorviante.
-Queste espressioni possono essere usate solo in alcuni contesti:
-
-@itemize @bullet
-@item
-Sul lato destro degli operatori @samp{~} e @samp{!~}:
-@samp{qualche_variabile ~ @@/foo/}
-(@pxref{Uso di @dfn{regexp}}).
-
-@item
-Nella parte @code{case} di un'istruzione @code{switch}
-(@pxref{Istruzione switch}).
-
-@item
-Come argomento in una delle funzioni predefinite che possono utilizzare
-costanti @dfn{regexp}:
-@code{gensub()},
-@code{gsub()},
-@code{match()},
-@code{patsplit()},
-@code{split()}
-e
-@code{sub()}
-(@pxref{Funzioni per stringhe}).
-
-@item
-Come parametro in una chiamata a una funzione definita dall'utente
-(@pxref{Funzioni definite dall'utente}).
-
-@item
-Sul lato destro di un assegnamento di variabile:
-@samp{qualche_variabile = @@/foo/}.
-In tal caso, @code{qualche_variabile} @`e di tipo @dfn{regexp}.
-Inoltre, @code{qualche_variabile}
-pu@`o essere usata con gli operatori @samp{~} e @samp{!~}, passata a una
-delle funzioni predefinite sopra elencate o passata come parametro
-a una funzione definita dall'utente.
-@end itemize
-
-Si pu@`o usare la funzione predefinita @code{typeof()}
-(@pxref{Funzioni per i tipi})
-per determinare se un parametro passato a una funzione
-@`e una variabile di tipo @dfn{regexp}.
-
-La vera efficacia di questa funzionalit@`a consiste nella capacit@`a di creare
-variabili il cui tipo @`e @dfn{regexp}. Tali variabili possono essere passate
-a funzioni definite dall'utente, senza gli inconvenenti che si hanno usando
-espressioni regolari calcolate, a partire da stringhe o da costanti di tipo
-stringa. Queste variabili possono anche essere passate utilizzando chiamate
-indirette a funzioni (@pxref{Chiamate indirette}) e alle funzioni predefinite
-che accettano costanti di tipo @dfn{regesp}.
-
-Quando sono usate per effettuare conversioni numeriche, le variabili
-@dfn{regexp} fortemente tipizzate vengono convertite alla cifra zero.
-Quando sono usate per effettuare conversioni a stringhe, vengono convertite
-al valore di stringa del testo della @dfn{regexp} originale.
-
-@node Variabili
-@subsection Variabili
-
-@cindex variabili definite dall'utente
-@cindex definite dall'utente, variabili
-Le @dfn{variabili} consentono di memorizzare valori in un certo punto di un
-programma, per usarli pi@`u tardi in un'altra parte del programma. Le variabili
-possono essere gestite interamente all'interno del testo del programma, ma
-ad esse possono essere assegnati valori sulla riga di comando, in fase di
-invocazione di @command{awk}.
-
-@menu
-* Usare variabili:: Usare variabili nei propri programmi.
-* Opzioni di assegnamento:: Impostare variabili dalla riga di
- comando, e un sommario della sintassi
- della riga di comando.
- Questo @`e un metodo di input avanzato.
-@end menu
-
-@node Usare variabili
-@subsubsection Usare variabili in un programma
-
-Le variabili permettono di dare nomi ai valori e di far riferimento ad essi in
-un secondo momento. Alcune variabili sono gi@`a state usate in molti degli
-esempi.
-Il nome di una variabile dev'essere una sequenza di lettere, cifre o trattini
-bassi, e non deve iniziare con una cifra.
-Qui, una @dfn{lettera} @`e una qualsiasi delle 52 lettere maiuscole e minuscole
-dell'alfabeto inglese. Altri caratteri che possono essere definiti come
-lettere in localizzazioni non inglesi non sono validi nei nomi di variabile.
-Il maiuscolo o minuscolo sono significativi nei nomi di variabile;
-@code{a} e @code{A} sono variabili diverse.
-
-Un nome di variabile @`e un'espressione valida in se stessa; rappresenta il
-valore corrente della variabile. I valori delle variabili possono essere
-modificati tramite @dfn{operatori di assegnamento}, @dfn{operatori di
-incremento} e @dfn{operatori di decremento}
-(@xref{Operatori di assegnamento}).
-Inoltre, le funzioni @code{sub()} e @code{gsub()} possono cambiare il valore
-di una variabile e le funzioni
-@code{match()}, @code{split()}, e @code{patsplit()} possono cambiare il
-contenuto dei loro parametri che sono
-costituiti da vettori
-(@pxref{Funzioni per stringhe}).
-
-@cindex variabili, predefinite
-@cindex variabili, inizializzazione
-Alcune variabili hanno un significato speciale predefinito, come @code{FS}
-(il separatore di campo) e @code{NF} (il numero di campi nel record di input
-corrente). @xref{Variabili predefinite} per un elenco delle variabili
-predefinite. Queste variabili predefinite possono essere usate e possono
-ricevere assegnamenti come tutte le altre variabili, ma i loro valori sono
-anche usati o cambiati automaticamente da @command{awk}. Tutti i nomi delle
-variabili predefinite sono in caratteri maiuscoli.
-
-Alle variabili in @command{awk} possono essere assegnati valori numerici o
-valori di stringa. Il tipo di valore che una variabile contiene pu@`o cambiare
-durante la vita di un programma. Per default, le variabili sono inizializzate
-alla stringa nulla, che vale zero se viene convertita in un numero. Non c'@`e
-alcuna
-necessit@`a di inizializzare esplicitamente una variabile in @command{awk},
-come invece occorre fare in C e nella maggior parte dei linguaggi
-tradizionali.
-
-@node Opzioni di assegnamento
-@subsubsection Assegnare una variabile dalla riga di comando
-@cindex variabili, assegnare da riga di comando
-@cindex riga di comando, variabili@comma{} assegnare da
-
-Si pu@`o impostare qualsiasi variabile @command{awk} includendo un
-@dfn{assegnamento di variabile} tra gli argomenti sulla riga di comando quando
-viene invocato @command{awk} (@pxref{Altri argomenti}).
-Tale assegnamento ha la seguente forma:
-
-@example
-@var{variabile}=@var{testo}
-@end example
-
-@cindex @option{-v}, opzione
-@noindent
-Con questo assegnamento, una variabile viene impostata o all'inizio
-dell'esecuzione di @command{awk} o tra la lettura di un file in input e il
-successivo file in input.
-Quando l'assegnamento @`e preceduto dall'opzione @option{-v},
-come nel seguente esempio:
-
-@example
--v @var{variabile}=@var{testo}
-@end example
-
-@noindent
-la variabile @`e impostata proprio all'inizio, ancor prima che sia eseguita la
-regola @code{BEGIN}. L'opzione @option{-v} e il suo assegnamento
-deve precedere tutti gli argomenti @value{FN}, e anche il testo del programma.
-(@xref{Opzioni} per maggiori informazioni sull'opzione
-@option{-v}.)
-In alternativa, l'assegnamento di variabile @`e effettuata in un momento
-determinato
-dalla posizione dell'opzione tra gli argomenti "file in input", cio@`e dopo
-l'elaborazione del precedente argomento "file in input". Per esempio:
-
-@example
-awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list
-@end example
-
-@noindent
-stampa il valore del campo numero @code{n} per tutti i record in input. Prima
-che venga letto il primo file, la riga di comando imposta la variabile @code{n}
-al valore quattro. Questo fa s@`{@dotless{i}} che venga stampato il quarto campo delle righe
-del file @file{inventory-shipped}. Dopo la fine del primo file, ma prima
-che inizi il secondo file, @code{n} viene impostato a due, e quindi poi
-viene stampato il secondo campo delle righe di @file{mail-list}:
-
-@example
-$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list}
-@print{} 15
-@print{} 24
-@dots{}
-@print{} 555-5553
-@print{} 555-3412
-@dots{}
-@end example
-
-@cindex angolo buio, argomenti da riga di comando
-Gli argomenti da riga di comando sono resi disponibili dal programma
-@command{awk} nel vettore @code{ARGV} per poter essere esaminati esplicitamente
-(@pxref{ARGC e ARGV}).
-@command{awk} elabora i valori degli assegnamenti da riga di comando per
-sequenze di protezione
-(@pxref{Sequenze di protezione}).
-@value{DARKCORNER}
-
-@node Conversione
-@subsection Conversione di stringhe e numeri
-
-Le conversioni di numeri in stringhe e di stringhe in numeri sono generalmente
-semplici. Ci possono essere delle sottigliezze che bisogna tenere presenti;
-questa @value{SECTION} tratta di quest'importante sfaccettatura di @command{awk}.
-
-@menu
-* Stringhe e numeri:: Come @command{awk} converte tra
- stringhe e numeri.
-* Localizzazione e conversioni:: Come la localizzazione pu@`o influire
- sulle conversioni.
-@end menu
-
-@node Stringhe e numeri
-@subsubsection Come @command{awk} converte tra stringhe e numeri
-
-@cindex conversione da stringhe a numeri
-@cindex stringhe, conversione
-@cindex numeri, conversione in stringhe
-@cindex conversione da numeri a stringhe
-Le stringhe sono convertite in numeri e i numeri sono convertiti in stringhe,
-se il contesto del programma @command{awk} lo richiede. Per esempio, se il
-valore di @code{pippo} o @code{pluto} nell'espressione @samp{pippo + pluto}
-@`e una stringa, viene convertita in un numero prima di eseguire l'addizione.
-Se in una concatenazione di stringhe ci sono valori numerici, questi sono
-convertiti in stringhe. Si consideri il seguente esempio:
-
-@example
-due = 2; tre = 3
-print (due tre) + 4
-@end example
-
-@noindent
-Stampa il valore (numerico) di 27. I valori numerici delle
-variabili @code{due} e @code{tre} sono convertiti in stringhe e
-concatenati insieme. La stringa risultante @`e riconvertita nel
-numero 23, al quale poi viene aggiunto 4.
-
-@cindex stringhe nulle, conversione da tipo numerico a tipo stringa
-@cindex conversione di tipo variabile
-@cindex variabile, conversione di tipo
-Se, per qualche ragione, si vuole forzare la conversione di un numero in
-una stringa, basta concatenare a quel numero la stringa nulla, @code{""}.
-Per forzare la conversione di una stringa in un numero, basta aggiungere zero
-a quella stringa. Una stringa viene convertita in un numero interpretando
-qualsiasi prefisso numerico della stringa come numero:
-@code{"2.5"} si converte in 2.5, @code{"1e3"} si converte in 1000, e
-@code{"25fix"} ha un valore numerico di 25.
-Le stringhe che non possono essere interpretate come numeri validi vengono
-convertite al valore zero.
-
-@cindex @code{CONVFMT}, variabile
-Il modo esatto in cui i numeri sono convertiti in stringhe @`e controllato dalla
-variabile predefinita di @command{awk} @code{CONVFMT}
-(@pxref{Variabili predefinite}). I numeri vengono convertiti usando la
-funzione @code{sprintf()}
-con @code{CONVFMT} come specificatore di formato
-(@pxref{Funzioni per stringhe}).
-
-Il valore di default di @code{CONVFMT} @`e @code{"%.6g"}, che crea un valore con
-un massimo di sei cifre significative. Per alcune applicazioni potrebbe essere
-opportuno cambiare questo valore per ottenere una maggiore precisione.
-Sulla maggior parte delle macchine moderne
-normalmente bastano 17 cifre per esprimere esattamente il valore di un numero
-in virgola mobile.@footnote{Per casi eccezionali possono essere richieste fino
-a 752 cifre (!), non sembra che sia il caso di preoccuparsene qui.}
-
-@cindex angolo buio, variabile @code{CONVFMT}
-Si possono avere strani risultati se si imposta @code{CONVFMT} a una stringa
-che non indica a @code{sprintf()} come formattare i numeri in virgola mobile
-in un modo utile. Per esempio, se ci si dimentica la @samp{%} nel formato,
-@command{awk} converte tutti i numeri alla stessa stringa costante.
-
-Come caso particolare, per un numero intero, il risultato della conversione
-a una stringa @`e @emph{sempre} un numero intero, indipendentemente da quale
-sia il valore di @code{CONVFMT}. Dato il seguente fammento di codice:
-
-@example
-CONVFMT = "%2.2f"
-a = 12
-b = a ""
-@end example
-
-@noindent
-@code{b} ha valore @code{"12"}, non @code{"12.00"}.
-@value{DARKCORNER}
-
-@cindex sidebar, @command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe
-@ifdocbook
-@docbook
-<sidebar><title>@command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe</title>
-@end docbook
-
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex @code{OFMT}, variabile
-@cindex portabilit@`a, nuovo @command{awk} vs.@: vecchio @command{awk}
-@cindex @command{awk}, nuovo vs.@: vecchio, variabile @code{OFMT}
-Prima dello standard POSIX, @command{awk} usava il valore di @code{OFMT} per
-convertire i numeri in stringhe. @code{OFMT} specifica il formato di output da
-usare per la stampa dei numeri con @code{print}. @code{CONVFMT} fu introdotto
-per separare la semantica della conversione dalla semantica della stampa. Sia
-@code{CONVFMT} che @code{OFMT} hanno lo stesso valore di dafault:
-@code{"%.6g"}. Nella stragrande maggioranza dei casi, i vecchi programmi di
-@command{awk} non cambiano questo comportamento.
-@xref{Print} per maggiori informazioni sull'istruzione @code{print}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe}
-
-
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex @code{OFMT}, variabile
-@cindex portabilit@`a, nuovo @command{awk} vs.@: vecchio @command{awk}
-@cindex @command{awk}, nuovo vs.@: vecchio, variabile @code{OFMT}
-Prima dello standard POSIX, @command{awk} usava il valore di @code{OFMT} per
-convertire i numeri in stringhe. @code{OFMT} specifica il formato di output da
-usare per la stampa dei numeri con @code{print}. @code{CONVFMT} fu introdotto
-per separare la semantica della conversione dalla semantica della stampa. Sia
-@code{CONVFMT} che @code{OFMT} hanno lo stesso valore di dafault:
-@code{"%.6g"}. Nella stragrande maggioranza dei casi, i vecchi programmi di
-@command{awk} non cambiano questo comportamento.
-@xref{Print} per maggiori informazioni sull'istruzione @code{print}.
-@end cartouche
-@end ifnotdocbook
-
-@node Localizzazione e conversioni
-@subsubsection Le localizzazioni possono influire sulle conversioni
-
-Il luogo dove si @`e pu@`o avere importanza quando si tratta di convertire numeri e
-stringhe. La lingua e i caratteri---la @dfn{localizzazione}---possono
-influire sui formati numerici. In particolare, per i programmi @command{awk},
-influiscono sui caratteri separatore decimale e separatore delle migliaia.
-La localizzazione @code{"C"}, e la maggior parte delle localizzazioni inglesi,
-usano il punto (@samp{.}) come separatore decimale e non prevedono un
-separatore delle
-migliaia. Tuttavia, molte (se non la maggior parte) delle localizzazioni
-europee e non inglesi usano la virgola (@samp{,}) come separatore dei decimali.
-Le localizzazioni europee spesso usano o lo spazio o il punto come separatore
-delle migliaia, all'occorrenza.
-
-@cindex angolo buio, carattere di separazione dei decimali nelle localizzazioni
-Lo standard POSIX prevede che @command{awk} usi sempre il punto come separatore
-dei decimali nel codice sorgente del programma @command{awk}, e per
-gli assegnamenti di variabile da riga di comando (@pxref{Altri argomenti}).
-Tuttavia, nell'interpretazione dei dati in input, per l'output di
-@code{print} e @code{printf}, e per la conversione da numeri a stringhe,
-viene usato il
-separatore decimale locale. @value{DARKCORNER} In ogni caso, i numeri nel
-codice sorgente e nei dati di input non possono avere un separatore delle
-migliaia. Di seguito sono riportati alcuni esempi che illustrano la differenza
-di comportamento, su un sistema GNU/Linux:
-
-@example
-$ @kbd{export POSIXLY_CORRECT=1} @ii{Forzare aderenza a standard POSIX}
-$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
-@print{} 3.14159
-$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
-@print{} 3,14159
-$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'}
-@print{} 5
-$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'}
-@print{} 5,321
-@end example
-
-@noindent
-La localizzazione @code{en_DK.utf-8} @`e per l'inglese in Danimarca, dove
-le virgole fungono da separatore decimale. Nella localizzazione @code{"C"}
-normale, @command{gawk} tratta @samp{4,321} come 4, mentre nella localizzazione
-danese @`e trattato come numero completo comprendente la parte frazionaria,
-4.321.
-
-Alcune delle prime versioni di @command{gawk} si conformavano completamente con
-quest'aspetto dello standard. Tuttavia, molti utenti di localizzazioni non
-inglesi si lamentavano di questo comportamento, perch@'e i loro dati usavano il
-punto come separatore decimale, per cui fu ripristinato il comportamento di
-default che usava il punto come carattere di separazione decimale. Si pu@`o
-usare l'opzione @option{--use-lc-numeric} (@pxref{Opzioni}) per forzare
-@command{gawk} a usare il carattere separatore decimale della localizzazione.
-(@command{gawk} usa il separatore decimale della localizzazione anche quando
-@`e in modalit@`a POSIX, o con l'opzione @option{--posix} o con la variabile
-d'ambiente @env{POSIXLY_CORRECT}, come appena visto.)
-
-@ref{table-locale-affects} descrive i casi in cui si usa il separatore decimale
-locale e quando si usa il punto. Alcune di queste funzionalit@`a non sono state
-ancora descritte.
-
-@float Tabella,table-locale-affects
-@caption{Separatore decimale locale o punto}
-@multitable @columnfractions .15 .25 .45
-@headitem Funzione @tab Default @tab @option{--posix} o @option{--use-lc-numeric}
-@item @code{%'g} @tab Usa la localizzazione @tab Usa la localizzazione
-@item @code{%g} @tab Usa il punto @tab Usa la localizzazione
-@item Input @tab Usa il punto @tab Usa la localizzazione
-@item @code{strtonum()} @tab Usa il punto @tab Usa la localizzazione
-@end multitable
-@end float
-
-Infine, gli standard ufficiali correnti e la rappresentazione dei numeri
-in virgola mobile dello standard IEEE possono avere un effetto insolito ma
-importante sul modo in cui @command{gawk} converte alcuni valori di stringa
-speciali in
-numeri. I dettagli sono illustrati in @ref{Problemi virgola mobile POSIX}.
-
-@node Tutti gli operatori
-@section Operatori: fare qualcosa coi valori
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} introduce gli @dfn{operatori} che fanno uso
-dei valori forniti da costanti e variabili.
-
-@menu
-* Operatori aritmetici:: Operazioni aritmetiche (@samp{+}, @samp{-},
- etc.)
-* Concatenazione:: Concatenazione di stringhe.
-* Operatori di assegnamento:: Cambiare il valore di una variabile o di un
- campo.
-* Operatori di incremento:: Incrementare il valore numerico di una
- variabile.
-@end menu
-
-@node Operatori aritmetici
-@subsection Operatori aritmetici
-@cindex aritmetici, operatori
-@cindex operatori aritmetici
-@c @cindex addition
-@c @cindex subtraction
-@c @cindex multiplication
-@c @cindex division
-@c @cindex remainder
-@c @cindex quotient
-@c @cindex exponentiation
-
-Il linguaggio @command{awk} usa i comuni operatori aritmetici nella valutazione
-delle espressioni. Tutti questi operatori aritmetici seguono le normali regole
-di precedenza e funzionano come ci si aspetta.
-
-Il seguente esempio usa un file chiamato @file{grades}, che contiene
-una lista di nomi di studenti e anche i voti di tre verifiche per ogni studente
-(@`e una piccola classe):
-
-@example
-Pat 100 97 58
-Sandy 84 72 93
-Chris 72 92 89
-@end example
-
-@noindent
-Questo programma prende il file @file{grades} e stampa la media
-dei voti:
-
-@example
-$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3}
-> @kbd{print $1, avg @}' grades}
-@print{} Pat 85
-@print{} Sandy 83
-@print{} Chris 84.3333
-@end example
-
-La lista seguente elenca gli operatori aritmetici in @command{awk},
-in ordine di precedenza, da quella pi@`u alta a quella pi@`u bassa:
-
-@table @code
-@cindex estensioni comuni, operatore @code{**}
-@cindex POSIX @command{awk}, operatori aritmetici e
-@item @var{x} ^ @var{y}
-@itemx @var{x} ** @var{y}
-Elevamento a potenza; @var{x} elevato alla potenza @var{y}. @samp{2 ^ 3}
-ha il valore otto; la sequenza di caratteri @samp{**} @`e equivalente a
-@samp{^}. @value{COMMONEXT}
-
-@item - @var{x}
-Negazione.
-
-@item + @var{x}
-Pi@`u unario; l'espressione @`e convertita in un numero.
-
-@item @var{x} * @var{y}
-Moltiplicazione.
-
-@cindex risoluzione di problemi, divisione
-@cindex problemi, risoluzione di, divisione
-@cindex divisione
-@item @var{x} / @var{y}
-Divisione; poich@'e tutti i numeri in @command{awk} sono numeri in virgola
-mobile, il risultato @emph{non} @`e arrotondato all'intero---@samp{3 / 4} ha il
-valore di 0.75. (Un errore comune, specialmente tra i programmatori in C, @`e
-quello di dimenticare che @emph{tutti} i numeri in @command{awk} sono in virgola mobile,
-e che la divisione di costanti rappresentate da numeri interi produce un
-numero reale, non un numero intero.)
-
-@item @var{x} % @var{y}
-Resto della divisione; subito dopo questa lista, l'argomento viene
-ulteriormente dettagliato.
-
-@item @var{x} + @var{y}
-Addizione.
-
-@item @var{x} - @var{y}
-Sottrazione.
-@end table
-
-Il pi@`u e il meno unari hanno la stessa precedenza,
-gli operatori di moltiplicazione hanno tutti la stessa precedenza, e
-l'addizione e la sottrazione hanno la stessa precedenza.
-
-@cindex differenze tra @command{awk} e @command{gawk}, operazione di modulo-troncamento
-@cindex modulo-troncamento, operazione di
-Quando si calcola il resto di @samp{@var{x} % @var{y}},
-il quoziente @`e troncato all'intero e
-moltiplicato per @var{y}. Questo risultato @`e sottratto da @var{x};
-quest'operazione @`e nota anche come ``modulo''. La seguente
-relazione @`e sempre verificata:
-
-@example
-b * int(a / b) + (a % b) == a
-@end example
-
-Un possibile effetto indesiderato di questa definizione di resto @`e che
-@samp{@var{x} % @var{y}} sia negativo se @var{x} @`e negativo. Cos@`{@dotless{i}}:
-
-@example
--17 % 8 = -1
-@end example
-
-In altre implementazioni di @command{awk} il segno del resto
-pu@`o essere dipendente dalla macchina.
-@c FIXME !!! what does posix say?
-
-@cindex portabilit@`a, operatore @code{**}
-@cindex @code{*} (asterisco), operatore @code{**}
-@cindex asterisco (@code{*}), operatore @code{**}
-@quotation NOTA
-Lo standard POSIX specifica solo l'uso di @samp{^}
-per l'elevamento a potenza.
-Per garantire la massima portabilit@`a @`e meglio non usare l'operatore @samp{**}.
-@end quotation
-
-@node Concatenazione
-@subsection Concatenazione di stringhe
-@cindex Kernighan, Brian
-@quotation
-@i{Allora ci era sembrata una buona idea.}
-@author Brian Kernighan
-@end quotation
-
-@cindex operatori di stringa
-@cindex stringa, operatori di
-@cindex concatenare
-C'@`e una sola operazione di stringa: la concatenazione. Non ha un operatore
-specifico per rappresentarla. Piuttosto, la concatenazione @`e effettuata
-scrivendo le espressioni l'una vicino all'altra, senza alcun operatore.
-Per esempio:
-
-@example
-$ @kbd{awk '@{ print "Campo numero uno: " $1 @}' mail-list}
-@print{} Campo numero uno: Amelia
-@print{} Campo numero uno: Anthony
-@dots{}
-@end example
-
-Senza lo spazio nella costante stringa dopo @samp{:}, la riga
-rimane unita. Per esempio:
-
-@example
-$ @kbd{awk '@{ print "Campo numero uno:" $1 @}' mail-list}
-@print{} Campo numero uno:Amelia
-@print{} Campo numero uno:Anthony
-@dots{}
-@end example
-
-@cindex risoluzione di problemi, concatenazione di stringhe
-@cindex problemi, risoluzione di, concatenazione di stringhe
-Poich@'e la concatenazione di stringhe non ha un operatore esplicito, @`e spesso
-necessario assicurarsi che venga effettuata al momento giusto usando le
-parentesi per racchiudere gli elementi da concatenare. Per esempio, ci si
-potrebbe aspettare che il
-seguente fammento di codice concateni @code{nome} e @code{file}:
-
-@example
-nome = "nome"
-file = "file"
-print "qualcosa di significativo" > nome file
-@end example
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@noindent
-Questo produce un errore di sintassi in alcune versioni di
-@command{awk} per Unix.@footnote{Pu@`o capitare che BWK
-@command{awk}, @command{gawk} e @command{mawk} lo interpretino nel modo giusto,
-ma non ci si dovrebbe fare affidamento.}
-@`E necessario usare la seguente sintassi:
-
-@example
-print "qualcosa di significativo" > (nome file)
-@end example
-
-@cindex ordine di valutazione, concatenazione
-@cindex valutazione, ordine di, concatenazione
-@cindex effetti collaterali
-Si dovrebbero usare le parentesi attorno alle concatenazioni in tutti i
-contesti non comuni, come, per esempio, sul lato destro di @samp{=}.
-Bisogna stare attenti
-al tipo di espressioni usate nella concatenazione di stringhe. In particolare,
-l'ordine di valutazione di espressioni usate per la concatenazione non @`e
-definita nel linguaggio @command{awk}. Si consideri quest'esempio:
-
-@example
-BEGIN @{
- a = "Non"
- print (a " " (a = "v'allarmate"))
-@}
-@end example
-
-@noindent
-Non @`e definito se il secondo assegnamento ad @code{a} debba avvenire
-prima o dopo il recupero del valore di @code{a} per produrre il
-valore concatenato. Il risultato potrebbe essere sia @samp{Non v'allarmate},
-sia @samp{v'allarmate v'allarmate}.
-@c see test/nasty.awk for a worse example
-
-La precedenza della concatenazione, quando @`e in combinazione con altri
-operatori, @`e spesso controintuitiva. Si consideri questo esempio:
-
-@ignore
-> To: bug-gnu-utils@@gnu.org
-> CC: arnold@@gnu.org
-> Subject: gawk 3.0.4 bug with {print -12 " " -24}
-> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG>
-> Date: Tue, 8 Feb 2000 19:56:08 -0700
->
-> gawk 3.0.4 on NT gives me:
->
-> prompt> cat bad.awk
-> BEGIN { print -12 " " -24; }
->
-> prompt> gawk -f bad.awk
-> -12-24
->
-> when I would expect
->
-> -12 -24
->
-> I have not investigated the source, or other implementations. The
-> bug is there on my NT and DOS versions 2.15.6 .
-@end ignore
-
-@example
-$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'}
-@print{} -12-24
-@end example
-
-Quest'esempio, ``ovviamente'' concatena @minus{}12, uno spazio, e @minus{}24.
-Ma dov'@`e finito lo spazio?
-La risposta sta nella combinazione di precedenze di operatori e nelle regole di
-conversione automatica di @command{awk}. Per ottenere il risultato desiderato,
-si deve scrivere il programma in questo modo:
-
-@example
-$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'}
-@print{} -12 -24
-@end example
-
-Questo forza il trattamento, da parte di @command{awk}, del @samp{-} del
-@samp{-24} come operatore unario. Altrimenti @`e analizzato in questo modo:
-
-@display
- @minus{}12 (@code{"@ "} @minus{} 24)
-@result{} @minus{}12 (0 @minus{} 24)
-@result{} @minus{}12 (@minus{}24)
-@result{} @minus{}12@minus{}24
-@end display
-
-Come si @`e detto precedentemente,
-quando si usa la concatenazione insieme ad altri operatori, @`e necessario
-@emph{usare le parentesi}. Altrimenti, non si pu@`o essere mai completamente
-certi di quel che si ottiene.
-
-@node Operatori di assegnamento
-@subsection Espressioni di assegnamento
-@cindex operatori di assegnamento
-@cindex assegnamento, operatori di
-@cindex espressioni di assegnamento
-@cindex @code{=} (uguale), operatore @code{=}
-@cindex uguale (@code{=}), operatore @code{=}
-Un @dfn{assegnamento} @`e un'espressione che memorizza un valore (generalmente
-diverso da quello che la variabile aveva in precedenza) in una variabile.
-Per esempio, si assegni il valore uno alla variabile @code{z}:
-
-@example
-z = 1
-@end example
-
-Dopo l'esecuzione di quest'espressione, la variabile @code{z} ha il valore
-uno. Qualsiasi precedente valore di @code{z} prima dell'assegnamento
-viene dimenticato.
-
-Gli assegnamenti possono anche memorizzare valori di stringa. Il seguente
-esempio memorizza
-il valore @code{"questo cibo @`e buono"} nella variabile @code{messaggio}:
-
-@example
-cosa = "cibo"
-predicato = "buono"
-messaggio = "questo " cosa " @`e " predicato
-@end example
-
-@noindent
-@cindex effetti collaterali, espressioni di assegnamento
-Quest'esempio illustra anche la concatenazione di stringhe.
-Il segno @samp{=} @`e un @dfn{operatore di assegnamento}. @`E il pi@`u semplice
-fra gli operatori di assegnamento perch@'e il valore dell'operando di destra
-@`e memorizzato invariato.
-La maggior parte degli operatori (addizione, concatenazione e cos@`{@dotless{i}} via) non
-fanno altro che calcolare un valore. Se il valore non viene poi utilizzato non c'@`e alcun
-motivo per usare l'operatore. Un operatore di assegnamento @`e differente;
-produce un valore; anche se poi non lo si usa, l'assegnamento svolge ancora
-una funzione alterando la variabile. Chiamiamo questo
-un @dfn{effetto collaterale}.
-
-@cindex @dfn{lvalue/rvalue}
-@cindex @dfn{rvalue/lvalue}
-@cindex assegnamento, operatori di, @dfn{lvalue/rvalue}
-@cindex operatori di assegnamento
-L'operando di sinistra non dev'essere necessariamente una variabile
-(@pxref{Variabili}); pu@`o essere anche un campo
-(@pxref{Cambiare i campi}) o
-@iftex
-un elemento di un vettore (@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-un elemento di un vettore (@pxref{Vettori}).
-@end ifnottex
-Questi operandi sono chiamati @dfn{lvalue}, il
-che significa che possono apparire sul lato sinistro di un operatore di
-assegnamento. L'operando sul lato destro pu@`o essere qualsiasi espressione;
-produce un nuovo valore che l'assegnamento memorizza nella variabile, nel campo
-o nell'elemento di vettore specificati. Tali valori sono chiamati
-@dfn{rvalue}.
-
-@cindex variabili, tipi di
-@`E importante notare che le variabili @emph{non} hanno dei tipi permanenti.
-Il tipo di una variabile @`e semplicemente quello di qualsiasi valore le sia stato
-assegnato per ultimo. Nel seguente frammento di programma, la variabile
-@code{pippo} ha dapprima un valore numerico, e in seguito un valore di stringa:
-
-@example
-pippo = 1
-print pippo
-pippo = "pluto"
-print pippo
-@end example
-
-@noindent
-Quando il secondo assegnamento d@`a a @code{pippo} un valore di stringa, il fatto
-che avesse precedentemente un valore numerico viene dimenticato.
-
-Ai valori di stringa che non iniziano con una cifra viene assegnato il valore
-numerico zero. Dopo l'esecuzione del seguente codice, il valore di @code{pippo} @`e
-cinque:
-
-@example
-pippo = "una stringa"
-pippo = pippo + 5
-@end example
-
-@quotation NOTA
-Usare una variabile sia come numero che come stringa pu@`o originare confusione
-e denota uno stile di programmazione scadente. I due esempi precedenti
-illustrano come funziona @command{awk}, @emph{non} come si dovrebbero scrivere
-i programmi!
-@end quotation
-
-Un assegnamento @`e un'espressione, per cui ha un valore: lo stesso valore che
-le @`e stato assegnato. Cos@`{@dotless{i}}, @samp{z = 1} @`e un'espressione col valore uno.
-Una conseguenza di ci@`o @`e che si possono scrivere pi@`u assegnamenti insieme,
-come:
-
-@example
-x = y = z = 5
-@end example
-
-@noindent
-Quest'esempio memorizza il valore cinque in tutte e tre le variabili,
-(@code{x}, @code{y} e @code{z}).
-Questo perch@'e il
-valore di @samp{z = 5}, che @`e cinque, @`e memorizzato in @code{y} e poi
-il valore di @samp{y = z = 5}, che @`e cinque, @`e memorizzato in @code{x}.
-
-Gli assegnamenti possono essere usati ovunque sia prevista un'espressione. Per
-esempio, @`e valido scrivere @samp{x != (y = 1)} per impostare @code{y} a
-uno, e poi verificare se @code{x} @`e uguale a uno. Per@`o questo stile rende i
-programmi difficili da leggere; una tale nidificazione di assegnamenti dovrebbe
-essere evitata, eccetto forse in un programma usa-e-getta.
-
-@cindex @code{+} (pi@`u), operatore @code{+=}
-@cindex pi@`u (@code{+}), operatore @code{+=}
-Accanto a @samp{=}, ci sono diversi altri operatori di assegnamento che
-eseguono calcoli col vecchio valore di una variabile. Per esempio,
-l'operatore @samp{+=} calcola un nuovo valore aggiungendo il valore sul lato
-destro al vecchio valore di una variabile. Cos@`{@dotless{i}}, il seguente assegnamento
-aggiunge cinque al valore di @code{pippo}:
-
-@example
-pippo += 5
-@end example
-
-@noindent
-Questo @`e equivalente a:
-
-@example
-pippo = pippo + 5
-@end example
-
-@noindent
-Si usi la notazione che rende pi@`u chiaro il significato del programma.
-
-Ci sono situazioni in cui usare @samp{+=} (o qualunque operatore di
-assegnamento) @emph{non} @`e la stessa cosa che ripetere semplicemente l'operando
-di sinistra nell'espressione di destra. Per esempio:
-
-@cindex Rankin, Pat
-@example
-# Grazie a Pat Rankin per quest'esempio
-BEGIN @{
- pippo[rand()] += 5
- for (x in pippo)
- print x, pippo[x]
-
- pluto[rand()] = pluto[rand()] + 5
- for (x in pluto)
- print x, pluto[x]
-@}
-@end example
-
-@cindex operatori di assegnamento, ordine di valutazione
-@cindex assegnamento, operatori di, ordine di valutazione
-@noindent
-@`E praticamente certo che gli indici di @code{pluto} siano differenti, perch@'e
-@code{rand()} restituisce valori differenti ogni volta che viene chiamata.
-(I vettori e la funzione @code{rand()} non sono ancora stati trattati.
-@iftex
-@xrefil{Vettori},
-@end iftex
-@ifnottex
-@xref{Vettori},
-@end ifnottex
-e
-@ifnotdocbook
-@pxref{Funzioni numeriche}
-@end ifnotdocbook
-@ifdocbook
-@ref{Funzioni numeriche}
-@end ifdocbook
-per maggiori informazioni.)
-Quest'esempio illustra un fatto importante riguardo agli operatori di
-assegnamento: l'espressione di sinistra viene valutata @emph{una volta sola}.
-
-Dipende dall'implementazione stabilire quale espressione valutare per
-prima, se quella di sinistra o quella di destra.
-Si consideri quest'esempio:
-
-@example
-i = 1
-a[i += 2] = i + 1
-@end example
-
-@noindent
-Il valore di @code{a[3]} potrebbe essere sia due sia quattro.
-
-La @ref{table-assign-ops} elenca gli operatori di assegnamento aritmetici. In
-ogni caso, l'operando di destra @`e un'espressione il cui valore @`e convertito in
-un numero.
-
-@cindex @code{-} (meno), operatore @code{-=}
-@cindex meno (@code{-}), operatore @code{-=}
-@cindex @code{*} (asterisco), operatore @code{*=}
-@cindex asterisco (@code{*}), operatore @code{*=}
-@cindex @code{/} (barra), operatore @code{/=}
-@cindex barra (@code{/}), operatore @code{/=}
-@cindex @code{%} (percento), operatore @code{%=}
-@cindex percento (@code{%}), operatore @code{%=}
-@cindex @code{^} (circonflesso), operatore @code{^=}
-@cindex circonflesso (@code{^}), operatore @code{^=}
-@cindex @code{*} (asterisco), operatore @code{**=}
-@cindex asterisco (@code{*}), operatore @code{**=}
-@float Tabella,table-assign-ops
-@caption{Operatori di assegnamento aritmetici}
-@multitable @columnfractions .30 .70
-@headitem Operatore @tab Effetto
-@item @var{lvalue} @code{+=} @var{incremento} @tab Aggiunge @var{incremento} al valore di @var{lvalue}.
-@item @var{lvalue} @code{-=} @var{decremento} @tab Sottrae @var{decremento} dal valore di @var{lvalue}.
-@item @var{lvalue} @code{*=} @var{coefficiente} @tab Moltiplica il valore di @var{lvalue} per @var{coefficiente}.
-@item @var{lvalue} @code{/=} @var{divisore} @tab Divide il valore di @var{lvalue} per @var{divisore}.
-@item @var{lvalue} @code{%=} @var{modulo} @tab Imposta @var{lvalue} al resto della sua divisione per @var{modulo}.
-@cindex estensioni comuni, operatore @code{**=}
-@cindex estensioni comuni@comma{} operatore @code{**=}
-@cindex @command{awk}, linguaggio, versione POSIX
-@cindex POSIX @command{awk}
-@item @var{lvalue} @code{^=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}.
-@item @var{lvalue} @code{**=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}. @value{COMMONEXT}
-@end multitable
-@end float
-
-@cindex POSIX @command{awk}, operatore @code{**=} e
-@cindex portabilit@`a, operatore @code{**=}
-@quotation NOTA
-Soltanto l'operatore @samp{^=} @`e definito da POSIX.
-Per avere la massima portabilit@`a, non usare l'operatore @samp{**=}.
-@end quotation
-
-@cindex sidebar, Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari
-@ifdocbook
-@docbook
-<sidebar><title>Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari</title>
-@end docbook
-
-@cindex angolo buio, costanti @dfn{regexp}, operatore @code{/=} e
-@cindex @code{/} (barra), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex barra (@code{/}), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @dfn{regexp}, costanti, @code{/=@dots{}/}, operatore @code{/=} e
-
-@c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu>
-@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
-
-@cindex angolo buio, operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex sintattica, ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @code{/=}, operatore, vs. costante @dfn{regexp} @code{/=@dots{}/}
-C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=}
-e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}.
-@value{DARKCORNER}
-Questo @`e pi@`u evidente in alcune versioni commerciali di @command{awk}.
-Per esempio:
-
-@example
-$ @kbd{awk /==/ /dev/null}
-@error{} awk: syntax error at source line 1
-@error{} context is
-@error{} >>> /= <<<
-@error{} awk: bailing out at source line 1
-@end example
-
-@noindent
-Un espediente @`e:
-
-@example
-awk '/[=]=/' /dev/null
-@end example
-
-@command{gawk} non ha questo problema, e neppure lo hanno BWK @command{awk}
-e @command{mawk}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari}
-
-
-@cindex angolo buio, costanti @dfn{regexp}, operatore @code{/=} e
-@cindex @code{/} (barra), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex barra (@code{/}), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @dfn{regexp}, costanti, @code{/=@dots{}/}, operatore @code{/=} e
-
-@c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu>
-@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
-
-@cindex angolo buio, operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex sintattica, ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @code{/=}, operatore, vs. costante @dfn{regexp} @code{/=@dots{}/}
-C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=}
-e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}.
-@value{DARKCORNER}
-Questo @`e pi@`u evidente in alcune versioni commerciali di @command{awk}.
-Per esempio:
-
-@example
-$ @kbd{awk /==/ /dev/null}
-@error{} awk: syntax error at source line 1
-@error{} context is
-@error{} >>> /= <<<
-@error{} awk: bailing out at source line 1
-@end example
-
-@noindent
-Un espediente @`e:
-
-@example
-awk '/[=]=/' /dev/null
-@end example
-
-@command{gawk} non ha questo problema, e neppure lo hanno BWK @command{awk}
-e @command{mawk}.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di incremento
-@subsection Operatori di incremento e di decremento
-
-@cindex incremento, operatori di
-@cindex operatori di decremento/incremento
-Gli @dfn{operatori di incremento} e @dfn{decremento} incrementano o riducono il
-valore di una variabile di uno. Un operatore di assegnamento pu@`o fare la
-stessa cosa, per cui gli operatori di incremento non aggiungono funzionalit@`a
-al inguaggio @command{awk}; in ogni caso, sono delle convenienti abbreviazioni
-per operazioni molto comuni.
-
-@cindex effetti collaterali
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@cindex effetti collaterali, operatori di decremento/incremento
-L'operatore per aggiungere uno @`e @samp{++}. Pu@`o essere usato per incrementare
-una variabile prima o dopo aver stabilito il suo valore. Per @dfn{preincrementare}
-una variabile @code{v}, si scrive @samp{++v}. Questo aggiunge uno al valore di
-@code{v}; questo nuovo valore @`e anche il valore dell'espressione.
-(L'espressione di assegnamento @samp{v += 1} @`e totalmente equivalente.)
-Scrivendo @samp{++} dopo la variabile si specifica un @dfn{postincremento}.
-Questo incrementa il valore della variabile nello stesso modo; la differenza @`e
-che il valore dell'espressione d'incremento @`e il @emph{vecchio} valore della
-variabile. Cos@`{@dotless{i}}, se @code{pippo} ha il valore quattro, l'espressione
-@samp{pippo++} ha il valore quattro, ma cambia il valore di @code{pippo} in cinque.
-In altre parole, l'operatore restituisce il vecchio valore della variabile, ma
-con l'effetto collaterale di incrementarlo.
-
-Il postincremento @samp{pippo++} @`e quasi come scrivere @samp{(pippo += 1) - 1}.
-Non @`e perfettamente equivalente perch@'e tutti i numeri in @command{awk} sono in
-virgola mobile. In virgola mobile, @samp{pippo + 1 - 1} non @`e necessariamente
-uguale a @code{pippo}, ma la differenza @`e molto piccola finch@'e si ha a che
-fare con numeri relativamente piccoli (inferiori a
-@iftex
-@math{10^{12}}).
-@end iftex
-@ifinfo
-10e12).
-@end ifinfo
-@ifnottex
-@ifnotinfo
-10@sup{12}).
-@end ifnotinfo
-@end ifnottex
-
-@cindex @code{$} (dollaro), incrementare campi e vettori
-@cindex dollaro (@code{$}), incrementare campi e vettori
-I campi di un record e gli elementi di un vettore vengono incrementati
-proprio come le
-variabili. (Si deve usare @samp{$(i++)} quando si deve fare un riferimento a
-un campo e incrementare una variabile allo stesso tempo. Le parentesi sono
-necessarie a causa della precedenza dell'operatore di riferimento @samp{$}.)
-
-@cindex decremento, operatori di
-L'operatore di decremento @samp{--} funziona proprio come @samp{++}, solo che
-sottrae uno anzich@'e aggiungerlo. Come @samp{++}, si pu@`o usare prima di
-@dfn{lvalue}
-per predecrementare o dopo per postdecrementare.
-Quel che segue @`e un sommario delle espressioni di incremento e di
-decremento:
-
-@table @code
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@item ++@var{lvalue}
-Incrementa @var{lvalue}, restituendo il nuovo valore come
-valore dell'espressione.
-
-@item @var{lvalue}++
-Incrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
-come valore dell'espressione.
-
-@cindex @code{-} (meno), operatore @code{--}
-@cindex meno (@code{-}), operatore @code{--}
-@item --@var{lvalue}
-Decrementa @var{lvalue}, restituendo il nuovo valore come
-valore dell'espressione.
-(Quest'espressione @`e come
-@samp{++@var{lvalue}}, ma invece di aggiungere, sottrae.)
-
-@item @var{lvalue}--
-Decrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
-come valore dell'espressione.
-(Quest'espressione @`e come
-@samp{@var{lvalue}++}, ma invece di aggiungere, sottrae.)
-@end table
-
-@cindex sidebar, Ordine di valutazione degli operatori
-@ifdocbook
-@docbook
-<sidebar><title>Ordine di valutazione degli operatori</title>
-@end docbook
-
-@cindex precedenza
-@cindex operatori, precedenza
-@cindex portabilit@`a, operatori
-@cindex valutazione, ordine di
-@cindex Marx, Groucho
-@quotation
-@i{Dottore, quando faccio cos@`{@dotless{i}} mi fa male!@*
-E allora non farlo!}
-@author Groucho Marx
-@end quotation
-
-@noindent
-Che cosa succede con qualcosa come questo?
-
-@example
-b = 6
-print b += b++
-@end example
-
-@noindent
-O con qualcosa di pi@`u strano ancora?
-
-@example
-b = 6
-b += ++b + b++
-print b
-@end example
-
-@cindex effetti collaterali
-In altre parole, quando hanno effetto i vari effetti collaterali previsti
-dagli operatori col suffisso (@samp{b++})? Quando gli effetti collaterali
-si verificano @`e @dfn{definito dall'implementazione}.
-Per dirla diversamente, questo @`e compito di ogni specifica versione di
-@command{awk}. Il risultato del primo esempio pu@`o essere 12 o 13, e del
-secondo pu@`o essere 22 o 23.
-
-In breve, @`e sconsigliato fare cose come questa e, in ogni caso,
-ogni cosa che possa incidere sulla portabilit@`a.
-Si dovrebbero evitare cose come queste nei programmi.
-@c You'll sleep better at night and be able to look at yourself
-@c in the mirror in the morning.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ordine di valutazione degli operatori}
-
-
-@cindex precedenza
-@cindex operatori, precedenza
-@cindex portabilit@`a, operatori
-@cindex valutazione, ordine di
-@cindex Marx, Groucho
-@quotation
-@i{Dottore, quando faccio cos@`{@dotless{i}} mi fa male!@*
-E allora non farlo!}
-@author Groucho Marx
-@end quotation
-
-@noindent
-Che cosa succede con qualcosa come questo?
-
-@example
-b = 6
-print b += b++
-@end example
-
-@noindent
-O con qualcosa di pi@`u strano ancora?
-
-@example
-b = 6
-b += ++b + b++
-print b
-@end example
-
-@cindex effetti collaterali
-In altre parole, quando hanno effetto i vari effetti collaterali previsti
-dagli operatori col suffisso (@samp{b++})? Quando gli effetti collaterali
-si verificano @`e @dfn{definito dall'implementazione}.
-Per dirla diversamente, questo @`e compito di ogni specifica versione di
-@command{awk}. Il risultato del primo esempio pu@`o essere 12 o 13, e del
-secondo pu@`o essere 22 o 23.
-
-In breve, @`e sconsigliato fare cose come questa e, in ogni caso,
-ogni cosa che possa incidere sulla portabilit@`a.
-Si dovrebbero evitare cose come queste nei programmi.
-@c You'll sleep better at night and be able to look at yourself
-@c in the mirror in the morning.
-@end cartouche
-@end ifnotdocbook
-
-@node Valori e condizioni di verit@`a
-@section Valori e condizioni di verit@`a
-
-In certi contesti, i valori delle espressioni servono anche come
-``valori di verit@`a''; cio@`e, determinano quale sar@`a la direzione che il
-programma prender@`a durante la sua esecuzione. Questa
-@value{SECTION} descrive come @command{awk} definisce ``vero'' e ``falso''
-e come questi valori sono confrontati.
-
-@menu
-* Valori di verit@`a:: Cos'@`e ``vero'' e cos'@`e ``falso''.
-* Tipi di variabile e confronti:: Come alle variabili si assegna il tipo e
- l'effetto che questo ha sul confronto di
- numeri e stringhe con @samp{<}, etc.
-* Operatori booleani:: Combinare espressioni di confronto usando
- operatori booleani @samp{||} (``or''),
- @samp{&&} (``and'') e @samp{!} (``not'').
-* Espressioni condizionali:: Le espressioni condizionali scelgono una fra
- due sottoespressioni, a seconda del valore di
- una terza sottoespressione.
-@end menu
-
-@node Valori di verit@`a
-@subsection Vero e falso in @command{awk}
-@cindex valori di verit@`a
-@cindex logico, valore, vero/falso
-@cindex falso, valore logico (zero o stringa nulla)
-@cindex vero, valore logico (diverso da zero e da stringa nulla)
-
-@cindex nulle, stringhe
-Molti linguaggi di programmazione hanno una particolare rappresentazione per i
-concetti di ``vero'' e ``falso.'' Questi linguaggi usano normalmente le
-costanti speciali @code{true} e @code{false}, o forse i loro equivalenti
-maiuscoli.
-Per@`o @command{awk} @`e differente.
-Prende in prestito un concetto molto semplice di vero e falso dal linguaggio
-C. In @command{awk}, ogni valore numerico diverso da zero @emph{oppure}
-ogni valore di stringa non vuota @`e vero. Ogni altro valore (zero o la stringa
-nulla, @code{""}) @`e falso. Il seguente programma stampa @samp{Uno strano
-valore di verit@`a} tre volte:
-
-@example
-BEGIN @{
- if (3.1415927)
- print "Uno strano valore di verit@`a"
- if ("Ottanta e sette anni or sono")
- print "Uno strano valore di verit@`a"
- if (j = 57)
- print "Uno strano valore di verit@`a"
-@}
-@end example
-
-@cindex angolo buio, @code{"0"} @`e effettivamente vero
-C'@`e una conseguenza sorprendente della regola ``non zero o non nullo'':
-la costante di stringa @code{"0"} sta effettivamente per vero, perch@'e
-@`e non nulla.
-@value{DARKCORNER}
-
-@node Tipi di variabile e confronti
-@subsection Tipi di variabile ed espressioni di confronto
-@quotation
-@i{La Guida galattica @`e infallibile. @`E la realt@`a, spesso, a essere inesatta.}
-@author Douglas Adams, @cite{Guida galattica per autostoppisti}
-@end quotation
-@c 2/2015: Antonio Colombo points out that this is really from
-@c The Restaurant at the End of the Universe. But I'm going to
-@c leave it alone.
-
-@cindex confronto, espressioni di
-@cindex espressioni di confronto
-@cindex espressioni, ricerca di corrispondenze, si veda espressioni di confronto
-@cindex individuazione, espressioni di, si veda espressioni di confronto
-@cindex relazionali, operatori, si veda espressioni di confronto
-@cindex operatori relazionali, si veda espressioni di confronto
-@cindex variabile, tipi di
-@cindex variabili, tipi di, espressioni di confronto e
-Diversamente che in altri linguaggi di programmazione, le variabili di
-@command{awk} non hanno un tipo fisso. Possono essere sia un numero che una
-stringa, a seconda del valore loro assegnato.
-Vediamo ora come viene assegnato il tipo a una variabile, e come @command{awk}
-le confronta.
-
-@menu
-* Tipi di variabile:: Tipo stringa rispetto a tipo numero.
-* Operatori di confronto:: Gli operatori di confronto.
-* Confronto POSIX di stringhe:: Confronto tra stringhe usando le
- regole POSIX.
-@end menu
-
-@node Tipi di variabile
-@subsubsection Tipo stringa rispetto a tipo numero
-
-Per gli elementi scalari in @command{awk} (variabili, elementi di
-vettore e campi), il tipo degli stessi viene attribuito @emph{dinamicamente}.
-Ci@`o significa che il tipo di un elemento pu@`o cambiare nel corso
-dell'esecuzione di un programma, da @dfn{untyped} (non ancora tipizzata),
-valore assunto prima che la variabile sia utilizzata,@footnote{@command{gawk}
-chiama queste variabili @dfn{unassigned} (non ancora assegnate), come si
-vede dall'esempio che segue.} a stringa oppure a numero, e in seguito
-da stringa a numero o da numero a stringa, nel prosieguo del programma.
-(@command{gawk} prevede anche degli scalari di tipo @dfn{regexp}, ma
-per ora possiamo ignorarli;
-@pxref{Costanti @dfn{regexp} forti}.)
-
-Non si pu@`o fare molto riguardo alle variabili di tipo @dfn{untyped},
-oltre a constatare che ancora non @`e stato loro attribuito un tipo.
-Il seguente programma confronta la variabile @code{a} con i valori
-@code{""} e @code{0}; il confronto d@`a esito positivo se alla
-variabile @code{a} non @`e mai stato assegnato un valore.
-L'esempio usa la funzione predefinita @code{typeof()}
-(non ancora trattata; @pxref{Funzioni per i tipi}) per
-visualizzare il tipo della variabile @code{a}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print (a == "" && a == 0 ?}
-> @kbd{"a non ha un tipo" : "a ha un tipo!") ; print typeof(a) @}'}
-@print{} a non ha un tipo
-@print{} unassigned
-@end example
-
-Una variabile scalare diviene di tipo numerico quando le viene assegnato un
-valore numerico, per mezzo di una costante numerica, o tramite un'altra
-variabile scalare di tipo numerico:
-
-@example
-$ @kbd{gawk 'BEGIN @{ a = 42 ; print typeof(a)}
-> @kbd{b = a ; print typeof(b) @}'}
-number
-number
-@end example
-
-Analogamente, una variabile scalare diviene di tipo stringa quando le
-viene assegnato come valore una stringa, per mezzo di una costante stringa,
-o tramite un'altra variabile scalare di tipo stringa:
-
-@example
-$ @kbd{gawk 'BEGIN @{ a = "quarantadue" ; print typeof(a)}
-> @kbd{b = a ; print typeof(b) @}'}
-string
-string
-@end example
-
-Fin qui, tutto semplice e chiaro. Cosa succede, per@`o, quando
-@command{awk} deve trattare dati forniti dall'utente?
-Il primo caso da considerare @`e quello dei campi di dati in input.
-Quale dovrebbe essere l'output del seguente programma?
-
-@example
-echo ciao | awk '@{ printf("%s %s < 42\n", $1,
- ($1 < 42 ? "@`e" : "non @`e")) @}'
-@end example
-
-@noindent
-Poich@'e @samp{ciao} @`e un dato di tipo alfabetico, @command{awk} pu@`o solo
-effettuare un confronto di tipo stringa. Internamente, il numero @code{42}
-viene convertito in @code{"42"} e vengono confrontate le due stringhe di
-valore @code{"ciao"} e @code{"42"}. Questo @`e il risultato:
-
-@example
-$ @kbd{echo ciao | awk '@{ printf("%s %s < 42\n", $1,}
-> @kbd{ ($1 < 42 ? "@`e" : "non @`e")) @}'}
-@print{} ciao non @`e < 42
-@end example
-
-Tuttavia, cosa succede quando un dato utente @emph{assomiglia} a un
-numero?
-Da un lato, in realt@`a, il dato in input @`e formato da alcuni caratteri, non da
-valori numerici in formato binario. Ma, d'altro lato, il dato sembra
-numerico, e @command{awk} dovrebbe davvero trattarlo come tale. E in effetti
-questo @`e ci@`o che avviene:
-
-@example
-$ @kbd{echo 37 | awk '@{ printf("%s %s < 42\n", $1,}
-> @kbd{ ($1 < 42 ? "@`e" : "non @`e")) @}'}
-@print{} 37 is < 42
-@end example
-
-Queste sono le regole seguite per determinare quando @command{awk}
-tratta dei dati in input come numeri, e quando li considera stringhe.
-
-@cindex numeriche, stringhe
-@cindex stringhe, numeriche
-@cindex POSIX @command{awk}, stringhe numeriche e
-Lo standard POSIX usa il concetto di @dfn{stringa numerica}, per dei dati
-in input che appaiono essere numerici. Il @samp{37} nell'esempio precedente
-@`e una stringa numerica. Quindi, qual @`e il tipo di una stringa numerica?
-Risposta: numerico.
-
-Il tipo di una variabile @`e importante perch@'e il tipo di due variabili
-determina il modo con cui le stesse vengono confrontate.
-La determinazione del tipo di variabile segue queste regole:
-
-@itemize @value{BULLET}
-@item
-Una costante numerica o il risultato di un'operazione numerica ha l'attributo
-@dfn{numeric}.
-
-@item
-Una costante di stringa o il risultato di un'operazione di stringa ha
-l'attributo @dfn{string}.
-
-@item
-Campi, input tramite @code{getline}, @code{FILENAME}, elementi di
-@code{ARGV}, elementi di @code{ENVIRON}, e gli elementi di un vettore
-creato da @code{match()}, @code{split()} e @code{patsplit()} che sono
-stringhe numeriche hanno l'attributo @dfn{strnum}.@footnote{Quindi, una
-stringa numerica POSIX e una variabile tipo @dfn{strnum} di @command{gawk}
-sono equivalenti.}
-Altrimenti, hanno l'attributo @dfn{string}.
-Anche le variabili non inizializzate hanno l'attributo @var{strnum}.
-
-@item
-Gli attributi si trasmettono attraverso gli assegnamenti ma non vengono
-cambiati da nessun uso.
-@c (Although a use may cause the entity to acquire an additional
-@c value such that it has both a numeric and string value, this leaves the
-@c attribute unchanged.)
-@c This is important but not relevant
-@end itemize
-
-L'ultima regola @`e particolarmente importante. Nel seguente programma,
-@code{a} @`e di tipo numerico, anche se viene usata in un secondo momento in
-un'operazione di stringa:
-
-@example
-BEGIN @{
- a = 12.345
- b = a " @`e un numero carino"
- print b
-@}
-@end example
-
-Quando si confrontano due operandi, pu@`o essere usata sia il confronto come
-stringa che il confronto numerico, a seconda degli attributi degli operandi,
-secondo questa matrice simmetrica:
-
-@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables
-@tex
-\centerline{
-\vbox{\bigskip % space above the table (about 1 linespace)
-% Because we have vertical rules, we can't let TeX insert interline space
-% in its usual way.
-\offinterlineskip
-%
-% Define the table template. & separates columns, and \cr ends the
-% template (and each row). # is replaced by the text of that entry on
-% each row. The template for the first column breaks down like this:
-% \strut -- a way to make each line have the height and depth
-% of a normal line of type, since we turned off interline spacing.
-% \hfil -- infinite glue; has the effect of right-justifying in this case.
-% # -- replaced by the text (for instance, `STRNUM', in the last row).
-% \quad -- about the width of an `M'. Just separates the columns.
-%
-% The second column (\vrule#) is what generates the vertical rule that
-% spans table rows.
-%
-% The doubled && before the next entry means `repeat the following
-% template as many times as necessary on each line' -- in our case, twice.
-%
-% The template itself, \quad#\hfil, left-justifies with a little space before.
-%
-\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr
- &&STRING &NUMERIC &STRNUM\cr
-% The \omit tells TeX to skip inserting the template for this column on
-% this particular row. In this case, we only want a little extra space
-% to separate the heading row from the rule below it. the depth 2pt --
-% `\vrule depth 2pt' is that little space.
-\omit &depth 2pt\cr
-% This is the horizontal rule below the heading. Since it has nothing to
-% do with the columns of the table, we use \noalign to get it in there.
-\noalign{\hrule}
-% Like above, this time a little more space.
-\omit &depth 4pt\cr
-% The remaining rows have nothing special about them.
-STRING &&string &string &string\cr
-NUMERIC &&string &numeric &numeric\cr
-STRNUM &&string &numeric &numeric\cr
-}}}
-@end tex
-@ifnottex
-@ifnotdocbook
-@verbatim
- +----------------------------------------------
- | STRING NUMERIC STRNUM
---------+----------------------------------------------
- |
-STRING | string string string
- |
-NUMERIC | string numeric numeric
- |
-STRNUM | string numeric numeric
---------+----------------------------------------------
-@end verbatim
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<informaltable>
-<tgroup cols="4">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<colspec colname="3" align="left"/>
-<colspec colname="4" align="left"/>
-<thead>
-<row>
-<entry/>
-<entry>STRING</entry>
-<entry>NUMERIC</entry>
-<entry>STRNUM</entry>
-</row>
-</thead>
-
-<tbody>
-<row>
-<entry><emphasis role="bold">STRING</emphasis></entry>
-<entry>string</entry>
-<entry>string</entry>
-<entry>string</entry>
-</row>
-
-<row>
-<entry><emphasis role="bold">NUMERIC</emphasis></entry>
-<entry>string</entry>
-<entry>numeric</entry>
-<entry>numeric</entry>
-</row>
-
-<row>
-<entry><emphasis role="bold">STRNUM</emphasis></entry>
-<entry>string</entry>
-<entry>numeric</entry>
-<entry>numeric</entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-L'idea di base @`e che l'input dell'utente che appare come numerico---e
-@emph{solo} l'input dell'utente---dovrebbe essere trattato come numerico, anche
-se in realt@`a @`e un insieme di caratteri e quindi anche una stringa.
-Cos@`{@dotless{i}}, ad esempio, la costante di stringa @w{@code{" +3.14"}},
-quando appare nel codice sorgente di un programma,
-@`e una stringa---anche se sembra numerica---e non
-viene @emph{mai} trattato come numero
-ai fini di un confronto.
-
-In breve, quando un operando @`e una stringa ``pura'', come una costante di
-stringa, viene effettuato un confronto di stringa. In caso contrario viene
-effettuato un confronto numerico.
-(La differenza principale tra un numero e uno @dfn{strnum} @`e che per gli
-@dfn{strnum} @command{gawk} conserva anche il valore originale della stringa
-che la variabile scalare aveva al momento in cui @`e stata letta.
-
-Questo punto merita di essere ulteriormente ribadito:
-l'input che appare essere un numero @emph{@`e} numerico.
-Tutto il resto dell'input @`e considerato essere una stringa.
-
-Cos@`{@dotless{i}}, la stringa in input di sei caratteri @w{@samp{ +3.14}}
-riceve l'attributo @dfn{strnum}. Al contrario, la stringa di sei caratteri
-@w{@code{" +3.14"}} che compaia nel testo di un programma rimane una
-costante di stringa. I seguenti esempi stampano @samp{1} quando il confronto
-fra due diverse costanti @`e vero, altrimenti stampano @samp{0}:
-
-@c 22.9.2014: Tested with mawk and BWK awk, got same results.
-@example
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == " +3.14") @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == "+3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == "3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == 3.14) @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == " +3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == "+3.14") @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == "3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == 3.14) @}'} @ii{Vero}
-@print{} 1
-@end example
-
-Per controllare il tipo di un campo in input (o di altro input immesso
-dall'utente, si pu@`o usare @code{typeof()}:
-
-@example
-$ @kbd{echo salve 37 | gawk '@{ print typeof($1), typeof($2) @}'}
-@print{} string strnum
-@end example
-
-@node Operatori di confronto
-@subsubsection Operatori di confronto
-
-Le @dfn{espressioni di confronto} confrontano stringhe o numeri per metterli in
-relazione tra di loro, come ad esempio nella relazione di uguaglianza. Sono
-scritte usando @dfn{operatori di relazione}, che sono un superinsieme di quelli
-in C. Sono descritti nella @ref{table-relational-ops}.
-
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>}
-@cindex @code{=} (uguale), operatore @code{==}
-@cindex uguale (@code{=}), operatore @code{==}
-@cindex @code{!} (punto esclamativo), operatore @code{!=}
-@cindex punto esclamativo (@code{!}), operatore @code{!=}
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@cindex @code{in}, operatore
-@float Tabella,table-relational-ops
-@caption{Operatori di relazione}
-@multitable @columnfractions .23 .77
-@headitem Espressione @tab Risultato
-@item @var{x} @code{<} @var{y} @tab Vero se @var{x} @`e minore di @var{y}
-@item @var{x} @code{<=} @var{y} @tab Vero se @var{x} @`e minore o uguale a @var{y}
-@item @var{x} @code{>} @var{y} @tab Vero se @var{x} @`e maggiore di @var{y}
-@item @var{x} @code{>=} @var{y} @tab Vero se @var{x} @`e maggiore o uguale a @var{y}
-@item @var{x} @code{==} @var{y} @tab Vero se @var{x} @`e uguale a @var{y}
-@item @var{x} @code{!=} @var{y} @tab Vero se @var{x} @`e diverso da @var{y}
-@item @var{x} @code{~} @var{y} @tab Vero se la stringa @var{x} corrisponde alla @dfn{regexp} rappresentata da @var{y}
-@item @var{x} @code{!~} @var{y} @tab Vero se la stringa @var{x} non corrisponde alla @dfn{regexp} rappresentata da @var{y}
-@item @var{indice} @code{in} @var{vettore} @tab Vero se il vettore @var{vettore} ha un elemento con indice @var{indice}
-@end multitable
-@end float
-
-Le espressioni di confronto valgono uno se sono vere e zero se false.
-Quando si confrontano operandi di tipi diversi, gli operandi numerici sono
-convertiti in stringhe usando il valore di @code{CONVFMT}
-(@pxref{Conversione}).
-
-Il confronto tra stringhe avviene
-confrontando il primo carattere di ciascuna stringa, poi il secondo carattere,
-e cos@`{@dotless{i}} via. Quindi, @code{"10"} @`e minore di @code{"9"}. Se vi sono due
-stringhe di cui una @`e il prefisso dell'altra, la stringa pi@`u corta @`e minore di
-quella pi@`u lunga. Cos@`{@dotless{i}}, @code{"abc"} @`e minore di @code{"abcd"}.
-
-@cindex risoluzione di problemi, operatore @code{==}
-@cindex problemi, risoluzione di, operatore @code{==}
-@`E molto facile sbagliarsi scrivendo l'operatore @samp{==} e
-omettendo uno dei due caratteri @samp{=}. Il risultato @`e sempre un codice
-@command{awk} valido, ma il programma non fa quel che si voleva:
-
-@example
-if (a = b) # oops! dovrebbe essere == b
- @dots{}
-else
- @dots{}
-@end example
-
-@noindent
-A meno che @code{b} non sia zero o la stringa nulla, la parte @code{if}
-del test ha sempre successo. Poich@'e gli operatori sono molto simili,
-questo tipo di errore @`e molto difficile da individuare
-rileggendo il codice sorgente.
-
-Il seguente elenco di espressioni illustra il tipo di confronti
-che @command{awk} effettua e il risultato di ciascun confronto:
-
-@table @code
-@item 1.5 <= 2.0
-Confronto numerico (vero)
-
-@item "abc" >= "xyz"
-Confronto tra stringhe (falso)
-
-@item 1.5 != " +2"
-Confronto tra stringhe (vero)
-
-@item "1e2" < "3"
-Confronto tra stringhe (vero)
-
-@item a = 2; b = "2"
-@itemx a == b
-Confronto tra stringhe (vero)
-
-@item a = 2; b = " +2"
-@itemx a == b
-Confronto tra stringhe (falso)
-@end table
-
-In quest'esempio:
-
-@example
-$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "vero" : "falso" @}'}
-@print{} falso
-@end example
-
-@cindex espressioni di confronto, stringa vs.@: @dfn{regexp}
-@c @cindex string comparison vs.@: regexp comparison
-@c @cindex regexp comparison vs.@: string comparison
-@noindent
-il risultato @`e @samp{falso} perch@'e sia @code{$1} che @code{$2}
-sono immessi dall'utente. Sono stringhe numeriche---quindi hanno entrambe
-l'attributo @dfn{strnum}, che richiede un confronto di tipo numerico.
-Lo scopo delle regole di confronto e dell'uso di stringhe numeriche @`e quello
-di cercare di produrre il comportamento "meno inaspettato possibile",
-pur "facendo la cosa giusta".
-
-I confronti di stringhe e i confronti di espressioni regolari sono molto
-diversi. Per esempio:
-
-@example
-x == "att"
-@end example
-
-@noindent
-ha il valore uno, ossia @`e vero, se la variabile @code{x}
-@`e precisamente @samp{att}. Al contrario:
-
-@example
-x ~ /att/
-@end example
-
-@noindent
-ha il valore uno se @code{x} contiene @samp{att}, come
-@code{"Oh, che matto che sono!"}.
-
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-L'operando di destra degli operatori @samp{~} e @samp{!~} pu@`o essere sia una
-costante @dfn{regexp} (@code{/}@dots{}@code{/}) che un'espressione ordinaria.
-In quest'ultimo caso, il valore dell'espressione come stringa @`e usato come una
-@dfn{regexp} dinamica (@pxref{Uso di @dfn{regexp}}; e
-@pxref{Espressioni regolari calcolate}).
-
-@cindex @command{awk}, costanti @dfn{regexp} e
-@cindex costanti @dfn{regexp}
-@cindex @dfn{regexp}, costanti
-Un'espressione regolare costante tra due barre @`e di per s@'e anche
-un'espressione. @code{/@var{regexp}/} @`e un'abbreviazione per la seguente
-espressione di confronto:
-
-@example
-$0 ~ /@var{regexp}/
-@end example
-
-Una particolare posizione dove @code{/pippo/} @emph{non} @`e un'abbreviazione di
-@samp{$0 ~ /pippo/} @`e quella in cui @`e l'operando di destra di @samp{~} o
-@samp{!~}.
-@xref{Usare le costanti @dfn{regexp}},
-dove questo punto @`e trattato in maggiore dettaglio.
-
-@node Confronto POSIX di stringhe
-@subsubsection Confronto tra stringhe usando l'ordine di collazione locale
-
-Lo standard POSIX diceva che il confronto di stringhe viene effettuato secondo
-l'@dfn{ordine di collazione} locale. Questo @`e l'ordine secondo il quale sono
-disposti i caratteri, come definito dalla localizzazione (per una trattazione
-pi@`u dettagliata, @pxref{Localizzazioni}). Quest'ordine normalmente @`e molto
-diverso dal risultato ottenuto quando si esegue un confronto rigorosamente
-"carattere per carattere".@footnote{Tecnicamente, il confronto di stringhe
-dovrebbe funzionare come se le stringhe fossero confrontate usando la
-funzione @code{strcoll()} di C.}
-
-Poich@'e questo comportamento differisce sensibilmente dalla pratica corrente,
-@command{gawk} lo implementava solo quando eseguito in modalit@`a POSIX
-(@pxref{Opzioni}).
-Quest'esempio ilustra la differenza, in una localizzazione
-@code{en_US.UTF-8}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",}
-> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
-@print{} ABC < abc = TRUE
-$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",}
-> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
-@print{} ABC < abc = FALSE
-@end example
-Fortunatamente, dal mese di agosto 2016, un confronto basato sull'ordine
-di collazione locale non @`e pi@`u richiesto per gli operatori @code{==} e
-@code{!=}.@footnote{Si consulti il sito web
-@uref{http://austingroupbugs.net/view.php?id=1070,
-dell'Austin Group}.} Tuttavia, un confronto basato sull'ordine di
-collazione locale @`e ancora richiesto per gli operatori @code{<},
-@code{<=}, @code{>} e @code{>=}. POSIX, quindi, raccomanda quanto
-segue:
-
-@quotation
-Poich@'e l'operatore @code{==} controlla che se le stringhe sono identiche,
-e non se sono nell'ordine di collazione locale, le applicazioni che
-devono controllare se le stringhe sono nell'ordine di collazione locale
-possono usare:
-
-@example
-a <= b && a >= b
-@end example
-@end quotation
-
-A partire dalla @value{PVERSION} 4.2, @command{gawk} continua a usare
-l'ordine di collazione locale per @code{<}, @code{<=}, @code{>}
-e @code{>=} solo se eseguito nella modalit@`a POSIX.
-
-@node Operatori booleani
-@subsection Espressioni booleane
-@cindex @dfn{and}, operatore logico-booleano
-@cindex @dfn{or}, operatore logico-booleano
-@cindex @dfn{not}, operatore logico-booleano
-@cindex espressioni booleane
-@cindex booleane, espressioni
-@cindex operatori booleani, si veda espressioni booleane
-@cindex booleani, operatori, si veda espressioni booleane
-@cindex logici, operatori, si veda espressioni booleane
-@cindex operatori logici, si veda espressioni booleane
-
-Un'@dfn{espressione booleana} @`e una combinazione di espressioni di confronto o
-espressioni di ricerca, che usa gli operatori booleani "or"
-(@samp{||}), "and" (@samp{&&}), e "not" (@samp{!}), facendo uso di
-parentesi per controllare le nidificazioni. Il valore di verit@`a
-dell'espressione booleana @`e calcolato calcolando i valori di verit@`a delle
-espressioni componenti. Le espressioni booleane sono conosciute anche come
-@dfn{espressioni logiche}. I due termini sono equivalenti.
-
-Le espressioni booleane possono essere usate in tutti i casi in cui @`e possibile
-usare espressioni di confronto e di ricerca di corrispondenze. Si possono
-usare nelle istruzioni @code{if}, @code{while}, @code{do} e @code{for}
-(@pxref{Istruzioni}).
-Hanno valori numerici (uno se vero, zero se falso) che entrano in gioco
-se il risultato di un'espressione booleana @`e memorizzato in una variabile o
-se @`e usato nei calcoli.
-
-Inoltre, ogni espressione booleana @`e anche un modello di ricerca valido, cos@`{@dotless{i}}
-se ne pu@`o usare uno come modello di ricerca per controllare l'esecuzione di
-regole. Gli operatori booleani sono:
-
-@table @code
-@item @var{booleano1} && @var{booleano2}
-Vero se @var{booleano1} e @var{booleano2} sono entrambi veri. Per esempio,
-la seguente istruzione stampa il record in input corrente se contiene
-sia @samp{edu} che @samp{li}:
-
-@example
-if ($0 ~ /edu/ && $0 ~ /li/) print
-@end example
-
-@cindex effetti collaterali, operatori booleani
-La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
-@`e vero. Questo pu@`o comportare una differenza laddove @var{booleano2} contenga
-espressioni che hanno effetti collaterali. Nel caso di @samp{$0 ~ /pippo/ &&
-($2 == pluto++)}, la variabile @code{pluto} non viene incrementata se non c'@`e
-nessuna sottostringa @samp{pippo} nel record.
-
-@item @var{booleano1} || @var{booleano2}
-Vero se almeno uno tra @var{booleano1} e @var{booleano2} @`e vero.
-Per esempio, la seguente istruzione stampa tutti i record dell'input che
-contengono @samp{edu} @emph{oppure}
-@samp{li}:
-
-@example
-if ($0 ~ /edu/ || $0 ~ /li/) print
-@end example
-
-La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
-@`e falso. Questo pu@`o comportare una differenza quando @var{booleano2} contiene
-espressioni che hanno effetti collaterali.
-(Perci@`o, questo confronto non individua mai i record che contengono sia
-@samp{edu} che @samp{li}: non appena @samp{edu} viene trovato,
-l'intero confronto @`e concluso positivamente.)
-
-@item ! @var{booleano}
-Vero se @var{booleano} @`e falso. Per esempio,
-il seguente programma stampa @samp{nessuna home!} nel
-caso insolito che la variabile d'ambiente @env{HOME}
-non sia stata definita:
-
-@example
-BEGIN @{ if (! ("HOME" in ENVIRON))
- print "nessuna home!" @}
-@end example
-
-(L'operatore @code{in} @`e descritto in
-@ref{Visitare elementi}.)
-@end table
-
-@cindex cortocircuito, operatori
-@cindex operatori di cortocircuito
-@cindex @code{&} (e commerciale), operatore @code{&&}
-@cindex e commerciale (@code{&}), operatore @code{&&}
-@cindex @code{|} (barra verticale), operatore @code{||}
-@cindex barra verticale (@code{|}), operatore @code{||}
-Gli operatori @samp{&&} e @samp{||} sono chiamati operatori di
-@dfn{cortocircuito} per il modo in cui funzionano. La valutazione dell'intera
-espressione @`e "cortocircuitata" se il risultato pu@`o gi@`a essere determinato
-prima di aver completato interamente la valutazione.
-
-@cindex continuazione di riga
-Le istruzioni che finiscono con @samp{&&} o @samp{||} si possono continuare
-semplicemente mettendo un ritorno a capo dopo di esse. Per@`o non si pu@`o mettere
-un ritorno a capo @emph{prima} di questi operatori senza usare la
-continuazione tramite la barra inversa (@pxref{Istruzioni/Righe}).
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@cindex ritorno a capo
-@cindex variabili di tipo indicatore [@dfn{flag}]
-@cindex @dfn{flag} [indicatore], variabili
-Il valore reale di un'espressione che usa l'operatore @samp{!} @`e uno
-o zero, a seconda del valore di verit@`a dell'espressione a cui
-@`e applicato.
-L'operatore @samp{!} spesso @`e utile per cambiare il senso di una variabile
-indicatore [@dfn{flag}] da falso a vero e viceversa. Per esempio, il seguente
-programma @`e un modo per stampare righe poste tra due speciali righe
-delimitatrici:
-
-@example
-$1 == "START" @{ pertinente = ! pertinente; next @}
-pertinente @{ print @}
-$1 == "END" @{ pertinente = ! pertinente; next @}
-@end example
-
-@noindent
-La variabile @code{pertinente}, cos@`{@dotless{i}} come tutte le variabili di @command{awk},
-@`e inizializzata a zero, che vale anche "falso". Quando viene trovata
-una riga il cui primo campo @`e @samp{START}, il valore di @code{pertinente}
-viene commutato a vero, usando @samp{!}. La regola nella riga seguente stampa righe finch@'e
-@code{pertinente} resta vero. Quando viene trovata una riga il cui primo
-campo @`e @samp{END}, @code{pertinente} viene nuovamente commutata a
-falso.@footnote{Questo programma ha un bug; stampa righe che iniziano con
-@samp{END}. Come si pu@`o risolvere?}
-
-@ignore
-Scott Deifik points out that this program isn't robust against
-bogus input data, but the point is to illustrate the use of `!',
-so we'll leave well enough alone.
-@end ignore
-
-Pi@`u comunemente, l'operatore @samp{!} viene usato nelle condizioni delle
-istruzioni @code{if} e @code{while}, dove ha pi@`u senso formulare espressioni
-logiche in negativo:
-
-@example
-if (! @var{qualche condizione} || @var{qualche altra condizione}) @{
- @var{@dots{} fai un'operazione a piacere @dots{}}
-@}
-@end example
-
-@cindex @code{next}, istruzione
-@quotation NOTA
-L'istruzione @code{next} viene trattata in
-@ref{Istruzione next}.
-@code{next} dice ad @command{awk} di tralasciare il resto delle regole,
-leggere il record successivo, e iniziare a elaborare le regole partendo
-nuovamente dalla prima.
-Il motivo @`e quello di evitare di stampare le righe delimitatrici
-@samp{START} e @samp{END}.
-@end quotation
-
-@node Espressioni condizionali
-@subsection Espressioni condizionali
-@cindex condizionali, espressioni
-@cindex espressioni condizionali
-@cindex espressioni, selezionare
-
-Un'@dfn{espressione condizionale} @`e un tipo particolare di espressione che ha
-tre operandi. Consente di usare il primo valore dell'espressione per
-scegliere una o l'altra delle due ulteriori espressioni.
-L'espressione condizionale in @command{awk} @`e la stessa di quella del
-linguaggio C, ovvero:
-
-@example
-@var{selettore} ? @var{espr-se-vero} : @var{espr-se-falso}
-@end example
-
-@noindent
-Ci sono tre sottoespressioni. La prima, @var{selettore}, viene sempre
-calcolata per prima. Se @`e "vera" (non zero o non nulla), viene poi calcolata
-@var{espr-se-vero} e il suo valore diventa il valore dell'intera espressione.
-Altrimenti, la seconda espressione che viene calcolata @`e @var{espr-se-falso}
-e il suo valore diventa il valore dell'intera espressione.
-Per esempio, la seguente espressione produce il valore assoluto di @code{x}:
-
-@example
-x >= 0 ? x : -x
-@end example
-
-@cindex effetti collaterali, espressioni condizionali
-Ogni volta che viene calcolata un'espressione condizionale, solo una delle
-espressioni @var{espr-se-vero} e @var{espr-se-falso} viene usata; l'altra
-@`e ignorata. Questo @`e importante quando le espressioni hanno effetti
-collaterali. Per esempio, quest'espressione condizionale esamina l'elemento
-@code{i} del vettore @code{a} o del vettore @code{b}, e incrementa @code{i}:
-
-@example
-x == y ? a[i++] : b[i++]
-@end example
-
-@noindent
-Questa istruzione garantisce che @code{i} sia incrementato una volta sola
-per ogni esecuzione dell'istruzione stessa, perch@'e ogni volta viene eseguita
-solo una delle due espressioni di incremento, mentre l'altra viene
-ignorata.
-@iftex
-@xrefil{Vettori},
-@end iftex
-@ifnottex
-@xref{Vettori},
-@end ifnottex
-per maggiori informazioni sui vettori.
-
-@cindex differenze tra @command{awk} e @command{gawk}, continuazione di riga
-@cindex continuazione di riga, @command{gawk}
-@cindex @command{gawk}, continuazione di riga in
-Come estensione minore di @command{gawk},
-un'istruzione che usa @samp{?:} si pu@`o continuare mettendo
-semplicemente un ritorno a capo dopo i due caratteri.
-Tuttavia, se si mette un ritorno a capo @emph{prima} dei due
-caratteri, la continuazione non funziona, se non si aggiunge anche la barra inversa
-(@pxref{Istruzioni/Righe}).
-Se viene specificata l'opzione @option{--posix}
-(@pxref{Opzioni}), quest'estensione @`e disabilitata.
-
-@node Chiamate di funzione
-@section Chiamate di funzione
-@cindex chiamata di funzione
-
-Una @dfn{funzione} @`e un nome per richiedere un particolare calcolo.
-Il nome permette di richiamare
-la funzione da qualsiasi punto del programma.
-Per esempio, la funzione @code{sqrt()} calcola la radice quadrata di un numero.
-
-@cindex funzioni predefinite
-Un certo numero di funzioni sono @dfn{predefinite}, ossia sono
-disponibili in ogni programma @command{awk}. La funzione @code{sqrt()} @`e una
-di queste. @xref{Funzioni predefinite} per un elenco di funzioni
-predefinite e per le loro rispettive descrizioni. In aggiunta, l'utente pu@`o
-definire delle funzioni da usare nel proprio programma.
-@xref{Funzioni definite dall'utente}
-per istruzioni su come farlo.
-Infine, @command{gawk} permette di scrivere funzioni in C o in C++ che possono
-essere chiamate dal proprio programma (@pxref{Estensioni dinamiche}).
-
-@cindex argomenti, nelle chiamate di funzione
-Una funzione viene utilizzata invocandola tramite un'espressione di
-@dfn{chiamata di funzione}, che consiste nel nome della funzione seguito
-immediatamente da una lista di @dfn{argomenti} tra parentesi. Gli argomenti
-sono espressioni che forniscono i materiali grezzi su cui opera la funzione.
-Quando ci sono pi@`u argomenti, questi sono separati da virgole. Se
-non ci sono argomenti, basta scrivere @samp{()} dopo il nome della funzione.
-Gli esempi che seguono mostrano chiamate di funzione con e senza argomenti:
-
-@example
-sqrt(x^2 + y^2) @ii{un argomento}
-atan2(y, x) @ii{due argomenti}
-rand() @ii{nessun argomento}
-@end example
-
-@cindex risoluzione di problemi, sintassi della chiamata di funzione
-@cindex problemi, risoluzione di, sintassi della chiamata di funzione
-@quotation ATTENZIONE
-Non ci dev'essere nessuno spazio tra il nome della funzione e la parentesi
-aperta! Un nome di funzione definita dall'utente pu@`o essere scambiata per
-il nome di una
-variabile: uno spazio renderebbe l'espressione simile alla concatenazione di
-una variabile con un'espressione racchiusa tra parentesi.
-Per le funzioni predefinite, lo spazio prima delle parentesi non crea problemi,
-ma @`e meglio non prendere l'abitudine di usare spazi per evitare errori con le
-funzioni definite dall'utente.
-@end quotation
-
-Ogni funzione richiede uno specifico numero di argomenti.
-Per esempio, la funzione @code{sqrt()} dev'essere chiamata con
-un solo argomento, il numero del quale si vuole estrarre la radice quadrata:
-
-@example
-sqrt(@var{argomento})
-@end example
-
-Alcune delle funzioni predefinite hanno uno o pi@`u argomenti opzionali.
-Se questi argomenti non vengono forniti, le funzioni
-usano un valore di default appropriato.
-@xref{Funzioni predefinite} per tutti i dettagli. Se sono omessi argomenti
-in chiamate a funzioni definite dall'utente, tali argomenti sono considerati
-essere variabili locali. Il valore di tali variabili locali
-@`e la stringa nulla se usate in un contesto che richiede una stringa
-di caratteri, e lo zero se @`e richiesto
-un valore numerico
-(@pxref{Funzioni definite dall'utente}).
-
-Come funzionalit@`a avanzata, @command{gawk} prevede la possibilit@`a di
-effettuare chiamate di funzione
-indirette, il che permette di scegliere la funzione da chiamare al momento
-dell'esecuzione, invece che nel momento in cui si scrive il codice sorgente
-del programma.
-Si rimanda la trattazione di questa funzionalit@`a
-a un secondo momento; si veda @ref{Chiamate indirette}.
-
-@cindex effetti collaterali, chiamate di funzione
-Come ogni altra espressione, la chiamata di funzione ha un valore, chiamato
-spesso @dfn{valore di ritorno}, che @`e calcolato dalla funzione
-in base agli argomenti dati. In quest'esempio, il valore di ritorno
-di @samp{sqrt(@var{argomento})} @`e la radice quadrata di @var{argomento}.
-Il seguente programma legge numeri, un numero per riga, e stampa
-la radice quadrata di ciascuno:
-
-@example
-$ @kbd{awk '@{ print "La radice quadrata di", $1, "@`e", sqrt($1) @}'}
-@kbd{1}
-@print{} La radice quadrata di 1 @`e 1
-@kbd{3}
-@print{} La radice quadrata di 3 @`e 1.73205
-@kbd{5}
-@print{} La radice quadrata di 5 @`e 2.23607
-@kbd{Ctrl-d}
-@end example
-
-Una funzione pu@`o avere anche effetti collaterali, come assegnare
-valori a certe variabili o effettuare operazioni di I/O.
-Questo programma mostra come la funzione @code{match()}
-(@pxref{Funzioni per stringhe})
-cambia le variabili @code{RSTART} e @code{RLENGTH}:
-
-@example
-@{
- if (match($1, $2))
- print RSTART, RLENGTH
- else
- print "non uguali"
-@}
-@end example
-
-@noindent
-Qui vediamo un'esecuzione di esempio:
-
-@example
-$ @kbd{awk -f matchit.awk}
-@kbd{aaccdd c+}
-@print{} 3 2
-@kbd{pippo pluto}
-@print{} non uguali
-@kbd{abcdefg e}
-@print{} 5 1
-@end example
-
-@node Precedenza
-@section Precedenza degli operatori (Come si nidificano gli operatori)
-@cindex precedenza
-@cindex operatori, precedenza
-
-La @dfn{precedenza degli operatori} determina come gli operatori vengono
-raggruppati quando diversi operatori appaiono uno vicino all'altro in
-un'espressione.
-Per esempio, @samp{*} ha una precedenza pi@`u alta di @samp{+}; cos@`{@dotless{i}},
-@samp{a + b * c} moltiplica @code{b} e @code{c}, e poi aggiunge @code{a} al
-prodotto (ovvero esegue @samp{a + (b * c)}).
-
-La normale precedenza degli operatori pu@`o essere cambiata usando delle
-parentesi. Si possono vedere le regole di precedenza come un modo per
-indicare dove si sarebbero dovute mettere delle parentesi. Di fatto,
-@`e cosa saggia usare sempre le parentesi
-in presenza di una combinazione di operatori insolita, perch@'e altre persone
-che leggono il programma potrebbero non ricordare quale sia la precedenza
-in quel particolare caso.
-Anche dei programmatori esperti a volte dimenticano le regole esatte,
-il che porta a commettere errori.
-Usare esplicitamente le parentesi previene qualunque errore
-di questo tipo.
-
-Quando vengono usati insieme operatori con uguale precedenza, quello pi@`u a
-sinistra viene raggruppato per primo, ad eccezione degli operatori di
-assegnamento, condizionali e di elevamento a potenza, che vengono raggruppati
-nell'ordine opposto.
-Quindi, @samp{a - b + c} raggruppa come @samp{(a - b) + c} e
-@samp{a = b = c} raggruppa come @samp{a = (b = c)}.
-
-Normalmente la precedenza degli operatori unari di prefisso non ha importanza,
-perch@'e c'@`e un solo modo di interpretarli: prima il pi@`u interno. Quindi,
-@samp{$++i} significa @samp{$(++i)} e
-@samp{++$x} significa @samp{++($x)}. Tuttavia, quando un altro operatore segue
-l'operando, la precedenza degli operatori unari pu@`o avere importanza.
-@samp{$x^2} significa @samp{($x)^2}, ma @samp{-x^2} significa
-@samp{-(x^2)}, perch@'e @samp{-} ha precedenza pi@`u bassa rispetto a @samp{^},
-mentre @samp{$} ha precedenza pi@`u alta.
-Inoltre, gli operatori non possono essere combinati in modo tale da violare le
-regole di precedenza; per esempio, @samp{$$0++--} non @`e un'espressione valida
-perch@'e il primo @samp{$} ha precedenza pi@`u alta di
-@samp{++}; per evitare il problema l'espressione pu@`o essere scritta come
-@samp{$($0++)--}.
-
-Questa lista illustra gli operatori di @command{awk}, in ordine di precedenza
-dalla pi@`u alta alla pi@`u bassa:
-
-@c @asis for docbook to come out right
-@table @asis
-@item @code{(}@dots{}@code{)}
-Raggruppamento.
-
-@cindex @code{$} (dollaro), operatore di campo @code{$}
-@cindex dollaro (@code{$}), operatore di campo @code{$}
-@item @code{$}
-Riferimento a un campo.
-
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@cindex @code{-} (meno), operatore @code{--}
-@cindex meno (@code{-}), operatore @code{--}
-@item @code{++ --}
-Incremento, decremento.
-
-@cindex @code{^} (circonflesso), operatore @code{^}
-@cindex circonflesso (@code{^}), operatore @code{^}
-@cindex @code{*} (asterisco), operatore @code{**}
-@cindex asterisco (@code{*}), operatore @code{**}
-@item @code{^ **}
-Elevamento a potenza. Questi operatori sono raggruppati da destra verso
-sinistra.
-
-@cindex @code{+} (pi@`u), operatore @code{+}
-@cindex pi@`u (@code{+}), operatore @code{+}
-@cindex @code{-} (meno), operatore @code{-}
-@cindex meno (@code{-}), operatore @code{-}
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@item @code{+ - !}
-Pi@`u, meno, ``not'' logico, unari.
-
-@cindex @code{*} (asterisco), operatore @code{*}, come operatore di moltiplicazione
-@cindex asterisco (@code{*}), operatore @code{*}, come operatore di moltiplicazione
-@cindex @code{/} (barra), operatore @code{/}
-@cindex barra (@code{/}), operatore @code{/}
-@cindex @code{%} (percento), operatore @code{%}
-@cindex percento (@code{%}), operatore @code{%}
-@item @code{* / %}
-Moltiplicazione, divisione, resto di una divisione.
-
-@cindex @code{+} (pi@`u), operatore @code{+}
-@cindex pi@`u (@code{+}), operatore @code{+}
-@cindex @code{-} (meno), operatore @code{-}
-@cindex meno (@code{-}), operatore @code{-}
-@item @code{+ -}
-Addizione, sottrazione.
-
-@item Concatenazione di stringhe
-Non c'@`e un simbolo speciale per la concatenazione.
-Gli operandi sono semplicemente scritti uno accanto all'altro.
-(@pxref{Concatenazione}).
-
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>}
-@cindex @code{=} (uguale), operatore @code{==}
-@cindex uguale (@code{=}), operatore @code{==}
-@cindex @code{!} (punto esclamativo), operatore @code{!=}
-@cindex punto esclamativo (@code{!}), operatore @code{!=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
-@cindex operatori, input/output
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
-@cindex operatori, input/output
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@item @code{< <= == != > >= >> | |&}
-Operatori relazionali e ridirezione.
-Gli operatori relazionali e le ridirezioni hanno lo stesso livello di
-precedenza. I caratteri come @samp{>} servono sia come operatori relazionali
-che come ridirezioni; la distinzione tra i due significati dipende dal
-contesto.
-
-@cindex istruzione @code{print}, operatori I/O nell'
-@cindex istruzione @code{printf}, operatori I/O nell'
-Si noti che gli operatori di ridirezione I/O nelle istruzioni @code{print} e
-@code{printf} appartengono al livello dell'istruzione, non alle espressioni.
-La ridirezione non produce un'espressione che potrebbe essere l'operando di un
-altro operatore. Di conseguenza, non ha senso usare un operatore di
-ridirezione vicino a un altro operatore con precedenza pi@`u bassa senza
-parentesi. Tali combinazioni generano errori di sintassi
-(p.es., @samp{print pippo > a ? b : c}).
-Il modo corretto di scrivere quest'istruzione @`e @samp{print pippo > (a ? b : c)}.
-
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@item @code{~ !~}
-Corrispondenza, non corrispondenza.
-
-@cindex @code{in}, operatore
-@item @code{in}
-Appartenenza a un vettore.
-
-@cindex @code{&} (e commerciale), operatore @code{&&}
-@cindex e commerciale (@code{&}), operatore @code{&&}
-@item @code{&&}
-``and'' logico.
-
-@cindex @code{|} (barra verticale), operatore @code{||}
-@cindex barra verticale (@code{|}), operatore @code{||}
-@item @code{||}
-``or'' logico.
-
-@cindex @code{?} (punto interrogativo), operatore @code{?:}
-@cindex punto interrogativo (@code{?}), operatore @code{?:}
-@item @code{?:}
-Operatore condizionale. Questo operatore raggruppa da destra verso sinistra.
-
-@cindex @code{+} (pi@`u), operatore @code{+=}
-@cindex pi@`u (@code{+}), operatore @code{+=}
-@cindex @code{-} (meno), operatore @code{-=}
-@cindex meno (@code{-}), operatore @code{-=}
-@cindex @code{*} (asterisco), operatore @code{*=}
-@cindex asterisco (@code{*}), operatore @code{*=}
-@cindex @code{*} (asterisco), operatore @code{**=}
-@cindex asterisco (@code{*}), operatore @code{**=}
-@cindex @code{/} (barra), operatore @code{/=}
-@cindex barra (@code{/}), operatore @code{/=}
-@cindex @code{%} (percento), operatore @code{%=}
-@cindex percento (@code{%}), operatore @code{%=}
-@cindex @code{^} (circonflesso), operatore @code{^=}
-@cindex circonflesso (@code{^}), operatore @code{^=}
-@item @code{= += -= *= /= %= ^= **=}
-Assegnamento. Questi operatori raggruppano da destra verso sinistra.
-@end table
-
-@cindex POSIX @command{awk}, @code{**} e
-@cindex portabilit@`a, operatori, non in POSIX @command{awk}
-@quotation NOTA
-Gli operatori @samp{|&}, @samp{**} e @samp{**=} non sono definiti da POSIX.
-Per la massima portabilit@`a, @`e meglio non usarli.
-@end quotation
-
-@node Localizzazioni
-@section Il luogo fa la differenza
-@cindex localizzazione, definizione di
-
-I moderni sistemi prevedono la nozione di @dfn{localizzazione}: un modo per
-informare il sistema sulla serie di caratteri e sulla lingua locali.
-Lo standard ISO C definisce una localizzazione di default @code{"C"}, che @`e
-l'ambiente tipico a cui molti programmatori in C sono abituati.
-
-Un tempo, le impostazioni della localizzazione avevano influenza sulla
-ricerca di corrispondenze tramite @dfn{regexp}, ma ora non @`e pi@`u cos@`{@dotless{i}}
-(@pxref{Intervalli e localizzazione}).
-
-La localizzazione pu@`o influire sulla separazione dei record. Per il caso
-normale di @samp{RS = "\n"}, la localizzazione @`e generalmente irrilevante.
-Per altri separatori di record di un solo carattere, impostare
-la variabile d'ambiente @samp{LC_ALL=C}
-garantisce una migliore efficienza nella lettura dei record. Altrimenti,
-@command{gawk} dovrebbe fare diverse chiamate di funzione, @emph{per ogni
-carattere in input}, per determinare la fine del record.
-
-La localizzazione pu@`o influire sulla formattazione delle date e delle ore
-(@pxref{Funzioni di tempo}). Per esempio, un modo comune per abbreviare la
-data 4 settembre 2015, negli Stati Uniti @`e ``9/4/15.'' In molti paesi
-dell'Europa, invece, l'abbreviazione @`e "4.9.15". Quindi, la specifica di
-formato
-@code{%x} in una localizzazione @code{"US"} potrebbe produrre @samp{9/4/15},
-mentre in una localizzazione @code{"EUROPA"}, potrebbe produrre @samp{4.9.15}.
-
-Secondo POSIX, anche il confronto tra stringhe @`e influenzato dalla
-localizzazione (come nelle espressioni regolari). I dettagli sono descritti in
-@ref{Confronto POSIX di stringhe}.
-
-Infine, la localizzazione influenza il valore del separatore decimale
-usato quando @command{gawk} analizza i dati in input. Questo @`e stato
-trattato nel dettaglio in @ref{Conversione}.
-
-@node Sommario delle espressioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Le espressioni sono gli elementi base dei calcoli eseguiti nei programmi.
-Sono costruite a partire da costanti, variabili, chiamate di funzione e dalla
-combinazione di vari tipi di valori tramite operatori.
-
-@item
-@command{awk} fornisce tre tipi di costanti: numerica, di stringa e
-di @dfn{regexp}. Le costanti numeriche in @command{gawk} si possono
-specificare nei sistemi ottale ed esadecimale (con base 8 e 16), e anche nel
-sistema decimale (base 10). In alcuni contesti, una costante @dfn{regexp}
-isolata come @code{/pippo/} ha lo stesso significato di @samp{$0 ~ /pippo/}.
-
-@item
-Le variabili contengono valori che possono essere usati diverse volte nei
-calcoli. Un certo numero di variabili predefinite forniscono informazioni al
-programma @command{awk}, mentre altre permettono il controllo del comportamento
-di @command{awk}.
-
-@item
-I numeri sono automaticamente convertiti in stringhe, e le stringhe in numeri,
-a seconda delle necessit@`a di @command{awk}. I valori numerici sono convertiti
-come se fossero formattati con @code{sprintf()} usando il formato contenuto in
-@code{CONVFMT}. La localizzazione pu@`o influire sulle conversioni.
-
-@item
-In @command{awk} ci sono gli operatori aritmetici di uso comune (addizione,
-sottrazione, moltiplicazione, divisione, modulo), e il pi@`u e il meno unari.
-Ci sono anche operatori di confronto, operatori booleani, una verifica
-dell'esistenza di una chiave in
-un vettore, e operatori per la ricerca di corrispondenze con espressioni
-regolari. La concatenazione di stringhe @`e effettuata mettendo due espressioni
-una vicino all'altra; non c'@`e nessun operatore esplicito.
-L'operatore con tre operandi @samp{?:} fornisce una verifica ``if-else''
-all'interno delle espressioni.
-
-@item
-Gli operatori di assegnamento forniscono delle comode forme brevi per le comuni
-operazioni aritmetiche.
-
-@item
-In @command{awk}, un valore @`e considerato vero se @`e diverso da zero
-@emph{oppure} non nullo. Altrimenti, il valore @`e falso.
-
-@item
-Il tipo di una variabile viene impostata a ogni assegnamento e pu@`o cambiare
-durante il suo ciclo di vita. Il tipo determina il comportamento della
-variabile nei confronti (di tipo stringa o numerici).
-
-@item
-Le chiamate di funzione restituiscono un valore che pu@`o essere usato come parte
-di un'espressione pi@`u lunga. Le espressioni usate per passare valori di
-parametro vengono valutate completamente prima di chiamare la funzione.
-@command{awk} fornisce funzioni predefinite e prevede quelle definite
-dall'utente; questo @`e descritto in
-@ref{Funzioni}.
-
-@item
-La precedenza degli operatori specifica l'ordine secondo il quale vengono
-effettuate le operazioni, a meno che quest'ordine non sia esplicitamente
-alterato
-tramite parentesi. Le regole di precedenza degli operatori di @command{awk}
-sono compatibili con quelle del linguaggio C.
-
-@item
-La localizzazione pu@`o influire sul formato dei dati in uscita da un programma
-@command{awk}, e occasionalmente sul formato dei dati letti in input.
-
-@end itemize
-
-@node Criteri di ricerca e azioni
-@chapter Criteri di ricerca, azioni e variabili
-@cindex criteri di ricerca
-@cindex @dfn{pattern}, si veda criteri di ricerca
-@cindex espressione di ricerca
-
-Come gi@`a visto, ogni istruzione @command{awk} consiste di un criterio di
-ricerca [@dfn{pattern}] a cui @`e associata un'azione. Questo @value{CHAPTER}
-descrive come specificare criteri e azioni, cosa @`e possibile
-fare tramite le azioni e quali sono le variabili predefinite in
-@command{awk}.
-
-Le regole @dfn{criterio di ricerca--azione} e le istruzioni che si possono
-dare all'interno delle azioni formano il nucleo centrale dei programmi
-scritti in @command{awk}.
-In un certo senso, tutto quanto si @`e visto finora costituisce le fondamenta
-sulle quali sono costruiti i programmi. @`E giunto il momento di iniziare a
-costruire qualcosa di utile.
-
-@menu
-* Panoramica sui criteri di ricerca:: Come scrivere un criterio di ricerca.
-* Usare variabili di shell:: come usare variabili della shell in
- @command{awk}.
-* Panoramica sulle azioni:: Come scrivere un'azione.
-* Istruzioni:: Descrizione dettagliata delle varie
- istruzioni di controllo.
-* Variabili predefinite:: Sommario delle variabili predefinite.
-* Sommario criteri e azioni:: Sommario di criteri di ricerca e azioni.
-@end menu
-
-@node Panoramica sui criteri di ricerca
-@section Elementi di un criterio di ricerca
-
-@menu
-* @dfn{regexp} come criteri di ricerca:: Usare espressioni regolari come
- criteri di ricerca.
-* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
- criterio di ricerca.
-* Intervalli:: Coppie di espressioni regolari per
- delimitare una ricerca.
-* BEGIN/END:: Specificare regole di inizio e fine programma.
-* BEGINFILE/ENDFILE:: Due condizioni speciali per controlli avanzati.
-* Vuoto:: Il criterio di ricerca vuoto, che
- corrisponde a ogni record.
-@end menu
-
-@cindex criteri di ricerca, tipi di
-I criteri di ricerca in @command{awk} controllano l'esecuzione di
-azioni: un'azione viene eseguita
-quando il criterio di ricerca associato ad essa @`e soddisfatto dal
-record in input corrente.
-La tabella seguente @`e un sommario dei tipi di criteri di ricerca in
-@command{awk}:
-
-@table @code
-@item /@var{espressione regolare}/
-Un'espressione regolare. @`E verificata quando il testo di un
-record in input corrisponde all'espressione regolare.
-@iftex
-(@xrefIl{Espressioni regolari}.)
-@end iftex
-@ifnottex
-(@xref{Espressioni regolari}.)
-@end ifnottex
-
-@item @var{espressione}
-Una singola espressione. @`E verificata quando il suo valore @`e
-diverso da zero (se di tipo numerico) o non nullo (se @`e una stringa).
-(@xref{Espressioni come criteri di ricerca}.)
-
-@item @var{inizio_interv}, @var{fine_interv}
-Una coppia di criteri di ricerca separati da una virgola, che specificano un
-@dfn{intervallo} di record.
-L'intervallo comprende sia il record iniziale che corrisponde a @var{inizio_interv}
-sia il record finale che corrisponde a @var{fine_interv}.
-(@xref{Intervalli}.)
-
-@item BEGIN
-@itemx END
-Criteri di ricerca speciali che consentono azioni di inizializzazione o
-di pulizia in un programma @command{awk}.
-(@xref{BEGIN/END}.)
-
-@item BEGINFILE
-@itemx ENDFILE
-Criteri di ricerca speciali che consentono azioni di inizializzazione o di
-pulizia da eseguire all'inizio o alla fine di ogni file in input.
-(@xref{BEGINFILE/ENDFILE}.)
-
-@item @var{vuoto}
-Il criterio di ricerca vuoto corrisponde a ciascun record in input.
-(@xref{Vuoto}.)
-@end table
-
-@node @dfn{regexp} come criteri di ricerca
-@subsection Espressioni regolari come criteri di ricerca
-@cindex criteri di ricerca, espressioni come
-@cindex espressioni regolari, come criteri di ricerca
-
-Le espressioni regolari sono uno dei primi tipi di criteri di ricerca
-presentati in questo @value{DOCUMENT}.
-Questo tipo di criterio di ricerca @`e semplicemente una costante @dfn{regexp}
-posta nella parte @dfn{criterio di ricerca} di una regola. Equivale a
-scrivere @samp{$0 ~ /@var{criterio di ricerca}/}.
-Il criterio di ricerca @`e verificato quando il record in input corrisponde
-alla @dfn{regexp}.
-Per esempio:
-
-@example
-/pippo|pluto|paperino/ @{ personaggi_Disney++ @}
-END @{ print personaggi_Disney, "Personaggi Disney visti" @}
-@end example
-
-@node Espressioni come criteri di ricerca
-@subsection Espressioni come criteri di ricerca
-@cindex espressioni regolari, come criteri di ricerca
-
-Qualsiasi espressione @command{awk} pu@`o essere usata come un criterio di
-ricerca @command{awk}.
-Il criterio di ricerca @`e verificato se il valore dell'espressione @`e diverso
-da zero (se @`e un numero), o non nullo (se @`e una stringa).
-L'espressione @`e ricalcolata ogni volta che la regola viene applicata a un
-nuovo record in input. Se l'espressione usa campi come @code{$1}, il suo
-valore dipende direttamente dal contenuto del record in input appena letto;
-altrimenti, dipende solo da quel che @`e accaduto fino a quel momento durante
-l'esecuzione del programma @command{awk}.
-
-@cindex espressioni di confronto, come criteri di ricerca
-@cindex criteri di ricerca, espressioni di confronto come
-Le espressioni di confronto, che usano gli operatori di confronto descritti in
-@ref{Tipi di variabile e confronti},
-sono un tipo di criterio di ricerca usato frequentemente.
-Anche le @dfn{regexp}, verificate o non verificate, sono tipi di espressioni molto frequenti.
-L'operando a sinistra degli operatori @samp{~} e @samp{!~} @`e una stringa.
-L'operando di destra @`e un'espressione regolare costante delimitata da
-barre (@code{/@var{@dfn{regexp}}/}) o qualsiasi espressione il cui valore come
-stringa @`e usato come un'espressione regolare dinamica
-(@pxref{Espressioni regolari calcolate}).
-L'esempio seguente stampa il secondo campo di ogni record in input
-il cui primo campo sia esattamente @samp{li}:
-
-@cindex @code{/} (barra), criteri di ricerca e
-@cindex barra (@code{/}), criteri di ricerca e
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@example
-$ @kbd{awk '$1 == "li" @{ print $2 @}' mail-list}
-@end example
-
-@noindent
-(Il programma non stampa alcun output, perch@'e nessuna persona ha come nome esattamente @samp{li}.)
-Si veda la differenza con il seguente confronto di espressione regolare, che
-individua invece qualsiasi record il cui primo campo @emph{contenga} @samp{li}:
-
-@example
-$ @kbd{awk '$1 ~ /li/ @{ print $2 @}' mail-list}
-@print{} 555-5553
-@print{} 555-6699
-@end example
-
-@cindex @dfn{regexp}, costanti, come criteri di ricerca
-@cindex criteri di ricerca, costanti @dfn{regexp} come
-Una costante @dfn{regexp} usata come criterio di ricerca @`e anche un
-caso speciale di criterio di ricerca costituito da un'espressione.
-All'espressione @code{/li/} viene assegnato il valore uno se @samp{li}
-viene trovato nel record in input corrente. Quindi, come criterio di ricerca,
-@code{/li/} individua tutti i record che contengono la stringa @samp{li}.
-
-@cindex espressioni booleane, come criteri di ricerca
-Anche le espressioni booleane sono frequentemente usate come criteri di
-ricerca. Se un criterio di ricerca
-individua o no un record in input dipende dalla verifica delle
-sottoespressioni da cui @`e composto.
-Per esempio, il seguente comando stampa tutti i record in
-@file{mail-list} che contengono sia @samp{edu} che @samp{li}:
-
-@example
-$ @kbd{awk '/edu/ && /li/' mail-list}
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@end example
-
-Il seguente comando stampa tutti i record in
-@file{mail-list} che contengono @samp{edu} @emph{oppure} @samp{li}
-(o entrambi, naturalmente):
-
-@example
-$ @kbd{awk '/edu/ || /li/' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-Il seguente comando stampa tutti i record in
-@file{mail-list} che @emph{non} contengono la stringa @samp{li}:
-
-@example
-$ @kbd{awk '! /li/' mail-list}
-@print{} Anthony 555-3412 anthony.asserturo@@hotmail.com A
-@print{} Becky 555-7685 becky.algebrarum@@gmail.com A
-@print{} Bill 555-1675 bill.drowning@@hotmail.com A
-@print{} Camilla 555-2912 camilla.infusarum@@skynet.be R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Martin 555-6480 martin.codicibus@@hotmail.com A
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{END}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{BEGINFILE}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{ENDFILE}, criterio di ricerca, criteri di ricerca booleani e
-Le sottoespressioni di un'operatore booleano in un criterio di ricerca possono
-essere espressioni regolari costanti, confronti, o qualsiasi altra espressione
-di @command{awk}. Gli intervalli di ricerca
-non sono espressioni, e quindi non possono apparire all'interno di
-criteri di ricerca booleani. Analogamente, i criteri di ricerca speciali
-@code{BEGIN}, @code{END}, @code{BEGINFILE} ed @code{ENDFILE},
-che non corrispondono ad alcun record in input, non sono espressioni e non
-possono essere usati all'interno di criteri di ricerca booleani.
-
-L'ordine di precedenza dei differenti operatori che possono essere usati nei
-criteri di ricerca @`e descritto in @ref{Precedenza}.
-
-@node Intervalli
-@subsection Specificare intervalli di record con i criteri di ricerca
-
-@cindex intervalli di ricerca
-@cindex criteri di ricerca, intervalli nei
-@cindex righe, individuare intervalli di
-@cindex @code{,} (virgola), negli intervalli di ricerca
-@cindex virgola (@code{,}), negli intervalli di ricerca
-Un @dfn{intervallo di ricerca} @`e composto da due criteri di ricerca
-separati da una virgola, nella forma
-@samp{@var{inizio_intervallo}, @var{fine_intervallo}}. @`E usato per
-individuare
-una serie di record consecutivi nei file in input. Il primo criterio di
-ricerca, @var{inizio_intervallo}, controlla dove inizia la serie di record,
-mentre @var{fine_intervallo} controlla dove finisce la serie stessa.
-L'esempio seguente:
-
-@example
-awk '$1 == "on", $1 == "off"' miofile
-@end example
-
-@noindent
-stampa ogni record in @file{miofile} incluso tra i due record che iniziano con
-@samp{on}/@samp{off}, estremi compresi.
-
-Un intervallo di ricerca inizia con la valutazione di
-@var{inizio_intervallo} per ogni record in input. Quando un record soddisfa
-la condizione @var{inizio_intervallo}, l'intervallo di ricerca @`e
-@dfn{attivato} e l'intervallo di ricerca include anche quel
-record. Finch@'e l'intervallo di ricerca rimane attivo,
-automaticamente vengono trovate corrispondenze in ogni record in input letto.
-L'intervallo di ricerca verifica anche @var{fine_intervallo} per ogni
-record in input; quando la verifica ha successo, il
-criterio di ricerca viene @dfn{disattivato} a partire dal record seguente.
-Quindi il criterio di ricerca torna a controllare
-@var{inizio_intervallo} per ogni nuovo record.
-
-@cindex @code{if}, istruzione, azioni@comma{} modificabili
-Il record che segnala l'inizio dell'intervallo
-di ricerca e quello che segnala la fine di quell'intervallo soddisfano
-@emph{entrambi} il criterio di ricerca. Se non si vuole agire su tali record
-si possono scrivere istruzioni @code{if} nella parte @dfn{azione} della regola
-per distinguerli dai record che il programma @`e interessato a trattare.
-
-@`E possibile che un criterio di ricerca sia attivato e disattivato dallo
-stesso record. Se il record soddisfa entrambe le condizioni, l'azione @`e
-eseguita solo su quel record.
-Per esempio, si supponga che ci sia un testo tra due separatori identici
-(p.es., il simbolo @samp{%}), ognuno dei quali sia su una riga a parte, che
-dovrebbero essere ignorati. Un primo tentativo potrebbe essere quello di
-combinare un intervallo di ricerca che descrive il
-testo delimitato con l'istruzione
-@code{next}
-(non ancora introdotta, @pxref{Istruzione next}).
-Con quest'istruzione @command{awk} non effettua alcuna azione sul record
-corrente e inizia di nuovo a elaborare il successivo record in input.
-Un tale programma @`e simile a questo:
-
-@example
-/^%$/,/^%$/ @{ next @}
- @{ print @}
-@end example
-
-@noindent
-@cindex righe, saltare tra delimitatori
-@c @cindex @dfn{flag} variables
-Questo programma non funziona, perch@'e l'intervallo di ricerca @`e sia attivato
-che disattivato dalla prima riga incontrata, quella costituita da un @samp{%}.
-Per ottenere l'effetto desiderato, si scriva il programma nella maniera che
-segue, utilizzando un @dfn{flag}:
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@example
-/^%$/ @{ ignora = ! ignora; next @}
-ignora == 1 @{ next @} # ignora righe quando `ignora' @`e impostato a 1
-@end example
-
-In un intervallo di ricerca, la virgola (@samp{,}) ha la
-precedenza pi@`u bassa tra tutti gli operatori (cio@`e, @`e l'ultima a essere
-valutata). Il programma seguente tenta di combinare un intervallo di
-ricerca con un altro controllo, pi@`u semplice:
-
-@example
-echo Yes | awk '/1/,/2/ || /Yes/'
-@end example
-
-L'intenzione in questo programma @`e quello di esprimere le condizioni
-@samp{(/1/,/2/) || /Yes/}.
-Tuttavia, @command{awk} lo interpreta come se fosse
-@samp{/1/, (/2/ || /Yes/)}.
-Questo comportamento non pu@`o essere cambiato o evitato; gli intervalli di
-ricerca non si possono combinare con altri criteri di ricerca:
-
-@example
-$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
-@error{} gawk: riga com.:1: (/1/,/2/) || /Yes/
-@error{} gawk: riga com.:1: ^ syntax error
-@end example
-
-@cindex intervalli di ricerca, continuazione di riga e
-Come punto di secondaria importanza, nonostante sia stilisticamente poco elegante,
-lo standard POSIX consente di andare a capo dopo la virgola
-in un intervallo di ricerca. @value{DARKCORNER}
-@node BEGIN/END
-@subsection I criteri di ricerca speciali @code{BEGIN} ed @code{END}
-
-@cindex @code{BEGIN}, criterio di ricerca
-@cindex @code{END}, criterio di ricerca
-@cindex criterio di ricerca @code{END}
-Tutti i criteri di ricerca fin qui descritti servono a individuare dei record
-in input.
-I criteri di ricerca speciali @code{BEGIN} ed @code{END} non hanno questo scopo.
-Servono invece per effettuare azioni di inizializzazione o di pulizia nei
-programmi @command{awk}.
-Le regole @code{BEGIN} ed @code{END} devono prevedere azioni; non c'@`e
-un'azione di default per queste regole, perch@'e non c'@`e un record corrente
-quando sono invocate.
-Le regole @code{BEGIN} ed @code{END} sono spesso chiamate
-``blocchi @code{BEGIN} ed @code{END}'' da programmatori che usano @command{awk}
-da molto tempo.
-
-@menu
-* Usare BEGIN/END:: Come e perch@'e usare regole BEGIN/END.
-* I/O e BEGIN/END:: Problemi di I/O nelle regole BEGIN/END.
-@end menu
-
-@node Usare BEGIN/END
-@subsubsection Azioni di inizializzazione e pulizia
-
-@cindex @code{BEGIN}, criterio di ricerca
-@cindex criterio di ricerca @code{BEGIN}
-@cindex @code{END}, criterio di ricerca
-@cindex criterio di ricerca @code{END}
-Una regola @code{BEGIN} @`e eseguita solo una volta, prima che sia letto il
-primo record in input. Analogamente, una regola @code{END} @`e eseguita
-solo una volta, dopo che tutto l'input @`e gi@`a stato letto. Per esempio:
-
-@example
-$ @kbd{awk '}
-> @kbd{BEGIN @{ print "Analisi di \"li\"" @}}
-> @kbd{/li/ @{ ++n @}}
-> @kbd{END @{ print "\"li\" @`e presente in", n, "record." @}' mail-list}
-@print{} Analisi di "li"
-@print{} "li" @`e presente in 4 record.
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, operatori e
-@cindex @code{END}, criterio di ricerca, operatori e
-@cindex criterio di ricerca @code{END}, operatori e
-Questo programma trova il numero di record nel file in input
-@file{mail-list} che contengono la stringa @samp{li}. La regola @code{BEGIN}
-stampa un titolo per il rapporto. Non c'@`e bisogno di usare la regola
-@code{BEGIN} per inizializzare il contatore @code{n} a zero, poich@'e
-@command{awk} lo fa
-automaticamente (@pxref{Variabili}).
-La seconda regola incrementa la variabile @code{n} ogni volta che si legge
-un record che soddisfa il criterio di ricerca @samp{li}. La regola @code{END}
-stampa il valore di @code{n} alla fine del programma.
-
-I criteri di ricerca speciali @code{BEGIN} ed @code{END} non possono essere
-usati negli intervalli,
-o con operatori booleani (in effetti, non possono essere combinati con nessun
-altro operatore).
-Un programma @command{awk} pu@`o avere molte regole @code{BEGIN} e/o @code{END}.
-Queste sono eseguite nell'ordine in cui compaiono nel programma: tutte le
-regole @code{BEGIN} a inizio programma e tutte le regole @code{END}
-a fine programma.
-Le regole @code{BEGIN} ed @code{END} possono apparire in qualsiasi
-posizione all'interno del programma.
-Questa funzionalit@`a @`e stata aggiunta nella versione 1987 di @command{awk} ed
-@`e inclusa nello standard POSIX.
-La versione originale (1978) di @command{awk} richiedeva che la regola
-@code{BEGIN} fosse posta all'inizio del programma, e la regola
-@code{END} alla fine del programma, e solo una regola per tipo era ammessa.
-Ci@`o non @`e pi@`u obbligatorio, ma @`e una buona idea continuare a seguire questo
-modello per migliorare l'organizzazione e la leggibilit@`a del programma.
-
-Regole multiple @code{BEGIN} ed @code{END} sono utili per scrivere funzioni
-di libreria, poich@'e ogni file di libreria pu@`o avere la sua propria regola
-@code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o pulizia.
-L'ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi
-determina l'ordine in cui le rispettive regole @code{BEGIN} ed @code{END} sono
-eseguite. Per questo motivi, occorre prestare attenzione nello scrivere tali
-regole nei file di libreria, in modo che non sia importante
-l'ordine in cui tali regole vengono eseguite.
-@xref{Opzioni} per maggiori informazioni sull'uso di funzioni di libreria.
-@iftex
-@xrefil{Funzioni di libreria},
-@end iftex
-@ifnottex
-@xref{Funzioni di libreria},
-@end ifnottex
-per parecchie utili funzioni di libreria.
-
-Se un programma @command{awk} ha solo regole @code{BEGIN} e nessun'altra
-regola, il programma esce dopo aver eseguito le regole
-@code{BEGIN}.@footnote{La versione originale di @command{awk} continuava a
-leggere e ignorare i record in input fino alla fine del file.} Tuttavia, se
-una regola @code{END} esiste, l'intero input @`e letto, anche se non sono
-presenti altre regole nel programma. Ci@`o viene fatto necessariamente
-per permettere che
-la regola @code{END} faccia uso delle variabili @code{FNR} e @code{NR}.
-
-@node I/O e BEGIN/END
-@subsubsection Input/Output dalle regole @code{BEGIN} ed @code{END}
-
-@cindex input/output, dalle regole @code{BEGIN} ed @code{END}
-Ci sono parecchi punti (talora insidiosi) da tener presente se si fa dell'I/O
-all'interno di una regola @code{BEGIN} o @code{END}.
-Il primo ha a che fare con il valore di @code{$0} in una regola @code{BEGIN}.
-Poich@'e le regole @code{BEGIN} sono eseguite prima delle lettura di qualsiasi
-input, non c'@`e assolutamente alcun record in input, e quindi nessun campo,
-quando si eseguono delle regole @code{BEGIN}. I riferimento a @code{$0} e ai
-campi restituiscono una stringa nulla o zero, a seconda del contesto.
-Un modo per assegnare un valore effettivo a @code{$0} @`e di eseguire un
-comando @code{getline} senza indicare una variabile (@pxref{Getline}).
-Un altro modo @`e semplicemente quello di assegnare un valore a @code{$0}.
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGIN}/@code{END}
-@cindex POSIX @command{awk}, criteri di ricerca @code{BEGIN}/@code{END}
-@cindex @code{print}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{print} e
-@cindex @code{END}, criterio di ricerca, istruzione @code{print} e
-Il secondo punto @`e simile al primo, ma in direzione opposta.
-Tradizionalmente, pi@`u che altro per problemi di implementazione, @code{$0}
-e @code{NF} erano @emph{indefiniti} all'interno di una regola @code{END}.
-Lo standard POSIX prescrive che @code{NF} sia disponibile all'interno di una
-regola @code{END}. Contiene il numero di campi dell'ultimo record in input.
-Probabilmente per una svista, lo standard non specifica che @`e reso
-disponibile anche @code{$0}, sebbene possa apparire logico che sia cos@`{@dotless{i}}.
-In effetti, BWK @command{awk}, @command{mawk} e @command{gawk} mantengono il
-valore di @code{$0} in modo che sia possibile usarlo all'interno delle regole
-@code{END}. Occorre peraltro tener presente che alcune altre implementazioni
-e parecchie tra le versioni pi@`u vecchie di Unix @command{awk} non si
-comportano cos@`{@dotless{i}}.
-
-Il terzo punto @`e una conseguenza dei primi due. Il significato di
-@samp{print}
-all'interno di una regola @code{BEGIN} o @code{END} @`e quello di sempre:
-@samp{print $0}. Se @code{$0} @`e la stringa nulla, stampa una riga vuota.
-Molti programmatori di lungo corso di @command{awk} usano un semplice
-@samp{print} all'interno delle regole @code{BEGIN} ed @code{END},
-intendendo @samp{@w{print ""}}, contando sul fatto che @code{$0} sia una
-stringa nulla. Sebbene questo funzioni solitamente con le regole
-@code{BEGIN}, @`e una pessima idea nelle regole @code{END},
-almeno in @command{gawk}. @`E anche stilisticamente inelegante, perch@'e se
-serve una riga vuota in output, il programma dovrebbe stamparne
-una esplicitamente.
-
-@cindex @code{next}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-Per finire, le istruzioni @code{next} e @code{nextfile} non sono consentite
-all'interno di una regola @code{BEGIN}, perch@'e il ciclo implicito
-leggi-un-record-e-confrontalo-con-le-regole non @`e ancora iniziato.
-Analogamente, tali istruzioni non sono valide all'interno di una regola
-@code{END}, perch@'e tutto l'input @`e gi@`a stato letto.
-(@xref{Istruzione next} e
-@ifnotdocbook
-@pxref{Istruzione nextfile}.)
-@end ifnotdocbook
-@ifdocbook
-@ref{Istruzione nextfile}.)
-@end ifdocbook
-
-@node BEGINFILE/ENDFILE
-@subsection I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-@cindex @code{BEGINFILE}, criterio di ricerca
-@cindex @code{ENDFILE}, criterio di ricerca
-@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE}
-
-Questa @value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-Due tipi speciali di criterio di ricerca, @code{BEGINFILE} ed @code{ENDFILE},
-forniscono
-degli ``agganci'' per intervenire durante il ciclo di elaborazione dei file
-specificati sulla riga di comando di @command{gawk}.
-Come con le regole @code{BEGIN} ed @code{END}
-@ifnottex
-@ifnotdocbook
-(@pxref{BEGIN/END}),
-@end ifnotdocbook
-@end ifnottex
-@iftex
-(si veda la @value{SECTION} precedente),
-@end iftex
-@ifdocbook
-(si veda la @value{SECTION} precedente),
-@end ifdocbook
-tutte le regole @code{BEGINFILE} in un programma sono riunite, mantenendole
-nell'ordine in cui sono lette da @command{gawk} e lo stesso viene fatto
-per tutte le regole @code{ENDFILE}.
-
-Il corpo delle regole @code{BEGINFILE} @`e eseguito subito prima che
-@command{gawk} legga il primo record da un file. La variabile @code{FILENAME}
-@`e impostata al nome del file corrente e @code{FNR} @`e impostata a zero.
-
-La regola @code{BEGINFILE} d@`a la possibilit@`a di eseguire due compiti
-che sarebbe difficile o impossibile effettuare altrimenti:
-
-@itemize @value{BULLET}
-@item
-Si pu@`o verificare che il file sia leggibile. Di solito, se un file presente
-nella riga dei comandi non pu@`o essere aperto in lettura, il programma
-@command{gawk} viene terminato. Comunque, questo si pu@`o evitare, per poi
-passare a elaborare il file successivo specificato sulla riga dei comandi.
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile, con criterio di ricerca @code{BEGINFILE}
-@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-Questo controllo @`e fattibile controllando se la variabile @code{ERRNO} @`e
-diversa dalla stringa nulla; se @`e questo il caso, @command{gawk} non @`e
-riuscito ad aprire il file. In questo caso il programma pu@`o eseguire
-un'istruzione @code{nextfile}
-(@pxref{Istruzione nextfile}). In questo modo @command{gawk} salta
-completamente l'elaborazione di quel file.
-In caso contrario, @command{gawk} termina come al solito con un
-errore fatale.
-
-@item
-Se sono state scritte estensioni che modificano la gestione del record
-(tramite l'inserzione di un ``analizzatore di input'';
-@pxref{Analizzatori di input}), @`e possibile richiamarle
-a questo punto, prima che @command{gawk} inizi a elaborare il file.
-(Questa @`e una funzionalit@`a @emph{molto} avanzata, usata al momento solo dal
-@uref{http://sourceforge.net/projects/gawkextlib, progetto @code{gawkextlib}}.)
-@end itemize
-
-La regola @code{ENDFILE} @`e chiamata quando @command{gawk} ha finito di
-elaborare l'ultimo record di un file in input. Per l'ultimo file in input,
-@`e chiamata prima di ogni regola @code{END}.
-La regola @code{ENDFILE} @`e eseguita anche per file in input vuoti.
-
-Normalmente, se si verifica un errore di lettura durante il normale
-ciclo di elaborazione dell'input,
-questo @`e considerato fatale (il programma termina). Tuttavia, se @`e presente
-una regola @code{ENDFILE}, l'errore non @`e considerato fatale, ma viene
-impostato @code{ERRNO}. Ci@`o permette di intercettare ed elaborare errori
-di I/O a livello di programma @command{awk}.
-
-@cindex @code{next}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-L'istruzione @code{next} (@pxref{Istruzione next}) non @`e permessa all'interno
-di una regola @code{BEGINFILE} o @code{ENDFILE}. L'istruzione @code{nextfile}
-@`e consentita solo all'interno di una regola @code{BEGINFILE}, non all'interno
-di una regola @code{ENDFILE}.
-
-@cindex @code{getline}, comando, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-L'istruzione @code{getline} (@pxref{Getline}) @`e limitata all'interno sia di
-@code{BEGINFILE} che di @code{ENDFILE}: solo le forme ridirette di
-di @code{getline} sono permesse.
-
-@code{BEGINFILE} ed @code{ENDFILE} sono estensioni @command{gawk}.
-In molte altre implementazioni di @command{awk} o se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}), non sono regole speciali.
-
-@c FIXME: For 4.2 maybe deal with this?
-@ignore
-Date: Tue, 17 May 2011 02:06:10 PDT
-From: rankin@pactechdata.com (Pat Rankin)
-Message-Id: <110517015127.20240f4a@pactechdata.com>
-Subject: BEGINFILE
-To: arnold@skeeve.com
-
- The documentation for BEGINFILE states that FNR is 0, which seems
-pretty obvious. It doesn't mention what the value of $0 is, and that's
-not obvious. I think setting it to null before starting the BEGINFILE
-action would be preferable to leaving whatever was there in the last
-record of the previous file.
-
- ENDFILE can retain the last record in $0. I guess it has to if
-the END rule's actions see that value too. But the beginning of a new
-file doesn't just mean that the old one has been closed; the old file
-is being superseded, so leaving the old data around feels wrong to me.
-[If the user wants to keep it on hand, he or she can use an ENDFILE
-rule to grab it before moving on to the next file.]
-@end ignore
-
-@node Vuoto
-@subsection Il criterio di ricerca vuoto
-
-@cindex vuoto, criterio di ricerca
-@cindex criteri di ricerca vuoti
-Un criterio di ricerca vuoto (cio@`e omesso) corrisponde a
-@emph{ogni} record in input. Per esempio, il programma:
-
-@example
-awk '@{ print $1 @}' mail-list
-@end example
-
-@noindent
-stampa il primo campo di ogni record.
-
-@node Usare variabili di shell
-@section Usare variabili di shell in programmi
-@cindex shell, variabili di
-@cindex programmi @command{awk}, variabili di shell in
-@c @cindex shell and @command{awk} interaction
-
-I programmi @command{awk} sono spesso usati come componenti di programmi pi@`u
-ampi, scritti in un linguaggio di shell.
-Per esempio, @`e molto comune usare una variabile di shell per
-specificare un criterio di ricerca che il programma @command{awk} deve poi
-individuare.
-Ci sono due modi per rendere disponibile il valore di una variabile di shell
-all'interno di un programma @command{awk}.
-
-@cindex shell, uso di doppio apice
-Un modo comune @`e quello di usare i doppi apici per sostituire il valore della
-variabile nel progamma @command{awk} contenuto nello @dfn{script}:
-
-Per esempio, si consideri il programma seguente:
-
-@example
-printf "Immettere il criterio di ricerca: "
-read criterio_di_ricerca
-awk "/$criterio_di_ricerca/ "'@{ num_trov++ @}
- END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
-@end example
-
-@noindent
-Il programma @command{awk} consiste di due pezzi di testo tra apici
-che, concatenati insieme, formano il programma.
-La prima parte @`e tra doppi apici, per consentire la sostituzione della
-variabile di shell @code{criterio_di_ricerca} contenuta al loro interno.
-La seconda parte @`e racchiusa tra apici singoli.
-
-La sostituzione di variabile attraverso gli apici funziona, ma pu@`o
-facilmente generare difficolt@`a. Richiede una buona comprensione delle
-regole per l'uso degli apici nella shell
-(@pxref{Protezione}),
-e spesso @`e difficile accoppiare i vari apici quando si legge il programma.
-
-Un metodo migliore @`e quello di usare la funzionalit@`a di assegnamento delle
-variabili di @command{awk}
-(@pxref{Opzioni di assegnamento})
-per assegnare il valore di una variabile di shell a una variabile
-di @command{awk}.
-Poi si possono usare @dfn{regexp} dinamiche come criterio di ricerca
-(@pxref{Espressioni regolari calcolate}).
-Quanto segue mostra come sarebbe l'esempio precedente usando questa tecnica:
-
-@example
-printf "Immettere il criterio di ricerca: "
-read criterio_di_ricerca
-awk -v crit="$criterio_di_ricerca" '$0 ~ crit @{ num_trov++ @}
- END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
-@end example
-
-@noindent
-Adesso il programma @command{awk} @`e solo una stringa tra apici semplici.
-L'assegnamento @samp{-v crit="$criterio_di_ricerca"} richiede ancora doppi
-apici, per il caso in cui uno spazio vuoto sia presente nel valore di
-@code{$criterio_di_ricerca}.
-La variabile @command{awk} @code{crit} potrebbe avere come nome anche
-@code{criterio_di_ricerca}, ma ci@`o potrebbe essere causa di confusione.
-Usare una variabile permette una maggiore flessibilit@`a, poich@'e la variabile
-pu@`o essere usata in ogni parte del
-programma---per stamparla, per indicizzare un vettore, o per qualsiasi altro
-scopo---senza che sia necessario l'artificio di doverla inserire usando gli
-apici.
-
-@node Panoramica sulle azioni
-@section Azioni
-@c @cindex action, definition of
-@c @cindex curly braces
-@c @cindex action, curly braces
-@c @cindex action, separating statements
-@cindex azioni
-
-Un programma o script @command{awk} consiste in una serie di
-regole e definizioni di funzione frammiste tra loro. (Le funzioni sono
-descritte pi@`u avanti. @xref{Funzioni definite dall'utente}.)
-Una regola contiene un criterio di ricerca e un'azione; l'uno o l'altra
-(ma non tutt'e due) possono essere omessi. Lo scopo di una @dfn{azione} @`e
-di specificare cosa deve fare @command{awk} quando si trova una corrispondenza
-con il criterio di ricerca. Quindi, schematicamente, un programma
-@command{awk} @`e normalmente simile a questo:
-
-@display
-[@var{criterio di ricerca}] @code{@{ @var{azione} @}}
- @var{criterio di ricerca} [@code{@{ @var{azione} @}}]
-@dots{}
-@code{function @var{nome}(@var{argomenti}) @{ @dots{} @}}
-@dots{}
-@end display
-
-@cindex @code{@{@}} (parentesi graffe), azioni e
-@cindex parentesi graffe (@code{@{@}}), azioni e
-@cindex separatori, per istruzioni in azioni
-@cindex a capo, separatore di istruzioni nelle azioni
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Un'azione consiste di una o pi@`u @dfn{istruzioni} @command{awk}, racchiuse
-fra parentesi graffe (@samp{@{@r{@dots{}}@}}). Ogni istruzione specifica
-una cosa da fare. Le istruzioni sono separate tra loro da dei ritorni a capo o
-da dei punti e virgola.
-Le parentesi graffe attorno a un'azione vanno usate anche se l'azione
-contiene una sola istruzione o se non contiene alcuna istruzione.
-Comunque, se si omette completamente l'azione, si possono omettere anche le
-parentesi graffe. Un'azione omessa @`e equivalente a specificare
-@samp{@{ print $0 @}}:
-
-@example
-/pippo/ @{ @} @ii{se si trova @code{pippo}, non fare nulla --- azione vuota}
-/pippo/ @ii{se si trova @code{pippo}, stampa il record --- azione omessa}
-@end example
-
-I seguenti tipi di istruzione sono disponibili in @command{awk}:
-
-@table @asis
-@cindex effetti collaterali delle istruzioni
-@cindex istruzioni, effetti collaterali delle
-@item Espressioni
-Servono per chiamare funzioni o assegnare valori a variabili
-@iftex
-(@pxrefil{Espressioni}). L'esecuzione
-@end iftex
-@ifnottex
-(@pxref{Espressioni}). L'esecuzione
-@end ifnottex
-di questo tipo di istruzione calcola semplicemente il valore dell'espressione.
-Ci@`o @`e utile quando l'espressione ha effetti collaterali
-(@pxref{Operatori di assegnamento}).
-
-@item Istruzioni di controllo
-Specificano il flusso di controllo dei programmi @command{awk}.
-Il linguaggio @command{awk} utilizza dei costrutti simili a quelli del C,
-(@code{if}, @code{for}, @code{while} e @code{do}), e anche alcune altre
-di tipo speciale (@pxref{Istruzioni}).
-
-@item Istruzioni composte
-Sono una o pi@`u istruzioni racchiuse tra parentesi graffe. Un'istruzione
-composta
-@`e usata per riunire un gruppo di istruzioni all'interno di
-un'istruzione @code{if}, @code{while}, @code{do} o @code{for}.
-
-@item Istruzioni di input
-Usano il comando @code{getline}
-(@pxref{Getline}).
-In @command{awk} sono anche disponibili le istruzioni @code{next}
-(@pxref{Istruzione next})
-e @code{nextfile}
-(@pxref{Istruzione nextfile}).
-
-@item Istruzioni di output
-Come @code{print} e @code{printf}.
-@iftex
-@xrefIl{Stampare}.
-@end iftex
-@ifnottex
-@xref{Stampare}.
-@end ifnottex
-
-@item Istruzioni di cancellazione
-Per eliminare elementi di vettori.
-@xref{Cancellazione}.
-@end table
-
-@node Istruzioni
-@section Istruzioni di controllo nelle azioni
-@cindex istruzioni di controllo
-@cindex controllo, tramite istruzioni, in azioni
-@cindex azioni, istruzioni di controllo in
-
-Le @dfn{istruzioni di controllo}, come @code{if}, @code{while} e cos@`{@dotless{i}} via,
-regolano il flusso di esecuzione nei programmi @command{awk}. Molte tra
-le istruzioni di controllo di @command{awk} sono modellate sulle
-corrispondenti istruzioni in C.
-@cindex istruzioni composte@comma{} istruzioni di controllo e
-@cindex composte, istruzioni@comma{} istruzioni di controllo e
-@cindex corpo, nelle azioni
-@cindex @code{@{@}} (parentesi graffe), istruzioni, raggruppare
-@cindex parentesi graffe (@code{@{@}}), istruzioni, raggruppare
-@cindex a capo, separatore di istruzioni nelle azioni
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Tutte le istruzioni di controllo iniziano con parole chiave speciali, come
-@code{if} e @code{while}, per distinguerle dalle semplici espressioni.
-Molte istruzioni di controllo contengono altre istruzioni. Per esempio,
-l'istruzione @code{if} contiene un'altra istruzione che pu@`o essere eseguita
-oppure no. Le istruzioni contenute sono chiamate @dfn{corpo}.
-Per includere pi@`u di un'istruzione nel corpo, queste vanno raggruppate
-in una sola @dfn{istruzione composta} tra parentesi graffe, e separate tra
-loro con dei ritorni a capo o dei punti e virgola.
-
-@menu
-* Istruzione if:: Eseguire in maniera condizionale
- istruzioni @command{awk}.
-* Istruzione while:: Eseguire il ciclo finch@'e @`e
- verificata una condizione.
-* Istruzione do:: Eseguire l'azione specificata, continuare
- a eseguire il ciclo
- finch@'e @`e verificata una condizione.
-* Istruzione for:: Un'altra istruzione iterativa, che
- permette di specificare clausole
- iniziali e di incremento.
-* Istruzione switch :: Valutazione di quale insieme di
- istruzioni eseguire, a seconda del
- valore assunto da una variabile.
-* Istruzione break:: Uscire subito dal ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione continue:: Andare alla fine del ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione next:: Smettere di elaborare il record corrente.
-* Istruzione nextfile:: Smettere di elaborare il file corrente.
-* Istruzione exit:: Interrompere l'esecuzione di @command{awk}.
-@end menu
-
-@node Istruzione if
-@subsection L'istruzione @code{if}-@code{else}
-
-@cindex istruzione @code{if}
-@cindex @code{if}, istruzione
-L'istruzione @code{if}-@code{else} @`e quella che serve in @command{awk}
-per prendere decisioni. @`E simile
-a questa:
-
-@display
-@code{if (@var{condizione}) @var{se-vera-fai}} [@code{else @var{se-falsa-fai}}]
-@end display
-
-@noindent
-La @var{condizione} @`e un'espressione che controlla quel che fa il resto
-dell'istruzione. Se la @var{condizione} @`e vera, viene eseguita la
-parte @var{se-vera-fai}; altrimenti viene
-eseguita la parte @var{se-falsa-fai}.
-La parte @code{else} dell'istruzione @`e
-facoltativa. La condizione @`e considerata falsa se il suo valore @`e zero o
-la stringa nulla; altrimenti, la condizione @`e vera.
-Si consideri quanto segue:
-
-@example
-if (x % 2 == 0)
- print "x @`e pari"
-else
- print "x @`e dispari"
-@end example
-
-In questo esempio, se l'espressione @samp{x % 2 == 0} @`e vera (cio@`e,
-se il valore di @code{x} @`e esattamente divisibile per due), allora viene
-eseguita la prima istruzione
-@code{print}; altrimenti, viene eseguita la seconda istruzione @code{print}.
-Se la parola chiave @code{else} sta sulla stessa riga di @var{se-vera-fai}
-e se @var{se-vera-fai} non @`e un'istruzione composta (cio@`e, non @`e racchiusa
-tra parentesi graffe), allora un punto e virgola deve separare
-@var{se-vera-fai} dalla parola chiave @code{else}.
-Per chiarire questo, l'esempio precedente si pu@`o riscrivere come:
-
-@example
-if (x % 2 == 0) print "x @`e pari"; else
- print "x @`e dispari"
-@end example
-
-@noindent
-Se il @samp{;} @`e omesso, @command{awk} non pu@`o interpretare l'istruzione e
-segnala un errore di sintassi. Non si dovrebbero scrivere programmi in
-questo modo, perch@'e a chi li legge potrebbe sfuggire la parola chiave
-@code{else} se non @`e la prima parola della riga.
-
-@node Istruzione while
-@subsection L'istruzione @code{while}
-@cindex @code{while}, istruzione
-@cindex istruzione @code{while}
-@cindex cicli
-@cindex cicli, @code{while}
-@cindex cicli, si veda anche @code{while}, istruzione
-
-Nella programmazione, un @dfn{ciclo} @`e una parte di un programma che pu@`o
-essere eseguita due o pi@`u volte consecutivamente.
-L'istruzione @code{while} @`e la pi@`u semplice istruzione iterativa in
-@command{awk}. Esegue ripetutamente un'istruzione finch@'e una data
-condizione @`e vera. Per esempio:
-
-@example
-while (@var{condizione})
- @var{corpo-del-ciclo}
-@end example
-
-@cindex corpo, nei cicli
-@noindent
-@var{corpo-del-ciclo} @`e un'istruzione detta @dfn{corpo} del ciclo,
-e @var{condizione} @`e un'espressione che controlla per quante volte il ciclo
-deve continuare a essere ripetuto.
-La prima cosa che l'istruzione @code{while} fa @`e un controllo della
-@var{condizione}.
-Se la @var{condizione} @`e vera, viene eseguita l'istruzione
-@var{corpo-del-ciclo}.
-@ifinfo
-(La @var{condizione} @`e vera quando il suo valore
-@`e diverso da zero e non @`e la stringa nulla.)
-@end ifinfo
-Dopo che le istruzioni in @var{corpo-del-ciclo} sono state eseguite,
-@var{condizione} @`e controllata nuovamente, e se @`e ancora vera,
-@var{corpo-del-ciclo} viene eseguito ancora. Questo processo @`e ripetuto
-finch@'e @var{condizione} rimane vera. Se la @var{condizione} @`e falsa fin
-dall'inizio, il corpo del ciclo
-non viene eseguito per nulla, e @command{awk} continua con l'istruzione
-che viene dopo il ciclo.
-Questo esempio stampa i primi tre campi di ogni record in input, uno per
-riga:
-
-@example
-awk '
-@{
- i = 1
- while (i <= 3) @{
- print $i
- i++
- @}
-@}' inventory-shipped
-@end example
-
-@noindent
-Il corpo di questo ciclo @`e un'istruzione composta racchiusa tra parentesi graffe,
-che contiene due istruzioni.
-Il ciclo funziona in questo modo: all'inizio, il valore di @code{i} @`e
-impostato a 1.
-Poi, l'istruzione @code{while} controlla se @code{i} @`e minore o uguale a
-tre. Ci@`o @`e vero quando @code{i} @`e uguale a 1, quindi il campo
-@code{i}-esimo viene stampato. Quindi l'istruzione @samp{i++} incrementa il
-valore di @code{i}
-e il ciclo viene ripetuto. Il ciclo termina quando @code{i} assume il
-valore quattro.
-
-Un ritorno a capo non @`e richiesto tra la condizione e il corpo del ciclo;
-tuttavia, se lo si mette, il programma @`e di pi@`u facile comprensione,
-a meno che il corpo del ciclo non sia un'istruzione composta, oppure se @`e
-qualcosa di molto semplice. Neppure il ritorno a capo dopo la parentesi graffa
-aperta che inizia l'istruzione composta @`e necessario, ma il
-programma @`e di lettura pi@`u difficile se lo si omette.
-
-@node Istruzione do
-@subsection L'istruzione @code{do}-@code{while}
-@cindex @code{do}-@code{while}
-@cindex cicli, @code{do}-@code{while}
-
-Il ciclo @code{do} @`e una variazione dell'istruzione di ciclo @code{while}.
-Il ciclo @code{do} esegue il @var{corpo-del-ciclo} una volta e poi ripete il
-@var{corpo-del-ciclo} finch@'e la @var{condizione} rimane vera. @`E simile a questo:
-@example
-do
- @var{corpo-del-ciclo}
-while (@var{condizione})
-@end example
-
-Anche se la @var{condizione} @`e falsa fin dall'inizio, il @var{corpo-del-ciclo}
-viene eseguito almeno una volta (e solo una volta, a meno che
-l'esecuzione di @var{corpo-del-ciclo}
-non renda vera la @var{condizione}). Si confronti con il corrispondente
-@code{while}:
-
-@example
-while (@var{condizione})
- @var{corpo-del-ciclo}
-@end example
-
-@noindent
-Quest'istruzione non esegue il @var{corpo-del-ciclo} neppure una volta, se
-la @var{condizione} @`e falsa fin dall'inizio. Il seguente @`e un esempio di
-@code{do}:
-
-@example
-@{
- i = 1
- do @{
- print $0
- i++
- @} while (i <= 10)
-@}
-@end example
-
-@noindent
-Questo programma stampa ogni record in input per 10 volte. Non si tratta,
-peraltro, di un esempio molto realistico, perch@'e in questo caso un semplice
-@code{while} sarebbe sufficiente. Questa osservazione riflette un'esperienza
-reale; solo occasionalmente @`e davvero necessario usare un @code{do}.
-
-@node Istruzione for
-@subsection L'istruzione @code{for}
-@cindex istruzione @code{for}
-@cindex @code{for}, istruzione
-@cindex cicli, @code{for}, iterativi
-
-L'istruzione @code{for} rende pi@`u agevole contare le iterazioni di un ciclo.
-La forma generale dell'istruzione @code{for} @`e simile a questa:
-
-@example
-for (@var{inizializzazione}; @var{condizione}; @var{incremento})
- @var{corpo-del-ciclo}
-@end example
-
-@noindent
-La parti @var{inizializzazione}, @var{condizione} e @var{incremento} sono
-espressioni @command{awk} a piacere, e @var{corpo-del-ciclo} indica qualsiasi
-istruzione @command{awk}.
-
-L'istruzione @code{for} comincia con l'esecuzione di @var{inizializzazione}.
-Poi, finch@'e
-la @var{condizione} @`e vera, esegue ripetutamente @var{corpo-del-ciclo},
-e quindi @var{incremento}. Tipicamente, @var{inizializzazione} imposta una
-variabile a zero o a uno, @var{incremento} aggiunge uno alla stessa e
-@var{condizione} ne confronta il valore rispetto al numero desiderato di
-iterazioni.
-Per esempio:
-
-@example
-awk '
-@{
- for (i = 1; i <= 3; i++)
- print $i
-@}' inventory-shipped
-@end example
-
-@noindent
-Questo programma stampa i primi tre campi di ogni record in input, mettendo
-un campo su ogni riga.
-
-Non @`e possibile impostare
-pi@`u di una variabile nella parte di
-@var{inizializzazione} senza usare un'istruzione di assegnamento multiplo,
-come @samp{x = y = 0}. Ci@`o ha senso solo se tutti i valori iniziali
-sono uguali. (Ma @`e possibile inizializzare ulteriori variabili scrivendo
-i relativi assegnamenti come istruzioni separate @emph{prima} del ciclo
-@code{for}.)
-
-@c @cindex comma operator, not supported
-Lo stesso vale per la parte @var{incremento}. Se serve incrementare ulteriori
-variabili, questo va fatto con istruzioni separate alla fine del ciclo.
-L'espressione composta del linguaggio C, che usa l'operatore virgola [,]
-del C, sarebbe
-utile in questo contesto, ma non @`e
-prevista in @command{awk}.
-
-Molto spesso, @var{incremento} @`e un'espressione di incremento, come
-nell'esempio precedente. Ma questo non @`e obbligatorio; pu@`o trattarsi di
-un'espressione qualsiasi. Per esempio,
-la seguente istruzione stampa tutte le potenze di due comprese
-tra 1 e 100:
-
-@example
-for (i = 1; i <= 100; i *= 2)
- print i
-@end example
-
-Se non @`e necessaria, ognuna delle tre espressioni fra
-parentesi che segue la parola chiave @code{for} pu@`o essere omessa. Quindi,
-@w{@samp{for (; x > 0;)}} @`e equivalente a @w{@samp{while (x > 0)}}. Se la
-@var{condizione} @`e omessa del tutto, @`e ritenuta sempre vera, producendo
-un @dfn{ciclo infinito} (cio@`e, un ciclo che non finisce mai).
-
-Molto spesso, un ciclo @code{for} @`e un'abbreviazione per un ciclo @code{while},
-come si pu@`o vedere qui:
-
-@example
-@var{inizializzazione}
-while (@var{condizione}) @{
- @var{corpo-del-ciclo}
- @var{incremento}
-@}
-@end example
-
-@cindex cicli, istruzione @code{continue} e
-@noindent
-La sola eccezione @`e quando l'istruzione @code{continue}
-(@pxref{Istruzione continue}) @`e usata
-all'interno del ciclo. Se si modifica un'istruzione @code{for}
-sostituendola con un'istruzione @code{while}
-ci@`o pu@`o cambiare l'effetto dell'istruzione @code{continue} posta all'interno
-del ciclo.
-
-Il linguaggio @command{awk} ha un'istruzione @code{for} oltre all'istruzione
-@code{while} perch@'e un ciclo @code{for} @`e spesso pi@`u semplice da scrivere,
-e viene in mente pi@`u naturalmente.
-Contare il numero di iterazioni @`e
-molto frequente nei cicli. Pu@`o essere pi@`u facile pensare a questo conto come
-parte del ciclo, piuttosto che come qualcosa da fare all'interno del ciclo.
-
-@cindex @code{in}, operatore
-@cindex operatore @code{in}
-Esiste una versione alternativa al ciclo @code{for}, per esaminare tutti
-gli indici di un vettore:
-
-@example
-for (i in vettore)
- @var{fai qualcosa con} vettore[i]
-@end example
-
-@noindent
-@xref{Visitare un intero vettore}
-per maggiori informazioni su questa versione del ciclo @code{for}.
-
-@node Istruzione switch
-@subsection L'istruzione @code{switch}
-@cindex @code{switch}, istruzione
-@cindex @code{case}, parola chiave
-@cindex parola chiave @code{case}
-@cindex @code{default}, parola chiave
-@cindex parola chiave @code{default}
-
-Questa @value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-Se @command{gawk} @`e in modalit@`a compatibile (@pxref{Opzioni}),
-la funzionalit@`a non @`e disponibile.
-
-L'istruzione @code{switch} consente di valutare un'espressione e di
-eseguire istruzioni se il valore trovato corrisponde a uno dei @code{case} [casi] previsti.
-Le istruzioni @code{case} sono esaminate per cercare una corrispondenza
-nell'ordine in cui i casi sono definiti nel programma. Se nessuno dei @code{case}
-corrisponde al valore dell'espressione, viene eseguita la sezione
-@code{default}, se @`e stata specificata.
-
-Ogni @code{case} contiene una singola costante, che pu@`o essere un numero,
-una stringa, o
-una @dfn{regexp}. Viene valutata l'espressione @code{switch}, e poi la
-costante di ogni @code{case} viene confrontata
-di volta in volta con il valore risultante.
-Il tipo di costante determina quale sar@`a il confronto: per i tipi numerici o
-stringa si seguono le regole abituali. Per una costante @dfn{regexp} viene
-effettuato un confronto tra l'espressione e il valore di tipo stringa
-dell'espressione originale.
-Il formato generale dell'istruzione @code{switch} @`e simile a questo:
-
-@example
-switch (@var{espressione}) @{
-case @var{valore o espressione regolare}:
- @var{corpo-del-caso}
-default:
- @var{corpo-del-default}
-@}
-@end example
-
-Il flusso di controllo
-dell'istruzione @code{switch} funziona come per il linguaggio C. Una volta
-stabilita una corrispondenza con un dato caso, le istruzione che formano il
-corpo del caso sono eseguite, fino a che non venga trovata un'istruzione
-@code{break},
-@code{continue}, @code{next}, @code{nextfile} o @code{exit},
-o fino alla fine dell'istruzione @code{switch} medesima. Per esempio:
-
-@example
-while ((c = getopt(ARGC, ARGV, "aksx")) != -1) @{
- switch (c) @{
- case "a":
- # stampa la dimensione di tutti i file
- all_files = TRUE;
- break
- case "k":
- BLOCK_SIZE = 1024 # in blocchi da 1 Kbyte
- break
- case "s":
- # fa solo le somme
- sum_only = TRUE
- break
- case "x":
- # non esce dal filesystem
- fts_flags = or(fts_flags, FTS_XDEV)
- break
- case "?":
- default:
- uso()
- break
- @}
-@}
-@end example
-
-Si noti che se nessuna delle istruzioni specificate qui arresta l'esecuzione
-di un'istruzione @code{case} per la quale @`e stata trovata una corrispondenza;
-l'esecuzione continua fino al successivo @code{case} finch@'e
-non viene interrotta. In questo esempio, il
-@code{case} per @code{"?"} esegue quello di @code{default}, che consiste nel
-chiamare una funzione di nome @code{uso()}.
-(La funzione @code{getopt()} qui chiamata @`e descritta in
-@ref{Funzione getopt}.)
-
-@node Istruzione break
-@subsection L'istruzione @code{break}
-@cindex @code{break}, istruzione
-@cindex istruzione @code{break}
-@cindex cicli, uscita
-@cindex cicli, istruzione @code{break} e
-
-L'istruzione @code{break} esce dal ciclo pi@`u interno @code{for},
-@code{while} o @code{do} dentro al quale si trova. L'esempio seguente
-trova, se esiste, il divisore pi@`u piccolo di un dato numero intero, oppure
-dichiara che si tratta di un numero primo:
-
-@example
-# trova il divisore pi@`u piccolo di num
-@{
- num = $1
- for (divisore = 2; divisore * divisore <= num; divisore++) @{
- if (num % divisore == 0)
- break
- @}
- if (num % divisore == 0)
- printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
- else
- printf "%d @`e un numero primo\n", num
-@}
-@end example
-
-Quando il resto della divisione @`e zero nella prima istruzione @code{if},
-@command{awk} immediatamente esce, a causa del @dfn{break}, dal ciclo
-@code{for} in cui @`e contenuto. Ci@`o vuol dire
-che @command{awk} prosegue immediatamente fino all'istruzione che viene dopo
-il ciclo, e continua l'elaborazione. (L'istruzione @code{break} @`e molto
-differente dall'istruzione @code{exit},
-la quale termina l'intero programma @command{awk}.
-@xref{Istruzione exit}.)
-
-Il seguente programma mostra come la @var{condizione} di un'istruzione
-@code{for} o @code{while} potrebbe essere sostituita da un'istruzione
-@code{break} all'interno di un @code{if}:
-
-@example
-# trova il divisore pi@`u piccolo di num
-@{
- num = $1
- for (divisore = 2; ; divisore++) @{
- if (num % divisore == 0) @{
- printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
- break
- @}
- if (divisore * divisore > num) @{
- printf "%d @`e un numero primo\n", num
- break
- @}
- @}
-@}
-@end example
-
-L'istruzione @code{break} @`e usata anche per terminare l'esecuzione di
-un'istruzione @code{switch}.
-Questo argomento @`e trattato in @ref{Istruzione switch}.
-
-@c @cindex @code{break}, outside of loops
-@c @cindex historical features
-@c @cindex @command{awk} language, POSIX version
-@cindex POSIX @command{awk}, @code{break} e
-@cindex angolo buio, istruzione @code{break}
-@cindex @command{gawk}, istruzione @code{break} in
-@cindex Brian Kernighan, @command{awk} di
-L'istruzione @code{break} non ha significato se
-usata fuori dal corpo di un ciclo o di un'istruzione @code{switch}.
-Tuttavia, anche se la cosa non @`e mai stata documentata,
-le prime implementazioni di @command{awk} consideravano l'istruzione @code{break}
-esterna a un ciclo come un'istruzione @code{next}
-(@pxref{Istruzione next}).
-@value{DARKCORNER}
-Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
-e lo stesso fa @command{gawk}.
-
-@node Istruzione continue
-@subsection L'istruzione @code{continue}
-
-@cindex @code{continue}, istruzione
-@cindex istruzione @code{continue}
-Analogamente a @code{break}, l'istruzione @code{continue} @`e usata solo
-all'interno di cicli @code{for}, @code{while} e @code{do}. L'istruzione
-ignora il resto del corpo del ciclo, facendo s@`{@dotless{i}} che la successiva iterazione
-del ciclo inizi immediatamente. Questo comportamento @`e differente da quello
-di @code{break}, che esce completamente dal ciclo.
-
-L'istruzione @code{continue} in un ciclo @code{for} fa s@`{@dotless{i}} che @command{awk}
-ignori il resto del corpo del ciclo e prosegua l'esecuzione con l'espressione
-@var{incremento} dell'istruzione @code{for}. Il seguente programma
-@`e un esempio di ci@`o:
-
-@example
-BEGIN @{
- for (x = 0; x <= 20; x++) @{
- if (x == 5)
- continue
- printf "%d ", x
- @}
- print ""
-@}
-@end example
-
-@noindent
-Questo programma stampa tutti i numeri da 0 a 20---tranne il 5, in cui
-l'istruzione @code{printf} @`e saltata. Siccome l'incremento @samp{x++}
-non viene saltato, @code{x} non rimane fermo al valore 5. Si confronti il ciclo
-@code{for} dell'esempio precedente con il seguente ciclo @code{while}:
-
-@example
-BEGIN @{
- x = 0
- while (x <= 20) @{
- if (x == 5)
- continue
- printf "%d ", x
- x++
- @}
- print ""
-@}
-@end example
-
-@noindent
-Questo programma inizia un ciclo infinito dopo che @code{x} ha assunto il
-valore 5, poich@'e l'istruzione di incremento (@samp{x++}) non @`e mai raggiunta.
-
-@c @cindex @code{continue}, fuori da un ciclo
-@c @cindex funzionalit@`a del passato
-@c @cindex linguaggio @command{awk}, versione POSIX
-@cindex POSIX @command{awk}, istruzione @code{continue} e
-@cindex angolo buio, istruzione @code{continue}
-@cindex @command{gawk}, istruzione @code{continue} in
-@cindex Brian Kernighan, @command{awk} di
-L'istruzione @code{continue} non ha un significato speciale se appare in
-un'istruzione @code{switch}, e non ha alcun significato se usata fuori dal
-corpo di un ciclo. Le prime versioni di @command{awk} trattavano le
-istruzioni @code{continue} che erano fuori da un ciclo allo stesso modo con
-cui trattavano l'istruzione @code{break}
-fuori da un ciclo: come se fosse un'istruzione @code{next}
-@ifset FOR_PRINT
-(trattata nella @value{SECTION} seguente).
-@end ifset
-@ifclear FOR_PRINT
-(@pxref{Istruzione next}).
-@end ifclear
-@value{DARKCORNER}
-Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
-e lo stesso vale per @command{gawk}.
-
-@node Istruzione next
-@subsection L'istruzione @code{next}
-@cindex @code{next}, istruzione
-@cindex istruzione @code{next}
-
-L'istruzione @code{next} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
-l'elaborazione del record corrente e proceda a elaborare il record successivo.
-Ci@`o vuol dire che nessuna delle eventuali regole successive viene eseguita
-per il record corrente e che il resto delle azioni presenti nella
-regola correntemente in esecuzione non viene eseguito.
-
-Si confronti quanto sopra con quel che fa la funzione @code{getline}
-(@pxref{Getline}). Anch'essa fa s@`{@dotless{i}} che @command{awk} legga il record
-successivo immediatamente, ma non altera il flusso del controllo in alcun
-modo (cio@`e, il resto dell'azione in esecuzione prosegue con il nuovo record
-in input).
-
-@cindex @command{awk}, programmi, eseguire
-Al livello pi@`u alto, l'esecuzione di un programma @command{awk} @`e un ciclo
-che legge un record in input e quindi confronta il criterio di ricerca di
-ciascuna regola con il record stesso. Se si vede questo ciclo come un
-@code{for} il cui corpo contiene le regole, l'istruzione @code{next} @`e analoga
-a un'istruzione @code{continue}. Salta, cio@`e, alla fine del corpo di questo
-ciclo implicito
-ed esegue l'incremento (ovvero legge un altro record).
-
-Per esempio, si supponga che un programma @command{awk} agisca solo su record
-che hanno quattro campi, e che non dovrebbe terminare con un errore se trova
-dei record in input non validi. Per evitare di complicare il resto del
-programma, si pu@`o scrivere una regola ``filtro'' a inizio programma, come
-mostrato in questo esempio:
-
-@example
-NF != 4 @{
- printf("%s:%d: salto: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
- next
-@}
-@end example
-
-@noindent
-Siccome @`e presente un @code{next},
-le regole successive del programma non elaboreranno i record non validi.
-Il messaggio @`e ridiretto al flusso in output
-@dfn{standard error}, sul quale vanno scritti i messaggi di errore.
-Per maggiori dettagli, si veda
-@ref{File speciali}.
-
-Se l'istruzione @code{next} provoca il raggiungimento della fine del file
-in input, vengono eseguite le eventuali regole @code{END} presenti.
-@xref{BEGIN/END}.
-
-L'istruzione @code{next} non @`e consentita all'interno delle regole
-@code{BEGINFILE} ed @code{ENDFILE}.
-@xref{BEGINFILE/ENDFILE}.
-
-@c @cindex @command{awk} language, POSIX version
-@c @cindex @code{next}, inside a user-defined function
-@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex POSIX @command{awk}, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{next}, istruzione, in funzioni definite dall'utente
-@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
-Secondo lo standard POSIX, il comportamento di @command{awk} @`e indefinito
-se @code{next} @`e usato in una regola @code{BEGIN} o @code{END}.
-@command{gawk} considera questo come un errore di sintassi. Sebbene POSIX
-non proibisca di usarlo,
-molte altre implementazioni di @command{awk} non consentono che l'istruzione
-@code{next} sia usata all'interno del corpo di funzioni.
-(@pxref{Funzioni definite dall'utente}).
-Come tutte le altre istruzioni @code{next}, un'istruzione @code{next} all'interno del
-corpo di una funzione legge il record successivo e inizia a elaborarlo
-a partire dalla prima regola del programma.
-
-@node Istruzione nextfile
-@subsection L'istruzione @code{nextfile}
-@cindex @code{nextfile}, istruzione
-@cindex istruzione @code{nextfile}
-
-L'istruzione @code{nextfile}
-@`e simile all'istruzione @code{next}.
-Tuttavia, invece di terminare l'elaborazione del record corrente, l'istruzione
-@code{nextfile} richiede ad @command{awk} di terminare di elaborare il
-@value{DF} corrente.
-
-Alla fine dell'esecuzione dell'istruzione @code{nextfile},
-@code{FILENAME} @`e
-aggiornato per contenere il nome del successivo @value{DF} elencato sulla riga
-di comando, @code{FNR} @`e reimpostato a uno, e l'elaborazione riparte con
-la prima regola del programma.
-Se l'istruzione @code{nextfile} raggiunge la fine dei file in input,
-vengono eseguite le eventuali regole @code{END} presenti.
-Un'eccezione a questo si ha se @code{nextfile} @`e invocata durante
-l'esecuzione di qualche istruzione all'interno di una regola @code{END};
-in questo caso, il programma viene terminato immediatamente.
-@xref{BEGIN/END}.
-
-L'istruzione @code{nextfile} @`e utile quando ci sono parecchi @value{DF} da
-elaborare, ma non @`e necessario elaborare ogni record in ogni file.
-Senza @code{nextfile},
-per passare al successivo @value{DF}, un programma
-dovrebbe continuare a leggere i record che non gli servono. L'istruzione
-@code{nextfile} @`e una maniera molto pi@`u efficiente per ottenere lo stesso
-risultato.
-
-In @command{gawk}, l'esecuzione di @code{nextfile} produce ulteriori effetti:
-le eventuali regole @code{ENDFILE}
-sono eseguite se @command{gawk} non
-si trova correntemente all'interno di una regola @code{END} o
-@code{BEGINFILE}; @code{ARGIND} @`e
-incrementato e le eventuali regole @code{BEGINFILE} sono eseguite.
-(@code{ARGIND} non @`e stato ancora trattato.
-@xref{Variabili predefinite}.)
-
-In @command{gawk}, @code{nextfile} @`e utile all'interno di una regola
-@code{BEGINFILE} per evitare di elaborare un file che altrimenti causerebbe
-un errore fatale in @command{gawk}.
-In questo caso, le regole @code{ENDFILE} non vengono eseguite.
-@xref{BEGINFILE/ENDFILE}.
-
-Sebbene possa sembrare che @samp{close(FILENAME)} ottenga lo stesso
-risultato di @code{nextfile}, non @`e cos@`{@dotless{i}}. @code{close()}
-pu@`o essere usato solo per chiudere file, @dfn{pipe} e coprocessi che siano
-stati aperti tramite ridirezioni. Non ha niente a che vedere con
-l'elaborazione principale che
-@command{awk} fa dei file elencati in @code{ARGV}.
-
-@quotation NOTA
-Per molti anni, @code{nextfile} @`e stata
-un'estensione comune. A settembre 2012 si @`e deciso di
-includerla nello standard POSIX.
-Si veda @uref{http://austingroupbugs.net/view.php?id=607, il sito web dell'Austin Group}.
-@end quotation
-
-@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{nextfile}, in funzioni definite dall'utente
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-Le versioni correnti di BWK @command{awk} e @command{mawk}
-entrambe prevedono @code{nextfile}. Tuttavia, non sono consentite istruzioni
-@code{nextfile} all'interno del corpo delle funzioni
-(@pxref{Funzioni definite dall'utente}).
-@command{gawk} lo permette; una @code{nextfile} all'interno del corpo di una
-funzione legge il primo record del file
-successivo e inizia l'elaborazione dello stesso
-a partire dalla prima regola del programma, esattamente come farebbe
-qualsiasi altra istruzione @code{nextfile}.
-
-@node Istruzione exit
-@subsection L'istruzione @code{exit}
-
-@cindex @code{exit}, istruzione
-@cindex istruzione @code{exit}
-L'istruzione @code{exit} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
-l'esecuzione della regola corrente e che termini di elaborare l'input;
-qualsiasi input ancora da elaborare @`e ignorato. L'istruzione @code{exit} @`e
-scritta come segue:
-
-@display
-@code{exit} [@var{codice di ritorno}]
-@end display
-
-@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{exit} e
-@cindex criterio di ricerca @code{BEGIN}, istruzione @code{exit} e
-@cindex @code{END}, criterio di ricerca, istruzione @code{exit} e
-@cindex criterio di ricerca @code{END}, istruzione @code{exit} e
-Quando un'istruzione @code{exit} @`e eseguita all'interno di una regola @code{BEGIN},
-il programma termina completamente l'elaborazione. Nessun record in input
-viene letto. Tuttavia, se una regola @code{END} @`e presente, come parte
-dell'esecuzione dell'istruzione @code{exit},
-la regola @code{END} viene eseguita
-(@pxref{BEGIN/END}).
-Se @code{exit} @`e usata nel corpo di una regola @code{END},
-il programma termina immediatamente.
-
-Un'istruzione @code{exit} che non fa parte di una regola @code{BEGIN} o @code{END}
-termina l'esecuzione di qualsiasi ulteriore regola applicabile al record
-corrente, salta la lettura di qualsiasi record in input, ed esegue
-le eventuali regole @code{END}. @command{gawk} salta anche le eventuali regole
-@code{ENDFILE}, che non vengono eseguite.
-
-In questo caso,
-se non si desidera che la regola @code{END} venga eseguita, si deve impostare
-una variabile a un valore diverso da zero, prima di invocare l'istruzione
-@code{exit} e controllarne il valore nella regola @code{END}.
-@xref{Funzione assert}
-per un esempio di questo tipo.
-
-@cindex angolo buio, istruzione @code{exit}
-Se si specifica un argomento all'istruzione @code{exit}, il suo valore @`e
-usato come codice di ritorno finale dell'elaborazione @command{awk}. Se non
-viene specificato alcun argomento,
-@code{exit} fa terminare @command{awk} con un codice di ritorno di
-``successo''.
-Nel caso in cui un argomento
-sia specificato in una prima istruzione @code{exit} e poi @code{exit} sia
-chiamato una seconda volta all'interno di una regola @code{END} senza alcun
-argomento, @command{awk} usa il valore di ritorno specificato in precedenza.
-@value{DARKCORNER}
-@xref{Codice di ritorno} per maggiori informazioni.
-
-@cindex convenzioni di programmazione, istruzione @code{exit}
-Per esempio, si supponga che si sia verificata una condizione di errore
-difficile o impossibile da gestire. Convenzionalmente, i programmi la
-segnalano terminando con un codice di ritorno diverso da zero. Un programma
-@command{awk} pu@`o farlo usando un'istruzione @code{exit} con un argomento
-diverso da zero, come mostrato nell'esempio seguente:
-
-@example
-BEGIN @{
- if (("date" | getline data_corrente) <= 0) @{
- print "Non riesco a ottenere la data dal sistema" > "/dev/stderr"
- exit 1
- @}
- print "la data corrente @`e", data_corrente
- close("date")
-@}
-@end example
-
-@quotation NOTA
-Per una completa portabilit@`a, i codici di ritorno dovrebbero essere compresi
-tra zero e 126, estremi compresi.
-Valori negativi e valori maggiori o uguali a 127, possono non generare
-risultati coerenti tra loro in sistemi operativi diversi.
-@end quotation
-
-
-@node Variabili predefinite
-@section Variabili predefinite
-@cindex predefinite, variabili
-@cindex variabili predefinite
-
-La maggior parte delle variabili @command{awk} sono disponibili per essere
-usate dall'utente secondo le proprie esigenze;
-queste variabili non cambiano mai di valore a meno che il
-programma non assegni loro dei valori, e non hanno alcuna influenza sul
-programma a meno che non si decida di utilizzarle nel programma.
-Tuttavia, alcune variabili in @command{awk} hanno dei significati speciali
-predefiniti.
-@command{awk} tiene conto di alcune di queste automaticamente, in modo da
-rendere possibile la richiesta ad @command{awk} di fare certe cose nella
-maniera desiderata. Altre variabili sono impostate automaticamente da
-@command{awk}, in modo da poter comunicare al programma in esecuzione
-informazioni sul modo di procedere interno di @command{awk}.
-
-@cindex @command{gawk}, variabili predefinite e
-Questa @value{SECTION} documenta tutte le variabili predefinite di
-@command{gawk}; molte di queste variabili sono anche documentate nei
-@value{CHAPTER} che descrivono le loro aree di influenza.
-
-@menu
-* Variabili modificabili dall'utente:: Variabili predefinite modificabili per
- controllare @command{awk}.
-* Variabili auto-assegnate:: Variabili predefinite con cui
- @command{awk} fornisce informazioni.
-* ARGC e ARGV:: Modi di usare @code{ARGC} e @code{ARGV}.
-@end menu
-
-@node Variabili modificabili dall'utente
-@subsection Variabili predefinite modificabili per controllare @command{awk}
-@cindex variabili predefinite, modificabili dall'utente
-@cindex modificabili dall'utente, variabili
-
-La seguente @`e una lista alfabetica di variabili che @`e possibile modificare per
-controllare come @command{awk} gestisce alcuni compiti.
-
-Le variabili che sono specifiche di @command{gawk} sono contrassegnate da un
-cancelletto (@samp{#}). Queste variabili sono estensioni @command{gawk}.
-In altre implementazioni di @command{awk}, o se @command{gawk} @`e eseguito in
-modalit@`a compatibile
-(@pxref{Opzioni}), non hanno un significato speciale. (Eventuali eccezioni
-sono menzionate nella descrizione di ogni variabile.)
-
-@table @code
-@cindex @code{BINMODE}, variabile
-@cindex variabile @code{BINMODE}
-@cindex binario, input/output
-@cindex input/output binario
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
-@item BINMODE #
-Su sistemi non-POSIX, questa variabile specifica l'uso della modalit@`a binaria
-per tutto l'I/O. I valori numerici di uno, due o tre specificano che i file
-in input, i file di output o tutti i file, rispettivamente, devono usare I/O
-binario.
-Un valore numerico inferiore a zero @`e trattato come zero e un valore
-numerico maggiore di tre @`e trattato
-come tre. Alternativamente, le stringhe @code{"r"} o @code{"w"} specificano
-che i file in input e i file in output,
-rispettivamente, devono usare
-I/O binario. Una stringa @code{"rw"} o @code{"wr"} indica che tutti i file
-devono usare I/O binario. Ogni altro valore di stringa @`e trattato come
-@code{"rw"}, ma @command{gawk} genera un messaggio di avvertimento.
-@code{BINMODE} @`e descritto in maggior
-dettaglio in @ref{Uso su PC}. @command{mawk} (@pxref{Altre versioni})
-prevede questa variabile, ma consente solo valori numerici.
-
-@cindex @code{CONVFMT}, variabile
-@cindex variabile @code{CONVFMT}
-@cindex POSIX @command{awk}, variabile @code{CONVFMT} e
-@cindex numeri, conversione in stringhe
-@cindex stringhe, conversione in numeri
-@item @code{CONVFMT}
-Una stringa che controlla la conversione di numeri in
-stringhe (@pxref{Conversione}).
-In effetti @`e la stringa passata come primo argomento alla funzione
-@code{sprintf()}
-(@pxref{Funzioni per stringhe}).
-Il suo valore di default @`e @code{"%.6g"}.
-@code{CONVFMT} @`e stata introdotta dallo standard POSIX.
-
-@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
-@cindex @code{FIELDWIDTHS}, variabile
-@cindex variabile @code{FIELDWIDTHS}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FIELDWIDTHS}
-@cindex separatori di campo, variabile @code{FIELDWIDTHS} e
-@cindex campo, separatori di, variabile @code{FIELDWIDTHS} e
-@item FIELDWIDTHS #
-Una lista di posizioni di colonna, separate da spazi, per dire a
-@command{gawk}
-come dividere campi in input posti su colonne fisse.
-Assegnando un valore a @code{FIELDWIDTHS}, le variabili @code{FS} e
-@code{FPAT}
-@emph{non} vengono usate per effettuare la divisione in campi.
-@xref{Dimensione costante} per maggiori informazioni.
-
-@cindex @command{gawk}, variabile @code{FPAT} in
-@cindex @code{FPAT}, variabile
-@cindex variabile @code{FPAT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FPAT}
-@cindex separatori di campo, variabile @code{FPAT} e
-@cindex campo, separatori di, variabile @code{FPAT} e
-@item FPAT #
-Un'espressione regolare (di tipo stringa) per dire a @command{gawk}
-di creare i campi utilizzando come delimitatore il testo che corrisponde
-all'espressione regolare.
-Assegnando un valore a @code{FPAT}
-le variabili @code{FS} e @code{FIELDWIDTHS}
-@emph{non} vengono usate per effettuare la divisione in campi.
-@xref{Separazione in base al contenuto} per maggiori informazioni.
-
-@cindex @code{FS}, variabile
-@cindex variabile @code{FS}
-@cindex campo, separatori di
-@cindex separatori di campo
-@item FS
-Il separatore dei campi in input (@pxref{Separatori di campo}).
-Il valore pu@`o essere una stringa di un solo carattere o un'espressione
-regolare composta da pi@`u caratteri che individua il separatore tra i campi
-dei record in input. Se il suo valore
-@`e la stringa nulla (@code{""}),
-ogni singolo carattere del record costituisce un campo.
-(Questo comportamente @`e un'estensione @command{gawk}. POSIX @command{awk} non
-specifica il comportamento quando @code{FS} @`e la stringa nulla.
-Nonostante questo, alcune altre versioni di @command{awk} trattano @code{""}
-in modo speciale.)
-
-@cindex POSIX @command{awk}, variabile @code{FS} e
-Il valore di default @`e @w{@code{" "}}, una stringa consistente in un singolo
-spazio. In via eccezionale, questo valore significa che qualsiasi sequenza
-di spazi, TAB, e/o ritorni a capo costituisce
-un solo separatore.
-Inoltre eventuali spazi, TAB e ritorni a capo all'inizio e alla fine
-del record in input vengono ignorati.
-
-Si pu@`o impostare il valore di @code{FS} sulla riga dei comandi usando
-l'opzione @option{-F}:
-
-@example
-awk -F, '@var{programma}' @var{file-in-input}
-@end example
-
-@cindex @command{gawk}, separatori di campo e
-Se @command{gawk} sta usando @code{FIELDWIDTHS} o @code{FPAT}
-per separare i campi,
-assegnare un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} torni alla
-separazione dei campi normale, fatta utilizzando la variabile @code{FS}.
-Un modo semplice per fare questo
-@`e semplicemente quello di scrivere l'istruzione
-@samp{FS = FS}, aggiungendo magari un commento esplicativo.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex @code{IGNORECASE}, variabile
-@cindex variabile @code{IGNORECASE}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{IGNORECASE}
-@cindex maiuscolo/minuscolo e confronti tra stringhe
-@cindex maiuscolo/minuscolo e @dfn{regexp}
-@cindex espressioni regolari, maiuscolo/minuscolo
-@item IGNORECASE #
-Se la variabile @code{IGNORECASE} @`e diversa da zero o dalla stringa nulla,
-tutti i confronti tra stringhe
-e tutti i confronti tra espressioni regolari sono insensibili
-alle differenze maiuscolo/minuscolo.
-Questo vale per il confronto tra @dfn{regexp}
-usando @samp{~} e @samp{!~}, per le funzioni @code{gensub()},
-@code{gsub()}, @code{index()}, @code{match()}, @code{patsplit()},
-@code{split()} e @code{sub()},
-per la determinazione della fine record con @code{RS} e per la divisione
-in campi con @code{FS} e @code{FPAT}.
-Tuttavia, il valore di @code{IGNORECASE} @emph{non} influenza gli indici
-dei vettori
-e non influenza la separazione dei campi qualora si usi un separatore di campo
-costituito da un unico carattere.
-@xref{Maiuscolo-Minuscolo}.
-
-@cindex @command{gawk}, variabile @code{LINT} in
-@cindex @code{LINT}, variabile
-@cindex variabile @code{LINT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{LINT}
-@cindex @dfn{lint}, controlli
-@cindex controlli @dfn{lint}
-@item LINT #
-Quando questa variabile @`e vera (non uguale a zero e non uguale alla stringa
-nulla), @command{gawk} si comporta come se fosse stata specificata sulla
-riga di comando l'opzione @option{--lint}
-(@pxref{Opzioni}).
-Con un valore di @code{"fatal"}, gli avvertimenti di @dfn{lint} generano un errore
-fatale.
-Con un valore di @code{"invalid"}, sono inviati solo gli avvertimenti
-per cose che sono effettivamente non valide. (Questa parte non funziona
-ancora perfettamente.)
-Ogni altro valore @dfn{vero} stampa avvertimenti non fatali.
-Se @code{LINT} ha per valore @dfn{falso} nessun avvertimento @dfn{lint} viene
-stampato.
-
-Questa variabile @`e un'estensione @command{gawk}. Non ha un valore speciale
-per altre implementazioni di @command{awk}. A differenza di altre variabili
-speciali, modificare il valore di @code{LINT} altera la produzione di
-avvertimenti @dfn{lint} anche se @command{gawk} @`e in modalit@`a compatibile.
-Analogamente a come le opzioni
-@option{--lint} e @option{--traditional} controllano in maniera indipendente
-diversi aspetti del comportamente di @command{gawk}, il controllo
-degli avvertimenti di @dfn{lint} durante l'esecuzione del programma @`e indipendente
-dall'implementazione @command{awk} in esecuzione.
-
-@cindex @code{OFMT}, variabile
-@cindex variabile @code{OFMT}
-@cindex numeri, conversione in stringhe
-@cindex stringhe, conversione in numeri
-@item OFMT
-@`E questa la stringa che controlla la conversione di numeri in
-stringhe (@pxref{Conversione}) quando li
-si stampa con l'istruzione
-@code{print}. Funziona passandola
- come primo argomento alla funzione @code{sprintf()}
-(@pxref{Funzioni per stringhe}).
-Il suo valore di default @`e @code{"%.6g"}. Le prime versioni di @command{awk}
-usavano @code{OFMT} per specificare il formato da usare per convertire
-numeri in stringhe in espressioni generali; questo compito @`e ora svolto
-da @code{CONVFMT}.
-
-@cindex @code{sprintf()}, funzione, variabile @code{OFMT} e
-@cindex funzione @code{sprintf()}, variabile @code{OFMT} e
-@cindex @code{print}, istruzione, variabile @code{OFMT} e
-@cindex istruzione @code{print}, variabile @code{OFMT} e
-@cindex variabile @code{OFS}
-@cindex @code{OFS}, variabile
-@cindex campo, separatori di
-@cindex separatori di campo
-@item OFS
-@`E il separatore dei campi in output (@pxref{Separatori di output}). @`E ci@`o
-che viene stampato in output per separare i campi stampati da un'istruzione @code{print}.
-Il suo valore di default @`e @w{@code{" "}}, una stringa costituita da un solo
-spazio.
-
-@cindex @code{ORS}, variabile
-@cindex variabile @code{ORS}
-@item ORS
-Il separatore dei record in output. Viene stampato alla fine di ogni
-istruzione @code{print}. Il suo valore di default @`e @code{"\n"},
-il carattere di ritorno a capo.
-(@xref{Separatori di output}.)
-
-@cindex @code{PREC}, variabile
-@cindex variabile @code{PREC}
-@item PREC #
-La precisione disponibile nei numeri a virgola mobile a precisione arbitraria,
-per default 53 bit (@pxref{Impostare la precisione}).
-
-@cindex @code{ROUNDMODE}, variabile
-@cindex variabile @code{ROUNDMODE}
-@item ROUNDMODE #
-La modalit@`a di arrotondamento da usare per operazioni aritmetiche a precisione
-arbitraria svolte sui numeri, per default @code{"N"}
-(@code{roundTiesToEven} nello standard
-IEEE 754; @pxref{Impostare modi di arrotondare}).
-
-@cindex @code{RS}, variabile
-@cindex variabile @code{RS}
-@cindex separatori di record
-@cindex record, separatori di
-@item @code{RS}
-Il separatore tra record in input. Il suo valore di default @`e una stringa
-contenente il solo carattere di ritorno a capo, il che significa che un record in input
-consiste di una sola riga di testo.
-Il suo valore pu@`o essere anche la stringa nulla, nel qual caso i record sono
-separati da una o pi@`u righe vuote.
-Se invece @`e una @dfn{regexp}, i record sono separati da
-corrispondenze alla @dfn{regexp} nel testo in input.
-(@xref{Record}.)
-
-La possibilit@`a che @code{RS} sia un'espressione regolare
-@`e un'estensione @command{gawk}.
-In molte altre implementazioni @command{awk}, oppure
-se @command{gawk} @`e in modalit@`a compatibile
-(@pxref{Opzioni}),
-@`e usato solo il primo carattere del valore di @code{RS}.
-
-@cindex @code{SUBSEP}, variabile
-@cindex variabile @code{SUBSEP}
-@cindex separatori di indici
-@cindex indici, separatori di
-@item @code{SUBSEP}
-Il separatore di indici. Ha il valore di default di
-@code{"\034"} ed @`e usato per separare le parti di cui sono composti gli indici
-di un vettore multidimensionale. Quindi, l'espressione
-@samp{@w{pippo["A", "B"]}}
-in realt@`a accede a @code{pippo["A\034B"]}
-(@pxref{Vettori multidimensionali}).
-
-@cindex @command{gawk}, variabile @code{TEXTDOMAIN} in
-@cindex @code{TEXTDOMAIN}, variabile
-@cindex variabile @code{TEXTDOMAIN}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{TEXTDOMAIN}
-@cindex internazionalizzazione, localizzazione
-@item TEXTDOMAIN #
-Usata per l'internazionalizzazione di programmi a livello di
-@command{awk}. Imposta il dominio di testo (@dfn{text domain}) di default per costanti stringa
-marcate in maniera speciale nel codice sorgente, e anche per le funzioni
-@code{dcgettext()}, @code{dcngettext()} e @code{bindtextdomain()}
-@iftex
-(@pxrefil{Internazionalizzazione}).
-@end iftex
-@ifnottex
-(@pxref{Internazionalizzazione}).
-@end ifnottex
-Il valore di default di @code{TEXTDOMAIN} @`e @code{"messages"}.
-@end table
-
-@node Variabili auto-assegnate
-@subsection Variabili predefinite con cui @command{awk} fornisce informazioni
-
-@cindex predefinite, variabili, che forniscono informazioni
-@cindex variabili predefinite, che forniscono informazioni
-Quella che segue @`e una lista in ordine alfabetico di variabili che
-@command{awk} imposta automaticamente in determinate situazioni per
-fornire informazioni a un programma.
-
-Le variabili specifiche di @command{gawk} sono contrassegnate da un
-cancelletto (@samp{#}). Queste variabili sono estensioni @command{gawk}.
-In altre implementazioni di @command{awk} o se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}), non hanno un significato speciale:
-
-@c @asis for docbook
-@table @asis
-@cindex @code{ARGC}/@code{ARGV}, variabili
-@cindex argomenti, riga di comando
-@cindex riga di comando, argomenti
-@item @code{ARGC}, @code{ARGV}
-Gli argomenti della riga di comando disponibili ai programmi @command{awk}
-sono memorizzati in un vettore di nome
-@code{ARGV}. @code{ARGC} @`e il numero di argomenti presenti sulla
-riga di comando.
-@xref{Altri argomenti}.
-A differenza di quasi tutti i vettori di @command{awk},
-@code{ARGV} @`e indicizzato da 0 a @code{ARGC} @minus{} 1.
-Lo si pu@`o vedere nell'esempio seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{for (i = 0; i < ARGC; i++)}
-> @kbd{print ARGV[i]}
-> @kbd{@}' inventory-shipped mail-list}
-@print{} awk
-@print{} inventory-shipped
-@print{} mail-list
-@end example
-
-@noindent
-@code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
-contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
-@samp{mail-list}. Il valore di @code{ARGC} @`e tre, ossia uno in pi@`u
-dell'indice dell'ultimo elemento di @code{ARGV}, perch@'e gli elementi sono
-numerati a partire da zero.
-
-@cindex convenzioni di programmazione, variabili @code{ARGC}/@code{ARGV}
-I nomi @code{ARGC} e @code{ARGV}, come pure la convenzione di indicizzare
-il vettore da 0 a @code{ARGC} @minus{} 1, derivano dal modo in cui il
-linguaggio C accede agli argomenti presenti sulla riga di comando.
-
-@cindex angolo buio, valore di @code{ARGV[0]}
-Il valore di @code{ARGV[0]} pu@`o variare da sistema a sistema.
-Va anche notato che il programma @emph{non}
-@`e incluso in @code{ARGV}, e non sono incluse neppure le eventuali opzioni di
-@command{awk} specificate sulla riga di comando.
-@xref{ARGC e ARGV} per informazioni
-su come @command{awk} usa queste variabili.
-@value{DARKCORNER}
-
-@cindex @code{ARGIND}, variabile
-@cindex variabile @code{ARGIND}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ARGIND}
-@item @code{ARGIND #}
-L'indice in @code{ARGV} del file correntemente in elaborazione.
-Ogni volta che @command{gawk} apre un nuovo @value{DF} per elaborarlo, imposta
-@code{ARGIND} all'indice in @code{ARGV} del @value{FN}.
-Quando @command{gawk} sta elaborando i file in input, il confronto
-@samp{FILENAME == ARGV[ARGIND]} @`e sempre verificato.
-
-@cindex file, elaborazione@comma{} variabile @code{ARGIND} e
-Questa variabile @`e utile nell'elaborazione dei file; consente di stabilire
-a che punto ci si trova nella lista
-di @value{DF}, e anche di distinguere tra successive occorrenze dello stesso
-@value{FN} sulla riga dei comandi.
-
-@cindex nomi di file, distinguere
-Anche se @`e possibile modificare il valore di @code{ARGIND} all'interno del
-programma @command{awk}, @command{gawk} automaticamente lo imposta a un nuovo
-valore quando viene aperto il file successivo.
-
-@cindex @code{ENVIRON}, vettore
-@cindex vettore @code{ENVIRON}
-@cindex variabili d'ambiente, nel vettore @code{ENVIRON}
-@item @code{ENVIRON}
-Un vettore associativo contenente i valori delle variabili d'ambiente.
-Gli indici del vettore sono i nomi delle variabili d'ambiente; gli elementi
-sono i valori della specifica variabile d'ambiente. Per esempio,
-@code{ENVIRON["HOME"]} potrebbe valere @code{/home/arnold}.
-
-Per POSIX @command{awk}, le modifiche a questo vettore non cambiano
-le variabili d'ambiente passate a qualsivoglia programma che @command{awk}
-pu@`o richiamare tramite una ridirezione
-o usando la funzione @code{system()}.
-
-Tuttavia, a partire dalla @value{PVERSION} 4.2, se non si @`e in
-modalit@`a compatibile POSIX, @command{gawk} aggiorna le proprie variabili
-d'ambiente, quando si modifica @code{ENVIRON}, e in questo modo sono
-modificate anche le variabili d'ambiente disponibili ai programmi richiamati.
-Un'attenzione speciale dovrebbe essere prestata alla modifica di
-@code{ENVIRON["PATH"]}, che @`e il percorso di ricerca usato per trovare
-i programmi eseguibili.
-
-Queste modifiche possono anche influire sul programma @command{gawk}, poich@'e
-alcune funzioni predefinite possono tener conto di certe
-variabili d'ambiente.
-L'esempio pi@`u notevole di una tale situazione @`e @code{mktime()}
-(@pxref{Funzioni di tempo})
-che, in molti sistemi, tiene conto del valore della
-variabile d'ambiente @env{TZ}.
-
-Alcuni sistemi operativi possono non avere variabili d'ambiente.
-In tali sistemi, il vettore @code{ENVIRON} @`e vuoto (tranne che per
-le variabili
-@w{@code{ENVIRON["AWKPATH"]}} e
-@w{@code{ENVIRON["AWKLIBPATH"]}} eventualmente presenti;
-@pxref{AWKPATH (Variabile)} e
-@ifdocbook
-@ref{AWKLIBPATH (Variabile)}).
-@end ifdocbook
-@ifnotdocbook
-@pxref{AWKLIBPATH (Variabile)}).
-@end ifnotdocbook
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile
-@cindex variabile @code{ERRNO}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ERRNO}
-@cindex gestione errori, variabile @code{ERRNO} e
-@item @code{ERRNO #}
-Se si verifica un errore di sistema durante una ridirezione per @code{getline},
-durante una lettura per @code{getline} o durante un'operazione di
-@code{close()}, la variabile
-@code{ERRNO} contiene una stringa che descrive l'errore.
-
-Inoltre, @command{gawk} annulla @code{ERRNO} prima di aprire ogni
-file in input presente sulla riga di comando. Questo consente di controllare
-se il file @`e accessibile
-all'interno di un criterio di ricerca @code{BEGINFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-Per il resto, @code{ERRNO} si comporta analogamente alla variabile C
-@code{errno}.
-Tranne nel caso sopra accennato, @command{gawk} non annulla @emph{mai}
-@code{ERRNO} (lo imposta a zero o a @code{""}). Quindi, ci si deve
-aspettare che il suo valore sia significativo solo quando un'operazione
-di I/O restituisce un valore che indica il fallimento dell'operazione, come
-per esempio quando @code{getline} restituisce @minus{}1. Si @`e, naturalmente,
-liberi di annullarla prima di effettuare un'operazione di I/O.
-
-Se il valore di @code{ERRNO} corrisponde a un errore di sistema della
-variabile C @code{errno}, @code{PROCINFO["errno"]} sar@`a impostato al valore
-di @code{errno}. Per errori non di sistema, @code{PROCINFO["errno"]} sar@`a
-impostata al valore zero.
-
-@cindex @code{FILENAME}, variabile
-@cindex variabile @code{FILENAME}
-@cindex angolo buio, variabile @code{FILENAME}
-@item @code{FILENAME}
-Il nome del file in input corrente. Quando non ci sono @value{DF}
-sulla riga dei comandi, @command{awk} legge dallo standard input e
-@code{FILENAME} @`e impostato a @code{"-"}. @code{FILENAME} cambia ogni
-volta che si legge un nuovo file
-@iftex
-(@pxrefil{Leggere file}).
-@end iftex
-@ifnottex
-(@pxref{Leggere file}).
-@end ifnottex
-All'interno di una
-regola @code{BEGIN}, il valore di @code{FILENAME} @`e @code{""}, perch@'e non si
-sta elaborando alcun file in input.@footnote{Alcune tra le prime implementazioni di Unix
-@command{awk} inizializzavano @code{FILENAME} a @code{"-"}, anche se
-vi erano @value{DF} da elaborare. Un tale comportamento era incorretto e
-non ci si dovrebbe poter contare nei programmi.}
-@value{DARKCORNER} Si noti, tuttavia,
-che l'uso di @code{getline} (@pxref{Getline}) all'interno di una regola
-@code{BEGIN} pu@`o implicare l'assegnamento di un valore a @code{FILENAME}.
-
-@cindex @code{FNR}, variabile
-@cindex variabile @code{FNR}
-@item @code{FNR}
-Il numero del record corrente nel file corrente. @command{awk} incrementa
-@code{FNR} ogni volta che legge un nuovo record (@pxref{Record}).
-@command{awk} imposta nuovamente a zero @code{FNR} ogni volta che inizia a
-leggere un nuovo file in input.
-
-@cindex @code{NF}, variabile
-@cindex variabile @code{NF}
-@item @code{NF}
-Il numero di campi nel corrente record in input.
-@code{NF} @`e impostato ogni volta che si legge un nuovo record,
-quando un nuovo campo viene creato,
-o quando si modifica @code{$0} (@pxref{Campi}).
-
-A differenza di molte altre variabili descritte in questa @value{SUBSECTION},
-l'assegnamento di un valore a @code{NF} pu@`o potenzialmente influenzare
-il funzionamento interno di @command{awk}. In particolare, assegnamenti
-a @code{NF} si possono usare per aggiungere o togliere campi dal
-record corrente. @xref{Cambiare i campi}.
-
-@cindex @code{FUNCTAB}, vettore
-@cindex vettore @code{FUNCTAB}
-@cindex @command{gawk}, vettore @code{FUNCTAB} in
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FUNCTAB}
-@item @code{FUNCTAB #}
-Un vettore i cui indici e i corrispondenti valori sono i nomi di tutte le
-funzioni predefinite, definite dall'utente ed estese, presenti nel programma.
-
-@quotation NOTA
-Il tentativo di usare l'istruzione @code{delete} per eliminare il vettore
-@code{FUNCTAB} genera un errore fatale. Genera un errore fatale anche
-ogni tentativo di impostare un elemento di @code{FUNCTAB}.
-@end quotation
-
-@cindex @code{NR}, variabile
-@cindex variabile @code{NR}
-@item @code{NR}
-Il numero di record in input che @command{awk} ha elaborato dall'inizio
-dell'esecuzione del programma
-(@pxref{Record}).
-@command{awk} incrementa @code{NR} ogni volta che legge un nuovo record.
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{PROCINFO}
-@item @code{PROCINFO #}
-Gli elementi di questo vettore danno accesso a informazioni sul
-programma @command{awk} in esecuzione.
-I seguenti elementi (elencati in ordine alfabetico)
-sono sicuramente sempre disponibili:
-
-@table @code
-@cindex effettivo, @dfn{ID di gruppo} dell'utente di @command{gawk}
-@item PROCINFO["egid"]
-Il valore restituito dalla chiamata di sistema @code{getegid()}.
-
-@item PROCINFO["errno"]
-Il valore della variabile C @code{ERRNO} quando @code{ERRNO} @`e impostato
-al messaggio di errore a essa associato.
-
-@item PROCINFO["euid"]
-@cindex @dfn{ID effettivo} dell'utente di @command{gawk}
-Il valore restituito dalla chiamata di sistema @code{geteuid()}.
-
-@item PROCINFO["FS"]
-Questo elemento vale
-@code{"FS"} se @`e in uso la separazione in campi con @code{FS},
-@code{"FIELDWIDTHS"} se @`e in uso quella con @code{FIELDWIDTHS},
-oppure @code{"FPAT"} se @`e in uso l'individuazione di campo con @code{FPAT}.
-
-@item PROCINFO["gid"]
-@cindex @dfn{ID di gruppo} dell'utente @command{gawk}
-Il valore restituito dalla chiamata di sistema @code{getgid()} .
-
-@item PROCINFO["identifiers"]
-@cindex programma, identificativi in un
-@cindex identificativi in un programma
-Un sottovettore, indicizzato dai nomi di tutti gli identificativi usati
-all'interno del programma @command{awk}. Un @dfn{identificativo} @`e
-semplicemente il nome di una variabile
-(scalare o vettoriale), una funzione predefinita, una funzione definita
-dall'utente, o una funzione contenuta in un'estensione.
-Per ogni identificativo, il valore dell'elemento @`e uno dei seguenti:
-
-@table @code
-@item "array"
-L'identificativo @`e un vettore.
-
-@item "builtin"
-L'identificativo @`e una funzione predefinita.
-
-@item "extension"
-L'identificativo @`e una funzione in un'estensione caricata tramite
-@code{@@load} o con l'opzione @option{-l}.
-
-@item "scalar"
-L'identificativo @`e uno scalare.
-
-@item "untyped"
-L'identificativo non ha ancora un tipo (potrebbe essere usato come scalare o
-come vettore; @command{gawk} non @`e ancora in grado di dirlo).
-
-@item "user"
-L'identificativo @`e una funzione definita dall'utente.
-@end table
-
-@noindent
-I valori riportano ci@`o che @command{gawk} sa sugli identificativi
-dopo aver finito l'analisi iniziale del programma; questi valori @emph{non}
-vengono pi@`u aggiornati durante l'esecuzione del programma.
-
-@item PROCINFO["pgrpid"]
-@cindex @dfn{process group ID} del programma @command{gawk}
-Il @dfn{ID di gruppo del processo} del programma corrente.
-
-@item PROCINFO["pid"]
-@cindex @dfn{process ID} del programma @command{gawk}
-Il @dfn{process ID} del programma corrente.
-
-@item PROCINFO["ppid"]
-@cindex @dfn{parent process ID} del programma @command{gawk}
-Il @dfn{ID di processo del padre} del programma corrente.
-
-@item PROCINFO["strftime"]
-La stringa col formato di default usato per la funzione @code{strftime()}.
-Assegnando un nuovo valore a questo elemento si cambia quello di default.
-@xref{Funzioni di tempo}.
-
-@item PROCINFO["uid"]
-Il valore restituito dalla chiamata di sistema @code{getuid()}.
-
-@item PROCINFO["version"]
-@cindex versione di @command{gawk}
-@cindex @command{gawk}, versione di
-La versione di @command{gawk}.
-@end table
-
-I seguenti elementi addizionali del vettore
-sono disponibili per fornire informazioni sulle librerie MPFR e GMP,
-se la versione in uso di @command{gawk} consente il calcolo con precisione
-arbitraria
-(@pxref{Calcolo con precisione arbitraria}):
-
-@table @code
-@item PROCINFO["gmp_version"]
-@cindex versione della libreria GNU MP
-La versione della libreria GNU MP.
-
-@cindex versione della libreria GNU MPFR
-@item PROCINFO["mpfr_version"]
-La versione della libreria GNU MPFR.
-
-@item PROCINFO["prec_max"]
-@cindex precisione massima consentita dalla libreria MPFR
-La massima precisione consentita da MPFR.
-
-@item PROCINFO["prec_min"]
-@cindex precisione minima richiesta dalla libreria MPFR
-La precisione minima richiesta da MPFR.
-@end table
-
-I seguenti elementi addizionali del vettore
-sono disponibili per fornire
-informazioni sulla versione dell'estensione API, se la versione
-di @command{gawk} prevede il caricamento dinamico di funzioni di estensione
-@iftex
-(@pxrefil{Estensioni dinamiche}):
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}):
-@end ifnottex
-
-@table @code
-@item PROCINFO["api_major"]
-@cindex versione dell'estensione API @command{gawk}
-@cindex estensione API, numero di versione
-La versione principale dell'estensione API.
-
-@item PROCINFO["api_minor"]
-La versione secondaria dell'estensione API.
-@end table
-
-@cindex gruppi supplementari Unix con @command{gawk}
-Su alcuni sistemi, ci possono essere elementi nel vettore, da @code{"group1"}
-fino a @code{"group@var{N}"}. @var{N} @`e il numero di
-gruppi supplementari che il processo [Unix] possiede. Si usi l'operatore
-@code{in} per verificare la presenza di questi elementi
-(@pxref{Visitare elementi}).
-
-I seguenti elementi consentono di modificare il comportamento di
-@command{gawk}:
-
-@item PROCINFO["NONFATAL"]
-Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni
-consentono la prosecuzizone del programma.
-@xref{Continuazione dopo errori}.
-
-@item PROCINFO["@var{nome_output}", "NONFATAL"]
-Gli errori in output per il file @var{nome_output}
-consentono la prosecuzizone del programma.
-@xref{Continuazione dopo errori}.
-
-@table @code
-@item PROCINFO["@var{comando}", "pty"]
-Per una comunicazione bidirezionale con @var{comando}, si usi una pseudo-tty
-invece di impostare una @dfn{pipe} bidirezionale.
-@xref{I/O bidirezionale} per ulteriori informazioni.
-
-@item PROCINFO["@var{input_name}", "READ_TIMEOUT"]
-Imposta un tempo limite per leggere dalla ridirezione di input @var{input_name}.
-@xref{Timeout in lettura} per ulteriori informazioni.
-
-@item PROCINFO["sorted_in"]
-Se questo elemento esiste in @code{PROCINFO}, il suo valore controlla
-l'ordine in cui gli indici dei vettori saranno elaborati nei cicli
-@samp{for (@var{indice} in @var{vettore})}.
-Questa @`e una funzionalit@`a avanzata, la cui descrizione completa sar@`a vista
-pi@`u avanti; si veda
-@ref{Visitare un intero vettore}.
-@end table
-
-@cindex @code{RLENGTH}, variabile
-@cindex variabile @code{RLENGTH}
-@item @code{RLENGTH}
-La lunghezza della sottostringa individuata dalla funzione
-@code{match()}
-(@pxref{Funzioni per stringhe}).
-@code{RLENGTH} viene impostata quando si richiama la funzione @code{match()}.
-Il suo
-valore @`e la lunghezza della stringa individuata, oppure @minus{}1 se non @`e
-stata trovata alcuna corrispondenza.
-
-@cindex @code{RSTART}, variabile
-@cindex variabile @code{RSTART}
-@item @code{RSTART}
-L'indice, in caratteri, da cui parte la sottostringa che @`e individuata dalla
-funzione @code{match()}
-(@pxref{Funzioni per stringhe}).
-@code{RSTART} viene impostata quando si richiama la funzione @code{match()}.
-Il suo
-valore @`e la posizione nella stringa da cui inizia la sottostringa
-individuata, oppure zero, se non @`e stata trovata alcuna corrispondenza.
-
-@cindex @command{gawk}, variabile @code{RT} in
-@cindex @code{RT}, variabile
-@cindex variabile @code{RT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{RT}
-@item @code{RT #}
-Il testo in input che corrisponde al testo individuato da @code{RS},
-il separatore di record. Questa variabile viene impostata dopo aver letto
-ciascun record.
-
-@cindex @command{gawk}, vettore @code{SYMTAB} in
-@cindex @code{SYMTAB}, vettore
-@cindex vettore @code{SYMTAB}
-@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{SYMTAB}
-@item @code{SYMTAB #}
-Un vettore i cui indici sono i nomi di tutte le variabili globali e i vettori
-definiti nel programma. @code{SYMTAB} rende visibile al
-programmatore @command{awk} la tabella dei simboli di @command{gawk}.
-Viene preparata nella fase di analisi iniziale del programma @command{gawk}
-ed @`e completata prima di cominciare a eseguire il programma.
-
-Il vettore pu@`o essere usato per accedere indirettamente, in lettura o in
-scrittura, al valore di una variabile:
-
-@example
-pippo = 5
-SYMTAB["pippo"] = 4
-print pippo # stampa 4
-@end example
-
-@noindent
-La funzione @code{isarray()} (@pxref{Funzioni per i tipi}) si pu@`o usare per
-controllare se un elemento in @code{SYMTAB} @`e un vettore.
-Inoltre, non @`e possibile usare l'istruzione @code{delete} con il vettore
-@code{SYMTAB}.
-
-@`E possibile aggiungere a @code{SYMTAB} un elemento che non sia un
-identificativo gi@`a esistente:
-
-@example
-SYMTAB["xxx"] = 5
-print SYMTAB["xxx"]
-@end example
-
-@noindent
-Il risultato @`e quello previsto: in questo caso @code{SYMTAB} si comporta
-come un normale vettore. La sola differenza @`e che non @`e poi possibile
-cancellare @code{SYMTAB["xxx"]}.
-
-@cindex Schorr, Andrew
-Il vettore @code{SYMTAB} @`e pi@`u interessante di quel che sembra. Andrew
-Schorr fa notare che effettivamente consente di ottenere dei puntatori ai dati
-in @command{awk}. Si consideri quest'esempio:
-
-@example
-# Moltiplicazione indiretta di una qualsiasi variabile per un
-# numero a piacere e restituzione del risultato
-
-function multiply(variabile, numero)
-@{
- return SYMTAB[variabile] *= numero
-@}
-@end example
-
-@noindent
-Si potrebbe usare in questo modo:
-
-@example
-BEGIN @{
- risposta = 10.5
- multiply("risposta", 4)
- print "La risposta @`e", risposta
-@}
-@end example
-
-@noindent
-Eseguendo, il risultato @`e:
-
-@example
-$ @kbd{gawk -f risposta.awk}
-@print{} La risposta @`e 42
-@end example
-
-@quotation NOTA
-Per evitare seri paradossi temporali,
-@footnote{Per non parlare dei grossi problemi di implementazione.}
-n@'e @code{FUNCTAB} n@'e @code{SYMTAB}
-sono disponibili come elementi all'interno del vettore @code{SYMTAB}.
-@end quotation
-@end table
-
-@cindex sidebar, Modificare @code{NR} e @code{FNR}
-@ifdocbook
-@docbook
-<sidebar><title>Modificare @code{NR} e @code{FNR}</title>
-@end docbook
-
-@cindex @code{NR}, variabile, modifica di
-@cindex variabile @code{NR}, modifica di
-@cindex @code{FNR}, variabile, modifica di
-@cindex variabile @code{FNR}, modifica di
-@cindex angolo buio, variabili @code{FNR}/@code{NR}
-@command{awk} incrementa le variabili @code{NR} e @code{FNR}
-ogni volta che legge un record, invece che impostarle al valore assoluto del
-numero di record letti. Ci@`o significa che un programma pu@`o
-modificare queste variabili e i valori cos@`{@dotless{i}} assegnati sono incrementati per
-ogni record.
-@value{DARKCORNER}
-Si consideri l'esempio seguente:
-
-@example
-$ @kbd{echo '1}
-> @kbd{2}
-> @kbd{3}
-> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
-> @kbd{@{ print NR @}'}
-@print{} 1
-@print{} 17
-@print{} 18
-@print{} 19
-@end example
-
-@noindent
-Prima che @code{FNR} venisse aggiunto al linguaggio @command{awk}
-(@pxref{V7/SVR3.1}),
-molti programmi @command{awk} usavano questa modalit@`a per
-contare il numero di record in un file impostando a zero @code{NR} al cambiare
-di @code{FILENAME}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Modificare @code{NR} e @code{FNR}}
-
-
-@cindex @code{NR}, variabile, modifica di
-@cindex variabile @code{NR}, modifica di
-@cindex @code{FNR}, variabile, modifica di
-@cindex variabile @code{FNR}, modifica di
-@cindex angolo buio, variabili @code{FNR}/@code{NR}
-@command{awk} incrementa le variabili @code{NR} e @code{FNR}
-ogni volta che legge un record, invece che impostarle al valore assoluto del
-numero di record letti. Ci@`o significa che un programma pu@`o
-modificare queste variabili e i valori cos@`{@dotless{i}} assegnati sono incrementati per
-ogni record.
-@value{DARKCORNER}
-Si consideri l'esempio seguente:
-
-@example
-$ @kbd{echo '1}
-> @kbd{2}
-> @kbd{3}
-> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
-> @kbd{@{ print NR @}'}
-@print{} 1
-@print{} 17
-@print{} 18
-@print{} 19
-@end example
-
-@noindent
-Prima che @code{FNR} venisse aggiunto al linguaggio @command{awk}
-(@pxref{V7/SVR3.1}),
-molti programmi @command{awk} usavano questa modalit@`a per
-contare il numero di record in un file impostando a zero @code{NR} al cambiare
-di @code{FILENAME}.
-@end cartouche
-@end ifnotdocbook
-
-@node ARGC e ARGV
-@subsection Usare @code{ARGC} e @code{ARGV}
-@cindex @code{ARGC}/@code{ARGV}, variabili, come usarle
-@cindex variabili @code{ARGC}/@code{ARGV}, come usarle
-@cindex argomenti, riga di comando
-@cindex riga di comando, argomenti
-
-@iftex
-La
-@end iftex
-@ref{Variabili auto-assegnate}
-conteneva il programma seguente che visualizzava le informazioni contenute
-in @code{ARGC} e @code{ARGV}:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{for (i = 0; i < ARGC; i++)}
-> @kbd{print ARGV[i]}
-> @kbd{@}' inventory-shipped mail-list}
-@print{} awk
-@print{} inventory-shipped
-@print{} mail-list
-@end example
-
-@noindent
-In questo esempio, @code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
-contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
-@samp{mail-list}.
-Si noti che il nome del programma @command{awk} non @`e incluso in @code{ARGV}.
-Le altre opzioni della riga di comando, con i relativi argomenti,
-sono parimenti non presenti, compresi anche gli assegnamenti di
-variabile fatti tramite l'opzione @option{-v}
-(@pxref{Opzioni}).
-I normali assegnamenti di variabile sulla riga dei comandi @emph{sono}
-trattati come argomenti e quindi inseriti nel vettore @code{ARGV}.
-Dato il seguente programma in un file di nome @file{vediargomenti.awk}:
-
-@example
-BEGIN @{
- printf "A=%d, B=%d\n", A, B
- for (i = 0; i < ARGC; i++)
- printf "\tARGV[%d] = %s\n", i, ARGV[i]
-@}
-END @{ printf "A=%d, B=%d\n", A, B @}
-@end example
-
-@noindent
-la sua esecuzione produce il seguente risultato:
-
-@example
-$ @kbd{awk -v A=1 -f vediargomenti.awk B=2 /dev/null}
-@print{} A=1, B=0
-@print{} ARGV[0] = awk
-@print{} ARGV[1] = B=2
-@print{} ARGV[2] = /dev/null
-@print{} A=1, B=2
-@end example
-
-Un programma pu@`o modificare @code{ARGC} e gli elementi di @code{ARGV}.
-Ogni volta che @command{awk} arriva alla fine di un file in input, usa
-il successivo elemento nel vettore @code{ARGV} come nome del successivo file
-in input. Cambiando il contenuto di quella stringa, un programma
-pu@`o
-modificare la lista dei file che sono letti.
-Si usi @code{"-"} per rappresentare lo standard input. Assegnando ulteriori
-elementi e incrementando @code{ARGC}
-verranno letti ulteriori file.
-
-Se il valore di @code{ARGC} viene diminuto, vengono ignorati i file in input
-posti alla fine della lista. Memorizzando il valore originale di @code{ARGC}
-da qualche altra parte, un programma pu@`o gestire gli argomenti
-ignorati come se fossero qualcosa di diverso dai @value{FN}.
-
-Per eliminare un file che sia in mezzo alla lista, si imposti in @code{ARGV}
-la stringa nulla
-(@code{""}) al posto del nome del file in questione. Come funzionalit@`a
-speciale, @command{awk} ignora valori di @value{FN} che siano stati
-rimpiazzati con la stringa nulla.
-Un'altra possibilit@`a @`e quella
-di usare l'istruzione @code{delete} per
-togliere elementi da @code{ARGV} (@pxref{Cancellazione}).
-
-Tutte queste azioni sono tipicamente eseguite nella regola @code{BEGIN},
-prima di iniziare l'elaborazione vera e propria dell'input.
-@xref{Programma split} e
-@ifnotdocbook
-@pxref{Programma tee}
-@end ifnotdocbook
-@ifdocbook
-@ref{Programma tee}
-@end ifdocbook
-per esempi
-su ognuno dei modi per togliere elementi dal vettore @code{ARGV}.
-
-Per passare direttamente delle opzioni a un programma scritto in
-@command{awk}, si devono terminare le opzioni di @command{awk} con
-@option{--} e poi inserire le opzioni destinate al programma @command{awk},
-come mostrato qui di seguito:
-
-@example
-awk -f mio_programma.awk -- -v -q file1 file2 @dots{}
-@end example
-
-Il seguente frammento di programma ispeziona @code{ARGV} per esaminare, e
-poi rimuovere, le opzioni sulla riga di comando viste sopra:
-
-@example
-BEGIN @{
- for (i = 1; i < ARGC; i++) @{
- if (ARGV[i] == "-v")
- verbose = 1
- else if (ARGV[i] == "-q")
- debug = 1
- else if (ARGV[i] ~ /^-./) @{
- e = sprintf("%s: opzione non riconosciuta -- %c",
- ARGV[0], substr(ARGV[i], 2, 1))
- print e > "/dev/stderr"
- @} else
- break
- delete ARGV[i]
- @}
-@}
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{ARGC}/@code{ARGV}
-Terminare le opzioni di @command{awk} con @option{--} non @`e
-necessario in @command{gawk}. A meno che non si specifichi @option{--posix},
-@command{gawk} inserisce, senza emettere messaggi, ogni opzione non
-riconosciuta
-nel vettore @code{ARGV} perch@'e sia trattata dal programma @command{awk}.
-Dopo aver trovato un'opzione non riconosciuta, @command{gawk} non cerca
-ulteriori opzioni, anche se ce ne fossero di riconoscibili.
-La riga dei comandi precedente sarebbe
-con @command{gawk}:
-
-@example
-gawk -f mio_programma.awk -q -v file1 file2 @dots{}
-@end example
-
-@noindent
-Poich@'e @option{-q} non @`e un'opzione valida per @command{gawk}, quest'opzione
-e l'opzione @option{-v} che segue sono passate al programma @command{awk}.
-(@xref{Funzione getopt} per una funzione di libreria @command{awk}
-che analizza le opzioni della riga di comando.)
-
-Nel progettare un programma, si dovrebbero scegliere opzioni che non
-siano in conflitto con quelle di @command{gawk}, perch@'e ogni opzioni
-accettata da @command{gawk} verr@`a elaborata prima di passare il resto
-della riga dei comandi al programma @command{awk}.
-Usare @samp{#!} con l'opzione @option{-E} pu@`o essere utile in questo caso
-(@pxref{@dfn{Script} eseguibili}
-e
-@ifnotdocbook
-@pxref{Opzioni}).
-@end ifnotdocbook
-@ifdocbook
-@ref{Opzioni}).
-@end ifdocbook
-
-@node Sommario criteri e azioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Coppie @dfn{criterio di ricerca--azione} sono gli elementi base di un
-programma @command{awk}. I criteri di ricerca possono essere espressioni
-normali, espressioni di intervallo, o costanti @dfn{regexp}; possono anche
-essere i criteri speciali @code{BEGIN}, @code{END},
-@code{BEGINFILE} o @code{ENDFILE}; o essere omessi. L'azione viene eseguita
-se il record corrente soddisfa il criterio di ricerca. Criteri di ricerca
-vuoti (omessi) corrispondono a
-tutti i record in input.
-
-@item
-L'I/O effettuato nelle azioni delle regole @code{BEGIN} ed @code{END}
-ha alcuni vincoli.
-Questo vale a maggior ragione per le regole @code{BEGINFILE} ed
-@code{ENDFILE}. Queste ultime due forniscono degli ``agganci'' per interagire
-con l'elaborazione dei file fatta da @command{gawk},
-consentendo di risolvere situazioni che altrimenti genererebbero degli
-errori fatali (ad esempio per un file che non si @`e autorizzati
-a leggere).
-
-@item
-Le variabili di shell possono essere usate nei programmi @command{awk}
-prestando la dovuta attenzione all'uso degli apici.
-@`E pi@`u facile passare una variabile di shell ad
-@command{awk} usando l'opzione @option{-v} e una variabile @command{awk}.
-
-@item
-Le azioni sono formate da istruzioni racchiuse tra parentesi graffe.
-Le istruzioni sono composte da
-espressioni, istruzioni di controllo,
-istruzioni composte,
-istruzioni di input/output e istruzioni di cancellazione.
-
-@item
-Le istruzioni di controllo in @command{awk} sono @code{if}-@code{else},
-@code{while}, @code{for} e @code{do}-@code{while}. @command{gawk}
-aggiunge l'istruzione @code{switch}. Ci sono due tipi di istruzione
-@code{for}: uno per eseguire dei cicli, e l'altro per esaminare un vettore.
-
-@item
-Le istruzioni @code{break} e @code{continue} permettono di uscire
-velocemente da un ciclo, o di passare alla successiva iterazione dello
-stesso (o di uscire da un'istruzione @code{switch}).
-
-@item
-Le istruzioni @code{next} e @code{nextfile} permettono, rispettivamente,
-di passare al record successivo, ricominciando l'elaborazione dalla prima
-regola del programma, o di passare al successivo file in input, sempre
-ripartendo dalla prima regola del programma.
-
-@item
-L'istruzione @code{exit} termina il programma. Quando @`e eseguita
-dall'interno di un'azione (o nel corpo di una funzione), trasferisce
-il controlla alle eventuali istruzioni @code{END}. Se @`e eseguita nel corpo
-di un'istruzione @code{END}, il programma @`e terminato
-immediatamente. @`E possibile specificare un valore numerico da usare come
-codice di ritorno di @command{awk}.
-
-@item
-Alcune variabili predefinite permettono di controllare @command{awk},
-principalmente per l'I/O. Altre variabili trasmettono informazioni
-da @command{awk} al programma.
-
-@item
-I vettori @code{ARGC} e @code{ARGV} rendono disponibili al programma gli
-argomenti della riga di comando. Una loro modifica all'interno di una regola
-@code{BEGIN} permette di controllare come @command{awk} elaborer@`a i @value{DF}
-in input.
-
-@end itemize
-
-@node Vettori
-@chapter Vettori in @command{awk}
-@cindex vettori
-
-Un @dfn{vettore} @`e una tabella di valori chiamati @dfn{elementi}. Gli
-elementi di un vettore sono individuati dai loro @dfn{indici}. Gli indici
-possono essere numeri o stringhe.
-
-Questo @value{CHAPTER} descrive come funzionano i vettori in @command{awk},
-come usare gli elementi di un vettore, come visitare tutti gli elementi
-di un vettore, e come rimuovere elementi da un vettore.
-Descrive anche come @command{awk} simula vettori multidimensionali,
-oltre ad alcuni aspetti meno ovvii sull'uso dei vettori.
-Il @value{CHAPTER} prosegue illustrando la funzionalit@`a di ordinamento dei
-vettori di @command{gawk}, e termina con una breve descrizione della capacit@`a
-di @command{gawk} di consentire veri vettori di vettori.
-
-@menu
-* Fondamenti sui vettori:: Informazioni di base sui vettori.
-* Indici numerici di vettore:: Come usare numeri come indici in
- @command{awk}.
-* Indici non inizializzati:: Usare variabili non inizializzate come indici.
-* Cancellazione:: L'istruzione @code{delete} toglie un elemento
- da un vettore.
-* Vettori multidimensionali:: Emulare vettori multidimensionali in
- @command{awk}.
-* Vettori di vettori:: Vettori multidimensionali veri.
-* Sommario dei vettori:: Sommario dei vettori.
-@end menu
-
-@node Fondamenti sui vettori
-@section Informazioni di base sui vettori
-
-Questa @value{SECTION} espone le nozioni fondamentali: elaborare gli elementi
-di un vettore uno alla volta, e visitare sequenzialmente tutti gli elementi
-di un vettore.
-
-@menu
-* Introduzione ai vettori:: Introduzione ai vettori
-* Visitare elementi:: Come esaminare un elemento di un vettore.
-* Impostare elementi:: Come cambiare un elemento di un vettore.
-* Esempio di vettore:: Esempio semplice di vettore
-* Visitare un intero vettore:: Variazione dell'istruzione @code{for}. Esegue
- un ciclo attraverso gli indici degli elementi
- contenuti in un vettore.
-* Controllare visita:: Controllare l'ordine in cui i vettori sono
- visitati.
-@end menu
-
-@node Introduzione ai vettori
-@subsection Introduzione ai vettori
-
-@cindex Wall, Larry
-@quotation
-@i{Visitare sequenzialmente un vettore associativo @`e come tentare di
-lapidare qualcuno usando una mitragliatrice Uzi carica.}
-@author Larry Wall
-@end quotation
-
-Il linguaggio @command{awk} mette a disposizione vettori monodimensionali per
-memorizzare gruppi di stringhe o di numeri correlati fra loro. Ogni vettore di
-@command{awk} deve avere un nome. I nomi dei vettori hanno la stessa sintassi
-dei nomi di variabile; qualsiasi nome valido di variabile potrebbe essere anche
-un valido nome di vettore. Un nome per@`o non pu@`o essere usato in entrambi i
-modi (come vettore e come variabile) nello stesso programma @command{awk}.
-
-I vettori in @command{awk} assomigliano superficialmente ai vettori in altri
-linguaggi di programmazione, ma ci sono differenze fondamentali. In
-@command{awk}, non @`e necessario specificare la dimensione di un vettore prima
-di iniziare a usarlo. In pi@`u, qualsiasi numero o stringa pu@`o essere usato
-come indice di un vettore, non solo numeri interi consecutivi.
-
-Nella maggior parte degli altri linguaggi, i vettori devono essere
-@dfn{dichiarati} prima dell'uso, specificando quanti elementi o componenti
-contengono. In questi linguaggi, la dichiarazione causa l'allocazione, per
-questi elementi, di un blocco di memoria contiguo.
-Normalmente, un indice di un vettore dev'essere un intero non negativo.
-Per esempio, l'indice zero specifica il primo elemento nel vettore, che @`e
-effettivamente memorizzato all'inizio di un blocco di memoria. L'indice uno
-specifica il secondo elemento, che @`e memorizzato subito dopo il primo elemento,
-e cos@`{@dotless{i}} via. @`E impossibile aggiungere ulteriori elementi al vettore, perch@'e
-esso pu@`o contenere solo il numero di elementi dichiarato.
-(Alcuni linguaggi consentono indici iniziali e finali arbitrari---p.es.,
-@samp{15 .. 27}---per@`o la dimensione del vettore rimane fissa una volta che
-il vettore sia stato dichiarato.)
-
-@c 1/2015: Do not put the numeric values into @code. Array element
-@c values are no different than scalar variable values.
-Un vettore contiguo di quattro elementi potrebbe essere come quello in
-@ifnotdocbook
-@ref{vettore-elementi},
-@end ifnotdocbook
-@ifdocbook
-come mostrato in @inlineraw{docbook, <xref linkend="vettore-elementi"/>}:
-@end ifdocbook
-concettualmente, se i valori degli elementi sono 8, @code{"pippo"},
-@code{""} e 30.
-
-@ifnotdocbook
-@float Figura,vettore-elementi
-@caption{Un vettore contiguo}
-@ifset SMALLPRINT
-@center @image{vettore-elementi, 11cm, , Un vettore contiguo}
-@end ifset
-@ifclear SMALLPRINT
-@center @image{vettore-elementi, , , Un vettore contiguo}
-@end ifclear
-@end float
-@end ifnotdocbook
-
-@docbook
-<figure id="vettore-elementi" float="0">
-<title>Un vettore contiguo</title>
-<mediaobject>
-<imageobject role="web"><imagedata fileref="vettore-elementi.png" format="PNG"/></imageobject>
-</mediaobject>
-</figure>
-@end docbook
-
-@noindent
-Vengono memorizzati solo i valori; gli indici sono definiti implicitamente
-dall'ordine dei valori. Qui, 8 @`e il valore il cui indice @`e zero, perch@'e 8
-appare nella posizione con zero elementi prima di essa.
-
-@cindex vettori, indicizzazione
-@cindex indicizzare i vettori
-@cindex associativi, vettori
-@cindex vettori associativi
-I vettori in @command{awk} non sono di questo tipo: sono invece
-@dfn{associativi}.
-Ci@`o significa che ogni vettore @`e un insieme di coppie, ognuna costituita
-da un indice e dal corrispondente valore dell'elemento del vettore:
-
-@ifnotdocbook
-@c extra empty column to indent it right
-@multitable @columnfractions .1 .1 .1
-@headitem @tab Indice @tab Valore
-@item @tab @code{3} @tab @code{30}
-@item @tab @code{1} @tab @code{"pippo"}
-@item @tab @code{0} @tab @code{8}
-@item @tab @code{2} @tab @code{""}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-
-<tbody>
-<row>
-<entry><literal>3</literal></entry>
-<entry><literal>30</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"pippo"</literal></entry>
-</row>
-
-<row>
-<entry><literal>0</literal></entry>
-<entry><literal>8</literal></entry>
-</row>
-
-<row>
-<entry><literal>2</literal></entry>
-<entry><literal>""</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-Le coppie sono elencate in ordine casuale perch@'e il loro ordinamento @`e
-irrilevante.@footnote{L'ordine potr@`a variare nelle diverse implementazioni
-di @command{awk}, che tipicamente usa tabelle @dfn{hash} per memorizzare
-elementi e valori del vettore.}
-
-Un vantaggio dei vettori associativi @`e che si possono aggiungere nuove coppie
-in qualsiasi momento. Per esempio, supponiamo di aggiungere al vettore un
-decimo elemento il cui valore sia @w{@code{"numero dieci"}}. Il risultato sar@`a:
-
-@ifnotdocbook
-@c extra empty column to indent it right
-@multitable @columnfractions .1 .1 .3
-@headitem @tab Indice @tab Valore
-@item @tab @code{10} @tab @code{"numero dieci"}
-@item @tab @code{3} @tab @code{30}
-@item @tab @code{1} @tab @code{"pippo"}
-@item @tab @code{0} @tab @code{8}
-@item @tab @code{2} @tab @code{""}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-<tbody>
-
-<row>
-<entry><literal>10</literal></entry>
-<entry><literal>"numero dieci"</literal></entry>
-</row>
-
-<row>
-<entry><literal>3</literal></entry>
-<entry><literal>30</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"pippo"</literal></entry>
-</row>
-
-<row>
-<entry><literal>0</literal></entry>
-<entry><literal>8</literal></entry>
-</row>
-
-<row>
-<entry><literal>2</literal></entry>
-<entry><literal>""</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-@cindex sparsi, vettori
-@cindex vettori sparsi
-Ora il vettore @`e @dfn{sparso}, il che significa semplicemente che non sono
-usati alcuni indici. Ha gli elementi 0, 1, 2, 3 e 10, ma mancano gli
-elementi 4, 5, 6, 7, 8 e 9.
-
-Un'altra caratteristica dei vettori associativi @`e che gli indici non devono
-essere necessariamente interi non negativi. Qualsiasi numero, o anche una
-stringa, pu@`o essere un indice. Per esempio, il seguente @`e un vettore che
-traduce delle parole dall'inglese all'italiano:
-
-@ifnotdocbook
-@multitable @columnfractions .1 .1 .1
-@headitem @tab Indice @tab Valore
-@item @tab @code{"dog"} @tab @code{"cane"}
-@item @tab @code{"cat"} @tab @code{"gatto"}
-@item @tab @code{"one"} @tab @code{"uno"}
-@item @tab @code{1} @tab @code{"uno"}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-<tbody>
-<row>
-<entry><literal>"dog"</literal></entry>
-<entry><literal>"cane"</literal></entry>
-</row>
-
-<row>
-<entry><literal>"cat"</literal></entry>
-<entry><literal>"gatto"</literal></entry>
-</row>
-
-<row>
-<entry><literal>"one"</literal></entry>
-<entry><literal>"uno"</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"uno"</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-Qui abbiamo deciso di tradurre il numero uno sia nella forma letterale che in
-quella numerica, per illustrare che un singolo vettore pu@`o avere come indici
-sia numeri che stringhe.
-(In effetti, gli indici dei vettori sono sempre stringhe.
-Ci sono alcune sottigliezze su come funzionano i numeri quando sono usati come
-indici dei vettori; questo verr@`a trattato in maggior dettaglio nella
-@ref{Indici numerici di vettore}.)
-Qui sopra, il numero @code{1} non @`e tra doppi apici, perch@'e @command{awk}
-lo converte automaticamente in una stringa.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex maiuscolo/minuscolo, distinzione, indici dei vettori e
-@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
-@cindex @code{IGNORECASE}, variabile, e indici dei vettori
-@cindex variabile @code{IGNORECASE}, e indici dei vettori
-Il valore di @code{IGNORECASE} non ha alcun effetto sull'indicizzazione dei
-vettori. Lo stesso valore di stringa usato per memorizzare un elemento di un
-vettore pu@`o essere usato per richiamarlo.
-Quando @command{awk} crea un vettore (p.es., con la funzione predefinita
-@code{split()}), gli indici di quel vettore sono numeri interi consecutivi
-a partire da uno.
-(@xref{Funzioni per stringhe}.)
-
-I vettori di @command{awk} sono efficienti: il tempo necessario per accedere a
-un elemento @`e indipendente dal numero di elementi nel vettore.
-
-@node Visitare elementi
-@subsection Come esaminare un elemento di un vettore
-@cindex vettori, esaminare elementi
-@cindex vettore, elementi di un
-@cindex elementi di un vettore
-
-Il modo principale di usare un vettore @`e quello di esaminare uno dei suoi
-elementi. Un @dfn{riferimento al vettore} @`e un'espressione come questa:
-
-@example
-@var{vettore}[@var{espressione-indice}]
-@end example
-
-@noindent
-Qui, @var{vettore} @`e il nome di un vettore. L'espressione
-@var{espressione-indice} @`e l'indice dell'elemento del vettore che si vuol
-esaminare.
-
-@c 1/2015: Having the 4.3 in @samp is a little iffy. It's essentially
-@c an expression though, so leave be. It's to early in the discussion
-@c to mention that it's really a string.
-Il valore del riferimento al vettore @`e il valore corrente di quell'elemento
-del vettore. Per esempio, @code{pippo[4.3]} @`e un'espressione che richiama
-l'elemento del vettore @code{pippo} il cui indice @`e @samp{4.3}.
-
-@cindex vettori, elementi non assegnati
-@cindex elementi di vettore non assegnati
-@cindex elementi di vettore vuoti
-Un riferimento a un elemento di un vettore il cui indice non esiste ancora
-restituisce un valore uguale a @code{""}, la stringa nulla. Questo comprende
-elementi a cui non @`e stato assegnato un valore ed elementi che sono stati
-eliminati (@pxref{Cancellazione}).
-
-@cindex elementi inesistenti di un vettore
-@cindex vettori, elementi che non esistono
-@quotation NOTA
-Un riferimento a un elemento inesistente crea @emph{automaticamente}
-quell'elemento di vettore, con la stringa nulla come valore. (In certi casi,
-ci@`o @`e indesiderabile, perch@'e potrebbe sprecare memoria all'interno di
-@command{awk}.)
-
-I programmatori principianti di @command{awk} fanno spesso l'errore di
-verificare se un elemento esiste controllando se il valore @`e vuoto:
-
-@example
-# Verifica se "pippo" esiste in a: @ii{Non corretto!}
-if (a["pippo"] != "") @dots{}
-@end example
-
-@noindent
-Questo @`e sbagliato per due motivi. Primo, @emph{crea} @code{a["pippo"]}
-se ancora non esisteva! Secondo, assegnare a un elemento di un vettore la
-stringa vuota come valore @`e un'operazione valida (anche se un po' insolita).
-@end quotation
-
-@c @cindex arrays, @code{in} operator and
-@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore
-Per determinare se un elemento con un dato indice esiste in un vettore,
-si usi la seguente espressione:
-
-@example
-@var{indice} in @var{vettore}
-@end example
-
-@cindex effetti collaterali, indicizzazione di vettori
-@noindent
-Quest'espressione verifica se lo specifico indice @var{indice} esiste, senza
-l'effetto collaterale di creare quell'elemento nel caso che esso non sia
-presente. L'espressione ha il valore uno (vero) se
-@code{@var{vettore}[@var{indice}]}
-esiste e zero (falso) se non esiste.
-@c (Qui usiamo @var{indx}, perch@'e @samp{index} @`e il nome di una funzione
-@c predefinita.)
-Per esempio, quest'istruzione verifica se il vettore @code{frequenze}
-contiene l'indice @samp{2}:
-
-@example
-if (2 in frequenze)
- print "L'indice 2 @`e presente."
-@end example
-
-Si noti che questo @emph{non} verifica se il vettore
-@code{frequenze} contiene un elemento il cui @emph{valore} @`e 2.
-Il solo modo far questo @`e quello di passare in rassegna tutti gli
-elementi. Inoltre, questo @emph{non} crea @code{frequenze[2]}, mentre la
-seguente alternativa (non corretta) lo fa:
-
-@example
-if (frequenze[2] != "")
- print "L'indice 2 @`e presente."
-@end example
-
-@node Impostare elementi
-@subsection Assegnare un valore a elementi di un vettore
-@cindex vettori, elementi, assegnare valori
-@cindex elementi di vettori, assegnare valori
-
-Agli elementi di un vettore possono essere assegnati valori proprio come
-alle variabili di @command{awk}:
-
-@example
-@var{vettore}[@var{espressione-indice}] = @var{valore}
-@end example
-
-@noindent
-@var{vettore} @`e il nome di un vettore. L'espressione
-@var{espressione-indice} @`e l'indice dell'elemento del vettore a cui @`e
-assegnato il valore. L'espressione @var{valore} @`e il valore da assegnare
-a quell'elemento del vettore.
-
-@node Esempio di vettore
-@subsection Esempio semplice di vettore
-@cindex vettori, un esempio sull'uso
-
-Il seguente programma prende una lista di righe, ognuna delle quali inizia con
-un numero di riga, e le stampa in ordine di numero di riga. I numeri di riga
-non sono ordinati al momento della lettura, ma sono invece in ordine sparso.
-Questo programma ordina le righe mediante la creazione di un vettore che usa
-i numeri di riga come indici. Il programma stampa poi le righe
-ordinate secondo il loro numero. @`E un programma molto semplice e non @`e in
-grado di gestire numeri ripetuti, salti di riga o righe che non
-iniziano con un numero:
-
-@example
-@c file eg/misc/arraymax.awk
-@{
- if ($1 > massimo)
- massimo = $1
- vett[$1] = $0
-@}
-
-END @{
- for (x = 1; x <= massimo; x++)
- print vett[x]
-@}
-@c endfile
-@end example
-
-La prima regola tiene traccia del numero di riga pi@`u grande visto
-durante la lettura;
-memorizza anche ogni riga nel vettore @code{vett}, usando come indice
-il numero di riga.
-La seconda regola viene eseguita dopo che @`e stato letto tutto l'input, per
-stampare tutte le righe.
-Quando questo programma viene eseguito col seguente input:
-
-@example
-@c file eg/misc/arraymax.data
-5 Io sono l'uomo Cinque
-2 Chi sei? Il nuovo numero due!
-4 . . . E quattro a terra
-1 Chi @`e il numero uno?
-3 Sei il tre.
-@c endfile
-@end example
-
-@noindent
-Il suo output @`e:
-
-@example
-1 Chi @`e il numero uno?
-2 Chi sei? Il nuovo numero due!
-3 Sei il tre.
-4 . . . E quattro a terra
-5 Io sono l'uomo Cinque
-@end example
-
-Se un numero di riga appare pi@`u di una volta, l'ultima riga con quel dato
-numero prevale sulle altre.
-Le righe non presenti nel vettore
-si possono saltare con un semplice perfezionamento della
-regola @code{END} del programma, in questo modo:
-
-@example
-END @{
- for (x = 1; x <= massimo; x++)
- if (x in vett)
- print vett[x]
-@}
-@end example
-
-@node Visitare un intero vettore
-@subsection Visitare tutti gli elementi di un vettore
-@cindex elementi di vettori, visitare
-@cindex visitare vettori
-@cindex vettori, visitare
-@cindex cicli, @code{for}, visita di un vettore
-
-Nei programmi che usano vettori, @`e spesso necessario usare un ciclo che
-esegue un'azione su ciascun elemento di un vettore. In altri linguaggi, dove
-i vettori sono contigui e gli indici sono limitati ai numeri interi
-non negativi,
-questo @`e facile: tutti gli indici validi possono essere visitati partendo
-dall'indice pi@`u basso e arrivando a quello pi@`u alto. Questa tecnica non
-@`e applicabile in @command{awk}, perch@'e qualsiasi numero o stringa pu@`o
-fare da indice in un vettore. Perci@`o @command{awk} ha un tipo speciale di
-istruzione @code{for} per visitare un vettore:
-
-@example
-for (@var{variabile} in @var{vettore})
- @var{corpo}
-@end example
-
-@noindent
-@cindex @code{in}, operatore, uso in cicli
-@cindex operatore @code{in}, uso in cicli
-Questo ciclo esegue @var{corpo} una volta per ogni indice in @var{vettore} che
-il programma ha usato precedentemente, con la variabile @var{variabile}
-impostata a quell'indice.
-
-@cindex vettori, istruzione @code{for} e
-@cindex @code{for}, istruzione, esecuzione di cicli su un vettore
-Il seguente programma usa questa forma dell'istruzione @code{for}. La
-prima regola visita i record in input e tiene nota di quali parole appaiono
-(almeno una volta) nell'input, memorizzando un 1 nel vettore @code{usate} con
-la parola come indice. La seconda regola visita gli elementi di
-@code{usate} per trovare tutte le parole distinte che appaiono nell'input.
-Il programma stampa poi ogni parola che @`e pi@`u lunga di 10 caratteri e
-anche il numero di tali parole.
-@xref{Funzioni per stringhe}
-per maggiori informazioni sulla funzione predefinita @code{length()}.
-
-@example
-# Registra un 1 per ogni parola usata almeno una volta
-@{
- for (i = 1; i <= NF; i++)
- usate[$i] = 1
-@}
-
-# Trova il numero di parole distinte lunghe pi@`u di 10 caratteri
-END @{
- for (x in usate) @{
- if (length(x) > 10) @{
- ++numero_parole_lunghe
- print x
- @}
- @}
- print numero_parole_lunghe, "parole pi@`u lunghe di 10 caratteri"
-@}
-@end example
-
-@noindent
-@xref{Programma utilizzo parole}
-per un esempio di questo tipo pi@`u dettagliato.
-
-@cindex vettori, elementi di, ordine di accesso da parte dell'operatore @code{in}
-@cindex elementi di vettori, ordine di accesso da parte dell'operatore @code{in}
-@cindex @code{in}, operatore, ordine di accesso dei vettori
-@cindex operatore @code{in}, ordine di accesso dei vettori
-L'ordine nel quale gli elementi del vettore sono esaminati da quest'istruzione
-@`e determinato dalla disposizione interna degli elementi del vettore all'interno
-di @command{awk} e nell'@command{awk} standard non pu@`o essere controllato
-o cambiato. Questo pu@`o portare a dei problemi se vengono aggiunti nuovi
-elementi al @var{vettore} dall'istruzione eseguendo il corpo del ciclo;
-non @`e prevedibile se il ciclo @code{for} li potr@`a raggiungere. Similmente,
-modificare @var{variabile} all'interno del ciclo potrebbe produrre strani
-risultati. @`E meglio evitare di farlo.
-
-Di sicuro, @command{gawk} imposta la lista di elementi su cui eseguire
-l'iterazione prima che inizi il ciclo, e non la cambia in corso d'opera.
-Ma non tutte le versioni di @command{awk} fanno cos@`{@dotless{i}}. Si consideri questo
-programma, chiamato @file{vediciclo.awk}:
-
-@example
-BEGIN @{
- a["questo"] = "questo"
- a["@`e"] = "@`e"
- a["un"] = "un"
- a["ciclo"] = "ciclo"
- for (i in a) @{
- j++
- a[j] = j
- print i
- @}
-@}
-@end example
-
-Ecco quel che accade quando viene eseguito con @command{gawk} (e @command{mawk}):
-
-@example
-$ @kbd{gawk -f vediciclo.awk}
-@print{} questo
-@print{} ciclo
-@print{} un
-@print{} @`e
-@end example
-
-Se si usa invece BWK @command{awk}:
-
-@example
-$ @kbd{nawk -f vediciclo.awk}
-@print{} ciclo
-@print{} questo
-@print{} @`e
-@print{} un
-@print{} 1
-@end example
-
-@node Controllare visita
-@subsection Visita di vettori in ordine predefinito con @command{gawk}
-
-Questa @value{SUBSECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-Per default, quando un ciclo @code{for} visita un vettore, l'ordine
-@`e indeterminato, il che vuol dire che l'implementazione di @command{awk}
-determina l'ordine in cui il vettore viene attraversato.
-Quest'ordine normalmente @`e basato sull'implementazione interna dei vettori
-e varia da una versione di @command{awk} alla successiva.
-
-@cindex vettori, ordine di visita, controllo dell'
-@cindex controllare l'ordine di visita dei vettori
-Spesso, tuttavia, servirebbe fare qualcosa di semplice, come
-``visitare il vettore confrontando gli indici in ordine crescente,''
-o ``visitare il vettore confrontando i valori in ordine decrescente.''
-@command{gawk} fornisce due meccanismi che permettono di farlo.
-
-@itemize @value{BULLET}
-@item
-Assegnare a @code{PROCINFO["sorted_in"]} un valore a scelta fra
-alcuni valori predefiniti.
-Si vedano pi@`u sotto i valori ammessi.
-
-@item
-Impostare @code{PROCINFO["sorted_in"]} al nome di una funzione definita
-dall'utente, da usare per il confronto tra gli elementi di un vettore. Questa
-funzionalit@`a avanzata verr@`a descritta in seguito in @ref{Ordinamento di vettori}.
-@end itemize
-
-@cindex @code{PROCINFO}, valori di @code{sorted_in}
-Sono disponibili i seguenti valori speciali per @code{PROCINFO["sorted_in"]}:
-
-@table @code
-@item "@@unsorted"
-Lasciare gli elementi del vettore in ordine arbitrario
-(questo @`e il comportamento di default di @command{awk}).
-
-@item "@@ind_str_asc"
-Ordinare in ordine crescente di indice, confrontando tra loro gli indici
-come stringhe; questo @`e l'ordinamento pi@`u normale.
-(Internamente, gli indici dei vettori sono sempre stringhe, per cui con
-@samp{a[2*5] = 1} l'indice @`e la stringa @code{"10"} e non il numero 10.)
-
-@item "@@ind_num_asc"
-Ordinare in ordine crescente di indice, ma nell'elaborazione gli indici vengono
-trattati come numeri. Gli indici con valore non numerico verranno posizionati
-come se fossero uguali a zero.
-
-@item "@@val_type_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). L'ordinamento @`e in base al tipo assegnato all'elemento
-(@pxref{Tipi di variabile e confronti}).
-Tutti i valori numerici precedono tutti i valori di tipo stringa,
-che a loro volta vengono prima dei sottovettori.
-(I sottovettori non sono ancora stati descritti;
-@pxref{Vettori di vettori}.)
-
-@item "@@val_str_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). I valori scalari sono confrontati come stringhe.
-I sottovettori, se presenti, vengono per ultimi.
-
-@item "@@val_num_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). I valori scalari sono confrontati come numeri.
-I sottovettori, se presenti, vengono per ultimi.
-Quando i valori numerici coincidono, vengono usati i valori di tipo stringa
-per stabilire un ordinamento: ci@`o garantisce risultati coerenti tra differenti
-versioni della funzione C @code{qsort()},@footnote{Quando due elementi
-risultano uguali, la funzione C @code{qsort()} non garantisce
-che dopo l'ordinamento venga rispettato il loro ordine relativo originale.
-Usando il valore di stringa per stabilire un ordinamento univoco quando i
-valori numerici sono uguali assicura che il comportamento di @command{gawk}
-sia coerente in differenti ambienti.} che @command{gawk} usa internamente
-per effettuare l'ordinamento.
-
-@item "@@ind_str_desc"
-Ordinare come fa @code{"@@ind_str_asc"}, ma gli
-indici di tipo stringa sono ordinati dal pi@`u alto al pi@`u basso.
-
-@item "@@ind_num_desc"
-Ordinare come fa @code{"@@ind_num_asc"}, ma gli
-indici numerici sono ordinati dal pi@`u alto al pi@`u basso.
-
-@item "@@val_type_desc"
-Ordinare come fa @code{"@@val_type_asc"}, ma i valori
-degli elementi, a seconda del tipo, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-
-@item "@@val_str_desc"
-Ordinare come fa @code{"@@val_str_asc"}, ma i valori degli
-elementi, trattati come stringhe, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-
-@item "@@val_num_desc"
-Ordinare come fa @code{"@@val_num_asc"}, ma i valori degli
-elementi, trattati come numeri, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-@end table
-
-L'ordine in cui il vettore @`e visitato viene determinato prima di iniziare
-l'esecuzione del ciclo @code{for}. Cambiare @code{PROCINFO["sorted_in"]}
-all'interno del corpo del ciclo non influisce sul ciclo stesso.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ a[4] = 4}
-> @kbd{ a[3] = 3}
-> @kbd{ for (i in a)}
-> @kbd{ print i, a[i]}
-> @kbd{@}'}
-@print{} 4 4
-@print{} 3 3
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ PROCINFO["sorted_in"] = "@@ind_str_asc"}
-> @kbd{ a[4] = 4}
-> @kbd{ a[3] = 3}
-> @kbd{ for (i in a)}
-> @kbd{ print i, a[i]}
-> @kbd{@}'}
-@print{} 3 3
-@print{} 4 4
-@end example
-
-Quando si ordina un vettore in base al valore dei suoi elementi, se viene
-trovato un valore che @`e un sottovettore, questo @`e considerato pi@`u grande di
-qualsiasi stringa o valore numerico, indipendentemente da quel che contiene
-lo stesso sottovettore, e tutti i sottovettori sono trattati come se fossero
-l'uno uguale all'altro. Il loro ordine reciproco @`e determinato dai loro
-indici, visti come stringhe.
-
-Di seguito sono elencati alcuni punti da tener presenti sulla visita
-ordinata dei vettori:
-
-@itemize @value{BULLET}
-@item
-Il valore di @code{PROCINFO["sorted_in"]} @`e globale. Cio@`e, ha effetto su tutti
-i cicli @code{for} relativi a qualsiasi vettore. Se si deve cambiarlo
-all'interno del proprio codice, si dovrebbe vedere se era gi@`a stato
-definito in precedenza, e salvare il valore relativo, per ripristinarlo
-successivamente:
-
-@example
-@dots{}
-if ("sorted_in" in PROCINFO) @{
- ordine_salvato = PROCINFO["sorted_in"]
- PROCINFO["sorted_in"] = "@@val_str_desc" # o qualcos'altro
-@}
-@dots{}
-if (ordine_salvato)
- PROCINFO["sorted_in"] = ordine_salvato
-@end example
-
-@item
-Come gi@`a accennato, l'ordine di visita di default del vettore
-@`e rappresentato da @code{"@@unsorted"}. Si pu@`o ottenere il comportamento di
-default anche assegnando la stringa nulla a @code{PROCINFO["sorted_in"]} o
-semplicemente eliminando l'elemento @code{"sorted_in"} dal vettore
-@code{PROCINFO} con l'istruzione @code{delete}.
-(L'istruzione @code{delete} non @`e stata ancora descritta; @pxref{Cancellazione}.)
-@end itemize
-
-Inoltre, @command{gawk} fornisce funzioni predefinite per l'ordinamento
-dei vettori; si veda @ref{Funzioni di ordinamento di vettori}.
-
-@node Indici numerici di vettore
-@section Usare numeri per indicizzare i vettori
-
-@cindex numeri, come indici di vettore
-@cindex vettori, indici numerici di
-@cindex indici di vettori, numeri come
-@cindex @code{CONVFMT}, variabile, e indici di vettore
-Un aspetto importante da ricordare riguardo ai vettori @`e che
-@emph{gli indici dei vettori sono sempre stringhe}.
-Quando un valore numerico @`e usato come indice,
-viene convertito in un valore di tipo stringa prima di essere usato per
-l'indicizzazione (@pxref{Conversione}).
-Ci@`o vuol dire che il valore della variabile predefinita @code{CONVFMT} pu@`o
-influire su come un programma ha accesso agli elementi di un vettore.
-Per esempio:
-
-@example
-xyz = 12.153
-dati[xyz] = 1
-CONVFMT = "%2.2f"
-if (xyz in dati)
- printf "%s @`e in dati\n", xyz
-else
- printf "%s non @`e in dati\n", xyz
-@end example
-
-@noindent
-Il risultato @`e @samp{12.15 non @`e in dati}. La prima istruzione d@`a a
-@code{xyz} un valore numerico. L'assegnamento a @code{dati[xyz]}
-indicizza @code{dati} col valore di tipo stringa @code{"12.153"}
-(usando il valore di conversione di default @code{CONVFMT}, @code{"%.6g"}).
-Quindi, all'elemento del vettore @code{dati["12.153"]} @`e assegnato il valore
-uno. Il programma cambia poi
-il valore di @code{CONVFMT}. La verifica @samp{(xyz in dati)} genera un nuovo
-valore di stringa da @code{xyz}---questa volta @code{"12.15"}---perch@'e il
-valore di @code{CONVFMT} consente solo due cifre decimali. Questa
-verifica d@`a esito negativo, perch@'e @code{"12.15"} @`e diverso da @code{"12.153"}.
-
-@cindex convertire numeri interi che sono indici di vettore
-@cindex numeri interi, indici di vettore
-Secondo le regole di conversione
-(@pxref{Conversione}), i valori numerici interi
-vengono convertiti in stringhe sempre come interi, indipendentemente dal
-valore che potrebbe avere @code{CONVFMT}. E infatti il caso
-seguente produce il risultato atteso:
-
-@example
-for (i = 1; i <= maxsub; i++)
- @ii{fa qualcosa con} vettore[i]
-@end example
-
-La regola ``i valori numerici interi si convertono sempre in stringhe intere''
-ha un'altra conseguenza per l'indicizzazione dei vettori.
-Le costanti ottali ed esadecimali
-@ifnotdocbook
-(@pxref{Numeri non-decimali})
-@end ifnotdocbook
-@ifdocbook
-(trattate in @ref{Numeri non-decimali})
-@end ifdocbook
-vengono convertite internamente in numeri, e la loro forma originale
-non viene pi@`u ricordata. Ci@`o significa, per esempio, che
-@code{vettore[17]},
-@code{vettore[021]} e
-@code{vettore[0x11]} fanno riferimento tutti allo stesso
-elemento!
-
-Come molte cose in @command{awk}, molto spesso le cose
-funzionano come ci si aspetta. @`E utile comunque avere una
-conoscenza precisa delle regole applicate, poich@'e a volte possono avere
-effetti difficili da individuare sui programmi.
-
-@node Indici non inizializzati
-@section Usare variabili non inizializzate come indici
-
-@cindex variabili non inizializzate, come indici di vettore
-@cindex non inizializzate, variabili, come indici di vettore
-@cindex indici di vettore, variabili non inizializzate come
-@cindex vettori, indici, variabili non inizializzate come
-Supponiamo che sia necessario scrivere un programma
-per stampare i dati di input in ordine inverso.
-Un tentativo ragionevole per far ci@`o (con qualche dato di
-prova) potrebbe essere qualcosa di questo tipo:
-
-@example
-$ @kbd{echo 'riga 1}
-> @kbd{riga 2}
-> @kbd{riga 3' | awk '@{ l[righe] = $0; ++righe @}}
-> @kbd{END @{}
-> @kbd{for (i = righe - 1; i >= 0; i--)}
-> @kbd{print l[i]}
-> @kbd{@}'}
-@print{} riga 3
-@print{} riga 2
-@end example
-
-Sfortunatamente, la prima riga di dati in input non appare
-nell'output!
-
-A prima vista, verrebbe da dire che questo programma avrebbe dovuto
-funzionare. La variabile @code{righe}
-non @`e inizializzata, e le variabili non inizializzate hanno il valore numerico
-zero. Cos@`{@dotless{i}}, @command{awk} dovrebbe aver stampato il valore @code{l[0]}.
-
-Qui il problema @`e che gli indici per i vettori di @command{awk} sono
-@emph{sempre} stringhe. Le variabili non inizializzate, quando sono usate come
-stringhe, hanno il valore @code{""}, e non zero. Quindi, @samp{riga 1}
-finisce per essere memorizzata in @code{l[""]}.
-La seguente variante del programma funziona correttamente:
-
-@example
-@{ l[righe++] = $0 @}
-END @{
- for (i = righe - 1; i >= 0; i--)
- print l[i]
-@}
-@end example
-
-Qui, @samp{++} forza @code{righe} a essere di tipo numerico, rendendo
-quindi il ``vecchio valore'' uno zero numerico. Questo viene poi convertito
-in @code{"0"} come l'indice del vettore.
-
-@cindex nulle, stringhe, come indici di vettore
-@cindex stringhe nulle, come indici di vettore
-@cindex angolo buio, indici di vettori
-@cindex @dfn{lint}, controlli, indici di vettori
-@cindex controlli @dfn{lint}, indici di vettori
-Anche se la cosa pu@`o sembrare strana, la stringa nulla
-(@code{""}) @`e un indice di vettore valido.
-@value{DARKCORNER}
-Se viene fornita l'opzione @option{--lint} sulla riga di comando
-@pxref{Opzioni}), @command{gawk} avvisa quando la stringa nulla viene usata
-come indice.
-
-@node Cancellazione
-@section L'istruzione @code{delete}
-@cindex @code{delete}, istruzione
-@cindex istruzione @code{delete}
-@cindex eliminare elementi di vettori
-@cindex vettori, elementi, eliminazione di
-@cindex elementi di vettori, eliminazione di
-
-Per rimuovere un singolo elemento da un vettore si usa l'istruzione
-@code{delete}:
-
-@example
-delete @var{vettore}[@var{espressione-indice}]
-@end example
-
-Una volta che un elemento di un vettore @`e stato eliminato, il valore che aveva
-quell'elemento non @`e pi@`u disponibile. @`E come se quell'elemento non sia
-mai stato referenziato oppure come se non gli sia mai stato assegnato un
-valore. Il seguente @`e un esempio di eliminazione di elementi da un vettore:
-
-@example
-for (i in frequenze)
- delete frequenze[i]
-@end example
-
-@noindent
-Quest'esempio rimuove tutti gli elementi dal vettore @code{frequenze}. Una
-volta che un elemento @`e stato eliminato, una successiva istruzione @code{for}
-che visiti il vettore non trover@`a quell'elemento, e l'uso dell'operatore
-@code{in} per controllare la presenza di quell'elemento restituisce zero (cio@`e
-falso):
-
-@example
-delete pippo[4]
-if (4 in pippo)
- print "Questo non verr@`a mai stampato"
-@end example
-
-@cindex nulle, stringhe, ed eliminazione di elementi di un vettore
-@cindex stringhe nulle, ed eliminazione di elementi di un vettore
-@`E importante notare che eliminare un elemento @emph{non} @`e la stessa cosa
-che assegnargli un valore nullo (la stringa vuota, @code{""}).
-Per esempio:
-
-@example
-pippo[4] = ""
-if (4 in pippo)
- print "Questo viene stampato, anche se pippo[4] @`e vuoto"
-@end example
-
-@cindex @dfn{lint}, controlli, elementi di vettori
-@cindex controlli @dfn{lint}, elementi di vettori
-@cindex elementi di vettori, controlli @dfn{lint} per
-Non @`e un errore eliminare un elemento che non esiste.
-Tuttavia, se viene data l'opzione @option{--lint} sulla riga di comando
-(@pxref{Opzioni}),
-@command{gawk} emette un messaggio di avvertimento quando viene eliminato un
-elemento che non @`e presente in un vettore.
-
-@cindex comuni, estensioni, @code{delete} per eliminare interi vettori
-@cindex estensioni comuni@comma{} @code{delete} per eliminare interi vettori
-@cindex vettori, eliminare l'intero contenuto
-@cindex eliminare interi vettori
-@cindex @code{delete}, @var{vettore}
-@cindex differenze tra @command{awk} e @command{gawk}, elementi dei vettori, eliminazione
-Tutti gli elementi di un vettore possono essere eliminati con una singola
-istruzione omettendo l'indice nell'istruzione @code{delete},
-in questo modo:
-
-
-@example
-delete @var{vettore}
-@end example
-
-L'uso di questa versione dell'istruzione @code{delete} @`e circa tre volte pi@`u
-efficiente dell'equivalente ciclo che elimina gli elementi uno
-alla volta.
-
-Questa forma dell'istruzione @code{delete} @`e ammessa anche
-da BWK @command{awk} e da @command{mawk}, e anche da
-diverse altre implementazioni.
-
-@cindex Brian Kernighan, @command{awk} di
-@quotation NOTA
-Per molti anni, l'uso di @code{delete} senza un indice era un'estensione
-comune. A settembre 2012 si @`e deciso di includerla nello
-standard POSIX. Si veda @uref{http://austingroupbugs.net/view.php?id=544,
-il sito dell'Austin Group}.
-@end quotation
-
-@cindex portabilit@`a, eliminazione di elementi di un vettore
-@cindex Brennan, Michael
-La seguente istruzione fornisce un modo portabile, anche se non evidente,
-per svuotare un vettore:@footnote{Un ringraziamento a Michael
-Brennan per la segnalazione.}
-
-@example
-split("", vettore)
-@end example
-
-@cindex @code{split()}, funzione, eliminazione di elementi di vettori
-@cindex funzione @code{split()}, eliminazione di elementi di vettori
-La funzione @code{split()}
-(@pxref{Funzioni per stringhe})
-dapprima svuota il vettore indicato. La chiamata chiede di dividere
-la stringa nulla. Poich@'e non c'@`e nulla da dividere, la
-funzione si limita a svuotare il vettore e poi termina.
-
-@quotation ATTENZIONE
-L'eliminazione di tutti gli elementi di un vettore non cambia il suo tipo; non
-si pu@`o svuotare un vettore e poi usare il nome del vettore come scalare
-(cio@`e, come una variabile semplice). Per esempio, questo non @`e consentito:
-
-@example
-a[1] = 3
-delete a
-a = 3
-@end example
-@end quotation
-
-@node Vettori multidimensionali
-@section Vettori multidimensionali
-
-@menu
-* Visitare vettori multidimensionali:: Visitare vettori multidimensionali.
-@end menu
-
-@cindex indici di vettori multidimensionali
-@cindex vettori multidimensionali
-@cindex multidimensionali, vettori
-Un @dfn{vettore multidimensionale} @`e un vettore in cui un elemento @`e
-identificato da un insieme di indici invece che da un indice singolo. Per
-esempio, un vettore bidimenisonale richiede due indici. Il modo consueto (in
-molti linguaggi, compreso @command{awk}) per far riferimento a un elemento di
-un vettore multidimensionale chiamato @code{griglia} @`e con
-@code{griglia[@var{x},@var{y}]}.
-
-@cindex @code{SUBSEP}, variabile, e vettori multidimensionali
-@cindex variabile @code{SUBSEP}, e vettori multidimensionali
-I vettori multidimensionali sono resi disponibili in @command{awk} attraverso
-la concatenazione di pi@`u indici in una stringa;
-@command{awk} converte gli indici in stringhe
-(@pxref{Conversione}) e
-le concatena assieme, inserendo un separatore tra ognuna di loro. Ne
-risulta una sola stringa che include i valori di ogni indice. La
-stringa cos@`{@dotless{i}} composta viene usata come un singolo indice in un vettore
-ordinario monodimensionale. Il separatore usato @`e il valore della variabile
-predefinita @code{SUBSEP}.
-
-Per esempio, supponiamo di valutare l'espressione @samp{pippo[5,12] = "valore"}
-quando il valore di @code{SUBSEP} @`e @code{"@@"}. I numeri 5 e 12 vengono
-convertiti in stringhe che sono poi
-concatenate con un @samp{@@} tra di essi, dando @code{"5@@12"}; di conseguenza,
-l'elemento del vettore @code{pippo["5@@12"]} @`e impostato a @code{"valore"}.
-
-Una volta che il valore dell'elemento @`e memorizzato, @command{awk}
-ignora se sia stato memorizzato con un solo indice o con una
-serie di indici. Le due espressioni @samp{pippo[5,12]} e
-@w{@samp{pippo[5 SUBSEP 12]}} sono sempre equivalenti.
-
-Il valore di default di @code{SUBSEP} @`e la stringa @code{"\034"},
-che contiene un carattere non stampabile che difficilmente appare in
-un programma di @command{awk} e nella maggior parte dei dati di input.
-Il vantaggio di scegliere un carattere improbabile discende dal fatto che i
-valori degli indici che contengono una stringa corrispondente a @code{SUBSEP}
-possono portare a stringhe risultanti ambigue. Supponendo che
-@code{SUBSEP} valga @code{"@@"}, @w{@samp{pippo["a@@b", "c"]}} e
-@w{@samp{pippo["a", "b@@c"]}} risultano indistinguibili perch@'e entrambi
-sarebbero in realt@`a memorizzati come @samp{pippo["a@@b@@c"]}.
-
-@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore multidimensionale
-Per verificare se una determinata sequenza di indici esiste in un vettore
-multidimensionale, si usa lo stesso operatore (@code{in}) che viene usato
-per i vettori monodimensionali. Si scrive l'intera sequenza di indici tra
-parentesi, separati da virgole, come operando di sinistra:
-
-@example
-if ((@var{indice1}, @var{indice2}, @dots{}) in @var{vettore})
- @dots{}
-@end example
-
-Qui vediamo un esempio, avendo in input un vettore bidimensionale
-di campi, ruota questo vettore di 90 gradi in senso orario e stampa il
-risultato. Si suppone che tutte le righe in input contengano lo stesso
-numero di elementi:
-
-@example
-@{
- if (max_nf < NF)
- max_nf = NF
- max_nr = NR
- for (x = 1; x <= NF; x++)
- vettore[x, NR] = $x
-@}
-
-END @{
- for (x = 1; x <= max_nf; x++) @{
- for (y = max_nr; y >= 1; --y)
- printf("%s ", vettore[x, y])
- printf("\n")
- @}
-@}
-@end example
-
-@noindent
-Dato l'input:
-
-@example
-1 2 3 4 5 6
-2 3 4 5 6 1
-3 4 5 6 1 2
-4 5 6 1 2 3
-@end example
-
-@noindent
-il programma produce il seguente output:
-
-@example
-4 3 2 1
-5 4 3 2
-6 5 4 3
-1 6 5 4
-2 1 6 5
-3 2 1 6
-@end example
-
-@node Visitare vettori multidimensionali
-@subsection Visitare vettori multidimensionali
-
-Non c'@`e un'istruzione @code{for} particolare per visitare un
-vettore ``multidimensionale''. Non ce ne pu@`o essere una, perch@'e
-@command{awk} in realt@`a non ha
-vettori o elementi multidimensionali: c'@`e solo una modalit@`a
-multidimensionale per @emph{accedere} a un vettore.
-
-@cindex indici di vettori multidimensionali, visitare gli
-@cindex vettori, multidimensionali, visitare
-@cindex visitare vettori multidimensionali
-Comunque, se un programma ha un vettore al quale si accede sempre in
-modalit@`a multidimensionale, si pu@`o ottenere il risultato di visitarlo
-combinando l'istruzione di visita @code{for}
-(@pxref{Visitare un intero vettore}) con la funzione
-interna @code{split()}
-(@pxref{Funzioni per stringhe}).
-Si procede nel seguente modo:
-
-@example
-for (indice_combinato in vettore) @{
- split(indice_combinato, indici_separati, SUBSEP)
- @dots{}
-@}
-@end example
-
-@noindent
-Questo imposta la variabile @code{indice_combinato} a ogni
-concatenazione di indici contenuta nel vettore, e la suddivide
-nei singoli indici separandoli
-in corrispondenza del valore di
-@code{SUBSEP}. I singoli indici diventano poi gli elementi
-del vettore @code{indici_separati}.
-
-Perci@`o, se un valore @`e stato precedentemente memorizzato in
-@code{vettore[1, "pippo"]}, esiste in @code{vettore} un elemento con indice
-@code{"1\034pippo"} (ricordare che il valore di default di @code{SUBSEP}
-@`e il carattere con codice ottale 034).
-Prima o poi, l'istruzione @code{for} trova quell'indice e fa un'iterazione
-con la variabile @code{indice_combinato} impostata a @code{"1\034pippo"}.
-Poi viene chiamata la funzione @code{split()} in questo modo:
-
-@example
-split("1\034pippo", indici_separati, "\034")
-@end example
-
-@noindent
-Il risultato @`e quello di impostare @code{indici_separati[1]} a @code{"1"} e
-@code{indici_separati[2]} a @code{"pippo"}. Ecco fatto!
-La sequenza originale degli indici separati @`e ripristinata.
-
-
-@node Vettori di vettori
-@section Vettori di vettori
-@cindex vettori di vettori
-
-@command{gawk} migliora l'accesso ai vettori multidimensionali di
-@command{awk} standard e mette a disposizione dei veri vettori di vettori.
-Agli elementi di un sottovettore si fa riferimento tramite il loro indice
-racchiuso tra parentesi quadre, proprio come gli elementi del vettore
-principale. Per esempio, quel che segue crea un sottovettore con due elementi
-all'indice @code{1} del vettore principale @code{a}:
-
-@example
-a[1][1] = 1
-a[1][2] = 2
-@end example
-
-Questo simula un vero vettore bidimensionale. Ogni elemento di un sottovettore
-pu@`o contenere un altro sottovettore come valore, che a sua volta pu@`o
-contenere anche ulteriori vettori. In questo modo, si possono creare vettori
-di tre o pi@`u dimensioni.
-Gli indici possono essere costituiti da qualunque espressione di
-@command{awk}, compresi dei
-valori scalari separati da virgole (cio@`e, un indice multidimensionale simulato
-di @command{awk}). Quindi, la seguente espressione @`e valida in
-@command{gawk}:
-
-@example
-a[1][3][1, "nome"] = "barney"
-@end example
-
-Ogni sottovettore e il vettore principale possono essere di diversa lunghezza.
-Di fatto, gli elementi di un vettore o un suo sottovettore non devono essere
-necessariamente tutti dello stesso tipo. Ci@`o significa che il vettore
-principale come anche uno qualsiasi dei suoi sottovettori pu@`o essere
-non rettangolare,
-o avere una struttura frastagliata. Si pu@`o assegnare un valore scalare
-all'indice @code{4} del vettore principale @code{a}, anche se @code{a[1]}
-@`e esso stesso un vettore e non uno scalare:
-
-@example
-a[4] = "Un elemento in un vettore frastagliato"
-@end example
-
-I termini @dfn{dimensione}, @dfn{riga} e @dfn{colonna} sono privi di
-significato quando sono applicati
-a questo tipo di vettore, ma d'ora in poi useremo ``dimensione'' per indicare
-il numero massimo di indici necessario per far riferimento a un elemento
-esistente. Il tipo di ogni elemento che @`e gi@`a stato assegnato non pu@`o essere
-cambiato assegnando un valore di tipo diverso. Prima si deve eliminare
-l'elemento corrente, per togliere completamente dalla memoria di
-@command{gawk} ogni riferimento a quell'indice:
-
-@example
-delete a[4]
-a[4][5][6][7] = "Un elemento in un vettore quadridimensionale"
-@end example
-
-@noindent
-Le due istruzioni rimuovono il valore scalare dall'indice @code{4} e
-inseriscono poi un
-sottovettore interno a tre indici contenente uno scalare. Si pu@`o anche
-eliminare un intero sottovettore o un sottovettore di sottovettori:
-
-@example
-delete a[4][5]
-a[4][5] = "Un elemento nel sottovettore a[4]"
-@end example
-
-Si deve per@`o ricordare che non @`e consentito eliminare il vettore principale
-@code{a} e poi usarlo come scalare.
-
-Le funzioni predefinite che accettano come argomenti dei vettori possono
-essere usate
-anche con i sottovettori. Per esempio, il seguente frammento di codice usa
-@code{length()} (@pxref{Funzioni per stringhe})
-per determinare il numero di elementi nel vettore principale @code{a}
-e nei suoi sottovettori:
-
-@example
-print length(a), length(a[1]), length(a[1][3])
-@end example
-
-@noindent
-Il risultato per il nostro vettore principale @code{a} @`e il seguente:
-
-@example
-2, 3, 1
-@end example
-
-@noindent
-L'espressione @samp{@var{indice} in @var{vettore}}
-(@pxref{Visitare elementi}) funziona allo stesso modo sia per
-i vettori regolari in stile @command{awk}
-che per i vettori di vettori. Per esempio, le espressioni @samp{1 in a},
-@samp{3 in a[1]} e @samp{(1, "nome") in a[1][3]} risultano tutte di valore
-uno (vero) per il nostro vettore @code{a}.
-
-L'istruzione @samp{for (elemento in vettore)} (@pxref{Visitare un intero vettore})
-pu@`o essere nidificata per visitare tutti gli
-elementi di un vettore di vettori che abbia una struttura rettangolare. Per
-stampare il contenuto (valori scalari) di un vettore di vettori bidimensionale
-(cio@`e nel quale ogni elemento di primo livello @`e esso stesso un
-vettore, non necessariamente di lunghezza uguale agli altri)
-si pu@`o usare il seguente codice:
-
-@example
-for (i in vettore)
- for (j in vettore[i])
- print vettore[i][j]
-@end example
-
-La funzione @code{isarray()} (@pxref{Funzioni per i tipi})
-permette di verificare se un elemento di un vettore @`e esso stesso un vettore:
-
-@example
-for (i in vettore) @{
- if (isarray(vettore[i]) @{
- for (j in vettore[i]) @{
- print vettore[i][j]
- @}
- @}
- else
- print vettore[i]
-@}
-@end example
-
-Se la struttura di un vettore di vettori frastagliato @`e nota in anticipo,
-si pu@`o spesso trovare il modo per visitarlo usando istruzioni di controllo.
-Per esempio,
-il seguente codice stampa gli elementi del nostro vettore principale @code{a}:
-
-@example
-for (i in a) @{
- for (j in a[i]) @{
- if (j == 3) @{
- for (k in a[i][j])
- print a[i][j][k]
- @} else
- print a[i][j]
- @}
-@}
-@end example
-
-@noindent
-@xref{Visitare vettori} per una funzione definita dall'utente che
-``visita'' un vettore di vettori di dimensioni arbitrarie.
-
-Si ricordi che un riferimento a un elemento di un vettore non
-inizializzato genera un elemento con valore uguale a @code{""}, la stringa
-nulla. Questo ha
-un'importante implicazione quando s'intende usare un sottovettore come
-argomento di una funzione, come illustrato nel seguente esempio:
-
-@example
-$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'}
-@error{} gawk: riga com.:1: fatale: split: secondo argomento
-@error{} non-vettoriale
-@end example
-
-Il modo per aggirare quest'ostacolo @`e quello di definire prima @code{b[1]}
-come vettore creando un indice arbitrario:
-
-@example
-$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'}
-@print{} a
-@end example
-
-@node Sommario dei vettori
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-@command{awk} standard dispone di vettori associativi monodimensionali
-(vettori indicizzati da valori di tipo stringa). Tutti i vettori sono
-associativi; gli indici numerici vengono convertiti automaticamente in
-stringhe.
-
-@item
-Agli elementi dei vettori si fa riferimento come
-@code{@var{vettore}[@var{indice}]}. Fare riferimento a un elemento lo
-crea se questo non esiste ancora.
-
-@item
-Il modo corretto per vedere se un vettore ha un elemento con un dato indice
-@`e quello di usare l'operatore @code{in}: @samp{@var{indice} in @var{vettore}}.
-
-@item
-Si usa @samp{for (@var{indice} in @var{vettore}) @dots{}} per visitare
-ogni singolo elemento di un vettore. Nel corpo del ciclo,
-@var{indice} assume via via il valore dell'indice di ogni elemento del vettore.
-
-@item
-L'ordine in cui il ciclo @samp{for (@var{indice} in @var{vettore})}
-attraversa un vettore non @`e definito in POSIX @command{awk} e varia a seconda
-dell'implementazione. @command{gawk} consente di controllare l'ordinamento
-di visita
-assegnando speciali valori predefiniti a @code{PROCINFO["sorted_in"]}.
-
-@item
-Si usa @samp{delete @var{vettore}[@var{indice}]} per eliminare un singolo
-elemento di un vettore.
-Per eliminare tutti gli elementi di un vettore,
-si usa @samp{delete @var{vettore}}.
-Quest'ultima funzionalit@`a @`e stata per molti anni un'estensione comune
-e ora @`e standard, ma potrebbe non essere disponibile in tutte le
-versioni commerciali di @command{awk}.
-
-@item
-@command{awk} standard simula vettori multidimensionali ammettendo pi@`u indici
-separati da virgole. I loro valori sono concatenati in un'unica
-stringa, separati dal valore di @code{SUBSEP}. Il modo di creazione
-dell'indice non viene immagazzinato; cos@`{@dotless{i}},
-cambiare @code{SUBSEP} potrebbe avere conseguenze inaspettate. Si pu@`o usare
-@samp{(@var{sub1}, @var{sub2}, @dots{}) in @var{vettore}} per vedere se
-un certo indice multidimensionale esiste in @var{vettore}.
-
-@item
-@command{gawk} consente di avere a disposizione veri vettori di vettori.
-Si usa una coppia
-di parentesi quadre per ogni dimensione in tali vettori:
-@code{dati[riga][colonna]}, per esempio. Gli elementi del vettore possono
-poi essere valori scalari (numeri o stringhe) o altri vettori.
-
-@item
-Si usa la funzione predefinita @code{isarray()} per determinare se un elemento
-di un vettore @`e esso stesso un sottovettore.
-
-@end itemize
-
-@node Funzioni
-@chapter Funzioni
-
-@cindex funzioni predefinite
-@cindex predefinite, funzioni
-Questo @value{CHAPTER} descrive le funzioni predefinite di @command{awk},
-che sono di tre tipi: numeriche, di stringa, e di I/O.
-@command{gawk} mette a disposizione ulteriori tipi di funzioni
-per gestire valori che rappresentano marcature temporali, per manipolare bit, per
-ordinare vettori, per fornire informazioni sui tipi di variabile,
-per internazionalizzare e localizzare i programmi.@footnote{Per
-un'introduzione alle tematiche suddette, si pu@`o consultare l'articolo
-"Localizzazione dei programmi" nel
-@uref{http://www.pluto.it/files/journal/pj0404/l10n.html, sito pluto.it.}}
-
-Oltre alle funzioni predefinite, @command{awk} consente di
-scrivere nuove funzioni utilizzabili all'interno di un programma.
-La seconda met@`a di questo @value{CHAPTER} descrive le funzioni
-@dfn{definite dall'utente}.
-Vengono infine descritte le chiamate indirette a una funzione, un'estensione
-specifica di @command{gawk} che consente di stabilire durante l'esecuzione del
-programma quale funzione chiamare.
-
-@menu
-* Funzioni predefinite:: Riepilogo delle funzioni predefinite.
-* Funzioni definite dall'utente:: Descrizione dettagliata delle funzioni
- definite dall'utente.
-* Chiamate indirette:: Scegliere la funzione da chiamare in
- fase di esecuzione del programma.
-* Sommario delle funzioni:: Sommario delle funzioni.
-@end menu
-
-@node Funzioni predefinite
-@section Funzioni predefinite
-
-Le funzioni @dfn{predefinite} sono sempre disponibili per essere chiamate
-da un programma @command{awk}. Questa @value{SECTION} definisce tutte le
-funzioni predefinite di @command{awk}; di alcune di queste si fa menzione
-in altre @value{SECTIONS},
-ma sono comunque riassunte anche qui per comodit@`a.
-
-@menu
-* Chiamare funzioni predefinite:: Come chiamare funzioni predefinite.
-* Funzioni numeriche:: Funzioni che trattano numeri, comprese
- @code{int()}, @code{sin()} e @code{rand()}.
-* Funzioni per stringhe:: Funzioni di manipolazione di stringhe,
- come @code{split()}, @code{match()}
- e @code{sprintf()}.
-* Funzioni di I/O:: Funzioni per i file e per i comandi
- della shell.
-* Funzioni di tempo:: Funzione per gestire marcature temporali.
-* Funzioni a livello di bit:: Funzioni per operazioni di
- manipolazione bit.
-* Funzioni per i tipi:: Funzioni per informazioni sul tipo
- di una variabile.
-* Funzioni di internazionalizzazione:: Funzioni per tradurre stringhe.
-@end menu
-
-@node Chiamare funzioni predefinite
-@subsection Chiamare funzioni predefinite
-
-Per chiamare una delle funzioni predefinite di @command{awk},
-si scrive il nome della funzione seguito dai suoi argomenti racchiusi
-tra parentesi. Per esempio, @samp{atan2(y + z, 1)}
-@`e una chiamata alla funzione @code{atan2()} e ha due argomenti.
-
-@cindex convenzioni di programmazione, nelle chiamate di funzione
-@cindex spazio bianco, nelle chiamate di funzione
-La presenza di spazi bianchi tra il nome della funzione predefinita
-e la parentesi aperta @`e consentita, ma @`e buona norma quella di evitare
-di inserire spazi bianchi in quella posizione.
-Le funzioni definite dall'utente non consentono che vi siano spazi bianchi
-fra nome funzione e aperta parentesi,
-ed @`e pi@`u semplice evitare errori seguendo una semplice convenzione che
-resta sempre valida: non inserire spazi dopo il nome di una funzione.
-
-@cindex risoluzione di problemi, @command{gawk}, errori fatali@comma{} argomenti di funzione e
-@cindex problemi, risoluzione di, @command{gawk}, errori fatali@comma{} argomenti di funzione e
-@cindex @command{gawk}, argomenti di funzione e
-@cindex differenze tra @command{awk} e @command{gawk}, argomenti di funzione (@command{gawk})
-Ogni funzione predefinita accetta un certo numero di argomenti.
-In alcuni casi, gli argomenti possono essere omessi. I valori di default per
-gli argomenti omessi variano
-da funzione a funzione e sono descritti insieme a
-ciascuna funzione. In alcune implementazioni di @command{awk}, gli
-eventuali argomenti in pi@`u specificati per le funzioni predefinite sono
-ignorati. Tuttavia, in @command{gawk},
-@`e un errore fatale fornire argomenti in pi@`u a una funzione predefinita.
-
-Quando si richiama una funzione viene calcolato, prima di effettuare la
-chiamata, il valore assunto dalle espressioni che descrivono i parametri
-da passare alla funzione.
-Per esempio, nel seguente frammento di codice:
-
-@example
-i = 4
-j = sqrt(i++)
-@end example
-
-@cindex ordine di valutazione, funzioni
-@cindex funzioni predefinite, ordine di valutazione
-@cindex predefinite, funzioni, ordine di valutazione
-@noindent
-la variabile @code{i} @`e incrementata al valore cinque prima di chiamare
-la funzione @code{sqrt()} alla quale viene fornito come parametro il valore
-quattro.
-L'ordine di valutazione delle espressioni usate come parametri per la
-funzione @`e indefinito. Per questo motivo, si deve evitare di scrivere
-programmi che presuppongono che i parametri siano valutati da sinistra a
-destra o da destra a sinistra. Per esempio:
-
-@example
-i = 5
-j = atan2(++i, i *= 2)
-@end example
-
-Se l'ordine di valutazione @`e da sinistra a destra, @code{i} assume dapprima
-il valore 6, e quindi il valore 12, e la funzione @code{atan2()} @`e chiamata
-con i due argomenti 6 e 12. Ma se l'ordine di valutazione @`e da destra a
-sinistra, @code{i} assume dapprima il valore 10, e poi il valore 11, e la
-funzione @code{atan2()} @`e chiamata con i due argomenti 11 e 10.
-
-@node Funzioni numeriche
-@subsection Funzioni numeriche
-@cindex funzioni numeriche
-@cindex numeriche, funzioni
-
-La seguente lista descrive tutte le
-funzioni predefinite che hanno a che fare con i numeri.
-I parametri facoltativi sono racchiusi tra parentesi quadre@w{ ([ ]):}
-
-@c @asis for docbook
-@table @asis
-@item @code{atan2(@var{y}, @var{x})}
-@cindexawkfunc{atan2}
-@cindex arcotangente
-Restituisce l'arcotangente di @code{@var{y} / @var{x}} in radianti.
-Si pu@`o usare @samp{pi = atan2(0, -1)} per ottenere il valore di
-@value{PI} greco.
-
-@item @code{cos(@var{x})}
-@cindexawkfunc{cos}
-@cindex coseno
-Restituisce il coseno di @var{x}, con @var{x} in radianti.
-
-@item @code{exp(@var{x})}
-@cindexawkfunc{exp}
-@cindex esponenziale
-Restituisce l'esponenziale di @var{x} (@code{e ^ @var{x}}) o un messaggio
-di errore se @var{x} @`e fuori dall'intervallo consentito.
-L'intervallo entro il quale pu@`o variare @var{x}
-dipende dalla rappresentazione dei numeri in virgola mobile nella macchina in
-uso.
-
-@item @code{int(@var{x})}
-@cindexawkfunc{int}
-@cindex arrotondamento all'intero pi@`u vicino
-Restituisce l'intero pi@`u vicino a @var{x}, situato tra @var{x} e zero,
-troncato togliendo i decimali.
-Per esempio, @code{int(3)} @`e 3, @code{int(3.9)} @`e 3, @code{int(-3.9)}
-@`e @minus{}3, e @code{int(-3)} @`e ancora @minus{}3.
-
-@item @code{intdiv(@var{numeratore}, @var{denominatore}, @var{risultato})}
-@cindexawkfunc{intdiv}
-@cindex funzione @code{intdiv}
-Esegue una divisione tra numeri interi, simile alla funzione standard C
-che ha lo stesso nome. Dapprima, il @code{numeratore} e il
-@code{denominatore} vengono troncati, eliminando la parte decimale,
-per trasformarli in numeri interi.
-Il vettore @code{risultato} viene dapprima svuotato, e poi viene impostato
-l'elemento @code{risultato["quotient"]} al risultato della divisione
-@samp{numeratore / denominatore}, troncato a numero intero
-mediante l'eliminazione dei decimali,
-e viene impostato l'elemento @code{risultato["remainder"]} al
-risultato dell'operazione @samp{numeratore % denominatore}, troncato a
-numero intero allo stesso modo del risultato. Questa funzione @`e
-rivolta principalmente a chi usa numeri interi di lunghezza arbitraria;
-consente di evitare la creazione di numeri in virgola mobile
-di precisione arbitaria usando la funzionalit@`a MPFR
-(@pxref{Interi a precisione arbitraria}).
-
-Questa funzione @`e un'estensione @code{gawk}. Non @`e disponibile in
-modalit@`a compatibile (@pxref{Opzioni}).
-
-@item @code{log(@var{x})}
-@cindexawkfunc{log}
-@cindex logaritmo
-Restituisce il logaritmo naturale di @var{x}, se @var{x} @`e positivo;
-altrimenti, restituisce @code{NaN} (``not a number'') sui sistemi che
-implementano lo standard IEEE 754.
-Inoltre, @command{gawk} stampa un messaggio di avvertimento qualora @code{x}
-sia negativo.
-
-@item @code{rand()}
-@cindexawkfunc{rand}
-@cindex numeri casuali, funzioni @code{rand()}/@code{srand()}
-Restituisce un numero casuale. I valori di @code{rand()} sono
-uniformemente distribuiti tra zero e uno.
-Il valore potrebbe essere zero ma non @`e mai uno.@footnote{La versione C di
-@code{rand()} in molti sistemi Unix
-produce notoriamente delle sequenze piuttosto mediocri di numeri casuali.
-Tuttavia, non @`e prescritto che un'implementazione di @command{awk}
-debba usare la funzione @code{rand()} del linguaggio C per implementare
-la versione @command{awk} di @code{rand()}.
-In effetti, @command{gawk} usa, per generare numeri casuali,
-la funzione @code{random()} di BSD, che @`e
-notevolmente migliore di @code{rand()}}
-
-Spesso servono dei numeri casuali interi invece che frazionari.
-La seguente funzione definita dall'utente pu@`o essere usata per ottenere
-un numero casuale non negativo inferiore a @var{n}:
-
-@example
-function randint(n)
-@{
- return int(n * rand())
-@}
-@end example
-
-@noindent
-La moltiplicazione produce un numero casuale maggiore o uguale a zero e
-minore di @code{n}. Tramite @code{int()}, questo risultato diventa
-un intero tra zero e @code{n} @minus{} 1, estremi inclusi.
-
-Il seguente esempio usa una funzione simile per generate interi casuali
-fra uno e @var{n}. Il programma stampa un numero casuale per
-ogni record in input:
-
-@example
-# funzione per simulare un tiro di dado.
-function roll(n) @{ return 1 + int(rand() * n) @}
-
-# Tira 3 dadi a sei facce e
-# stampa il numero di punti.
-@{
- printf("%d punteggio\n", roll(6) + roll(6) + roll(6))
-@}
-@end example
-
-@cindex inizializzazione generazione di numeri casuali
-@cindex numeri casuali, inizializzazione generazione di
-@cindex numeri casuali, seme di
-@quotation ATTENZIONE
-Nella maggior parte delle implementazioni di @command{awk}, compreso
-@command{gawk},
-@code{rand()} inizia a generare numeri casuali partendo sempre
-dallo stesso numero, o @dfn{seme}, per ogni invocazione di
-@command{awk}.@footnote{@command{mawk}
-usa un seme differente ogni volta.} @`E per questo motivo che
-un programma genera sempre gli stessi risultati ogni volta che lo si esegue.
-I numeri sono casuali all'interno di una singola esecuzione di @command{awk}
-ma "prevedibili" in ogni successiva esecuzione.
-Ci@`o torna utile in fase di test, ma se si desidera che
-un programma generi sequenze differenti di numeri casuali ogni volta
-che @`e chiamato, occorre impostare il seme a un valore che cambi
-per ogni esecuzione. Per fare questo, @`e prevista la funzione @code{srand()}.
-@end quotation
-
-@item @code{sin(@var{x})}
-@cindexawkfunc{sin}
-@cindex seno
-Restituisce il seno di @var{x}, con @var{x} espresso in radianti.
-
-@item @code{sqrt(@var{x})}
-@cindexawkfunc{sqrt}
-@cindex radice quadrata
-Restituisce la radice quadrata positiva di @var{x}.
-@command{gawk} stampa un messaggio di avvertimento
-se @var{x} @`e un numero negativo. Quindi, @code{sqrt(4)} vale 2.
-
-@item @code{srand(}[@var{x}]@code{)}
-@cindexawkfunc{srand}
-Imposta al valore @var{x} il numero di partenza, o seme,
-utilizzato per generare numeri casuali.
-
-Ogni seme genera una sequenza particolare di numeri casuali.@footnote{I
-numeri casuali generati da un computer non sono veramente casuali.
-Tecnicamente sono conosciuti come numeri @dfn{pseudo-casuali}. Ci@`o vuol dire
-che, anche se i numeri in una sequenza sembrano casuali, @`e possibile
-in realt@`a generare la stessa sequenza di numeri casuali pi@`u e pi@`u volte.}
-Quindi, impostando il seme allo stesso valore una seconda volta,
-viene prodotta ancora la stessa sequenza di numeri casuali.
-
-@quotation ATTENZIONE
-Differenti implementazioni di @command{awk} usano internamente differenti
-generatori di numeri casuali. Non si deve dare per scontato che lo stesso
-programma @command{awk}
-generi la stessa serie di numeri casuali se viene eseguito da differenti
-versioni di @command{awk}.
-@end quotation
-
-Se si omette l'argomento @var{x}, scrivendo @samp{srand()}, viene usato
-come seme la data e ora corrente. @`E questo il modo per ottenere numeri
-casuali che sono veramente imprevedibili.
-
-Il valore restituito da @code{srand()} @`e quello del seme precedente.
-Questo per facilitare il monitoraggio dei semi, nel caso occorra riprodurre
-in maniera coerente delle sequenze di numeri casuali.
-
-POSIX non specifica quale debba essere il seme iniziale, che quindi varia
-a seconda delle implementazioni @command{awk}.
-@end table
-
-@node Funzioni per stringhe
-@subsection Funzioni di manipolazione di stringhe
-@cindex funzioni di manipolazione di stringhe
-
-Le funzioni in questa @value{SECTION} leggono o modificano il testo di
-una o pi@`u stringhe.
-
-@command{gawk} implementa la localizzazione
-(@pxref{Localizzazioni}) ed effettua
-ogni manipolazione di stringhe trattando ogni singolo @emph{carattere}, non
-ogni singolo @emph{byte}.
-Questa distinzione @`e particolarmente importante da comprendere per
-quelle localizzazioni in cui un singolo carattere pu@`o essere rappresentato
-da pi@`u di un byte.
-Quindi, per esempio, la funzione @code{length()} restituisce il numero di
-caratteri in una stringa, e non il numero di byte usato per rappresentare quei
-caratteri. Allo stesso modo, @code{index()} restituisce indici di caratteri, e
-non indici di byte.
-
-@quotation ATTENZIONE
-Un certo numero di funzioni riguarda indici all'interno di stringhe. Per
-queste funzioni, il primo carattere di una stringa @`e alla posizione
-(all'indice) uno. Questo comportamento @`e differente da quello del C e dei
-linguaggi che da esso discendono, nei quali il primo carattere @`e alla posizione
-zero. @`E importante ricordarlo quando si fanno calcoli sugli indici, in
-particolare se si ha familiarit@`a con il linguaggio C.
-@end quotation
-
-Nella lista seguente, i parametri facoltativi sono racchiusi tra parentesi
-quadre@w{ ([ ]).}
-Parecchie funzioni operano sostituzioni in una stringa; la spiegazione
-completa di ci@`o @`e contenuta nella descrizione della funzione @code{sub()},
-che si trova quasi alla fine di questa lista, ordinata alfabeticamente.
-
-Le funzioni specifiche di @command{gawk} sono contrassegnate col simbolo
-del cancelletto (@samp{#}). Tali funzioni non sono disponibili in modalit@`a
-compatibile (@pxref{Opzioni}):
-
-
-@menu
-* Dettagli ostici:: Pi@`u di quel che si vorrebbe sapere su @samp{\}
- e @samp{&} con @code{sub()}, @code{gsub()}, e
- @code{gensub()}.
-@end menu
-
-@c @asis for docbook
-@table @asis
-@item @code{asort(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
-@itemx @code{asorti(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
-@cindexgawkfunc{asorti}
-@cindex vettori, ordinamento dei
-@cindex ordinamento di vettori
-@cindex vettori, determinare il numero degli elementi
-@cindexgawkfunc{asort}
-@cindex ordinamento vettori per indici
-@cindex vettori, ordinamento per indici
-@cindex indici di vettori, ordinamento per
-Queste due funzioni sono abbastanza simili, e quindi sono descritte
-insieme.
-
-@quotation NOTA
-La seguente descrizione ignora il terzo argomento, @var{come}, perch@'e
-richiede la conoscenza di funzionalit@`a di cui non si @`e ancora parlato. Per
-questo motivo la seguente trattazione @`e volutamente semplificata. (In seguito
-l'argomento verr@`a trattato in maniera pi@`u esauriente; si veda @ref{Funzioni di
-ordinamento di vettori} per la descrizione completa.)
-@end quotation
-
-Entrambe le funzioni restituiscono il numero di elementi nel vettore @var{sorgente}.
-Con @command{asort()}, @command{gawk} ordina i valori di @var{sorgente}
-e rimpiazza gli indici dei valori ordinati di @var{sorgente} con
-numeri interi sequenziali, a partire da uno. Se si specifica il vettore
-opzionale @var{destinazione},
-@var{sorgente} @`e copiato in @var{destinazione}. @var{destinazione}
-viene quindi ordinato, lasciando immodificati gli indici di @var{sorgente}.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-Nel confronto tra stringhe, la variabile @code{IGNORECASE} influenza
-l'ordinamento
-(@pxref{Funzioni di ordinamento di vettori}). Se il vettore
-@var{sorgente} contiene sottovettori come valori
-(@pxref{Vettori di vettori}), questi saranno alla fine, dopo tutti i valori
-scalari.
-I sottovettori @emph{non} vengono ordinati ricorsivamente.
-
-Per esempio, se i contenuti del vettore @code{a} sono i seguenti:
-
-@example
-a["ultimo"] = "de"
-a["primo"] = "sac"
-a["mediano"] = "cul"
-@end example
-
-@noindent
-Una chiamata a @code{asort()}:
-
-@example
-asort(a)
-@end example
-
-@noindent
-genera i seguenti contenuti di @code{a}:
-
-@example
-a[1] = "cul"
-a[2] = "de"
-a[3] = "sac"
-@end example
-
-La funzione @code{asorti()} si comporta in maniera simile ad @code{asort()};
-tuttavia l'ordinamento avviene in base agli @emph{indici}, e non in base ai
-valori. Quindi, nell'esempio seguente, a partire dallo stesso insieme iniziale
-di indici e valori nel vettore @code{a}, la chiamata di @samp{asorti(a)}
-produrrebbe:
-
-@example
-a[1] = "mediano"
-a[2] = "primo"
-a[3] = "ultimo"
-@end example
-
-@item @code{gensub(@var{regexp}, @var{rimpiazzo}, @var{come}} [@code{, @var{obiettivo}}]@code{) #}
-@cindexgawkfunc{gensub}
-@cindex cercare e rimpiazzare in stringhe
-@cindex sostituzione in stringa
-Ricerca nella stringa @var{obiettivo} delle corrispondenze
-all'espressione regolare @var{regexp}.
-Se @var{come} @`e una stringa che inizia
-con @samp{g} o @samp{G} (abbreviazione di ``global''), sostituisce
-ogni occorrenza di @var{regexp} con la stringa
-@var{rimpiazzo}. Altrimenti, @var{come} @`e visto come un numero che indica
-quale corrispondenza di @var{regexp} va rimpiazzata. Se non si specifica
-il nome dell'@var{obiettivo}, si
-opera su @code{$0}. La funzione restituisce come risultato la stringa
-modificata, e la stringa originale di partenza @emph{non} viene modificata.
-
-@code{gensub()} @`e una funzione generale di sostituzione. Mira a fornire
-pi@`u funzionalit@`a rispetto alle funzioni standard @code{sub()} e
-@code{gsub()}.
-
-@code{gensub()} prevede una funzionalit@`a ulteriore, non disponibile in
-@code{sub()} o @code{gsub()}: la possibilit@`a di specificare componenti di
-una @dfn{regexp} nel testo da sostituire. Questo @`e fatto utilizzando delle
-parentesi nella @dfn{regexp} per designare i componenti, e quindi inserendo
-@samp{\@var{N}} nel testo di rimpiazzo, dove @var{N} @`e una cifra da 1 a 9.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{a = "abc def"}
-> @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)}
-> @kbd{print b}
-> @kbd{@}'}
-@print{} def abc
-@end example
-
-@noindent
-Come con @code{sub()}, occorre battere due barre inverse, per ottenerne
-una come componente della stringa.
-Nel testo di rimpiazzo, la sequenza @samp{\0} rappresenta l'intero testo
-corrispondente, e lo stesso vale per
-il carattere @samp{&}.
-
-Il seguente esempio mostra come @`e possibile usare il terzo argomento
-per controllare quale corrispondenza
-della @dfn{regexp} sia da modificare:
-
-@example
-$ @kbd{echo a b c a b c |}
-> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'}
-@print{} a b c AA b c
-@end example
-
-In questo caso, @code{$0} @`e la stringa obiettivo di default.
-@code{gensub()} restituisce la nuova stringa come risultato, e questa
-@`e passata direttamente a @code{print} per essere stampata.
-
-@c @cindex avvertimenti automatici
-@c @cindex automatici, avvertimenti
-Se l'argomento @var{come} @`e una stringa che non inizia con @samp{g} o
-@samp{G}, o se @`e un numero minore o uguale a zero, si effettua solo una
-sostituzione. Se @var{come} @`e zero, @command{gawk} emette
-un messaggio di avvertimento.
-
-Se @var{regexp} non viene trovata in @var{obiettivo}, il valore
-restituito da @code{gensub()}
-@`e il valore originale e non modificato di @var{obiettivo}.
-
-@item @code{gsub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
-@cindexawkfunc{gsub}
-Ricerca in @var{obiettivo}
-@emph{tutte} le sottostringhe corrispondenti al criterio di ricerca, le
-pi@`u lunghe possibili partendo da sinistra, @emph{non sovrapposte tra loro},
-e le sostituisce con @var{rimpiazzo}.
-La lettera @samp{g} in @code{gsub()} significa
-``global'', e richiede di sostituire dappertutto. Per esempio:
-
-@example
-@{ gsub(/Inghilterra/, "Regno Unito"); print @}
-@end example
-
-@noindent
-sostituisce tutte le occorrenze della stringa @samp{Inghilterra} con
-@samp{Regno Unito} in tutti i record in input.
-
-La funzione @code{gsub()} restituisce il numero di sostituzioni effettuate.
-Se la variabile da cercare e modificare (@var{obiettivo}) @`e omessa,
-viene usato l'intero record in input.
-Come in @code{sub()}, i caratteri @samp{&} e @samp{\} sono speciali,
-e il terzo argomento dev'essere modificabile.
-
-@item @code{index(@var{dove}, @var{cosa})}
-@cindexawkfunc{index}
-@cindex ricerca in stringhe
-@cindex trovare sottostringhe in una stringa
-Ricerca nella stringa @var{dove} la prima occorrenza della stringa @var{cosa},
-e restituisce la posizione in caratteri dell'inizio di quest'occorrenza nella
-stringa @var{dove}. Si consideri il seguente esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{ print index("noccioline", "oli") @}'}
-@print{} 6
-@end example
-
-@noindent
-Se @var{cosa} non viene trovato, @code{index()} restituisce zero.
-
-@cindex angolo buio, @dfn{regexp} come secondo argomento di @code{index()}
-In BWK @command{awk} e @command{gawk},
-@`e un errore fatale usare una costante @dfn{regexp} per @var{cosa}.
-Altre implementazioni lo consentono, considerando semplicemente
-la costante @dfn{regexp} come un'espressione che significa
-@samp{$0 ~ /@dfn{regexp}/}. @value{DARKCORNER}
-
-@item @code{length(}[@var{stringa}]@code{)}
-@cindexawkfunc{length}
-@cindex stringa, lunghezza di una
-@cindex lunghezza di una stringa
-Restituisce il numero di caratteri in @var{stringa}. Se
-@var{stringa} @`e un numero, viene restituita la lunghezza della stringa
-di cifre che rappresenta quel numero. Per esempio, @code{length("abcde")} @`e
-cinque.
-Invece, @code{length(15 * 35)} restituisce tre. In questo esempio,
-@iftex
-@math{15 @cdot 35 = 525},
-@end iftex
-@ifnottex
-@ifnotdocbook
-15 * 35 = 525,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-15 &sdot; 35 = 525,
-@end docbook
-e 525 @`e quindi convertito alla stringa @code{"525"}, che @`e composta da
-tre caratteri.
-
-@cindex lunghezza di un record in input
-@cindex record in input, lunghezza di un
-Se non si specifica alcun argomento, @code{length()} restituisce la
-lunghezza di @code{$0}.
-
-@c @cindex historical features
-@cindex portabilit@`a, funzione @code{length()}
-@cindex POSIX @command{awk}, funzione @code{length()} e
-@quotation NOTA
-In alcune delle prime versioni di @command{awk}, la funzione @code{length()}
-poteva essere richiamata senza alcuna parentesi. Farlo @`e considerata
-una cattiva abitudine, sebbene il POSIX standard 2008 lo consenta esplicitamente,
-per compatibilit@`a con la vecchia prassi. Per garantire la massima
-portabilit@`a ai programmi, @`e meglio mettere sempre le parentesi.
-@end quotation
-
-@cindex angolo buio, funzione @code{length()}
-Se @code{length()} @`e chiamata con una variabile che non @`e stata usata,
-@command{gawk} considera la variabile come uno scalare. Altre
-implementazioni di @command{awk} non assegnano nessun tipo alla variabile.
-@value{DARKCORNER}
-Si consideri:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
-@print{} 0
-@error{} gawk: riga com.:1: fatale: tentativo di usare
-@error{} scalare 'x' come vettore
-
-$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
-@print{} 0
-@end example
-
-@noindent
-Se @option{--lint} @`e
-stato specificato sulla riga di comando, @command{gawk} emette un
-avvertimento a questo riguardo.
-
-@cindex estensioni comuni, @code{length()} applicato a un vettore
-@cindex comuni, estensioni@comma{} @code{length()} applicato a un vettore
-@cindex differenze tra @command{gawk} e @command{awk}
-@cindex numero di elementi di un vettore
-@cindex vettore, determinare il numero degli elementi
-In @command{gawk} e in parecchie altre implementazioni @command{awk},
-se l'argomento @`e un vettore, la funzione @code{length()} restituisce il numero
-di elementi nel vettore. @value{COMMONEXT}
-Ci@`o @`e meno utile di quel che sembra a prima vista, in quanto
-non @`e affatto detto che il vettore abbia come indici i numeri da 1 al
-numero di elementi che contiene.
-Se @option{--lint} @`e
-stato specificato sulla riga di comando,
-(@pxref{Opzioni}),
-@command{gawk} avvisa che l'uso di un vettore come argomento non
-@`e portabile.
-Se si specifica l'opzione @option{--posix}, l'uso di un vettore come
-argomento genera un errore fatale
-@iftex
-(@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-(@pxref{Vettori}).
-@end ifnottex
-
-@item @code{match(@var{stringa}, @var{regexp}} [@code{, @var{vettore}}]@code{)}
-@cindexawkfunc{match}
-@cindex stringa, ricercare espressioni regolari in una
-@cindex ricerca @dfn{regexp} in stringhe
-Ricerca in @var{stringa} la
-sottostringa pi@`u lunga, a partire da sinistra, che corrisponde
-all'espressione regolare @var{regexp} e restituisce la posizione
-del carattere (indice) con cui inizia la sottostringa (uno, se
-la corrispondenza parte dall'inizio di @var{stringa}). Se non viene
-trovata alcuna corrispondenza, restituisce zero.
-
-L'argomento @var{regexp} pu@`o essere sia una costante @dfn{regexp}
-(@code{/}@dots{}@code{/}) che una costante stringa (@code{"}@dots{}@code{"}).
-In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
-per la quale cercare una corrispondenza.
-@xref{Espressioni regolari calcolate} per una
-spiegazione sulla differenza tra le due forme e sulle loro
-implicazioni riguardo al modo per scrivere correttamente un programma.
-
-L'ordine dei primi due argomenti @`e l'opposto di molte altre funzioni che
-trattano stringhe e che hanno a che fare con espressioni regolari, come
-@code{sub()} e @code{gsub()}. Potrebbe essere di aiuto ricordare che
-per @code{match()}, l'ordine @`e lo stesso che per l'operatore @samp{~} :
-@samp{@var{stringa} ~ @var{regexp}}.
-
-@cindex @code{RSTART}, variabile, funzione @code{match()} e
-@cindex variabile @code{RSTART}, funzione @code{match()} e
-@cindex @code{RLENGTH}, variabile, funzione @code{match()} e
-@cindex variabile @code{RLENGTH}, funzione @code{match()} e
-@cindex funzione @code{match()}, variabili @code{RSTART}/@code{RLENGTH}
-@cindex @code{match()}, funzione, variabili @code{RSTART}/@code{RLENGTH}
-La funzione @code{match()} imposta la variabile predefinita @code{RSTART}
-all'indice.
-Imposta anche la variabile predefinita @code{RLENGTH} alla
-lunghezza in caratteri della sottostringa individuata. Se non viene
-trovata alcuna corrispondenza, @code{RSTART} @`e impostata a zero, e
-@code{RLENGTH} a @minus{}1.
-
-Per esempio:
-
-@example
-@c file eg/misc/findpat.awk
-@{
- if ($1 == "TROVA")
- regexp = $2
- else @{
- dove = match($0, regexp)
- if (dove != 0)
- print "Corrispondenza di", regexp, "alla posiz.", \
- dove, "in", $0
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-Questo programma ricerca delle righe che corrispondono all'espressione
-regolare contenuta nella variabile
-@code{regexp}. Quest'espressione regolare pu@`o essere modificata. Se la
-prima parola in una riga @`e @samp{TROVA}, @code{regexp} diventa la
-seconda parola su quella riga. Quindi, dato:
-
-@example
-@c file eg/misc/findpat.data
-TROVA or+e
-Il mio programma corre
-ma non troppo velocemente
-TROVA Melvin
-JF+KM
-Questa riga appartiene a Reality Engineering Co.
-Melvin @`e passato da qui.
-@c endfile
-@end example
-
-@noindent
-@command{awk} stampa:
-
-@example
-Corrispondenza di or+e alla posiz. 19 in Il mio programma corre
-Corrispondenza di Melvin alla posiz. 1 in Melvin @`e passato da qui.
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{match()}
-Se @var{vettore} esiste gi@`a, viene cancellato, e quindi l'elemento numero
-zero di @var{vettore} @`e impostato all'intera parte di @var{stringa}
-individuata da @var{regexp}. Se @var{regexp} contiene parentesi,
-gli elementi aventi per indici numeri interi in @var{vettore} sono
-impostati per contenere ognuno la parte di @var{stringa} individuata dalla
-corrispondente sottoespressione delimitata da parentesi.
-Per esempio:
-
-@example
-$ @kbd{echo pippoooopaperpluttttttt |}
-> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
-> @kbd{print vett[1], vett[2] @}'}
-@print{} pippoooo pluttttttt
-@end example
-
-Inoltre,
-sono disponibili indici multidimensionali che contengono
-la posizione di partenza e la lunghezza di ogni sottoespressione
-individuata:
-
-@example
-$ @kbd{echo pippoooopaperpluttttttt |}
-> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
-> @kbd{print vett[1], vett[2]}
-> @kbd{print vett[1, "start"], vett[1, "length"]}
-> @kbd{print vett[2, "start"], vett[2, "length"]}
-> @kbd{@}'}
-@print{} pippoooo pluttttttt
-@print{} 1 8
-@print{} 14 10
-@end example
-
-Possono non esserci indici che individuino inizio e posizione
-per ogni sottoespressione
-fra parentesi, perch@'e non tutte potrebbero aver individuato del testo;
-quindi, andrebbero esaminati usando l'operatore @code{in}
-(@pxref{Visitare elementi}).
-
-@cindex risoluzione di problemi, funzione @code{match()}
-@cindex problemi, risoluzione di, funzione @code{match()}
-L'argomento @var{vettore} di @code{match()} @`e un'estensione
-@command{gawk}. In modalit@`a compatibile
-(@pxref{Opzioni}),
-l'impiego di un terzo argomento causa un errore fatale.
-
-@item @code{patsplit(@var{stringa}, @var{vettore}} [@code{, @var{regexpdelim}} [@code{, @var{separatori}} ] ]@code{) #}
-@cindexgawkfunc{patsplit}
-@cindex dividere in un vettore una stringa
-@cindex creare un vettore da una stringa
-Divide
-@var{stringa} in parti definite da @var{regexpdelim}
-e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
-vettore @var{separatori}. Il primo pezzo @`e memorizzato in
-@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
-cos@`{@dotless{i}} via. Il terzo argomento, @var{regexpdelim}, @`e
-una @dfn{regexp} che descrive i campi in @var{stringa} (allo stesso modo in
-cui @code{FPAT} @`e una @dfn{regexp} che descrive i campi nei record
-in input).
-Pu@`o essere una costante @dfn{regexp} o una stringa.
-Se @var{regexpdelim} @`e omesso, viene usato il valore di @code{FPAT}.
-@code{patsplit()} restituisce il numero di elementi creati.
-@code{@var{separatori}[@var{i}]} @`e
-la stringa che separa
-l'elemento @code{@var{vettore}[@var{i}]} e @code{@var{vettore}[@var{i}+1]}.
-Ogni separatore iniziale sar@`a in @code{@var{separatori}[0]}.
-
-La funzione @code{patsplit()} divide delle stringhe in pezzi in modo
-simile a quello con cui le righe in input vengono divise in campi
-usando @code{FPAT}
-(@pxref{Separazione in base al contenuto}).
-
-Prima di dividere la stringa, @code{patsplit()} cancella ogni elemento che
-fosse eventualmente presente
-nei vettori @var{vettore} e @var{separatori}.
-
-@item @code{split(@var{stringa}, @var{vettore}} [@code{, @var{separacampo}} [@code{, @var{separatori}} ] ]@code{)}
-@cindexawkfunc{split}
-Divide @var{stringa} in pezzi separati da @var{separacampo}
-e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
-vettore @var{separatori}. Il primo pezzo @`e memorizzato in
-@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
-cos@`{@dotless{i}} via. Il valore della stringa specificata nel terzo argomento,
-@var{separacampo}, @`e una @dfn{regexp} che indica come dividere @var{stringa}
-(analogamente a come @code{FS} pu@`o essere un @dfn{regexp} che indica dove
-dividere i record in input).
-Se @var{separacampo} @`e omesso, si usa il valore di @code{FS}.
-@code{split()} restituisce il numero di elementi creati.
-@var{separatori} @`e un'estensione @command{gawk}, in cui
-@code{@var{separatori}[@var{i}]}
-@`e la stringa che separa @code{@var{vettore}[@var{i}]} e
-@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
-@code{@var{separatori}[@var{n}]}, dove @var{n} @`e il valore restituito da
-@code{split()} (cio@`e il numero di elementi in @var{vettore}).
-
-La funzione @code{split()} divide le stringhe in pezzi in modo simile
-a quello con cui le righe in input sono divise in campi. Per esempio:
-
-@example
-split("cul-de-sac", a, "-", separatori)
-@end example
-
-@noindent
-@cindex stringhe, divisione, esempio
-divide la stringa @code{"cul-de-sac"} in tre campi usando @samp{-} come
-separatore. Il vettore @code{a} ha i seguenti contenuti:
-
-@example
-a[1] = "cul"
-a[2] = "de"
-a[3] = "sac"
-@end example
-
-e imposta il contenuto del vettore @code{separatori} come segue:
-
-@example
-seps[1] = "-"
-seps[2] = "-"
-@end example
-
-@noindent
-Il valore restituito da questa chiamata a @code{split()} @`e tre.
-
-@cindex differenze tra @command{awk} e @command{gawk}, 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
-vengono ignorati nell'assegnare valori agli elementi di @var{vettore} ma non nel
-vettore @var{separatori}, e gli elementi sono separati da uno o pi@`u spazi
-bianchi. Inoltre, come nel caso della divisione dei record in input, se
-@var{separacampo} @`e la stringa nulla, ogni singolo carattere nella stringa
-costituisce un elemento del vettore.
-@value{COMMONEXT}
-
-Si noti, tuttavia, che @code{RS} non influisce sul comportamento di
-@code{split()}.
-Anche se @samp{RS = ""} fa s@`{@dotless{i}} che il carattere di ritorno a capo sia un
-separatore di campo,
-questo non influenza il modo in cui @code{split()} divide le stringhe.
-
-@cindex angolo buio, funzione @code{split()}
-Recenti implementazioni di @command{awk}, incluso @command{gawk},
-consentono che il terzo argomento sia una costante @dfn{regexp}
-(@w{@code{/}@dots{}@code{/}})
-o anche una stringa. @value{DARKCORNER}
-Anche lo standard POSIX permette questo.
-@xref{Espressioni regolari calcolate} per la spiegazione della differenza
-tra l'uso di una costante stringa e l'uso di una costante @dfn{regexp},
-sulle loro implicazioni riguardo a come scrivere correttamente un programma.
-
-Prima di dividere la stringa, @code{split()} cancella ogni elemento
-eventualmente gi@`a presente
-nei vettori @var{vettore} e @var{separatori}.
-
-Se @var{stringa} @`e la stringa nulla, il vettore non ha elementi.
-(Quindi, in questo modo si pu@`o cancellare un intero vettore con una sola
-istruzione).
-@xref{Cancellazione}.)
-
-Se in @var{stringa} non viene trovato @var{separacampo} (ma la stringa
-non @`e la stringa nulla),
-@var{vettore} ha solo un elemento. Il valore di quell'elemento @`e la
-@var{stringa} originale.
-
-In modalit@`a POSIX (@pxref{Opzioni}), il quarto argomento non @`e disponibile.
-
-@item @code{sprintf(@var{formato}, @var{espressione1}, @dots{})}
-@cindexawkfunc{sprintf}
-@cindex formattare stringhe
-@cindex stringhe, formattazione
-Restituisce (senza stamparla) la stringa che @code{printf} avrebbe
-stampato con gli stessi argomenti
-(@pxref{Printf}).
-Per esempio:
-
-@example
-pival = sprintf("pi = %.2f (approx.)", 22/7)
-@end example
-
-@noindent
-assegna la stringa @w{@samp{pi = 3.14 (approx.)}} alla variabile @code{pival}.
-
-@cindexgawkfunc{strtonum}
-@cindex conversione di una stringa in un numero
-@cindex stringhe, conversione in numeri
-@item @code{strtonum(@var{stringa}) #}
-Esamina @var{stringa} e restituisce il suo valore numerico. Se
-@var{stringa} inizia con la cifra @samp{0}, @code{strtonum()} presuppone
-che @var{stringa} sia un numero ottale. Se @var{stringa} inizia con
-@samp{0x} o @samp{0X}, @code{strtonum()} presuppone che @var{stringa} sia un
-numero esadecimale.
-Per esempio:
-
-@example
-$ @kbd{echo 0x11 |}
-> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'}
-@print{} 17
-@end example
-
-Usare la funzione @code{strtonum()} @emph{non} @`e lo stesso che aggiungere
-zero al valore di una stringa;
-la conversione automatica di stringhe in numeri
-si applica solo a dati decimali, non a quelli ottali o
-esadecimali.@footnote{Tranne nel caso si usi l'opzione
-@option{--non-decimal-data}, il che non @`e consigliato.
-@xref{Dati non decimali} per ulteriori informazioni.}
-
-Si noti anche che @code{strtonum()} usa il separatore decimale della
-localizzazione corrente per riconoscere i numeri
-(@pxref{Localizzazioni}).
-
-@item @code{sub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
-@cindexawkfunc{sub}
-@cindex rimpiazzare in una stringa
-@cindex stringa, rimpiazzare in una
-Ricerca in @var{obiettivo}, che @`e visto come una stringa,
-la prima sottostringa pi@`u lunga possibile,
-a partire da sinistra, che corrisponde all'espressione regolare @var{regexp}.
-Modifica l'intera stringa sostituendo il testo individuato con
-@var{rimpiazzo}.
-La stringa cos@`{@dotless{i}} modificata diventa il nuovo valore di @var{obiettivo}.
-Restituisce il numero di sostituzioni fatte (zero o uno).
-
-L'argomento @var{regexp} pu@`o essere o una costante @dfn{regexp}
-(@code{/}@dots{}@code{/}) o una constante stringa (@code{"}@dots{}@code{"}).
-In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
-da individuare.
-@xref{Espressioni regolari calcolate} per la spiegazione della differenza tra
-le due forme, delle loro implicazioni riguardo al modo di scrivere
-correttamente un programma.
-
-Questa funzione @`e particolare perch@'e @var{obiettivo} non @`e semplicemente usato
-per calcolare un valore, e non basta che sia un'espressione qualsiasi:
-dev'essere una variabile, un campo, o un elemento di vettore in cui
-@code{sub()} possa memorizzare un valore modificato. Se questo argomento @`e
-omesso, il comportamento di default @`e
-quello di usare e modificare
-@code{$0}.@footnote{Si noti che questo significa che il record sar@`a dapprima
-ricostruito, usando il valore di @code{OFS} se qualche campo @`e stato cambiato,
-e che i campi saranno aggiornati dopo la sostituzione, anche se l'operazione in
-s@'e non cambia il record (@`e una ``no-op'') come @samp{sub(/^/, "")}.} Per
-esempio:
-
-@example
-str = "acqua, acqua dappertutto"
-sub(/cqu/, "vari", str)
-@end example
-
-@noindent
-modifica @code{stringa} facendola divenire
-@w{@samp{avaria, acqua dappertutto}},
-rimpiazzando l'occorrenza pi@`u lunga,
-a partire da sinistra, di @samp{cqu} con @samp{vari}.
-
-Se il carattere speciale @samp{&} compare in @var{rimpiazzo}, designa
-l'esatta sottostringa individuata da @var{regexp}. (Se
-@dfn{regexp} pu@`o individuare pi@`u di una stringa, questa sottostringa
-pu@`o assumere valori diversi.) Per esempio:
-
-@example
-@{ sub(/candidato/, "& e sua moglie"); print @}
-@end example
-
-@noindent
-cambia la prima occorrenza di @samp{candidato} a @samp{candidato
-e sua moglie} in ogni riga in input.
-Ecco un altro esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{str = "daabaaa"}
-> @kbd{sub(/a+/, "C&C", str)}
-> @kbd{print str}
-> @kbd{@}'}
-@print{} dCaaCbaaa
-@end example
-
-@noindent
-questo mostra come @samp{&} possa rappresentare una stringa variabile
-e illustra anche la regola
-``a partire da sinistra, la pi@`u lunga'' nell'individuazione di @dfn{regexp}
-(@pxref{Pi@`u lungo da sinistra}).
-
-L'effetto di questo carattere speciale (@samp{&}) pu@`o essere neutralizzato
-anteponendogli una barra inversa nella stringa. Come al solito, per
-inserire una barra inversa nella
-stringa, occorre scrivere due barre inverse. Quindi, occorre scrivere
-@samp{\\&} in una costante stringa per includere un carattere @samp{&}
-nel rimpiazzo.
-Per esempio, quanto segue mostra come rimpiazzare il primo @samp{|} su
-ogni riga con un @samp{&}:
-
-@example
-@{ sub(/\|/, "\\&"); print @}
-@end example
-
-@cindex @code{sub()}, funzione, argomenti di
-@cindex funzione @code{sub()}, argomenti di
-@cindex @code{gsub()}, funzione, argomenti di
-@cindex funzione @code{gsub()}, argomenti di
-Come gi@`a accennato, il terzo argomento di @code{sub()} dev'essere
-una variabile, un campo, o un elemento di vettore.
-Alcune versioni di @command{awk} accettano come terzo argomento
-un'espressione che non @`e un @dfn{lvalue}. In tal caso, @code{sub()}
-cerca ugualmente l'espressione e restituisce zero o uno, ma il risultato
-della sostituzione (se ce n'@`e uno) viene scartato perch@'e non c'@`e un posto
-dove memorizzarlo. Tali versioni di @command{awk} accettano espressioni
-come le seguente:
-
-@example
-sub(/USA/, "Stati Uniti", "gli USA e il Canada")
-@end example
-
-@noindent
-@cindex risoluzione di problemi, funzioni @code{gsub()}/@code{sub()}
-@cindex problemi, risoluzione di, funzioni @code{gsub()}/@code{sub()}
-Per compatibilit@`a storica, @command{gawk} accetta un tale codice erroneo.
-Tuttavia, l'uso di qualsiasi altra espressione non modificabile
-come terzo parametro causa un errore fatale, e il programma
-non viene portato a termine.
-
-Infine, se la @var{regexp} non @`e una costante @dfn{regexp}, @`e convertita
-in una stringa, e quindi il valore di quella stringa @`e trattato come
-la @dfn{regexp} da individuare.
-
-@item @code{substr(@var{stringa}, @var{inizio}} [@code{, @var{lunghezza}} ]@code{)}
-@cindexawkfunc{substr}
-@cindex sottostringa
-Restituisce una sottostringa di @var{stringa} lunga @var{lunghezza} caratteri,
-iniziando dal carattere numero @var{inizio}. Il primo carattere di una
-stringa @`e il carattere numero uno.@footnote{Questo @`e differente da
-C e C++, in cui il primo carattere ha il numero zero.}
-Per esempio, @code{substr("Washington", 5, 3)} restituisce @code{"ing"}.
-
-Se @var{lunghezza} non @`e presente, @code{substr()} restituisce l'intero
-suffisso di
-@var{stringa} a partire dal carattere numero @var{inizio}. Per esempio,
-@code{substr("Washington", 5)} restituisce @code{"ington"}. L'intero
-suffisso @`e restituito anche
-se @var{lunghezza} @`e maggiore del numero di caratteri disponibili
-nella stringa, a partire dal carattere @var{inizio}.
-
-@cindex Brian Kernighan, @command{awk} di
-Se @var{inizio} @`e minore di uno, @code{substr()} lo tratta come se
-fosse uno. (POSIX non specifica cosa fare in questo caso:
-BWK @command{awk} si comporta cos@`{@dotless{i}}, e quindi @command{gawk} fa lo stesso.)
-Se @var{inizio} @`e maggiore del numero di caratteri
-nella stringa, @code{substr()} restituisce la stringa nulla.
-Analogamente, se @var{lunghezza} @`e presente ma minore o uguale a zero,
-viene restituita la stringa nulla.
-
-@cindex risoluzione di problemi, funzione @code{substr()}
-@cindex problemi, risoluzione di, funzione @code{substr()}
-La stringa restituita da @code{substr()} @emph{non pu@`o} essere
-assegnata. Quindi, @`e un errore tentare di modificare una porzione di
-una stringa, come si vede nel seguente esempio:
-
-@example
-stringa = "abcdef"
-# tentare di ottenere "abCDEf", non @`e possibile
-substr(stringa, 3, 3) = "CDE"
-@end example
-
-@noindent
-@`E anche un errore usare @code{substr()} come terzo argomento
-di @code{sub()} o @code{gsub()}:
-
-@example
-gsub(/xyz/, "pdq", substr($0, 5, 20)) # SBAGLIATO
-@end example
-
-@cindex portabilit@`a, funzione @code{substr()}
-(Alcune versioni commerciali di @command{awk} consentono un tale uso di
-@code{substr()}, ma un tale codice non @`e portabile.)
-
-Se si devono sostituire pezzi di una stringa,
-si combini @code{substr()}
-con una concatenazione di stringa, nel modo seguente:
-
-@example
-stringa = "abcdef"
-@dots{}
-stringa = substr(stringa, 1, 2) "CDE" substr(stringa, 6)
-@end example
-
-@cindex maiuscolo/minuscolo, conversione da/a
-@cindex stringhe, convertire maiuscolo/minuscolo
-@item @code{tolower(@var{stringa})}
-@cindexawkfunc{tolower}
-@cindex convertire stringa in minuscolo
-Restituisce una copia di @var{stringa}, con ogni carattere maiuscolo
-nella stringa rimpiazzato dal suo corrispondente carattere minuscolo.
-I caratteri non alfabetici non vengono modificati. Per esempio,
-@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
-@code{"maiuscolo minuscolo 123"}.
-
-@item @code{toupper(@var{stringa})}
-@cindexawkfunc{toupper}
-@cindex convertire stringa in maiuscolo
-Restituisce una copia di @var{stringa}, con ogni carattere minuscolo
-nella stringa rimpiazzato dal suo corrispondente carattere maiuscolo.
-I caratteri non alfabetici non vengono modificati. Per esempio,
-@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
-@code{"MAIUSCOLO MINUSCOLO 123"}.
-@end table
-
-@cindex sidebar, Individuare la stringa nulla
-@ifdocbook
-@docbook
-<sidebar><title>Individuare la stringa nulla</title>
-@end docbook
-
-@cindex individuare la stringa nulla
-@cindex stringa nulla, individuare la
-@cindex @code{*} (asterisco), operatore @code{*}, individuare la stringa nulla
-@cindex asterisco (@code{*}), operatore @code{*}, individuare la stringa nulla
-
-In @command{awk}, l'operatore @samp{*} pu@`o individuare la stringa nulla.
-Questo @`e particolarmente importante per le funzioni @code{sub()},
-@code{gsub()} e @code{gensub()}. Per esempio:
-
-@example
-$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
-@print{} XaXbXcX
-@end example
-
-@noindent
-Sebbene questo sia abbastanza sensato, pu@`o suscitare una certa sorpresa.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Individuare la stringa nulla}
-
-
-@cindex individuare la stringa nulla
-@cindex stringa nulla, individuare la
-@cindex @code{*} (asterisco), operatore @code{*}, individuare la stringa nulla
-@cindex asterisco (@code{*}), operatore @code{*}, individuare la stringa nulla
-
-In @command{awk}, l'operatore @samp{*} pu@`o individuare la stringa nulla.
-Questo @`e particolarmente importante per le funzioni @code{sub()},
-@code{gsub()} e @code{gensub()}. Per esempio:
-
-@example
-$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
-@print{} XaXbXcX
-@end example
-
-@noindent
-Sebbene questo sia abbastanza sensato, pu@`o suscitare una certa sorpresa.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Dettagli ostici
-@subsubsection Ulteriori dettagli su @samp{\} e @samp{&} con @code{sub()}, @code{gsub()} e @code{gensub()}
-
-@cindex protezione caratteri nelle funzioni @code{gsub()}/@code{gensub()}/@code{sub()}
-@cindex funzione @code{sub()}, protezione caratteri
-@cindex @code{sub()}, funzione, protezione caratteri
-@cindex funzione @code{gsub()}, protezione caratteri
-@cindex @code{gsub()}, funzione, protezione caratteri
-@cindex funzione @code{gensub()} (@command{gawk}), protezione caratteri
-@cindex @code{gensub()}, funzione (@command{gawk}), protezione caratteri
-@cindex @code{\} (barra inversa), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
-@cindex barra inversa (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
-@cindex @code{&} (e commerciale), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
-@cindex e commerciale (@code{&}), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
-
-@quotation ATTENZIONE
-Si dice che questa sottosezione possa causare dei mal di testa.
-In prima lettura pu@`o essere benissimo saltata.
-@end quotation
-
-Quando si usa @code{sub()}, @code{gsub()} o @code{gensub()}, e si
-desidera includere delle
-barre inverse e delle "e commerciali" (@code{&}) nel testo da sostituire
-@`e necessario ricordare che ci sono parecchi livelli di
-@dfn{protezione caratteri} in gioco.
-
-Anzitutto, vi @`e il livello @dfn{lessicale}, quello in cui @command{awk}
-legge un programma e ne costruisce una copia interna da eseguire.
-Poi c'@`e il momento dell'esecuzione, quello in cui @command{awk}
-esamina effettivamente la stringa da sostituire, per determinare cosa
-fare.
-
-@cindex Brian Kernighan, @command{awk} di
-In entrambi i livelli, @command{awk} ricerca un dato insieme di caratteri
-che possono venire dopo una
-barra inversa. A livello lessicale, cerca le sequenze di protezione
-elencate in @ref{Sequenze di protezione}.
-Quindi, per ogni @samp{\} che @command{awk} elabora al momento
-dell'esecuzione, occorre immetterne due a livello lessicale.
-Quando un carattere che non ha necessit@`a di una sequenza di protezione
-segue una @samp{\}, sia BWK @command{awk} che @command{gawk} semplicemente
-rimuovono la @samp{\} stessa e
-mettono il carattere seguente nella stringa. Quindi, per esempio,
-@code{"a\qb"} @`e trattato come se si fosse scritto @code{"aqb"}.
-
-Al momento dell'esecuzione, le varie funzioni gestiscono sequenze di
-@samp{\} e @samp{&} in maniera differente. La situazione @`e (purtroppo)
-piuttosto complessa.
-Storicamente, le funzioni @code{sub()} e @code{gsub()} trattavano la
-sequenza di due caratteri @samp{\&} in maniera speciale; questa sequenza
-era rimpiazzata nel testo
-generato da un singolo carattere @samp{&}. Ogni altra @samp{\} contenuta
-nella stringa @var{rimpiazzo} che non era posta prima di una @samp{&} era
-lasciata passare senza modifiche.
-Questo @`e illustrato nella @ref{table-sub-escapes}.
-
-@c Thank to Karl Berry for help with the TeX stuff.
-@float Tabella,table-sub-escapes
-@caption{Elaborazione storica delle sequenze di protezione per @code{sub()} e @code{gsub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
- @code{\&}! @code{&}!Il testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\\&}! @code{\\&}!I caratteri @samp{\&}_cr
- @code{\\\\\&}! @code{\\&}!I caratteri @samp{\&}_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\\&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\&} @tab @code{&} @tab Il testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\\&} @tab @code{\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\\&} @tab @code{\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\\&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
- Immissione @code{sub()} vede @code{sub()} genera
- --------------- ------------- ---------------
- @code{\&} @code{&} Il testo individuato
- @code{\\&} @code{\&} La lettera @samp{&}
- @code{\\\&} @code{\&} La lettera @samp{&}
- @code{\\\\&} @code{\\&} Le lettere @samp{\&}
- @code{\\\\\&} @code{\\&} Le lettere @samp{\&}
-@code{\\\\\\&} @code{\\\&} Le lettere @samp{\\&}
- @code{\\q} @code{\q} Le lettere @samp{\q}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-@noindent
-Questa tabella mostra l'elaborazione a livello lessicale, in cui
-un numero dispari di barre inverse diventa un numero pari al momento
-dell'esecuzione,
-e mostra anche l'elaborazione in fase di esecuzione fatta da @code{sub()}.
-(Per amor di semplicit@`a le tavole che ancora seguono mostrano solo il caso
-di un numero pari di barre inverse immesso a livello lessicale.)
-
-Il problema con l'approccio storico @`e che non c'@`e modo di ottenere
-un carattere @samp{\} seguito dal testo individuato.
-
-Parecchie edizioni dello standard POSIX hanno provato a risolvere questo
-problema, senza riuscirci. I dettagli sono irrilevanti in questo contesto.
-
-A un certo punto, il manutentore di @command{gawk} ha presentato una
-proposta per una revisione dello standard per tornare
-a regole che corrispondano pi@`u da vicino alla prassi originalmente seguita.
-Le regole proposte hanno dei casi speciali che rendono possibile
-produrre una @samp{\} prima del
-testo individuato. Questo si pu@`o vedere nella
-@ref{table-sub-proposed}.
-
-@float Tabella,table-sub-proposed
-@caption{Regole @command{gawk} per @code{sub()} e barra inversa}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
-@code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
- @code{\\\\}! @code{\\}!@code{\\}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@item @code{\\\\} @tab @code{\\} @tab @code{\\}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
-Immissione @code{sub()} vede @code{sub()} genera
---------- ---------- ---------------
-@code{\\\\\\&} @code{\\\&} Il carattere @samp{\&}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\q} @code{\q} I caratteri @samp{\q}
- @code{\\\\} @code{\\} @code{\\}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-In breve, al momento dell'esecuzione, ci sono ora tre sequenze speciali
-di caratteri (@samp{\\\&}, @samp{\\&}, e @samp{\&}) mentre tradizionalmente
-ce n'era una sola. Tuttavia, come nel caso storico, ogni @samp{\} che
-non fa parte di una di queste tre sequenze non @`e speciale e appare
-nell'output cos@`{@dotless{i}} come @`e scritto.
-
-@command{gawk} 3.0 e 3.1 seguono queste regole per @code{sub()} e
-@code{gsub()}. La revisione dello standard POSIX ha richiesto molto pi@`u tempo
-di quel che ci si attendeva. Inoltre, la proposta del manutentore di
-@command{gawk} @`e andata persa durante il processo di standardizzazione. Le
-regole finali risultanti sono un po' pi@`u semplici. I risultati sono simili,
-tranne che in un caso.
-
-@cindex POSIX @command{awk}, funzioni @code{gsub()}/@code{sub()} e
-Le regole POSIX stabiliscono che @samp{\&} nella stringa di rimpiazzo
-produca il carattere @samp{&}, @samp{\\} produce il carattere @samp{\},
-e che @samp{\} seguito da qualsiasi carattere non @`e speciale; la @samp{\}
-@`e messa direttamente nell'output.
-Queste regole sono presentate nella @ref{table-posix-sub}.
-
-@float Tabella,table-posix-sub
-@caption{Regole POSIX per @code{sub()} e @code{gsub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
-@code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
- @code{\\\\}! @code{\\}!@code{\}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitemImmissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\&} @tab @code{\&} @tab I caratteri @samp{&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@item @code{\\\\} @tab @code{\\} @tab @code{\}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
-Immissione @code{sub()} vede @code{sub()} genera
---------- ---------- ---------------
-@code{\\\\\\&} @code{\\\&} I caratteri @samp{\&}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\q} @code{\q} I caratteri @samp{\q}
- @code{\\\\} @code{\\} @code{\}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-Il solo caso in cui la differenza @`e rilevante @`e l'ultimo: @samp{\\\\}
-@`e visto come @samp{\\} e produce @samp{\} invece che @samp{\\}.
-
-A partire dalla @value{PVERSION} 3.1.4, @command{gawk} ha seguito le regole
-POSIX quando si specifica @option{--posix} (@pxref{Opzioni}). Altrimenti, ha
-continuato a seguire le regole proposte [a POSIX], poich@'e questa @`e stato il
-comportamento seguito per parecchi anni.
-
-Quando la @value{PVERSION} 4.0.0 @`e stata rilasciata, il manutentore di
-@command{gawk}
-ha stabilito come default le regole POSIX, interrompendo cos@`{@dotless{i}} oltre
-un decennio di compatibilit@`a
-all'indietro.@footnote{Questa decisione si @`e dimostrata piuttosto avventata,
-anche se una nota in questa sezione avvertiva che la successiva versione
-principale di @command{gawk} avrebbe adottato le regole POSIX.}
-Inutile dire che questa non @`e stata una buona idea, e quindi dalla
-@value{PVERSION} 4.0.1, @command{gawk} ha ripreso il suo comportamento
-tradizionale, seguendo le regole POSIX solo quando si specifica l'opzione
-@option{--posix}.
-
-Le regole per @code{gensub()} sono molto pi@`u semplici. Al momento
-dell'esecuzione, quando @command{gawk} vede una @samp{\}, se il carattere
-seguente @`e una cifra,
-il testo individuato dalla corrispondente sottoespressione tra parentesi
-@`e inserito nell'output generato. Altrimenti, qualsiasi carattere segua la
-@samp{\} viene inserito nel testo generato, mentre la @samp{\} va persa,
-come si vede nella @ref{table-gensub-escapes}.
-
-@float Tabella,table-gensub-escapes
-@caption{Elaborazione sequenze di protezione in @code{gensub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{gensub()} vede!@code{gensub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
- @code{&}! @code{&}!Il testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\\}! @code{\\}!Il carattere @samp{\}_cr
- @code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
- @code{\\q}! @code{\q}!Il carattere @samp{q}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{gensub()} vede @tab @code{gensub()} genera
-@item @code{&} @tab @code{&} @tab Il testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\\} @tab @code{\\} @tab Il carattere @samp{\}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\q} @tab @code{\q} @tab Il carattere @samp{q}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
- Immissione @code{gensub()} vede @code{gensub()} genera
- --------- ------------- ------------------
- @code{&} @code{&} Il testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\\\} @code{\\} Il carattere @samp{\}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
-@code{\\\\\\&} @code{\\\&} I caratteri @samp{\&}
- @code{\\q} @code{\q} Il carattere @samp{q}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-A causa della complessit@`a dell'elaborazione a livello lessicale e in fase
-di esecuzione, e dei casi speciali di @code{sub()} e @code{gsub()},
-si raccomanda l'uso di @command{gawk} e di @code{gensub()} quando ci siano
-da fare delle sostituzioni.
-
-@node Funzioni di I/O
-@subsection Funzioni di Input/Output
-@cindex input/output, funzioni di
-@cindex funzioni di input/output
-
-Le seguenti funzioni riguardano l'input/output (I/O).
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@table @asis
-@item @code{close(}@var{nome_file} [@code{,} @var{come}]@code{)}
-@cindexawkfunc{close}
-@cindex file, chiusura
-@cindex chiudere un file o un coprocesso
-Chiude il file @var{nome_file} in input o in output. Alternativamente,
-l'argomento pu@`o essere un comando della shell usato per creare un
-coprocesso, o per ridirigere
-verso o da una @dfn{pipe}; questo coprocesso o @dfn{pipe} viene chiuso.
-@xref{Chiusura file e @dfn{pipe}}
-per ulteriori informazioni.
-
-Quando si chiude un coprocesso, pu@`o talora essere utile chiudere dapprima
-un lato della @dfn{pipe} bidirezionale e quindi chiudere l'altro.
-Questo si pu@`o fare fornendo un secondo argomento a @code{close()}.
-Questo secondo argomento (@var{come})
-dovrebbe essere una delle due stringhe @code{"to"} o @code{"from"},
-che indicano quale lato della @dfn{pipe} chiudere. La stringa pu@`o essere
-scritta indifferentemente in maiuscolo o in minuscolo.
-@xref{I/O bidirezionale},
-che tratta questa funzionalit@`a con maggior dettaglio e mostra un esempio.
-
-Si noti che il secondo argomento di @code{close()} @`e
-un'estensione @command{gawk}; non @`e disponibile in modalit@`a compatibile
-(@pxref{Opzioni}).
-
-@item @code{fflush(}[@var{nome_file}]@code{)}
-@cindexawkfunc{fflush}
-@cindex scrivere su disco i buffer di output contenuti in memoria
-Scrive su disco ogni output contenuto in memoria, associato con
-@var{nome_file}, che @`e o un
-file aperto in scrittura o un comando della shell che ridirige output a
-una @dfn{pipe} o a un coprocesso.
-
-@cindex buffer, scrivere su disco un
-@cindex memoria tampone, scrivere su disco
-@cindex output, bufferizzazione
-@cindex output, nella memoria tampone (buffer)
-Molti programmi di utilit@`a @dfn{bufferizzano} il loro output (cio@`e,
-accumulano in memoria record da scrivere in un file su disco o sullo
-schermo, fin quando non arriva il momento giusto per inviare i
-dati al dispositivo di output).
-Questo @`e spesso pi@`u efficiente che scrivere
-ogni particella di informazione non appena diventa disponibile. Tuttavia,
-qualche volta @`e necessario forzare un programma a @dfn{svuotare}
-i suoi buffer (cio@`e, inviare l'informazione alla sua destinazione,
-anche se un buffer non @`e pieno).
-Questo @`e lo scopo della funzione @code{fflush()}; anche
-@command{gawk} scrive il suo output in un buffer, e la funzione @code{fflush()}
-forza @command{gawk} a svuotare i suoi buffer.
-
-@cindex estensioni comuni, funzione @code{fflush()}
-@cindex Brian Kernighan, @command{awk} di
-Brian Kernighan ha aggiunto @code{fflush()} al suo @command{awk} nell'aprile
-1992. Per due decenni @`e rimasta un'estensione comune. A Dicembre
-2012 @`e stata accettata e inclusa nello standard POSIX.
-Si veda @uref{http://austingroupbugs.net/view.php?id=634, il sito Web dell'Austin Group}.
-
-POSIX standardizza @code{fflush()} come segue: se non c'@`e alcun
-argomento, o se l'argomento @`e la stringa nulla (@w{@code{""}}),
-@command{awk} svuota i buffer di @emph{tutti} i file in output e di
-@emph{tutte} le @dfn{pipe}.
-
-@quotation NOTA
-Prima della @value{PVERSION} 4.0.2, @command{gawk}
-avrebbe svuotato solo i buffer dello standard output se non era
-specificato alcun argomento,
-e svuotato tutti i buffer dei file in output e delle @dfn{pipe} se
-l'argomento era la stringa nulla.
-Questo @`e stato modificato per essere compatibile con l'@command{awk} di
-Kernighan, nella speranza che standardizzare questa
-funzionalit@`a in POSIX sarebbe stato pi@`u agevole (come poi @`e effettivamente
-successo).
-
-Con @command{gawk},
-si pu@`o usare @samp{fflush("/dev/stdout")} se si desidera solo svuotare i
-buffer dello standard output.
-@end quotation
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex risoluzione di problemi, funzione @code{fflush()}
-@cindex problemi, risoluzione di, funzione @code{fflush()}
-@code{fflush()} restituisce zero se il buffer @`e svuotato con successo;
-altrimenti, restituisce un valore diverso da zero. (@command{gawk}
-restituisce @minus{}1.)
-Nel caso in cui tutti i buffer vadano svuotati, il valore restituito @`e zero
-solo se tutti i buffer sono stati svuotati con successo. Altrimenti,
-@`e @minus{}1, e @command{gawk} avvisa riguardo al @var{nome_file}
-che ha problemi.
-
-@command{gawk} invia anche un messaggio di avvertimento se si tenta di svuotare i
-buffer di un file o @dfn{pipe} che era stato aperto in lettura
-(p.es. con @code{getline}),
-o se @var{nome_file} non @`e un file, una @dfn{pipe}, o un coprocesso aperto.
-in tal caso, @code{fflush()} restituisce ancora @minus{}1.
-
-@cindex sidebar, Bufferizzazione interattiva e non interattiva
-@ifdocbook
-@docbook
-<sidebar><title>Bufferizzazione interattiva e non interattiva</title>
-@end docbook
-
-@cindex bufferizzazione, interattiva vs.@: non interattiva
-
-A complicare ulteriormente le cose, i problemi di bufferizzazione possono
-peggiorare se il programma eseguito
-@`e @dfn{interattivo} (cio@`e, se
-comunica con un utente seduto davanti a una tastiera).@footnote{Un programma
-@`e interattivo se il suo standard output @`e connesso a un dispositivo
-terminale. Ai giorni nostri, questo vuol dire davanti a uno
-schermo e a una tastiera.}
-
-@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
-@c motivating me to write this section.
-I programmi interattivi normalmente @dfn{bufferizzano per riga} il loro
-output (cio@`e, scrivono in output una riga alla volta). I programmi
-non-interattivi attendono di aver riempito un buffer, il che pu@`o voler dire
-anche parecchie righe di output.
-Ecco un esempio della differenza:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}'}
-@kbd{1 1}
-@print{} 2
-@kbd{2 3}
-@print{} 5
-@kbd{Ctrl-d}
-@end example
-
-@noindent
-Ogni riga di output @`e stampata immediatamente. Si confronti questo
-comportamente con quello di questo esempio:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}' | cat}
-@kbd{1 1}
-@kbd{2 3}
-@kbd{Ctrl-d}
-@print{} 2
-@print{} 5
-@end example
-
-@noindent
-In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
-@kbd{Ctrl-d}, perch@'e l'output @`e bufferizzato e inviato tramite
-@dfn{pipe} al comando @command{cat} in un colpo solo.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Bufferizzazione interattiva e non interattiva}
-
-
-@cindex bufferizzazione, interattiva vs.@: non interattiva
-
-A complicare ulteriormente le cose, i problemi di bufferizzazione possono
-peggiorare se il programma eseguito
-@`e @dfn{interattivo} (cio@`e, se
-comunica con un utente seduto davanti a una tastiera).@footnote{Un programma
-@`e interattivo se il suo standard output @`e connesso a un dispositivo
-terminale. Ai giorni nostri, questo vuol dire davanti a uno
-schermo e a una tastiera.}
-
-@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
-@c motivating me to write this section.
-I programmi interattivi normalmente @dfn{bufferizzano per riga} il loro
-output (cio@`e, scrivono in output una riga alla volta). I programmi
-non-interattivi attendono di aver riempito un buffer, il che pu@`o voler dire
-anche parecchie righe di output.
-Ecco un esempio della differenza:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}'}
-@kbd{1 1}
-@print{} 2
-@kbd{2 3}
-@print{} 5
-@kbd{Ctrl-d}
-@end example
-
-@noindent
-Ogni riga di output @`e stampata immediatamente. Si confronti questo
-comportamente con quello di questo esempio:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}' | cat}
-@kbd{1 1}
-@kbd{2 3}
-@kbd{Ctrl-d}
-@print{} 2
-@print{} 5
-@end example
-
-@noindent
-In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
-@kbd{Ctrl-d}, perch@'e l'output @`e bufferizzato e inviato tramite
-@dfn{pipe} al comando @command{cat} in un colpo solo.
-@end cartouche
-@end ifnotdocbook
-
-@item @code{system(@var{comando})}
-@cindexawkfunc{system}
-@cindex chiamare comandi di shell
-@cindex interagire con altri programmi
-Esegue il comando del sistema operativo @var{comando} e quindi
-ritorna al programma @command{awk}.
-Restituisce il codice ritorno di @var{comando}.
-
-Per esempio, inserendo il seguente frammento di codice in un programma
-@command{awk}:
-
-@example
-END @{
- system("date | mail -s 'awk completato' root")
-@}
-@end example
-
-@noindent
-all'amministratore di sistema viene inviato un messaggio di posta quando
-il programma @command{awk} termina di elaborare l'input e inizia
-l'elaborazione da eseguire alla fine dell'input.
-
-Si noti che la ridirezione di @code{print} o @code{printf} in una
-@dfn{pipe} @`e spesso sufficiente per ottenere lo stesso risultato.
-Se @`e necessario eseguire parecchi comandi, @`e pi@`u efficiente
-stamparli verso una @dfn{pipe} diretta alla shell:
-
-@example
-while (@var{ancora lavoro da fare})
- print @var{comando} | "/bin/sh"
-close("/bin/sh")
-@end example
-
-@noindent
-@cindex risoluzione di problemi, funzione @code{system()}
-@cindex problemi, risoluzione di, funzione @code{system()}
-@cindex @option{--sandbox}, opzione, disabilitare la funzione @code{system()}
-@cindex opzione @option{--sandbox}, disabilitare la funzione @code{system()}
-Tuttavia, nel caso che il programma @command{awk} sia interattivo,
-@code{system()} @`e utile per eseguire grossi programmi autonomi,
-come ad esempio la shell o un programma di modifica testi.
-Alcuni sistemi operativi non consentono di implementare la funzione
-@code{system()}.
-Richiamare @code{system()} in sistemi in cui non @`e disponibile provoca
-un errore fatale.
-
-@quotation NOTA
-Quando si specifica l'opzione @option{--sandbox}, la funzione @code{system()} @`e
-disabilitata (@pxref{Opzioni}).
-@end quotation
-
-Nei sistemi aderenti allo standard POSIX, il codice di ritorno di un
-comando @`e un numero contenuto in 16 bit. Il valore del codice di ritorno
-passato alla funzione C @code{exit()} alla fine del programma @`e contenuto
-negli 8 bit di valore pi@`u alto dei 16 bit (la met@`a sinistra) che compongono
-il numero. I bit di valore pi@`u basso (la met@`a destra) indicano se il
-processo @`e stato terminato da un segnale (bit 7), e, se questo @`e il caso,
-il numero del segnale che ha provocato la terminazione (bit 0--6).
-
-Tradizionalmente, la funzione @code{system()} di @command{awk} si @`e
-semplicemente limitata a restituire il valore del codice di ritorno
-diviso per 256 (ossia la met@`a sinistra del numero di 16 bit, spostata
-a destra). In una situazione normale questo equivale a utilizzare il
-codice di ritornodi @code{system()}, ma nel caso in cui il programma sia
-stato terminato da un segnale, il valore diventa un numero frazionale a
-virgola mobile.@footnote{In uno scambio di messaggi privato il Dr.@:
-Kernighan mi ha comunicato che questo modo di procedere @`e probabilmente
-errato.} POSIX stabilisce che la chiamata a @code{system()} dall'interno
-di @command{awk} dovrebbe restituire l'intero valore a 16 bit.
-
-@command{gawk} si trova in qualche modo a met@`a strada.
-I valori del codice di ritorno sono descritti nella
-@ref{table-system-return-values}.
-
-@float Tabella,table-system-return-values
-@caption{Valori codici di ritorno da chiamata a @code{system()}}
-@multitable @columnfractions .40 .60
-@headitem Situazione @tab Valore codice di ritorno da @code{system()}
-@item @option{--traditional} @tab Valore dalla funzione C @code{system()}/256
-@item @option{--posix} @tab Valore dalla funzione C @code{system()}
-@item Uscita normale dal comando @tab Codice di ritorno del comando
-@item Terminazione da un segnale @tab 256 + numero segnale "assassino"
-@item Terminazione da un segnale con dump memoria @tab 512 + numero segnale "assassino"
-@item Qualsiasi tipo di errore @tab @minus{}1
-@end multitable
-@end float
-@end table
-
-@cindex sidebar, Controllare la bufferizzazione dell'output con @code{system()}
-@ifdocbook
-@docbook
-<sidebar><title>Controllare la bufferizzazione dell'output con @code{system()}</title>
-@end docbook
-
-@cindex buffer, scrivere su disco un
-@cindex bufferizzazione, dell'input/output
-@cindex output, bufferizzazione
-@cindex bufferizzazione, dell'output
-
-La funzione @code{fflush()} consente un controllo esplicito sulla
-bufferizzazione dell'output per singoli file e @dfn{pipe}.
-Tuttavia, il suo utilizzo non @`e portabile su molte delle meno recenti
-implementazioni di @command{awk}. Un metodo alternativo per forzare la
-scrittura dell'output @`e una chiamata a
-@code{system()} che abbia come argomento la stringa nulla:
-
-@example
-system("") # scrive l'output su disco
-@end example
-
-@noindent
-@command{gawk} tratta questo uso della funzione @code{system()} come un
-caso speciale, e si guarda bene dall'invocare la shell (o un altro
-interprete di comandi) con un comando nullo.
-Quindi, con @command{gawk}, questa maniera di procedere non @`e solo utile,
-ma @`e anche efficiente.
-Questo metodo dovrebbe funzionare anche con
-altre implementazioni di @command{awk}, ma non @`e detto che eviti una
-invocazione non necessaria della shell. (Altre implementazioni potrebbero
-limitarsi a forzare la scrittura del buffer associato con lo
-standard output, e non necessariamente di tutto l'output bufferizzato.)
-
-Avendo in mente le attese di un programmatore, sarebbe sensato che
-@code{system()} forzi la scrittura su disco di tutto l'output disponibile.
-Il programma seguente:
-
-@example
-BEGIN @{
- print "prima riga stampata"
- system("echo system echo")
- print "seconda riga stampata"
-@}
-@end example
-
-@noindent
-deve stampare:
-
-@example
-prima riga stampata
-system echo
-seconda riga stampata
-@end example
-
-@noindent
-e non:
-
-@example
-system echo
-prima riga stampata
-seconda riga stampata
-@end example
-
-Se @command{awk} non forzasse la scrittura dei suoi buffer prima di
-invocare @code{system()}, l'output sarebbe quest'ultimo (quello non voluto).
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Controllare la bufferizzazione dell'output con @code{system()}}
-
-
-@cindex buffer, scrivere su disco un
-@cindex bufferizzazione, dell'input/output
-@cindex output, bufferizzazione
-@cindex bufferizzazione, dell'output
-
-La funzione @code{fflush()} consente un controllo esplicito sulla
-bufferizzazione dell'output per singoli file e @dfn{pipe}.
-Tuttavia, il suo utilizzo non @`e portabile su molte delle meno recenti
-implementazioni di @command{awk}. Un metodo alternativo per forzare la
-scrittura dell'output @`e una chiamata a
-@code{system()} che abbia come argomento la stringa nulla:
-
-@example
-system("") # scrive l'output su disco
-@end example
-
-@noindent
-@command{gawk} tratta questo uso della funzione @code{system()} come un
-caso speciale, e si guarda bene dall'invocare la shell (o un altro
-interprete di comandi) con un comando nullo.
-Quindi, con @command{gawk}, questa maniera di procedere non @`e solo utile,
-ma @`e anche efficiente.
-Questo metodo dovrebbe funzionare anche con
-altre implementazioni di @command{awk}, ma non @`e detto che eviti una
-invocazione non necessaria della shell. (Altre implementazioni potrebbero
-limitarsi a forzare la scrittura del buffer associato con lo
-standard output, e non necessariamente di tutto l'output bufferizzato.)
-
-Avendo in mente le attese di un programmatore, sarebbe sensato che
-@code{system()} forzi la scrittura su disco di tutto l'output disponibile.
-Il programma seguente:
-
-@example
-BEGIN @{
- print "prima riga stampata"
- system("echo system echo")
- print "seconda riga stampata"
-@}
-@end example
-
-@noindent
-deve stampare:
-
-@example
-prima riga stampata
-system echo
-seconda riga stampata
-@end example
-
-@noindent
-e non:
-
-@example
-system echo
-prima riga stampata
-seconda riga stampata
-@end example
-
-Se @command{awk} non forzasse la scrittura dei suoi buffer prima di
-invocare @code{system()}, l'output sarebbe quest'ultimo (quello non voluto).
-@end cartouche
-@end ifnotdocbook
-
-@node Funzioni di tempo
-@subsection Funzioni per gestire marcature temporali
-@cindex funzioni di tempo
-
-@cindex marcature temporali
-@cindex data e ora, si veda marcature temporali
-@cindex @dfn{log} (registro), file di, marcature temporali nei
-@cindex registro (@dfn{log}), file di, marcature temporali nel
-@cindex file di registro (@dfn{log}), marcature temporali nei
-@cindex @command{gawk}, data e ora (marcature temporali)
-@cindex POSIX @command{awk}, marcature temporali e
-I programmi @command{awk} sono frequentemente usati per elaborare file di
-registro [file con estensione .log], che contengono l'informazione sulla data e
-l'ora (marcatura temporale) in cui un particolare record @`e stato registrato sul log.
-Molti programmi registrano questa informazione nel formato restituito
-dalla chiamata di sistema @code{time()}, la quale misura il numero di secondi
-trascorsi a partire da una certa data iniziale (Epoca). Nei sistemi aderenti
-allo standard POSIX, questo @`e il numero di secondi a partire dal primo gennaio
-1970, ora di Greenwich (1970-01-01 00:00:00 UTC), senza includere i secondi
-@ifclear FOR_PRINT
-@iftex
-intercalari.@footnote{@xrefIl{Glossario},
-@end iftex
-@ifnottex
-intercalari.@footnote{@xref{Glossario},
-@end ifnottex
-in particolare le voci ``Epoca'' e ``UTC.''}
-@end ifclear
-@ifset FOR_PRINT
-intercalari.
-@end ifset
-Tutti i sistemi noti aderenti allo standard POSIX gestiscono le marcature
-temporali da 0 fino a
-@iftex
-@math{2^{31} - 1},
-@end iftex
-@ifinfo
-2^31 - 1,
-@end ifinfo
-@ifnottex
-@ifnotinfo
-2@sup{31} @minus{} 1,
-@end ifnotinfo
-@end ifnottex
-il che @`e sufficiente per rappresentare date e ore fino a inizio 2038
-(2038-01-19 03:14:07 UTC). Molti sistemi supportano una maggiore estensione
-di date, compresi dei valori negativi per rappresentare delle date
-anteriori all'Epoca.
-
-@cindex @command{date}, programma di utilit@`a GNU
-@cindex programma di utilit@`a @command{date} GNU
-@cindex tempo, ottenerlo
-Per facilitare l'elaborazione di tali file di registro, e per produrre
-dei rapporti utili, @command{gawk} prevede le seguenti funzioni per
-lavorare con le marcature temporali. Si tratta di estensioni @command{gawk};
-non sono previste nello standard POSIX.@footnote{Il comando di utilit@`a GNU
-@command{date} pu@`o fare anche molte delle cose qui descritte. Pu@`o essere
-preferibile usarlo per semplici operazioni relative a data e ora in semplici
-script della shell.} Tuttavia, anche versioni recenti di @command{mawk}
-(@pxref{Altre versioni}) prevedono queste funzioni. I parametri facoltativi
-sono racchiusi tra parentesi quadre ([ ]):
-
-@c @asis for docbook
-@table @asis
-@item @code{mktime(@var{specifiche_data}} [@code{, @var{utc-flag}} ]@code{)}
-@cindexgawkfunc{mktime}
-@cindex generare data e ora
-Trasforma @var{specifiche_data} in una marcatura temporale nello stesso formato
-restituito da @code{systime()}. @`E simile alla funzione omonima
-in ISO C. L'argomento, @var{specifiche_data}, @`e una stringa della forma
-@w{@code{"@var{AAAA} @var{MM} @var{GG} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}.
-La stringa consiste di sei o sette numeri che rappresentano,
-rispettivamente,
-l'anno in quattro cifre, il mese da 1 a 12, il giorno del mese
-da 1 a 31, l'ora del giorno da 0 a 23, il minuto da 0 a
-59, il secondo da 0 a 60,@footnote{Occasionalmente ci sono dei
-minuti in un anno con un secondo intercalare, il che spiega perch@'e i
-secondi possono arrivare fino a 60.}
-e un'indicazione opzionale relativa all'ora legale.
-
-I valori di questi numeri possono non essere negli intervalli specificati; per
-esempio, un'ora di @minus{}1 sta a indicare 1 ora prima di mezzanotte.
-Viene adottato il calendario gregoriano con l'origine posta all'anno zero,
-con l'anno 0 che viene prima dell'anno 1 e l'anno @minus{}1 che viene prima
-dell'anno 0. Se il flag @var{utc-flag} @`e specificato ed @`e diverso da zero
-e dalla stringa nulla, si suppone che l'ora sia quella del fuso orario UTC;
-altrimenti l'ora @`e considerata essere quella del fuso orario locale. Se
-l'indicatore dell'ora legale @`e positivo, si presuppone che l'ora sia quella
-legale; se @`e 0, l'ora considerata @`e quella di Greenwich (standard time); se
-invece @`e negativo (questo @`e il default), @code{mktime()} tenta di
-determinare se @`e in vigore l'ora legale o no, nel momento specificato.
-
-Se @var{specifiche_data} non contiene elementi in numero sufficiente, o se
-la data e ora risultante sono fuori dall'intervallo previsto,
-@code{mktime()} restituisce @minus{}1.
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-@item @code{strftime(}[@var{formato} [@code{,} @var{data_e_ora} [@code{,} @var{utc}] ] ]@code{)}
-@cindexgawkfunc{strftime}
-@cindex formato stringa marcature temporali
-@cindex formato stringa data e ora
-@cindex data e ora, formato stringa
-@cindex marcature temporali, formato stringa
-Formatta la data e ora specificata da @var{data_e_ora} in base alle indicazioni
-contenute nella stringa @var{formato} e restituisce il risultato.
-@`E simile alla funzione omonima in ISO C.
-Se @var{utc} @`e presente ed @`e diverso da zero o dalla stringa nulla,
-il valore @`e formattato come UTC (Tempo Coordinato Universale,
-gi@`a noto come GMT o Tempo Medio di Greenwich).
-Altrimenti, il valore @`e formattato per il fuso orario locale.
-La stringa @var{data_e_ora} @`e nello stesso formato del valore restituito
-dalla funzione @code{systime()}. Se non si specifica l'argomento
-@var{data_e_ora}, @command{gawk} usa l'ora del giorno corrente per la
-formattazione.
-Omettendo l'argomento @var{formato}, @code{strftime()} usa
-il valore di @code{PROCINFO["strftime"]} come stringa di formattazione
-(@pxref{Variabili predefinite}).
-Il valore di default della stringa @`e
-@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}. Questa stringa di formattazione
-produce lo stesso output del programma di utilit@`a equivalente
-@command{date}.
-Si pu@`o assegnare un nuovo valore a @code{PROCINFO["strftime"]} per
-modificare la formattazione di default; si veda
-la lista che segue per le varie direttive di formattazione.
-
-@item @code{systime()}
-@cindexgawkfunc{systime}
-@cindex marcature temporali
-@cindex data e ora, si veda marcature temporali
-@cindex data e ora corrente del sistema
-Restituisce l'ora corrente come numero di secondi a partire dall'Epoca
-del sistema. Sui sistemi aderenti allo standard POSIX, questo @`e il numero
-di secondi trascorsi a partire dal primo gennaio 1970, ora di Greenwich
-(1970-01-01 00:00:00 UTC), senza includere i secondi intercalari.
-@end table
-
-La funzione @code{systime()} consente di confrontare una marcatura temporale
-in un file di registro con la data e ora correnti. In particolare, @`e facile
-determinare quanto tempo prima un particolare record @`e stato registrato.
-@`E anche possibile produrre record di registro usando il formato
-``secondi a partire dall'Epoca''.
-
-@cindex conversione di date in marcature temporali
-@cindex date, conversione in marcature temporali
-@cindex marcature temporali, conversione date nelle
-La funzione @code{mktime()} consente di convertire una rappresentazione in
-forma testuale di una data e ora in una marcatura temporale.
-Questo semplifica i confronti prima/dopo tra differenti date e ore, in
-particolare quando si abbia a che fare con date e ore provenienti da una
-fonte esterna, come un file di registro.
-
-La funzione @code{strftime()} permette di trasformare facilmente una marcatura
-temporale in un'informazione intelligibile. @`E analoga come tipo alla funzione
-@code{sprintf()} (@pxref{Funzioni per stringhe}), nel senso che copia
-letteralmente ci@`o che non @`e una specifica di formato nella stringa che viene
-restituita, mentre sostituisce i valori di data e ora a seconda delle
-specifiche di formato contenute nella stringa @var{formato}.
-
-@cindex specificatori di formato, funzione @code{strftime()} di (@command{gawk})
-@cindex formato, specificatori di, funzione @code{strftime()} di (@command{gawk})
-Per @code{strftime()} lo standard
-1999 ISO C@footnote{Sfortunatamente,
-non tutte le funzioni @code{strftime()} dei vari sistemi operativi
-ammettono tutte le conversioni qui elencate.}
-consente le seguenti specifiche di formattazione delle date:
-
-@table @code
-@item %a
-Il nome abbreviato del giorno della settimana nella lingua locale.
-
-@item %A
-Il nome completo del giorno della settimana nella lingua locale.
-
-@item %b
-Il nome abbreviato del mese dell'anno nella lingua locale.
-
-@item %B
-Il nome completo del mese dell'anno nella lingua locale.
-
-@item %c
-Il formato ``appropriato'' della rappresentazione della data e ora
-nella lingua locale.
-(Questo @`e @samp{%A %B %d %T %Y} per la localizzazione @code{"C"}.)
-
-@item %C
-La parte che designa il secolo nell'anno corrente.
-Si ottiene dividendo per 100 l'anno, e
-troncando verso il basso
-all'intero pi@`u vicino.
-
-@item %d
-Il giorno del mese come numero decimale (01--31).
-
-@item %D
-Equivale a specificare @samp{%m/%d/%y}.
-
-@item %e
-Il giorno del mese, preceduto da uno spazio se di tratta di una cifra sola.
-
-@item %F
-Equivale a specificare @samp{%Y-%m-%d}.
-Questo @`e il formato ISO 8601 della data.
-
-@item %g
-L'anno (ultime due cifre) ricavato prendendo il resto della divisione per 100
-dell'anno a cui appartiene la settimana, secondo ISO 8601, come numero decimale
-(00--99). Per esempio, il primo gennaio 2012, fa parte della settimana 53 del
-2011. Quindi, l'anno relativo al numero di settimana ISO di quella data @`e 2011
-(ossia 11), anche se la data in s@'e @`e nel 2012. Analogamente, il 31 dicembre
-2012, @`e nella prima settimana del 2013. Quindi, l'anno relativo al numero di
-settimana ISO di quella data @`e 2013 (ossia 13), anche se la data in s@'e @`e nel
-2012.
-
-@item %G
-L'anno intero relativo al numero di settimana ISO, come numero decimale.
-
-@item %h
-Equivalente a @samp{%b}.
-
-@item %H
-L'ora (in un orologio a 24 ore) come numero decimale (00--23).
-
-@item %I
-L'ora (in un orologio a 12 ore) come numero decimale (01--12).
-
-@item %j
-Il giorno dell'anno come numero decimale (001--366).
-
-@item %m
-Il mese come numero decimale (01--12).
-
-@item %M
-Il minuto come numero decimale (00--59).
-
-@item %n
-Un carattere di ritorno a capo (ASCII LF).
-
-@item %p
-L'equivalente nella lingua locale delle designazioni AM/PM
-(mattino/pomerigggio) associate a un orologio a 12 ore.
-
-@item %r
-L'ora locale nel formato a 12 ore.
-(Questo @`e @samp{%I:%M:%S %p} nella localizzazione @code{"C"}.)
-
-@item %R
-Equivalente a specificare @samp{%H:%M}.
-
-@item %S
-Il secondo come numero decimale (00--60).
-
-@item %t
-Un carattere di tabulazione [TAB].
-
-@item %T
-Equivalente a specificare @samp{%H:%M:%S}.
-
-@item %u
-Il numero del giorno della settimana come numero decimale (1--7).
-Luned@`{@dotless{i}} @`e il giorno numero 1.
-
-@item %U
-Il numero di settimana dell'anno (con la prima domenica dell'anno presa
-come primo giorno della prima settimana) come numero decimale (00--53).
-
-@c @cindex ISO 8601
-@item %V
-Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} dell'anno preso
-come primo giorno della prima settimana) come numero decimale (01--53).
-Il metodo per determinare il numero di settimana @`e quello specificato
-dallo standard ISO 8601.
-(In pratica: se la settimana che contiene il primo gennaio ha quattro o
-pi@`u giorni nel nuovo anno, allora
-@`e la settimana numero uno; altrimenti @`e l'ultima settimana
-[52 o 53] dell'anno
-precedente, e la settimana successiva @`e la settimana numero uno.)
-
-@item %w
-Il giorno della settimana come numero decimale (0--6).
-Domenica @`e il giorno zero.
-
-@item %W
-Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} come primo giorno
-della settimana numero uno)
-come numero decimale (00--53).
-
-@item %x
-Il formato ``appropriato'' della rappresentazione della data
-nella lingua locale.
-(Questo @`e @samp{%A %B %d %Y} nella localizzazione @code{"C"}.)
-
-@item %X
-Il formato ``appropriato'' della rappresentazione della data.
-(Questo @`e @samp{%T} nella localizzazione @code{"C"}.)
-
-@item %y
-L'anno modulo 100 (le ultime due cifre) come numero decimale (00--99).
-
-@item %Y
-L'anno come numero decimale (p.es., 2015).
-
-@c @cindex RFC 822
-@c @cindex RFC 1036
-@item %z
-La differenza di fuso orario [rispetto all'ora di Greenwich] in formato
-@samp{+@var{OOMM}} (p.es., il
-formato necessario per produrre intestazioni di data conformi agli standard
-RFC 822/RFC 1036).
-
-@item %Z
-Il nome o l'abbreviazione della zona di fuso orario (@dfn{time zone}); se il fuso
-orario non @`e determinabile, @`e impostata alla stringa nulla.
-
-@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
-@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
-``notazioni alternative'' di specifica
-in cui solo la seconda lettera (@samp{%c}, @samp{%C} e cos@`{@dotless{i}} via) @`e
-significativa.@footnote{Se questo risulta incomprensibile, non @`e il
-caso di preoccuparsi; queste notazioni hanno lo scopo di facilitare
-la ``internazionalizzazione'' dei programmi.
-Altre funzionalit@`a di internazionalizzazione sono descritte in
-@ref{Internazionalizzazione}.}
-(Queste facilitano la compatibilit@`a con il programma di utilit@`a
-POSIX @command{date}.)
-
-@item %%
-Un singolo carattere @samp{%}.
-@end table
-
-Se uno specificatore di conversione non @`e tra quelli elencati sopra, il
-comportamento @`e indefinito.@footnote{Questo @`e perch@'e ISO C lascia
-indefinito il comportamento della versione C di @code{strftime()} e
-@command{gawk} usa la versione di sistema di @code{strftime()},
-se disponibile.
-Tipicamente, lo specificatore di conversione "non previsto" non appare
-nella stringa risultante, o appare cos@`{@dotless{i}} come @`e scritto.}
-
-Per sistemi che non aderiscono completamente agli standard
-@command{gawk} utilizza una copia di
-@code{strftime()} dalla libreria C di GNU.
-Sono disponibili tutte le specifiche di formato sopra elencate.
-Se la detta versione @`e
-usata per compilare @command{gawk} (@pxref{Installazione}),
-sono disponibili anche le seguenti ulteriori specifiche di formato:
-
-@table @code
-@item %k
-L'ora (in un orologio a 24 ore) come numero decimale (0--23).
-I numeri di una sola cifra sono preceduti da uno spazio bianco.
-
-@item %l
-L'ora (in un orologio a 12 ore) come numero decimale (1--12).
-I numeri di una sola cifra sono preceduti da uno spazio bianco.
-
-@ignore
-@item %N
-Il nome dell'``Imperatore/Era''.
-Equivalente a @samp{%C}.
-
-@item %o
-L'anno dell'``Imperatore/Era''.
-Equivalente a @samp{%y}.
-@end ignore
-
-@item %s
-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}).
-@end ignore
-@end table
-
-In aggiunta a ci@`o, le notazioni alternative sono riconosciute, ma al
-loro posto sono usate quelle normali.
-
-@cindex @code{date}, programma di utilit@`a POSIX
-@cindex programma di utilit@`a POSIX @code{date}
-@cindex POSIX @command{awk}, programma di utilit@`a @code{date} e
-Il seguente esempio @`e un'implementazione @command{awk} del
-programma di utilit@`a POSIX @command{date}.
-Normalmente, il programma di utilit@`a @command{date} stampa la
-data e l'ora corrente nel formato ben noto. Tuttavia, se si
-specifica al comando un argomento che inizia con un @samp{+}, @command{date}
-copia i caratteri che non sono specifiche di formato nello standard output
-e interpreta l'ora corrente secondo gli specificatori di formato
-contenuti nella stringa. Per esempio:
-
-@example
-$ @kbd{date '+Oggi @`e %A, %d %B %Y.'}
-@print{} Oggi @`e luned@`{@dotless{i}}, 22 settembre 2014.
-@end example
-
-Ecco la versione @command{gawk} del programma di utilit@`a @command{date}.
-@`E all'interno di uno script di shell per gestire l'opzione @option{-u},
-che richiede che @command{date} sia eseguito come se il fuso orario
-fosse impostato a UTC:
-
-@example
-#! /bin/sh
-#
-# date --- simula il comando POSIX 'date'
-
-case $1 in
--u) TZ=UTC0 # usare UTC
- export TZ
- shift ;;
-esac
-
-gawk 'BEGIN @{
- formato = PROCINFO["strftime"]
- codice_di_ritorno = 0
-
- if (ARGC > 2)
- codice_di_ritorno = 1
- else if (ARGC == 2) @{
- formato = ARGV[1]
- if (formato ~ /^\+/)
- formato = substr(formato, 2) # togli il + iniziale
- @}
- print strftime(formato)
- exit codice_di_ritorno
-@}' "$@@"
-@end example
-
-@node Funzioni a livello di bit
-@subsection Funzioni per operazioni di manipolazione bit
-@cindex bit, funzioni per la manipolazione di
-@cindex manipolazione di bit, funzioni per la
-@cindex funzioni per la manipolazione di bit
-@cindex bit, operazioni sui
-@cindex AND, operazione sui bit
-@cindex OR, operazione sui bit
-@cindex XOR, operazione sui bit
-@cindex operazioni sui bit
-@quotation
-@i{Io posso spiegarlo per te, ma non posso capirlo per te.}
-@author Anonimo
-@end quotation
-
-Molti linguaggi consentono di eseguire operazioni @dfn{bit a bit}
-su due numeri interi. In altre parole, l'operazione @`e eseguita
-su ogni successiva coppia di bit presi da ognuno dei due operandi.
-Tre operazioni comuni sono AND, OR e XOR bit a bit.
-Queste operazioni sono descritte nella @ref{table-bitwise-ops}.
-
-@c 11/2014: Postprocessing turns the docbook informaltable
-@c into a table. Hurray for scripting!
-@float Tabella,table-bitwise-ops
-@caption{Operazioni a livello di bit}
-@ifnottex
-@ifnotdocbook
-@display
-@verbatim
- Operatore booleano
- | AND | OR | XOR
- |---+---+---+---+---+---
-Operandi | 0 | 1 | 0 | 1 | 0 | 1
-----------+---+---+---+---+---+---
- 0 | 0 0 | 0 1 | 0 1
- 1 | 0 1 | 1 1 | 1 0
-@end verbatim
-@end display
-@end ifnotdocbook
-@end ifnottex
-@tex
-\centerline{
-\vbox{\bigskip % space above the table (about 1 linespace)
-% Because we have vertical rules, we can't let TeX insert interline space
-% in its usual way.
-\offinterlineskip
-\halign{\strut\hfil#\quad\hfil % operands
- &\vrule#&\quad#\quad % rule, 0 (of and)
- &\vrule#&\quad#\quad % rule, 1 (of and)
- &\vrule# % rule between and and or
- &\quad#\quad % 0 (of or)
- &\vrule#&\quad#\quad % rule, 1 (of of)
- &\vrule# % rule between or and xor
- &\quad#\quad % 0 of xor
- &\vrule#&\quad#\quad % rule, 1 of xor
- \cr
-&\omit&\multispan{11}\hfil\bf Operatore booleano\hfil\cr
-\noalign{\smallskip}
-& &\multispan3\hfil AND\hfil&&\multispan3\hfil OR\hfil
- &&\multispan3\hfil XOR\hfil\cr
-\bf Operandi&&0&&1&&0&&1&&0&&1\cr
-\noalign{\hrule}
-\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr
-\noalign{\hrule height0pt}% without this the rule does not extend; why?
-0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr
-1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr
-}}}
-@end tex
-
-@docbook
-<informaltable>
-
-<tgroup cols="7" colsep="1">
-<colspec colname="c1"/>
-<colspec colname="c2"/>
-<colspec colname="c3"/>
-<colspec colname="c4"/>
-<colspec colname="c5"/>
-<colspec colname="c6"/>
-<colspec colname="c7"/>
-<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/>
-<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/>
-<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/>
-<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/>
-
-<tbody>
-<row>
-<entry colsep="0"></entry>
-<entry spanname="optitle"><emphasis role="bold">Operatore booleano</emphasis></entry>
-</row>
-
-<row rowsep="1">
-<entry rowsep="0"></entry>
-<entry spanname="andspan">AND</entry>
-<entry spanname="orspan">OR</entry>
-<entry spanname="xorspan">XOR</entry>
-</row>
-
-<row rowsep="1">
-<entry ><emphasis role="bold">Operandi</emphasis></entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-</row>
-
-<row>
-<entry align="center">0</entry>
-<entry colsep="0">0</entry>
-<entry>0</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-</row>
-
-<row>
-<entry align="center">1</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-<entry colsep="0">1</entry>
-<entry>1</entry>
-<entry colsep="0">1</entry>
-<entry>0</entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-@end docbook
-@end float
-
-@cindex bit, complemento a livello di
-@cindex complemento a livello di bit
-Come si vede, il risultato di un'operazione di AND @`e 1 solo quando
-@emph{entrambi} i bit sono 1.
-Il risultato di un'operazione di OR @`e 1 se @emph{almeno un} bit @`e 1.
-Il risultato di un'operazione di XOR @`e 1 se l'uno o l'altro
-bit @`e 1, ma non tutti e due.
-La successiva operazione @`e il @dfn{complemento}; il complemento di 1 @`e 0 e
-il complemento di 0 @`e 1. Quindi, quest'operazione ``inverte'' tutti i bit
-di un dato valore.
-
-@cindex bit, spostamento di
-@cindex spostamento a sinistra, bit a bit
-@cindex spostamento a destra, bit a bit
-@cindex spostamento, bit a bit
-Infine, due altre operazioni comuni consistono nello spostare i bit
-a sinistra o a destra.
-Per esempio, se si ha una stringa di bit @samp{10111001} e la si sposta
-a destra di tre bit, si ottiene @samp{00010111}.@footnote{Questo esempio
-presuppone che degli zeri riempiano le posizioni a sinistra.
-Per @command{gawk}, @`e sempre
-cos@`{@dotless{i}}, ma in alcuni linguaggi @`e possibile che le posizioni a sinistra
-siano riempite con degli uno.}
-Partendo nuovamente da @samp{10111001} e spostandolo a sinistra di tre
-bit, si ottiene @samp{11001000}. La lista seguente descrive
-le funzioni predefinite di @command{gawk} che rendono disponibili
-le operazioni a livello di bit.
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@cindex @command{gawk}, operazioni a livello di bit in
-@table @code
-@cindexgawkfunc{and}
-@cindex AND, operazione sui bit
-@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce l'AND bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-
-@cindexgawkfunc{compl}
-@cindex complemento a livello di bit
-@item @code{compl(@var{val})}
-Restituisce il complemento bit a bit di @var{val}.
-
-@cindexgawkfunc{lshift}
-@cindex spostamento a sinistra
-@item @code{lshift(@var{val}, @var{contatore})}
-Restituisce il valore di @var{val}, spostato a sinistra di
-@var{contatore} bit.
-
-@cindexgawkfunc{or}
-@cindex OR, operazione sui bit
-@item @code{or(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce l'OR bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-
-@cindexgawkfunc{rshift}
-@cindex spostamento a destra
-@item @code{rshift(@var{val}, @var{contatore})}
-Restituisce il valore di @var{val}, spostato a destra
-di @var{contatore} bit.
-
-@cindexgawkfunc{xor}
-@cindex XOR, operazione sui bit
-@item @code{xor(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce il XOR bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-@end table
-
-@quotation ATTENZIONE
-A partire dalla versione di @command{gawk} @value{PVERSION} 4.2, gli operandi
-negativi non sono consentiti per nessuna di queste funzioni. Un operando
-negativo produce un errore fatale. Si veda la nota a lato
-``Attenzione. Non @`e tutto oro quel che luccica!'' per maggiori informazioni sul perch@'e.
-@end quotation
-
-Ecco una funzione definita dall'utente (@pxref{Funzioni definite dall'utente})
-che illustra l'uso di queste funzioni:
-
-@cindex @code{bits2str()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{bits2str()}
-@cindex @code{testbits.awk}, programma
-@cindex programma @code{testbits.awk}
-@example
-@group
-@c file eg/lib/bits2str.awk
-# bits2str --- decodifica un byte in una serie di 0/1 leggibili
-
-function bits2str(byte, dati, maschera)
-@{
- if (byte == 0)
- return "0"
-
- maschera = 1
- for (; byte != 0; stringa = rshift(stringa, 1))
- dati = (and(byte, maschera) ? "1" : "0") dati
-
- while ((length(dati) % 8) != 0)
- dati = "0" dati
-
- return dati
-@}
-@c endfile
-@end group
-
-@c this is a hack to make testbits.awk self-contained
-@ignore
-@c file eg/prog/testbits.awk
-# bits2str --- turn a byte into readable 1's and 0's
-
-function bits2str(bits, data, mask)
-@{
- if (bits == 0)
- return "0"
-
- mask = 1
- for (; bits != 0; bits = rshift(bits, 1))
- data = (and(bits, mask) ? "1" : "0") data
-
- while ((length(data) % 8) != 0)
- data = "0" data
-
- return data
-@}
-@c endfile
-@end ignore
-@c file eg/prog/testbits.awk
-BEGIN @{
- printf "123 = %s\n", bits2str(123)
- printf "0123 = %s\n", bits2str(0123)
- printf "0x99 = %s\n", bits2str(0x99)
- comp = compl(0x99)
- printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
- shift = lshift(0x99, 2)
- printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
- shift = rshift(0x99, 2)
- printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
-@}
-@c endfile
-@end example
-
-@noindent
-Questo programma produce il seguente output quando viene eseguito:
-
-@example
-$ @kbd{gawk -f testbits.awk}
-@print{} 123 = 01111011
-@print{} 0123 = 01010011
-@print{} 0x99 = 10011001
-@print{} compl(0x99) = 0x3fffffffffff66 = 001111111111111111111111111111111
-@print{} 11111111111111101100110
-@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
-@print{} rshift(0x99, 2) = 0x26 = 00100110
-@end example
-
-@cindex conversione da stringhe a numeri
-@cindex stringhe, conversione
-@cindex numeri, conversione in stringhe
-@cindex conversione da numeri a stringhe
-@cindex numero visto come stringa di bit
-La funzione @code{bits2str()} trasforma un numero binario in una stringa.
-Inizializzando @code{maschera} a uno otteniamo
-un valore binario in cui il bit pi@`u a destra @`e impostato a
-uno. Usando questa maschera,
-la funzione continua a controllare il bit pi@`u a destra.
-l'operazione di AND tra la maschera e il valore indica se il
-bit pi@`u a destra @`e uno oppure no. Se questo @`e il caso, un @code{"1"}
-@`e concatenato all'inizio della stringa.
-Altrimenti, @`e concatenato uno @code{"0"}.
-Il valore @`e quindi spostato a destra di un bit e il ciclo continua
-finch@'e non ci sono pi@`u bit.
-
-Se il valore iniziale @`e zero, viene restituito semplicemente uno @code{"0"}.
-Altrimenti, alla fine, al valore ottenuto vengono aggiunti degli zeri a
-sinistra, per arrivare a stringhe
-di lunghezza multipla di 8, ossia contenenti un numero intero di byte.
-Questo @`e tipico dei computer moderni.
-
-Il codice principale nella regola @code{BEGIN} mostra la differenza tra
-i valori decimale e ottale dello stesso numero.
-(@pxref{Numeri non-decimali}),
-e poi mostra i risultati delle funzioni
-@code{compl()}, @code{lshift()} e @code{rshift()}.
-
-@cindex sidebar, Attenzione. Non @`e tutto oro quel che luccica!
-@ifdocbook
-@docbook
-<sidebar><title>Attenzione. Non @`e tutto oro quel che luccica!</title>
-@end docbook
-
-
-In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
-non su valori a virgola mobile. Come regola generale, tali operazioni
-funzionano meglio se eseguite su interi senza segno.
-
-@command{gawk} tenta di trattare gli argomenti delle funzioni
-"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
-provocano un errore fatale.
-
-In una normale operazione, per tutte queste funzioni, prima il valore a virgola
-mobile a doppia precisione viene convertito nel tipo intero senza segno di C
-pi@`u ampio, poi viene eseguita l'operazione "bit a bit". Se il risultato non
-pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
-vengono rimossi i bit iniziali diversi da zero uno alla volta finch@'e
-non sono rappresentati esattamente. Il risultato @`e poi nuovamente convertito
-in un tipo @code{double} di C.@footnote{Per essere pi@`u chiari,
-la conseguenza @`e che @command{gawk} pu@`o memorizzare solo un determinato
-intervallo di valori interi; i numeri al di fuori di questo intervallo vengono
-ridotti per rientrare all'interno dell'intervallo.}
-
-Comunque, quando si usa il calcolo con precisione arbitraria con l'opzione
-@option{-M} (@pxref{Calcolo con precisione arbitraria}), il risultato pu@`o
-essere diverso. Questo @`e particolarmente evidente con la funzione @code{compl()}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
-@print{} 9007199254740949
-$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
-@print{} -43
-@end example
-
-Quel che avviene diventa chiaro quando si stampano i risultati
-in notazione esadecimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0x1fffffffffffd5
-$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0xffffffffffffffd5
-@end example
-
-Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
-gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
-Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
-interi come regolari valori a virgola mobile con doppia precisione, che
-mantengono solo 53 bit di precisione. Inoltre, la libreria GNU MP tratta
-(o almeno sembra che tratti) il bit iniziale come un bit con segno; cos@`i il
-risultato con @option{-M} in questo caso @`e un numero negativo.
-
-In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
-tranne le pi@`u semplici, probabilmente @`e una cattiva idea; caveat emptor!
-
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Attenzione. Non @`e tutto oro quel che luccica!}
-
-
-
-In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
-non su valori a virgola mobile. Come regola generale, tali operazioni
-funzionano meglio se eseguite su interi senza segno.
-
-@command{gawk} tenta di trattare gli argomenti delle funzioni
-"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
-provocano un errore fatale.
-
-In una normale operazione, per tutte queste funzioni, prima il valore a virgola
-mobile a doppia precisione viene convertito nel tipo intero senza segno di C
-pi@`u ampio, poi viene eseguita l'operazione "bit a bit". Se il risultato non
-pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
-vengono rimossi i bit iniziali diversi da zero uno alla volta finch@'e
-non sono rappresentati esattamente. Il risultato @`e poi nuovamente convertito
-in un tipo @code{double} di C.@footnote{Per essere pi@`u chiari,
-la conseguenza @`e che @command{gawk} pu@`o memorizzare solo un determinato
-intervallo di valori interi; i numeri al di fuori di questo intervallo vengono
-ridotti per rientrare all'interno dell'intervallo.}
-
-Comunque, quando si usa il calcolo con precisione arbitraria con l'opzione
-@option{-M} (@pxref{Calcolo con precisione arbitraria}), il risultato pu@`o
-essere diverso. Questo @`e particolarmente evidente con la funzione @code{compl()}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
-@print{} 9007199254740949
-$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
-@print{} -43
-@end example
-
-Quel che avviene diventa chiaro quando si stampano i risultati
-in notazione esadecimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0x1fffffffffffd5
-$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0xffffffffffffffd5
-@end example
-
-Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
-gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
-Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
-interi come regolari valori a virgola mobile con doppia precisione, che
-mantengono solo 53 bit di precisione. Inoltre, la libreria GNU MP tratta
-(o almeno sembra che tratti) il bit iniziale come un bit con segno; cos@`i il
-risultato con @option{-M} in questo caso @`e un numero negativo.
-
-In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
-tranne le pi@`u semplici, probabilmente @`e una cattiva idea; caveat emptor!
-
-@end cartouche
-@end ifnotdocbook
-
-@node Funzioni per i tipi
-@subsection Funzioni per conoscere il tipo di una variabile
-
-@command{gawk} prevede due funzioni che permettono di conoscere
-il tipo di una variabile.
-Questo @`e necessario per scrivere del codice che visiti ogni elemento di un
-vettore di vettori
-(@pxref{Vettori di vettori}) e in altri contesti.
-
-@table @code
-@cindexgawkfunc{isarray}
-@cindex scalare o vettore
-@item isarray(@var{x})
-Restituisce il valore 'vero' se @var{x} @`e un vettore. Altrimenti, restituisce
-'falso'.
-
-@cindexgawkfunc{typeof}
-@cindex variabile, tipo di una
-@cindex tipo di una variabile
-@item typeof(@var{x})
-Restituisce una delle stringhe seguenti, a seconda del tipo di @var{x}:
-
-@c nested table
-@table @code
-@item "array"
-@var{x} @`e un vettore.
-
-@item "regexp"
-@var{x} @`e una @dfn{regexp} fortemente tipizzata
-(@pxref{Costanti @dfn{regexp} forti}).
-
-@item "number"
-@var{x} @`e un numero.
-
-@item "string"
-@var{x} @`e una stringa.
-
-@item "strnum"
-@var{x} @`e un numero che ha avuto origine da un input dell'utente,
-come un campo o il risultato di una chiamata a @code{split()}.
-(Cio@`e, @var{x} ha l'attributo @dfn{strnum};
-@pxref{Tipi di variabile}.)
-
-@item "unassigned"
-@var{x} @`e una variabile scalare a cui non @`e ancora stato assegnato un valore.
-Per esempio:
-
-@example
-BEGIN @{
- # crea a[1] ma non gli attribuisce alcun valore
- a[1]
- print typeof(a[1]) # unassigned
-@}
-@end example
-
-@item "untyped"
-@var{x} non @`e stata usata per nulla; pu@`o diventare uno scalare o un
-vettore.
-Per esempio:
-
-@example
-BEGIN @{
- print typeof(x) # x non @`e mai stato usato --> untyped
- mk_arr(x)
- print typeof(x) # x ora @`e un vettore --> array
-@}
-
-function mk_arr(a) @{ a[1] = 1 @}
-@end example
-
-@end table
-@end table
-
-@code{isarray()} torna utile in due occasioni. La prima @`e quando
-si visita un vettore multidimensionale: si pu@`o stabilire se un elemento @`e
-un vettore oppure no. La seconda @`e all'interno del corpo di una funzione
-definita dall'utente (argomento non ancora trattato;
-@pxref{Funzioni definite dall'utente}), per determinare se un parametro
-@`e un vettore oppure no.
-
-@quotation NOTA
-Usare @code{isarray()} a livello globale per controllare le variabili
-non ha alcun senso. Si suppone infatti che chi scrive il programma
-sappia se una variabile @`e un vettore oppure no. E in
-effetti, per come funziona @command{gawk}, se si passa una variabile
-che non sia stata usata in precedenza a @code{isarray()}, @command{gawk}
-la crea al volo, assegnandole il tipo scalare.
-@end quotation
-
-La funzione @code{typeof()} @`e generale; consente di determinare
-se una variabile o un parametro di funzione @`e uno scalare, un vettore,
-o una @dfn{regexp} fortemente tipizzata.
-
-L'uso di @code{isarray()} @`e deprecato; si dovrebbe usare @code{typeof()}
-al suo posto. Si dovrebbe sostituire ogni uso esistente di
-@samp{isarray(var)} nei programmi esistenti con
-@samp{typeof(var) == "array"}.
-
-@node Funzioni di internazionalizzazione
-@subsection Funzioni per tradurre stringhe
-@cindex @command{gawk}, funzioni di traduzione di stringhe
-@cindex funzioni di traduzione di stringhe
-@cindex traduzione di stringhe, funzioni di
-@cindex internazionalizzazione
-@cindex programmi @command{awk}, internazionalizzare
-
-@command{gawk} prevede strumenti per internazionalizzare i programmi
-@command{awk}.
-Questi sono costituiti dalle funzioni descritte nella lista seguente.
-Le descrizioni sono volutamente concise.
-@xref{Internazionalizzazione},
-per un'esposizione completa.
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@table @asis
-@cindexgawkfunc{bindtextdomain}
-@cindex impostare directory con catalogo messaggi tradotti
-@cindex messaggi tradotti, impostare directory con catalogo
-@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio}]@code{)}
-Imposta la directory in cui
-@command{gawk} trova i file di traduzione dei messaggi, nel caso in cui
-non siano o non possano essere messi nelle directory ``standard''
-(p.es., durante la fase di test di un programma).
-Restituisce la directory alla quale @var{dominio} @`e ``connesso.''
-
-Il default per @var{dominio} @`e il valore di @code{TEXTDOMAIN}.
-Se @var{directory} @`e la stringa nulla (@code{""}),
-@code{bindtextdomain()} restituisce la connessione corrente per il
-@var{dominio} dato.
-
-@cindexgawkfunc{dcgettext}
-@cindex traduzione di stringhe
-@item @code{dcgettext(@var{stringa}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
-Restituisce la traduzione di @var{stringa} nel
-dominio linguistico @var{dominio} per la categoria di localizzazione
-@var{categoria}.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-@cindexgawkfunc{dcngettext}
-@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
-Restituisce la forma plurale usata per @var{numero} nella
-traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
-@var{dominio} per la categoria di localizzazione @var{categoria}.
-@var{stringa1} @`e la variante al singolare in inglese di un messaggio e
-@var{stringa2} @`e la variante al plurare in inglese dello stesso messaggio.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-@end table
-
-@node Funzioni definite dall'utente
-@section Funzioni definite dall'utente
-
-@cindex funzioni definite dall'utente
-@cindex utente, funzioni definite dall'
-Programmi @command{awk} complessi spesso possono essere semplificati
-definendo delle apposite funzioni personali.
-Le funzioni definite dall'utente sono richiamate allo stesso modo di quelle
-predefinite
-(@pxref{Chiamate di funzione}),
-ma dipende dall'utente la loro definizione
-(cio@`e, dire ad @command{awk} cosa dovrebbero fare queste funzioni).
-
-@menu
-* Sintassi delle definizioni:: Come scrivere definizioni e cosa
- significano.
-* Esempio di funzione:: Un esempio di definizione di
- funzione e spiegazione della stessa.
-* Precisazioni sulle funzioni:: Cose a cui prestare attenzione.
-* Istruzione return:: Specificare il valore che una
- funzione restituisce.
-* Variabili di tipo dinamico:: Come cambiare tipo a una variabile in
- fase di esecuzione del programma.
-@end menu
-
-@node Sintassi delle definizioni
-@subsection Come scrivere definizioni e cosa significano
-
-@quotation
-@i{Risponde al vero affermare che la sintassi di awk per la definizione
-di variabili locali @`e semplicemente atroce.}
-@author Brian Kernighan
-@end quotation
-
-@cindex funzioni, definizione di
-@cindex definizione di funzioni
-Definizioni di funzioni possono stare in una posizione qualsiasi tra le regole
-di un programma @command{awk}. Quindi, la forma generale di un
-programma @command{awk} @`e estesa per
-permettere l'inclusione di regole @emph{e} la definizione di funzioni
-create dall'utente.
-Non @`e necessario che la definizione di una funzione sia posta prima
-del richiamo della stessa. Questo dipende dal fatto che @command{awk}
-legge l'intero programma, prima di iniziare ad eseguirlo.
-
-La definizione di una funzione chiamata @var{nome} @`e simile a questa:
-
-@display
-@code{function} @var{nome}@code{(}[@var{lista-parametri}]@code{)}
-@code{@{}
- @var{corpo-della-funzione}
-@code{@}}
-@end display
-
-@cindex nomi di funzione
-@cindex funzioni, nomi di
-@cindex limitazioni nei nomi di funzione
-@cindex nomi di funzione, limitazioni nei
-@noindent
-Qui, @var{nome} @`e il nome della funzione da definire. Un nome di funzione
-valido @`e come un nome di variabile valido: una sequenza di
-lettere, cifre e trattini bassi che non inizia con una cifra.
-Anche qui, solo le 52 lettere inglesi maiuscole e minuscole possono
-essere usate in un nome di funzione.
-All'interno di un singolo programma @command{awk}, un dato nome pu@`o essere
-usato una sola volta: per una variabile, o per un vettore,
-o per una funzione.
-
-@var{lista-parametri} @`e una lista opzionale degli argomenti della funzione
-e dei nomi delle variabili locali,
-separati da virgole. Quando la funzione viene chiamata,
-i nomi degli argomenti sono usati per contenere il valore degli argomenti
-passati con la chiamata.
-
-Una funzione non pu@`o avere due parametri con lo stesso nome, e neanche un
-parametro con lo stesso nome della funzione stessa.
-
-@quotation ATTENZIONE
-Secondo lo standard POSIX, i parametri di funzione
-non possono avere lo stesso nome di una delle speciali variabili predefinite
-(@pxref{Variabili predefinite}), e un parametro di funzione non pu@`o avere
-lo stesso nome di un'altra funzione.
-Non tutte le versioni di @command{awk} applicano queste limitazioni.
-@command{gawk} applica solo la prima di queste restrizioni.
-Se viene specificata l'opzione @option{--posix} (@pxref{Opzioni}),
-anche la seconda restrizione viene applicata.
-@end quotation
-
-Le variabili locali si comportano come la stringa vuota
-se vengono utilizzate dove @`e richiesto il valore di una stringa,
-e valgono zero se utilizzate dove @`e richiesto un valore numerico.
-Questo @`e lo stesso comportamento delle variabili regolari a cui non sia
-stato ancora assegnato un valore. (Ci sono ulteriori informazioni riguardo
-alle variabili locali;
-@pxref{Variabili di tipo dinamico}.)
-
-Il @var{corpo-della-funzione} @`e composto da istruzioni @command{awk}.
-Questa @`e la parte pi@`u importante della definizione, perch@'e dice quello che
-la funzione dovrebbe realmente
-@emph{fare}. I nomi di argomento esistono per consentire al corpo della
-funzione di gestire gli argomenti;
-le variabili locali esistono per consentire al corpo della funzione di
-memorizzare dei valori temporanei.
-
-I nomi di argomento non sono sintatticamente distinti da quelli delle
-variabili locali. Invece, il numero di argomenti forniti quando la
-funzione viene chiamata determina quanti degli argomenti passati sono delle
-variabili. Quindi, se tre valori di argomento sono specificati, i primi
-tre nomi in @var{lista-parametri}
-sono degli argomenti e i rimanenti sono delle variabili locali.
-
-Ne consegue che se il numero di argomenti richiesto non @`e lo stesso in
-tutte le chiamate alla funzione, alcuni dei nomi in @var{lista-parametri}
-possono essere in alcuni casi degli argomenti e in altri casi
-delle variabili locali. Un'altra angolatura da cui guardare questo fatto
-@`e che gli argomenti omessi assumono come valore di default la stringa nulla.
-
-@cindex convenzioni di programmazione, nella scrittura di funzioni
-@cindex funzioni, convenzioni di programmazione, nella scrittura di
-Solitamente, quando si scrive una funzione, si sa quanti nomi si intendono
-usare per gli argomenti e quanti si vogliono usare come variabili locali.
-@`E una convenzione in uso quella di aggiungere alcuni spazi extra tra gli
-argomenti e le variabili locali, per documentare come va utilizzata quella
-funzione.
-
-@cindex variabili nascoste
-@cindex nascondere valori di variabile
-Durante l'esecuzione del corpo della funzione, gli argomenti e i valori
-delle variabili locali
-nascondono, o @dfn{oscurano}, qualsiasi variabile dello stesso nome usata
-nel resto del programma. Le variabili oscurate non sono accessibili
-nel corpo della funzione, perch@'e non c'@`e modo di accedere a esse
-mentre i loro nomi sono stati "occupati" dagli argomenti e dalla variabili
-locali. Tutte le altre variabili usate nel programma @command{awk}
-possono essere accedute o impostate normalmente nel corpo della funzione.
-
-Gli argomenti e le variabili locali esistono solo finch@'e il corpo della
-funzione @`e in esecuzione. Una volta che l'esecuzione @`e terminata,
-ritornano accessibili le variabili che erano oscurate
-durante l'esecuzione della funzione.
-
-@cindex ricorsive, funzioni
-@cindex funzioni ricorsive
-Il corpo della funzione pu@`o contenere espressioni che chiamano altre
-funzioni. Tali espressioni possono perfino chiamare direttamente, o
-indirettamente tramite un'altra funzione, la funzione stessa.
-Quando questo succede, la funzione @`e detta @dfn{ricorsiva}.
-Il fatto che una funzione richiami se stessa @`e detto @dfn{ricorsione}.
-
-Tutte le funzioni predefinite restituiscono un valore al loro chiamante.
-Anche le funzioni definite dall'utente possono farlo, usando
-l'istruzione @code{return},
-che @`e descritta in dettaglio nella @ref{Istruzione return}.
-Molti dei successivi esempi in questa @value{SECTION} usano
-l'istruzione @code{return}.
-
-@cindex estensioni comuni, parola chiave @code{func}
-@c @cindex @command{awk} language, POSIX version
-@c @cindex POSIX @command{awk}
-@cindex POSIX @command{awk}, parola chiave @code{function} in
-In molte implementazioni di @command{awk}, compreso @command{gawk},
-la parola chiave @code{function} pu@`o essere
-abbreviata come @code{func}. @value{COMMONEXT}
-Tuttavia, POSIX specifica solo l'uso della parola chiave
-@code{function}. Questo ha alcune implicazioni di carattere pratico.
-Se @command{gawk} @`e in modalit@`a POSIX-compatibile
-(@pxref{Opzioni}), la seguente
-istruzione @emph{non} definisce una funzione:
-
-@example
-func foo() @{ a = sqrt($1) ; print a @}
-@end example
-
-@noindent
-Invece, definisce una regola che, per ogni record, concatena il valore
-della variabile @samp{func} con il valore restituito dalla funzione @samp{foo}.
-Se la stringa risultante @`e diversa dalla stringa nulla, l'azione viene eseguita.
-Questo non @`e con ogni probabilit@`a quello che si desidera.
-(@command{awk} accetta questo input come
-sintatticamente valido, perch@'e le funzioni, nei programmi @command{awk}
-possono essere usate prima che siano state definite.@footnote{Questo
-programma in realt@`a non verr@`a eseguito, perch@'e @code{foo()} risulter@`a
-essere una funzione non definita.})
-
-@cindex portabilit@`a, nella definizione di funzioni
-Per essere certi che un programma @command{awk} sia portabile,
-va sempre usata la parola chiave
-@code{function} per definire una funzione.
-
-@node Esempio di funzione
-@subsection Un esempio di definizione di funzione
-@cindex esempio di definizione di funzione
-@cindex funzione, esempio di definizione di
-
-
-Ecco un esempio di funzione definita dall'utente, di nome
-@code{stampa_num()}, che
-ha come input un numero e lo stampa in un formato specifico:
-
-@example
-function stampa_num(numero)
-@{
- printf "%6.3g\n", numero
-@}
-@end example
-
-@noindent
-Per comprenderne il funzionamento, ecco una regola @command{awk} che usa
-la funzione @code{stampa_num()}:
-
-@example
-$3 > 0 @{ stampa_num($3) @}
-@end example
-
-@noindent
-Questo programma stampa, nel nostro formato speciale, tutti i terzi campi
-nei record in input che
-contengono un numero positivo. Quindi, dato il seguente input:
-
-@example
- 1.2 3.4 5.6 7.8
- 9.10 11.12 -13.14 15.16
-17.18 19.20 21.22 23.24
-@end example
-
-@noindent
-questo programma, usando la nostra funzione per formattare i risultati, stampa:
-
-@example
- 5.6
- 21.2
-@end example
-
-La funzione seguente cancella tutti gli elementi in un vettore
-(si ricordi che gli spazi bianchi in soprannumero stanno a indicare
-l'inizio della lista delle variabili locali):
-
-@example
-function cancella_vettore(a, i)
-@{
- for (i in a)
- delete a[i]
-@}
-@end example
-
-Quando si lavora con vettori, @`e spesso necessario cancellare
-tutti gli elementi in un vettore e ripartire con una nuova lista di elementi
-(@pxref{Cancellazione}).
-Invece di dover ripetere
-questo ciclo ogni volta che si deve cancellare
-un vettore, un programma pu@`o limitarsi a effettuare una chiamata
-a @code{cancella_vettore()}.
-(Questo garantisce la portabilit@`a. L'uso di @samp{delete @var{vettore}}
-per cancellare
-il contenuto di un intero vettore @`e un'aggiunta relativamente
-recente@footnote{Verso la fine del 2012.}
-allo standard POSIX.)
-
-Quello che segue @`e un esempio di una funzione ricorsiva. Prende come
-parametro di input una stringa e restituisce la stringa in ordine inverso.
-Le funzioni ricorsive devono sempre avere un test che interrompa la
-ricorsione.
-In questo caso, la ricorsione termina quando la stringa in input @`e
-gi@`a vuota:
-
-@c 8/2014: Thanks to Mike Brennan for the improved formulation
-@cindex @code{rev()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{rev()}
-@example
-function rev(stringa)
-@{
- if (stringa == "")
- return ""
-
- return (rev(substr(stringa, 2)) substr(stringa, 1, 1))
-@}
-@end example
-
-Se questa funzione @`e in un file di nome @file{rev.awk}, si pu@`o provare
-cos@`{@dotless{i}}:
-
-@example
-$ @kbd{echo "Non v'allarmate!" |}
-> @kbd{gawk -e '@{ print rev($0) @}' -f rev.awk}
-@print{} !etamralla'v noN
-@end example
-
-La funzione C @code{ctime()} prende una marcatura temporale e la restituisce
-come una stringa,
-formattata come gi@`a sappiamo.
-Il seguente esempio usa la funzione predefinita @code{strftime()}
-(@pxref{Funzioni di tempo})
-per creare una versione @command{awk} di @code{ctime()}:
-
-@cindex @code{ctime()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{ctime()}
-@example
-@c file eg/lib/ctime.awk
-# ctime.awk
-#
-# versione awk della funzione C ctime(3)
-
-function ctime(ts, format)
-@{
- format = "%a %e %b %Y, %H.%M.%S, %Z"
-
- if (ts == 0)
- ts = systime() # usare data e ora correnti per default
- return strftime(format, ts)
-@}
-@c endfile
-@end example
-
-Si potrebbe pensare che la funzione @code{ctime()} possa usare
-@code{PROCINFO["strftime"]}
-come stringa di formato. Sarebbe un errore, perch@'e si suppone che
-@code{ctime()} restituisca data e ora formattati in maniera standard,
-e qualche codice a livello utente potrebbe aver modificato in precedenza
-@code{PROCINFO["strftime"]}.
-
-@node Precisazioni sulle funzioni
-@subsection Chiamare funzioni definite dall'utente
-
-@cindex funzioni definite dall'utente, chiamare
-@cindex chiamare funzioni definite dall'utente
-@dfn{Chiamare una funzione} significa richiedere l'esecuzione di una
-funzione, la quale svolge il compito per cui @`e stata scritta.
-La chiamata di una funzione @`e un'espressione e il suo valore @`e quello
-restituito dalla funzione.
-
-@menu
-* Chiamare una funzione:: Non usare spazi.
-* Campo di validit@`a variabili:: Variabili locali e globali.
-* Parametri per valore/riferimento:: Passaggio parametri.
-@end menu
-
-@node Chiamare una funzione
-@subsubsection Scrivere una chiamata di funzione
-
-Una chiamata di funzione consiste nel nome della funzione seguito dagli
-argomenti racchiusi tra parentesi. Gli argomenti specificati nella chiamata
-sono costituiti da espressioni @command{awk}. Ogni volta che si esegue una
-chiamata queste espressioni vengono ricalcolate, e i loro valori diventano gli
-argomenti passati alla funzione. Per esempio, ecco una chiamata a
-@code{pippo()} con tre argomenti (il primo dei quali @`e una concatenazione di
-stringhe):
-
-@example
-pippo(x y, "perdere", 4 * z)
-@end example
-
-@quotation ATTENZIONE
-Caratteri bianchi (spazi e TAB) non sono permessi tra il nome della funzione e
-la parentesi aperta che apre la lista degli argomenti. Se per errore si
-lasciano dei caratteri bianchi, @command{awk} li interpreterebbe come se
-s'intendesse concatenare una variabile con un'espressione tra parentesi.
-Tuttavia, poich@'e si @`e usato un nome di funzione e non un nome di variabile,
-verrebbe emesso un messaggio di errore.
-@end quotation
-
-@node Campo di validit@`a variabili
-@subsubsection Variabili locali e globali.
-
-@cindex variabili locali, in una funzione
-@cindex locali, variabili, per una funzione
-Diversamente da molti altri linguaggi, non c'@`e modo di
-rendere locale una variabile in un blocco @code{@{} @dots{} @code{@}} di
-@command{awk}, ma si pu@`o rendere locale una variabile di una funzione. @`E
-buona norma farlo quando una variabile serve solo all'interno di quella
-particolare funzione.
-
-Per rendere locale una variabile per una funzione, basta dichiarare la
-variabile come argomento della funzione dopo gli argomenti richiesti dalla
-funzione (@pxref{Sintassi delle definizioni}). Si consideri il seguente
-esempio, dove la variabile @code{i} @`e una variabile globale usata sia dalla
-funzione @code{pippo()} che dalla funzione @code{pluto()}:
-
-@example
-function pluto()
-@{
- for (i = 0; i < 3; i++)
- print "in pluto i=" i
-@}
-
-function pippo(j)
-@{
- i = j + 1
- print "in pippo i=" i
- pluto()
- print "in pippo i=" i
-@}
-
-BEGIN @{
- i = 10
- print "in BEGIN i=" i
- pippo(0)
- print "in BEGIN i=" i
-@}
-@end example
-
-L'esecuzione di questo script produce quanto segue, perch@'e la stessa
-variabile @code{i} @`e usata sia nelle
-funzioni @code{pippo()} e @code{pluto()} sia a livello della
-regola @code{BEGIN}:
-
-@example
-in BEGIN i=10
-in pippo i=1
-in pluto i=0
-in pluto i=1
-in pluto i=2
-in pippo i=3
-in BEGIN i=3
-@end example
-
-Se si vuole che @code{i} sia una variabile locale sia per
-@code{pippo()} che per @code{pluto()}, occorre procedere in questo modo
-(gli spazi extra prima della @code{i} sono una convenzione di codifica
-che serve a ricordare che @code{i} @`e una variabile locale, non
-un argomento):
-
-@example
-function pluto( i)
-@{
- for (i = 0; i < 3; i++)
- print "in pluto i=" i
-@}
-
-function pippo(j, i)
-@{
- i = j + 1
- print "in pippo i=" i
- pluto()
- print "in pippo i=" i
-@}
-
-BEGIN @{
- i = 10
- print "in BEGIN i=" i
- pippo(0)
- print "in BEGIN i=" i
-@}
-@end example
-
-L'esecuzione della versione corretta dello script produce il seguente
-output:
-
-@example
-in BEGIN i=10
-in pippo i=1
-in pluto i=0
-in pluto i=1
-in pluto i=2
-in pippo i=1
-in BEGIN i=10
-@end example
-
-Oltre a valori scalari (stringhe e numeri), si possono usare anche
-vettori locali. Usando come parametro il nome di un vettore, @command{awk}
-lo considera come tale, e lo tratta come locale alla funzione.
-Inoltre, chiamate ricorsive creano nuovi vettori.
-Si consideri questo esempio:
-
-@example
-function qualche_funz(p1, a)
-@{
- if (p1++ > 3)
- return
-
- a[p1] = p1
-
- qualche_funz(p1)
-
- printf("Al livello %d, indice %d %s trova in a\n",
- p1, (p1 - 1), (p1 - 1) in a ? "si" : "non si")
- printf("Al livello %d, indice %d %s trova in a\n",
- p1, p1, p1 in a ? "si" : "non si")
- print ""
-@}
-
-BEGIN @{
- qualche_funz(1)
-@}
-@end example
-
-Quando viene eseguito, questo programma produce il seguente output:
-
-@example
-Al livello 4, indice 3 non si trova in a
-Al livello 4, indice 4 si trova in a
-
-Al livello 3, indice 2 non si trova in a
-Al livello 3, indice 3 si trova in a
-
-Al livello 2, indice 1 non si trova in a
-Al livello 2, indice 2 si trova in a
-@end example
-
-@node Parametri per valore/riferimento
-@subsubsection Passare parametri di funzione per valore o per riferimento
-
-In @command{awk}, quando si definisce una funzione, non c'@`e modo di
-dichiarare esplicitamente se gli argomenti sono passati @dfn{per valore}
-o @dfn{per riferimento}.
-
-Invece, il modo con cui i parametri sono passati @`e determinato
-durante l'esecuzione del programma,
-quando la funzione @`e chiamata, nel rispetto della regola seguente:
-se l'argomento @`e una variabile di tipo vettoriale, questa @`e passata
-per riferimento. Altrimenti, l'argomento @`e passato per valore.
-
-@cindex chiamare per valore
-Passare un argomento per valore significa che quando una funzione @`e chiamata,
-le viene fornita una @emph{copia} del valore di quell'argomento. Il chiamante
-pu@`o usare una variabile il cui valore calcolato viene passato come argomento, ma la
-funzione chiamata non la riconosce come variabile; riconosce solo il valore
-assunto dall'argomento. Per esempio, scrivendo il seguente codice:
-
-@example
-pippo = "pluto"
-z = mia_funzione(pippo)
-@end example
-
-@noindent
-non si deve pensare che l'argomento passato a @code{mia_funzione()} sia ``la
-variabile @code{pippo}.'' Invece, @`e corretto considerare l'argomento come la
-stringa il cui valore @`e @code{"pluto"}.
-Se la funzione @code{mia_funzione()} altera i valori delle sue variabili
-locali, ci@`o non influisce su nessun'altra variabile. Quindi, se
-@code{mia_funzione()} fa questo:
-
-@example
-function mia_funzione(stringa)
-@{
- print stringa
- stringa = "zzz"
- print stringa
-@}
-@end example
-
-@noindent
-cambiando cos@`{@dotless{i}} il valore della variabile che @`e il suo primo argomento, ossia
-@code{stringa}, il valore di @code{pippo} per il chiamante @emph{non} viene
-modificato. Il ruolo svolto da @code{pippo} nella chiamata di
-@code{mia_funzione()} termina quando il suo valore (@code{"pluto"}) viene
-calcolato. Se la variabile @code{stringa} esiste anche al di fuori di
-@code{mia_funzione()}, il corpo della funzione non pu@`o modificare questo valore
-esterno, perch@'e esso rimane oscurato durante l'esecuzione di
-@code{mia_funzione()} e non pu@`o quindi essere visto o modificato.
-
-@cindex chiamare per riferimento
-@cindex vettori, come parametri di funzione
-@cindex funzioni, vettori come parametri di
-Tuttavia, quando sono dei vettori a fungere da parametri alle funzioni, questi
-@emph{non} vengono copiati. Invece, il vettore stesso @`e reso disponibile per
-essere manipolato direttamente dalla funzione. Questo @`e quel che si dice
-solitamente una @dfn{chiamata per riferimento}. Le modifiche effettuate su un
-vettore passato come parametro all'interno del corpo di una funzione
-@emph{sono} visibili all'esterno della funzione.
-
-@quotation NOTA
-Modificare un vettore passato come parametro all'interno di una funzione
-pu@`o essere molto pericoloso se non si sta attenti a quel che si sta facendo.
-Per esempio:
-
-@example
-function cambialo(vettore, ind, nvalore)
-@{
- vettore[ind] = nvalore
-@}
-
-BEGIN @{
- a[1] = 1; a[2] = 2; a[3] = 3
- cambialo(a, 2, "due")
- printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
- a[1], a[2], a[3]
-@}
-@end example
-
-@noindent
-stampa @samp{a[1] = 1, a[2] = due, a[3] = 3}, perch@'e
-@code{cambialo()} memorizza @code{"due"} nel secondo elemento di @code{a}.
-@end quotation
-
-@cindex indefinite, funzioni
-@cindex funzioni indefinite
-Alcune implementazioni di @command{awk} consentono di chiamare una
-funzione che non @`e stata definita.
-Viene solo emesso un messaggio che descrive il problema al momento
-dell'esecuzione, se il programma tenta di chiamare quella funzione.
-Per esempio:
-
-@example
-BEGIN @{
- if (0)
- pippo()
- else
- pluto()
-@}
-function pluto() @{ @dots{} @}
-# si noti che `pippo' non @`e definito
-@end example
-
-@noindent
-Poich@'e la condizione dell'istruzione @samp{if} non risulter@`a mai verificata
-in questo caso,
-non @`e un problema reale il fatto che
-che @code{pippo()} non sia stato definito. Solitamente, tuttavia,
-@`e un problema se un programma chiama una funzione indefinita.
-
-@cindex @dfn{lint}, controlli, funzione indefinita
-@cindex controlli @dfn{lint} per funzione indefinita
-@cindex funzione indefinita, controlli @dfn{lint} per
-
-Se si specifica l'opzione @option{--lint}
-(@pxref{Opzioni}),
-@command{gawk} elenca le chiamate a funzioni indefinite.
-
-@cindex portabilit@`a, istruzione @code{next} in funzioni definite dall'utente
-@cindex @code{next}, istruzione, in funzioni definite dall'utente
-Alcune implementazione di @command{awk} emettono un messaggio di errore
-se si usa l'istruzione @code{next}
-o @code{nextfile}
-(@pxref{Istruzione next}, e
-@ifdocbook
-@ref{Istruzione nextfile})
-@end ifdocbook
-@ifnotdocbook
-@pxref{Istruzione nextfile})
-@end ifnotdocbook
-all'interno di una funzione definita dall'utente.
-@command{gawk} non ha questa limitazione.
-
-@node Istruzione return
-@subsection L'istruzione @code{return}
-@cindex @code{return}, istruzione@comma{} in funzioni definite dall'utente
-@cindex istruzione @code{return}@comma{} in funzioni definite dall'utente
-
-Come visto in parecchi esempi precedenti,
-il corpo di una funzione definita dall'utente pu@`o contenere un'istruzione
-@code{return}.
-Quest'istruzione restituisce il controllo a quella parte del
-del programma @command{awk} che ha effettuato la chiamata.
-Pu@`o anche essere usata per restituire un valore da usare nel resto del
-programma @command{awk}.
-Questo @`e un esempio:
-
-@display
-@code{return} [@var{espressione}]
-@end display
-
-La parte @var{espressione} @`e facoltativa.
-Probabilmente per una svista, POSIX non definisce qual @`e il valore
-restituito, se si omette @var{espressione}. Tecnicamente parlando, questo
-rende il valore restituito indefinito, e quindi, indeterminato.
-In pratica, tuttavia, tutte le versioni di @command{awk} restituiscono
-semplicemente la stringa nulla, che vale zero se usata
-in un contesto che richiede un numero.
-
-Un'istruzione @code{return} senza una @var{espressione} @`e considerata presente
-alla fine di ogni definizione di funzione.
-Quindi, se il flusso di esecuzione raggiunge la fine del corpo della
-funzione, tecnicamente la funzione
-restituisce un valore indeterminato.
-In pratica, restituisce la stringa nulla. @command{awk}
-@emph{non} emette alcun messaggio di avvertimento se si usa
-il valore restituito di una tale funzione.
-
-Talvolta pu@`o capitare di scrivere una funzione per quello che fa, non per
-quello che restituisce. Una tale funzione corrisponde a una funzione
-@code{void} in C, C++, o Java, o a una @code{procedure} in Ada.
-Quindi, pu@`o essere corretto non
-restituire alcun valore; basta fare attenzione a non usare poi il
-valore restituito da una tale funzione.
-
-Quello che segue @`e un esempio di una funzione definita dall'utente
-che restituisce un valore che @`e
-il numero pi@`u alto presente tra gli elementi di un vettore:
-
-@example
-function massimo(vettore, i, max)
-@{
- for (i in vettore) @{
- if (max == "" || vettore[i] > max)
- max = vettore[i]
- @}
- return max
-@}
-@end example
-
-@cindex programmazione, convenzioni di, parametri di funzione
-@cindex convenzioni di programmazione, parametri di funzione
-@noindent
-La chiamata a @code{massimo()} ha un solo argomento, che @`e il nome di
-un vettore. Le variabili locali @code{i} e @code{max} non vanno intese
-come argomenti; nulla vieta di passare pi@`u di un argomento
-a @code{massimo()} ma i risultati sarebbero strani. Gli spazi extra prima
-di @code{i} nella lista dei parametri della funzione indicano che @code{i} e
-@code{max} sono variabili locali.
-@`E consigliabile seguire questa convenzione quando si definiscono delle funzioni.
-
-Il programma seguente usa la funzione @code{massimo()}. Carica un vettore,
-richiama @code{massimo()}, e quindi elenca il numero massimo contenuto in
-quel vettore:
-
-@example
-function massimo(vettore, i, max)
-@{
- for (i in vettore) @{
- if (max == "" || vettore[i] > max)
- max = vettore[i]
- @}
- return max
-@}
-
-# Carica tutti i campi di ogni record in numeri.
-@{
- for (i = 1; i <= NF; i++)
- numeri[NR, i] = $i
-@}
-
-END @{
- print massimo(numeri)
-@}
-@end example
-
-Dato il seguente input:
-
-@example
- 1 5 23 8 16
-44 3 5 2 8 26
-256 291 1396 2962 100
--6 467 998 1101
-99385 11 0 225
-@end example
-
-@noindent
-il programma trova (come si pu@`o immaginare) che 99.385 @`e il
-valore pi@`u alto contenuto nel vettore.
-
-@node Variabili di tipo dinamico
-@subsection Funzioni e loro effetti sul tipo di una variabile
-
-@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,
-prima dell'effettiva esecuzione di un programma.
-Ecco un esempio di programma commentato:
-
-@example
-function pippo(a)
-@{
- a[1] = 1 # il parametro @`e un vettore
-@}
-
-BEGIN @{
- b = 1
- pippo(b) # non valido: errore fatale, tipi variabile in conflitto
-
- pippo(x) # x non inizializzato, diventa un vettore dinamicamente
- x = 1 # a questo punto, non permesso: errore in esecuzione
-@}
-@end example
-
-In questo esempio, la prima chiamata a @code{pippo()} genera
-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.
-
-@node Chiamate indirette
-@section Chiamate indirette di funzione
-
-@cindex indiretta, chiamata di funzione
-@cindex chiamata indiretta di funzione
-@cindex funzione, puntatori a
-@cindex puntatori a funzioni
-@cindex differenze tra @command{awk} e @command{gawk}, chiamata indiretta di funzione
-
-Questa sezione descrive un'estensione avanzata, specifica di @command{gawk}.
-
-Spesso pu@`o essere utile ritardare la scelta della funzione da chiamare
-fino al momento in cui il programma viene eseguito.
-Per esempio, potrebbero esserci diversi tipi di record in input, ciascuno
-dei quali dovrebbe essere elaborato in maniera differente.
-
-Solitamente, si userebbe una serie di istruzioni @code{if}-@code{else}
-per decidere quale funzione chiamare. Usando la chiamata @dfn{indiretta}
-a una funzione, si pu@`o assegnare il nome della funzione da chiamare a
-una variabile di tipo stringa, e usarla per chiamare la funzione.
-Vediamo un esempio.
-
-Si supponga di avere un file con i punteggi ottenuti negli esami per i
-corsi che si stanno seguendo, e che si desideri ottenere la somma e la
-media dei punteggi ottenuti.
-Il primo campo @`e il nome del corso. I campi seguenti sono i nomi delle
-funzioni da chiamare per elaborare i dati, fino a un campo ``separatore''
-@samp{dati:}. Dopo il separatore, fino alla fine del record,
-ci sono i vari risultati numerici di ogni test.
-
-Ecco il file iniziale:
-
-@example
-@c file eg/data/class_data1
-Biologia_101 somma media dati: 87.0 92.4 78.5 94.9
-Chimica_305 somma media dati: 75.2 98.3 94.7 88.2
-Inglese_401 somma media dati: 100.0 95.6 87.1 93.4
-@c endfile
-@end example
-
-Per elaborare i dati, si potrebbe iniziare a scrivere:
-
-@example
-@{
- corso = $1
- for (i = 2; $i != "dati:"; i++) @{
- if ($i == "somma")
- somma() # elabora l'intero record
- else if ($i == "media")
- media()
- @dots{} # e cos@`{@dotless{i}} via
- @}
-@}
-@end example
-
-@noindent
-Questo stile di programmazione funziona, ma pu@`o essere scomodo.
-Con la chiamata @dfn{indiretta} di funzione, si pu@`o richiedere a @command{gawk}
-di usare il @emph{valore} di una variabile come @emph{nome} della funzione da
-chiamare.
-
-@cindex @code{@@}, notazione per la chiamata indiretta di funzioni
-@cindex chiamata indiretta di funzioni, notazione @code{@@}
-La sintassi @`e simile a quella di una normale chiamata di funzione:
-un identificativo, seguito immediatamente da una parentesi aperta,
-qualche argomento, e una parentesi chiusa, con l'aggiunta di un carattere
-@samp{@@} all'inizio:
-
-@example
-quale_funzione = "somma"
-risultato = @@quale_funzione() # chiamata della funzione somma()
-@end example
-
-Ecco un intero programma che elabora i dati mostrati sopra,
-usando la chiamata indiretta di funzioni:
-
-@example
-@c file eg/prog/indirectcall.awk
-# chiamataindiretta.awk --- esempio di chiamata indiretta di funzioni
-@c endfile
-@ignore
-@c file eg/prog/indirectcall.awk
-#
-# Arnold Robbins, arnold@skeeve.com, Public Domain
-# January 2009
-@c endfile
-@end ignore
-
-@c file eg/prog/indirectcall.awk
-# media --- calcola la media dei valori dei campi $primo - $ultimo
-
-function media(primo, ultimo, somma, i)
-@{
- somma = 0;
- for (i = primo; i <= ultimo; i++)
- somma += $i
-
- return somma / (ultimo - primo + 1)
-@}
-
-# somma --- restituisce la somma dei valori dei campi $primo - $ultimo
-
-function somma(primo, ultimo, totale, i)
-@{
- max = 0;
- for (i = primo; i <= ultimo; i++)
- totale += $i
-
- return totale
-@}
-@c endfile
-@end example
-
-Queste due funzioni presuppongono che si lavori con dei campi; quindi,
-i parametri @code{primo} e @code{ultimo} indicano da quale campo iniziare
-e fino a quale arrivare.
-Per il resto, eseguono i calcoli richiesti, che sono i soliti:
-
-@example
-@c file eg/prog/indirectcall.awk
-# Per ogni record,
-# stampa il nome del corso e le statistiche richieste
-@{
- nome_corso = $1
- gsub(/_/, " ", nome_corso) # Rimpiazza _ con spazi
-
- # trova campo da cui iniziare
- for (i = 1; i <= NF; i++) @{
- if ($i == "dati:") @{
- inizio = i + 1
- break
- @}
- @}
-
- printf("%s:\n", nome_corso)
- for (i = 2; $i != "dati:"; i++) @{
- quale_funzione = $i
- printf("\t%s: <%s>\n", $i, @@quale_funzione(inizio, NF) "")
- @}
- print ""
-@}
-@c endfile
-@end example
-
-Questo @`e il ciclo principale eseguito per ogni record.
-Stampa il nome del corso (con le
-lineette basse sostituite da spazi). Trova poi l'inizio dei dati veri
-e propri, salvandolo in @code{inizio}.
-L'ultima parte del codice esegue un ciclo per ogni nome di funzione
-(da @code{$2} fino al separatore, @samp{dati:}), chiamando la funzione
-il cui nome @`e specificato nel campo. La chiamata di funzione indiretta
-compare come parametro nella chiamata a @code{printf}.
-(La stringa di formattazione di @code{printf} usa @samp{%s} come
-specificatore di formato, affinch@'e sia possibile usare funzioni
-che restituiscano sia stringhe che numeri. Si noti che il risultato
-della chiamata indiretta @`e concatenato con la stringa nulla, in modo da
-farlo considerare un valore di tipo stringa).
-
-Ecco il risultato dell'esecuzione del programma:
-
-@example
-$ @kbd{gawk -f chiamataindiretta.awk dati_dei_corsi}
-@print{} Biologia 101:
-@print{} somma: <352.8>
-@print{} media: <88.2>
-@print{}
-@print{} Chimica 305:
-@print{} somma: <356.4>
-@print{} media: <89.1>
-@print{}
-@print{} Inglese 401:
-@print{} somma: <376.1>
-@print{} media: <94.025>
-@end example
-
-La possibilit@`a di usare la chiamata indiretta di funzioni @`e pi@`u potente
-di quel che si possa pensare inizialmente.
-I linguaggi C e C++ forniscono ``puntatori di funzione'' che
-sono un metodo per chiamare una funzione scelta al momento dell'esecuzione.
-Uno dei pi@`u noti usi di questa funzionalit@`a @`e
-la funzione C @code{qsort()}, che ordina un vettore usando il famoso
-algoritmo noto come ``quicksort''
-(si veda @uref{http://en.wikipedia.org/wiki/Quicksort, l'articolo di Wikipedia}
-per ulteriori informazioni). Per usare questa funzione, si specifica un
-puntatore a una funzione di confronto. Questo meccanismo consente
-di ordinare dei dati arbitrari in una maniera arbitraria.
-
-Si pu@`o fare qualcosa di simile usando @command{gawk}, cos@`{@dotless{i}}:
-
-@example
-@c file eg/lib/quicksort.awk
-# quicksort.awk --- Algoritmo di quicksort, con funzione di confronto
-# fornita dall'utente
-@c endfile
-@ignore
-@c file eg/lib/quicksort.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# January 2009
-
-@c endfile
-@end ignore
-@c file eg/lib/quicksort.awk
-
-# quicksort --- Algoritmo di quicksort di C.A.R. Hoare.
-# Si veda Wikipedia o quasi ogni libro
-# che tratta di algoritmi o di informatica.
-@c endfile
-@ignore
-@c file eg/lib/quicksort.awk
-#
-# Adattato da B.W. Kernighan & D.M. Ritchie
-# The C Programming Language
-# (Englewood Cliffs, NJ: Prentice Hall, 1988)
-# Seconda Edizione, pagina 110
-@c endfile
-@end ignore
-@c file eg/lib/quicksort.awk
-
-function quicksort(dati, sinistra, destra, minore_di, i, ultimo)
-@{
- if (sinistra >= destra) # non fa nulla se il vettore contiene
- return # meno di due elementi
-
- quicksort_scambia(dati, sinistra, int((sinistra + destra) / 2))
- ultimo = sinistra
- for (i = sinistra + 1; i <= destra; i++)
- if (@@minore_di(dati[i], dati[sinistra]))
- quicksort_scambia(dati, ++ultimo, i)
- quicksort_scambia(dati, sinistra, ultimo)
- quicksort(dati, sinistra, ultimo - 1, minore_di)
- quicksort(dati, ultimo + 1, destra, minore_di)
-@}
-
-# quicksort_scambia --- funzione ausiliaria per quicksort,
-# sarebbe meglio fosse nel programma principale
-
-function quicksort_scambia(dati, i, j, salva)
-@{
- salva = dati[i]
- dati[i] = dati[j]
- dati[j] = salva
-@}
-@c endfile
-@end example
-
-La funzione @code{quicksort()} riceve il vettore @code{dati}, gli
-indici iniziali e finali da ordinare
-(@code{sinistra} e @code{destra}), e il nome di una funzione che
-esegue un confronto ``minore di''. Viene quindi eseguito
-l'algoritmo di quicksort.
-
-Per fare uso della funzione di ordinamento, torniamo all'esempio
-precedente. La prima cosa da fare @`e di scrivere qualche funzione
-di confronto:
-
-@example
-@c file eg/prog/indirectcall.awk
-# num_min --- confronto numerico per minore di
-
-function num_min(sinistra, destra)
-@{
- return ((sinistra + 0) < (destra + 0))
-@}
-
-# num_magg_o_ug --- confronto numerico per maggiore o uguale
-
-function num_magg_o_ug(sinistra, destra)
-@{
- return ((sinistra + 0) >= (destra + 0))
-@}
-@c endfile
-@end example
-
-La funzione @code{num_magg_o_ug()} serve per ottenere un ordinamento
-decrescente (dal numero pi@`u alto al pi@`u basso); quando @`e usato
-per eseguire un test per ``minore di'', in realt@`a fa l'opposto
-(maggiore o uguale a), il che conduce a ottenere dati ordinati
-in ordine decrescente.
-
-Poi serve una funzione di ordinamento.
-Come parametri ha i numeri del campo iniziale e di quello finale,
-e il nome della funzione di confronto.
-Costruisce un vettore con
-i dati e richiama appropriatamente @code{quicksort()}; quindi formatta i
-risultati mettendoli in un'unica stringa:
-
-@example
-@c file eg/prog/indirectcall.awk
-# ordina --- ordina i dati a seconda di `confronta'
-# e li restituisce come un'unica stringa
-
-function ordina(primo, ultimo, confronta, dati, i, risultato)
-@{
- delete dati
- for (i = 1; primo <= ultimo; primo++) @{
- dati[i] = $primo
- i++
- @}
-
- quicksort(dati, 1, i-1, confronta)
-
- risultato = dati[1]
- for (i = 2; i in dati; i++)
- risultato = risultato " " dati[i]
-
- return risultato
-@}
-@c endfile
-@end example
-
-Per finire, le due funzioni di ordinamento chiamano la funzione
-@code{ordina()}, passandole i nomi delle due funzioni di confronto:
-
-@example
-@c file eg/prog/indirectcall.awk
-# ascendente --- ordina i dati in ordine crescente
-# e li restituisce sotto forma di stringa
-
-function ascendente(primo, ultimo)
-@{
- return ordina(primo, ultimo, "num_min")
-@}
-
-# discendente --- ordina i dati in ordine decrescente
-# e li restituisce sotto forma di stringa
-
-function discendente(primo, ultimo)
-@{
- return ordina(primo, ultimo, "num_magg_o_ug")
-@}
-@c endfile
-@end example
-
-Ecco una versione estesa del @value{DF}:
-
-@example
-@c file eg/data/class_data2
-Biologia_101 somma media ordina discendente dati: 87.0 92.4 78.5 94.9
-Chimica_305 somma media ordina discendente dati: 75.2 98.3 94.7 88.2
-Inglese_401 somma media ordina discendente dati: 100.0 95.6 87.1 93.4
-@c endfile
-@end example
-
-Per finire, questi sono i risultati quando si esegue il programma
-in questa versione migliorata:
-
-@example
-$ @kbd{gawk -f quicksort.awk -f indirettacall.awk class_data2}
-@print{} Biologia 101:
-@print{} somma: <352.8>
-@print{} media: <88.2>
-@print{} ascendente: <78.5 87.0 92.4 94.9>
-@print{} discendente: <94.9 92.4 87.0 78.5>
-@print{}
-@print{} Chimica 305:
-@print{} somma: <356.4>
-@print{} media: <89.1>
-@print{} ascendente: <75.2 88.2 94.7 98.3>
-@print{} discendente: <98.3 94.7 88.2 75.2>
-@print{}
-@print{} Inglese 401:
-@print{} somma: <376.1>
-@print{} media: <94.025>
-@print{} ascendente: <87.1 93.4 95.6 100.0>
-@print{} discendente: <100.0 95.6 93.4 87.1>
-@end example
-
-Un altro esempio in cui le chiamate indirette di funzione sono utili
-@`e costituito dall'elaborazione di vettori. La descrizione si pu@`o trovare
-@ref{Visitare vettori}.
-
-Occorre ricordarsi di anteporre il carattere @samp{@@} prima di una
-chiamata indiretta di funzione.
-
-A partire dalla @value{PVERSION} 4.1.2 di @command{gawk}, le chiamate
-indirette di funzione
-possono anche essere usate per chiamare funzioni predefinite e con
-funzioni di estensione
-(@pxref{Estensioni dinamiche}). Ci sono alcune limitazioni nel richiamare
-in maniera indiretta delle funzioni predefinite, come qui dettagliato:
-
-@itemize @value{BULLET}
-@item
-Non si pu@`o passare una costante @dfn{regexp} a una funzione predefinita
-effettuando una chiamata di funzione indiretta.@footnote{Questa
-limitazione potrebbe cambiare in una futura versione;
-per appurarlo, si controlli la documentazione che accompagna
-la versione in uso di @command{gawk}.}
-Quanto sopra vale per le funzioni
-@code{sub()}, @code{gsub()}, @code{gensub()}, @code{match()},
-@code{split()} e @code{patsplit()}.
-
-@item
-Nel chiamare @code{sub()} o @code{gsub()}, sono accettati solo due argomenti,
-poich@'e queste funzioni sono atipiche, in quanto aggiornano il loro terzo
-argomento. Questo significa che verr@`a sempre aggiornato l'argomento di
-default, @code{$0}.
-@end itemize
-
-@command{gawk} fa del suo meglio per rendere efficiente la chiamata indiretta
-di funzioni. Per esempio, nel ciclo seguente:
-
-@example
-for (i = 1; i <= n; i++)
- @@quale_funzione()
-@end example
-
-@noindent
-@command{gawk} ricerca solo una volta quale funzione chiamare.
-
-@node Sommario delle funzioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-@command{awk} include delle funzioni predefinite e consente all'utente
-di definire le sue proprie funzioni.
-
-@item
-POSIX @command{awk} include tre tipi di funzioni predefinite: numeriche, di
-stringa, e di I/O. @command{gawk} prevede funzioni per ordinare vettori, per
-lavorare con valori che rappresentano marcature temporali,
-per la manipolazione di bit,
-per determinare il tipo di una variabile (vettoriale piuttosto che scalare), e
-programmi per l'internazionalizzazione e la localizzazione. @command{gawk}
-prevede anche parecchie estensioni ad alcune funzioni standard, tipicamente
-nella forma di ulteriori argomenti.
-
-@item
-Le funzioni accettano zero o pi@`u argomenti e restituiscono un valore. Le
-espressioni che specificano il valore di ogni argomento sono valutate
-completamente prima della chiamata
-a una funzione. L'ordine di valutazione di questi argomenti non @`e definito.
-Il valore restituito dalla funzione pu@`o essere ignorato.
-
-@item
-La gestione delle barre inverse in @code{sub()} e @code{gsub()} non @`e
-semplice.
-@`E pi@`u semplice nella funzione di @command{gawk} @code{gensub()},
-ma anche questa funzione richiede attenzione quando la si usa.
-
-@item
-Le funzioni definite dall'utente consentono importanti funzionalit@`a ma hanno
-anche alcune ineleganze sintattiche. In una chiamata di funzione non si pu@`o
-inserire alcuno spazio tra il nome della funzione e la parentesi sinistra
-aperta che inizia la lista degli argomenti. Inoltre, non c'@`e nessuna
-prescrizione per le variabili locali, e per questo la
-convenzione in uso @`e di aggiungere parametri extra, e di separarli visivamente
-dai parametri veri e propri inserendo degli spazi bianchi prima di essi.
-
-@item
-Le funzioni definite dall'utente possono chiamare altre
-funzioni definite dall'utente (oltre a quelle predefinite)
-e possono chiamare se stesse ricorsivamente. I parametri di funzione
-``nascondono'' qualsiasi variabile globale che abbia lo stesso nome.
-Non si pu@`o usare il nome di una variabile riservata (p.es. @code{ARGC})
-come nome di un parametro in funzioni definite dall'utente.
-
-@item
-I valori scalari sono passati alle funzioni definite dall'utente
-per valore. I parametri che sono dei vettori sono passati alle funzioni
-per riferimento; ogni modifica fatta dalla funzione a un parametro che
-sia un vettore @`e quindi visibile dopo aver eseguito quella funzione.
-
-@item
-L'istruzione @code{return} serve per tornare indietro da una funzione definita
-dall'utente. Un'espressione opzionale diviene il valore restituito dalla
-funzione. Una funzione pu@`o solo restituire valori di tipo scalare.
-
-@item
-Se una variabile che non @`e stata mai usata @`e passata a una funzione
-definita dall'utente, il modo con cui quella funzione elabora la variabile
-ne pu@`o determinare il tipo: o scalare o vettoriale.
-
-@item
-@command{gawk} consente la chiamata indiretta di funzioni usando una sintassi
-speciale. Impostando una variabile al nome di una funzione, si pu@`o
-determinare al momento dell'esecuzione che funzione sar@`a chiamata in un certo
-punto del programma. Questo equivale a usare un puntatore a una funzione nei
-linguaggi C e C++.
-
-@end itemize
-
-
-@ifnotinfo
-@part @value{PART2}Risoluzione di problemi con @command{awk}
-@end ifnotinfo
-
-@ifdocbook
-La Parte II mostra come usare @command{awk} e @command{gawk} per risolvere
-problemi. Qui c'@`e il codice di molti programmi, da leggere e da cui si pu@`o
-imparare. @`E composta dai seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Funzioni di libreria}
-
-@item
-@ref{Programmi di esempio}
-@end itemize
-@end ifdocbook
-
-@node Funzioni di libreria
-@chapter Una libreria di funzioni @command{awk}
-@cindex libreria di funzioni @command{awk}
-@cindex funzioni di libreria
-@cindex funzioni definite dall'utente, libreria di
-
-@iftex
-La
-@end iftex
-@ref{Funzioni definite dall'utente} descrive come scrivere le proprie
-funzioni @command{awk} personali. Scrivere funzioni @`e importante, perch@'e
-consente di incapsulare in un unico contenitore algoritmi e azioni di
-programma. Semplifica la programmazione, rendendo lo sviluppo di un programma
-pi@`u gestibile, e rendendo i programmi pi@`u leggibili.
-
-@cindex Kernighan, Brian
-@cindex Plauger, P.J.@:
-Nel loro autorevole libro del 1976,
-@cite{Software Tools},@footnote{Purtroppo, a distanza di oltre 35 anni,
-molte delle
-lezioni impartite da questo libro devono ancora essere apprese da un gran
-numero di programmatori professionisti.}
-Brian Kernighan e P.J.@: Plauger hanno scritto:
-
-@quotation
-A programmare bene non s'impara dai concetti generali, ma vedendo come
-programmi complessi possono essere resi puliti, facili da leggere,
-facili da manutenere e modificare,
-strutturati in modo comprensibile, efficienti e affidabili,
-applicando il buon senso e delle buone pratiche di programmazione.
-Lo studio attento e l'imitazione di buoni programmi conduce a una migliore
-scrittura.
-@end quotation
-
-In effetti, loro reputavano quest'idea tanto importante da mettere questa
-frase sulla copertina del libro. Poich@'e credo fermamente che la loro
-affermazione sia corretta, questo @value{CHAPTER} e
-@iftex
-il
-@end iftex
-@ref{Programmi di esempio}
-forniscono una corposa raccolta di codice da leggere e, si spera, da cui
-imparare.
-
-Questo @value{CHAPTER} illustra una libreria di utili funzioni @command{awk}.
-Molti dei programmi descritti nel seguito di questo @value{DOCUMENT}
-usano queste funzioni.
-Le funzioni sono illustrate progressivamente, dalla pi@`u semplice alla pi@`u
-complessa.
-
-@cindex Texinfo
-@iftex
-La
-@end iftex
-@ref{Programma extract}
-illustra un programma che si pu@`o usare per estrarre il codice sorgente
-degli esempi di funzioni di libreria e di programmi dal sorgente Texinfo
-di questo @value{DOCUMENT}.
-(Questo @`e gi@`a stato fatto durante la preparazione della distribuzione
-di @command{gawk}.)
-
-@ifclear FOR_PRINT
-Chi avesse scritto una o pi@`u funzioni @command{awk} utili e di uso
-generale, e volesse metterle a disposizione della comunit@`a degli utenti di
-@command{awk}, pu@`o leggere le informazioni contenute in
-@ref{Come contribuire}.
-@end ifclear
-
-@cindex portabilit@`a, programmi di esempio
-I programmi contenuti in questo @value{CHAPTER} e in
-@ref{Programmi di esempio},
-utilizzano anche le funzionalit@`a specifiche di @command{gawk}.
-Riscrivere questi programmi per implementazioni di @command{awk} diverse
-@`e piuttosto semplice:
-
-@itemize @value{BULLET}
-@item
-I messaggi di errore diagnostici sono inviati a @file{/dev/stderr}.
-Usare @samp{| "cat 1>&2"} al posto di @samp{> "/dev/stderr"} se il sistema
-in uso non ha un @file{/dev/stderr}, o se non @`e possibile usare
-@command{gawk}.
-
-@item
-Alcuni programmi usano @code{nextfile}
-(@pxref{Istruzione nextfile})
-per evitare di leggere gli input ancora non letti dal file in input corrente.
-
-@item
-@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue.
-@cindex distinzione maiuscolo/minuscolo, programmi di esempio
-@cindex @code{IGNORECASE}, variabile, nei programmi di esempio
-@cindex variabile @code{IGNORECASE}, nei programmi di esempio
-Infine, alcuni dei programmi scelgono di ignorare la distinzione tra maiuscolo e
-minuscolo nei loro input, assegnando il valore uno a @code{IGNORECASE}.
-Si pu@`o ottenere quasi lo stesso effetto@footnote{I risultati non sono identici.
-L'output del record trasformato sar@`a tutto in minuscolo, mentre
-@code{IGNORECASE} preserva il contenuto originale del record in input.}
-aggiungendo la seguente regola
-all'inizio del programma:
-
-@example
-# ignora maiuscolo/minuscolo
-@{ $0 = tolower($0) @}
-@end example
-
-@noindent
-Inoltre, si verifichi che tutte le @dfn{regexp} e le costanti
-di tipo stringa usate nei confronti utilizzano solo lettere minuscole.
-@end itemize
-
-@menu
-* Nomi di variabili di libreria:: Che nomi @`e meglio dare alle variabili
- private globali nelle funzioni di libreria.
-* Funzioni di tipo generale:: Funzioni di uso generale.
-* Gestione File Dati:: Funzioni per gestire file-dati specificati
- sulla riga di comando.
-* Funzione getopt:: Una funzione per trattare argomenti presenti
- sulla riga di comando.
-* Funzioni Passwd:: Funzioni per ottenete informazioni
- sull'utente [da /etc/passwd].
-* Funzioni Group:: Funzioni per ottenete informazioni
- sul gruppo [da /etc/group].
-* Visitare vettori:: Una funzione per visitare vettori di vettori.
-* Sommario funzioni di libreria:: Sommario funzioni di libreria
-* Esercizi con le librerie:: Esercizi.
-@end menu
-
-@node Nomi di variabili di libreria
-@section Dare un nome a variabili globali in funzioni di libreria
-
-@cindex nomi di vettore/variabile
-@cindex nomi di funzione
-@cindex questioni sui nomi permessi
-@cindex nomi permessi, questioni sui
-@cindex programmi @command{awk}, documentazione
-@cindex documentazione, di programmi @command{awk}
-Per come si @`e sviluppato il linguaggio @command{awk}, le variabili sono
-o @dfn{globali} (usabili dall'intero programma) o @dfn{locali} (usabili solo
-in una specifica funzione). Non c'@`e uno stato intermedio analogo alle
-variabili @code{statiche} in C.
-
-@cindex variabili globali, per funzioni di libreria
-@cindex globali, variabili, per funzioni di libreria
-@cindex private, variabili
-@cindex variabili private
-Le funzioni di libreria hanno spesso necessit@`a di avere variabili globali da
-usare per conservare informazioni di stato tra successive chiamate alla
-funzione; per esempio, la variabile di @code{getopt()} @code{_opti}
-(@pxref{Funzione getopt}).
-Tali variabili vengono dette @dfn{private}, poich@'e le sole funzioni che
-devono usarle sono quelle della libreria.
-
-Quando si scrive una funzione di libreria, si dovrebbe cercare di scegliere per
-le variabili private dei nomi che non entrano in conflitto con nessuna delle
-variabili usate da un'altra funzione di libreria o dal programma principale di
-un utente. Per esempio, un nome come @code{i} o @code{j} non @`e una buona
-scelta, perch@'e i programmi a livello utente usano spesso nomi di variabile come
-questi per le proprie elaborazioni.
-
-@cindex convenzioni di programmazione, nomi di variabili private
-@cindex programmazione, convenzioni di, nomi di variabili private
-I programmi di esempio mostrati in questo @value{CHAPTER} usano per le
-loro variabili private nomi che iniziano con un trattino basso(@samp{_}).
-Generalmente gli utenti
-non usano trattini bassi iniziali nei nomi di variabile, cos@`{@dotless{i}} questa convenzione
-riduce le possibilit@`a che il nome di variabile coincida con un nome usato
-nel programma dell'utente.
-
-@cindex @code{_} (trattino basso), nei nomi di variabili private
-@cindex trattino basso (@code{_}), nei nomi di variabili private
-Inoltre, parecchie funzioni di libreria usano un prefisso che suggerisce
-quale funzione o gruppo di funzioni usa quelle variabili; per esempio,
-@code{_pw_byname()} nelle routine che consultano la lista degli utenti
-(@pxref{Funzioni Passwd}).
-L'uso di questa convenzione viene raccomandata, poich@'e riduce ulteriormente la
-possibilit@`a di conflitti accidentali tra nomi di variabile. Si noti che questa
-convenzione pu@`o anche essere usata per i nomi di variabile e per i nomi delle
-funzioni private.@footnote{Sebbene tutte le routine di libreria si sarebbero
-potute riscrivere usando questa convenzione, ci@`o non @`e stato fatto, per far
-vedere come lo stile di programmazione in @command{awk} si @`e evoluto e
-per fornire alcuni spunti per questa spiegazione.}
-
-Come nota finale sui nomi delle variabili, se una funzione rende
-disponibile una variabile globale per essere usata da un programma principale,
-@`e una buona convenzione quella di far iniziare i nomi di queste variabili con
-una lettera maiuscola; per esempio, @code{Opterr} e @code{Optind} di
-@code{getopt()}
-(@pxref{Funzione getopt}).
-La lettera maiuscola iniziale indica che la variabile @`e globale,
-mentre il fatto che
-il nome della variabile non @`e tutto in lettere maiuscole indica che la variabile
-non @`e una delle variabili predefinite di @command{awk}, come @code{FS}.
-
-@cindex @option{--dump-variables}, opzione, uso per funzioni di libreria
-@cindex opzione @option{--dump-variables}, uso per funzioni di libreria
-@`E importante anche che @emph{tutte} le variabili nelle funzioni di libreria
-che non abbiano la necessit@`a di essere
-conservate per tutta la durata del
-programma siano, di fatto, dichiarate
-come locali.@footnote{L'opzione da riga di comando di @command{gawk}
-@option{--dump-variables} @`e utile per verificare questo.} Se ci@`o non viene
-fatto, la variabile potrebbe essere usata accidentalmente nel programma
-dell'utente, conducendo a errori che sono molto difficili da scoprire:
-
-@example
-function lib_func(x, y, l1, l2)
-@{
- @dots{}
- # qualche_var dovrebbe essere locale ma per una svista non lo @`e
- @var{uso della variabile} qualche_var
- @dots{}
-@}
-@end example
-
-@cindex vettori associativi, funzioni di libreria e
-@cindex libreria di funzioni @command{awk}, vettori associativi e
-@cindex funzioni, libreria di, vettori associativi e
-@cindex Tcl
-Una differente convenzione, comune nella comunit@`a Tcl, @`e quella di usare un
-solo vettore associativo che contiene i valori necessari alle funzioni di
-libreria, o ``package.'' Questo riduce significativamente il numero degli
-effettivi nomi globali in uso. Per esempio, le funzioni descritte in
-@ref{Funzioni Passwd}
-potrebbero aver usato gli elementi di vettore
-@code{@w{PW_data["inizializzato"]}},
-@code{@w{PW_data["totale"]}}, @code{@w{PW_data["contatore"]}}, e
-@code{@w{PW_data["awklib"]}}, al posto di @code{@w{_pw_inizializzato}},
-@code{@w{_pw_totale}},
-@code{@w{_pw_awklib}} e
-@code{@w{_pw_contatore}}.
-
-Le convenzioni illustrate in questa @value{SECTION} sono esattamente
-quello che indica il termine: convenzioni. Non si @`e obbligati a scrivere
-i propri programmi in questo modo: @`e solo auspicabile che lo si faccia.
-
-@node Funzioni di tipo generale
-@section Programmazione di tipo generale
-
-Questa @value{SECTION} illustra diverse funzioni che sono di uso generale nella
-programmazione.
-
-@menu
-* Funzione strtonum:: Da usare se non @`e disponibile la funzione
- predefinita @code{strtonum()}.
-* Funzione assert:: Una funzione per controllare affermazioni
- in programmi @command{awk}.
-* Funzione round:: Una funzione per eseguire arrotondamenti
- se @code{sprintf()} non lo fa correttamente.
-* Funzione random Cliff:: Il generatore Cliff di numeri casuali.
-* Funzioni ordinali:: Funzioni per usare caratteri come numeri
- e viceversa.
-* Funzione join:: Una funzione per fondere un vettore
- in una stringa.
-* Funzione getlocaltime:: Una funzione per ottenere data e ora nel
- formato desiderato.
-* Funzione readfile:: Una funzione per leggere un file intero in
- un colpo solo.
-* Apici alla shell:: Una funzione per passare stringhe
- con apici alla shell.
-@end menu
-
-@node Funzione strtonum
-@subsection Conversione di stringhe in numeri
-
-La funzione @code{strtonum()} (@pxref{Funzioni per stringhe})
-@`e un'estensione @command{gawk}. La seguente funzione
-fornisce un'implementazione per altre versioni di @command{awk}:
-
-@example
-@c file eg/lib/strtonum.awk
-# mystrtonum --- converte stringhe in numeri
-
-@c endfile
-@ignore
-@c file eg/lib/strtonum.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# February, 2004
-# Revised June, 2014
-
-@c endfile
-@end ignore
-@c file eg/lib/strtonum.awk
-function mystrtonum(str, ret, n, i, k, c)
-@{
- if (str ~ /^0[0-7]*$/) @{
- # ottale
- n = length(str)
- ret = 0
- for (i = 1; i <= n; i++) @{
- c = substr(str, i, 1)
- # index() restituisce 0 se c non @`e nella stringa,
- # e anche se c == "0"
- k = index("1234567", c)
-
- ret = ret * 8 + k
- @}
- @} else if (str ~ /^0[xX][[:xdigit:]]+$/) @{
- # esadecimale
- str = substr(str, 3) # via 0x iniziale
- n = length(str)
- ret = 0
- for (i = 1; i <= n; i++) @{
- c = substr(str, i, 1)
- c = tolower(c)
- # index() restituisce 0 se c non @`e nella stringa,
- # e anche se c == "0"
- k = index("123456789abcdef", c)
-
- ret = ret * 16 + k
- @}
- @} else if (str ~ \
- /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{
- # numero decimale, eventualmente in virgola mobile
- ret = str + 0
- @} else
- ret = "NON-UN-NUMERO"
-
- return ret
-@}
-
-# BEGIN @{ # dati per un test
-# a[1] = "25"
-# a[2] = ".31"
-# a[3] = "0123"
-# a[4] = "0xdeadBEEF"
-# a[5] = "123.45"
-# a[6] = "1.e3"
-# a[7] = "1.32"
-# a[8] = "1.32E2"
-#
-# for (i = 1; i in a; i++)
-# print a[i], strtonum(a[i]), mystrtonum(a[i])
-# @}
-@c endfile
-@end example
-
-La funzione cerca dapprima numeri ottali in stile C (base 8).
-Se la stringa in input corrisponde all'espressione regolare che descrive i
-numeri ottali, @code{mystrtonum()} esegue il ciclo per ogni carattere presente
-nella stringa. Imposta @code{k} all'indice in @code{"1234567"} della cifra
-ottale corrente.
-Il valore di ritorno sar@`a lo stesso numero della cifra, o zero
-se il carattere non c'@`e, il che succeder@`a per ogni cifra @samp{0}.
-Questo si pu@`o fare, perch@'e il test di @dfn{regexp} nell'istruzione @code{if}
-assicura che vengano scelti per
-essere convertiti solo dei numeri ottali.
-
-Una logica simile si applica al codice che ricerca e converte un
-valore esadecimale, che inizia con @samp{0x} o @samp{0X}.
-L'uso di @code{tolower()} semplifica il calcolo per trovare
-il valore numerico corretto per ogni cifra esadecimale.
-
-Infine, se la stringa corrisponde alla (piuttosto complicata) @dfn{regexp} per
-un intero decimale regolare o per un numero in virgola mobile, il calcolo
-@samp{ret = str + 0} fa s@`{@dotless{i}} che @command{awk} converta il valore in un
-numero.
-
-@`E incluso un programma di verifica commentato, in modo che la funzione possa
-essere verificata con @command{gawk} e il risultato confrontato con la funzione
-predefinita @code{strtonum()}.
-
-@node Funzione assert
-@subsection Asserzioni
-
-@cindex asserzioni
-@cindex @code{assert()}, funzione (libreria C)
-@cindex funzione @code{assert()} (libreria C)
-@cindex libreria di funzioni @command{awk}, asserzioni
-@cindex funzioni, libreria di, asserzioni
-@cindex @command{awk}, asserzioni in programmi lunghi
-Quando si scrivono grossi programmi, spesso @`e utile sapere se
-una condizione o una serie di condizioni @`e verificata oppure no.
-Prima di procedere
-con un determinato calcolo, si fa un'affermazione su cosa si crede sia
-vero. Tale affermazione @`e nota come
-@dfn{asserzione}. Il linguaggio C fornisce un file di intestazione
-@code{<assert.h>} e una corrispondente macro @code{assert()} che un
-programmatore pu@`o utilizzare per fare asserzioni.
-Se l'asserzione risulta falsa, la macro @code{assert()} predispone la
-stampa di un messaggio diagnostico che descrive la condizione che
-sarebbe dovuta essere vera ma che non lo era, e poi fa terminare
-il programma.
-In C, l'uso di @code{assert()} @`e simile a questo:
-
-@example
-#include <assert.h>
-
-int myfunc(int a, double b)
-@{
- assert(a <= 5 && b >= 17.1);
- @dots{}
-@}
-@end example
-
-Se l'asserzione @`e falsa, il programma stampa un messaggio simile a questo:
-
-@example
-prog.c:5: asserzione falsa: `a <= 5 && b >= 17.1'
-@end example
-
-@cindex @code{assert()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{assert()}
-Il linguaggio C rende possibile trasformare questa condizione in una stringa
-da
-usare per stampare il messaggio di diagnosi. Ci@`o in @command{awk} non @`e
-possibile, per cui la funzione @code{assert()} scritta in @command{awk}
-richiede anche una descrizione
-della condizione da verificare, in formato stringa.
-La funzione @`e la seguente:
-
-@example
-@c file eg/lib/assert.awk
-# assert --- Verifica una condizione. Se questa @`e falsa esce.
-
-@c endfile
-@ignore
-@c file eg/lib/assert.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May, 1993
-
-@c endfile
-@end ignore
-@c file eg/lib/assert.awk
-function assert(condizione, stringa)
-@{
- if (! condizione) @{
- printf("%s:%d: asserzione falsa: %s\n",
- FILENAME, FNR, stringa) > "/dev/stderr"
- _assert_exit = 1
- exit 1
- @}
-@}
-
-@group
-END @{
- if (_assert_exit)
- exit 1
-@}
-@end group
-@c endfile
-@end example
-
-La funzione @code{assert()} verifica il parametro @code{condizione}. Se
-@`e falso, stampa un messaggio sullo standard error, usando il parametro
-@code{stringa} per descrivere la condizione non verificata. Poi imposta la
-variabile @code{_assert_exit} a uno ed esegue l'istruzione @code{exit}.
-L'istruzione @code{exit} salta alla regola @code{END}. Se la regola @code{END}
-trova vera la variabile @code{_assert_exit}, esce immediatamente.
-
-Lo scopo della verifica nella regola @code{END} @`e quello di evitare che venga
-eseguita qualsiasi altra eventuale regola @code{END}.
-Quando un'asserzione non @`e
-verificata, il programma dovrebbe uscire immediatamente.
-Se nessuna asserzione
-fallisce, @code{_assert_exit} @`e ancora falso quando la regola @code{END} @`e
-eseguita normalmente, e le eventuali altre regole @code{END} del programma
-vengono eseguite.
-Affinch@'e tutto questo funzioni correttamente, @file{assert.awk} dev'essere il
-primo file sorgente che viene letto da @command{awk}.
-La funzione pu@`o essere usata in un programma nel seguente modo:
-
-@example
-function miafunz(a, b)
-@{
- assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1")
- @dots{}
-@}
-@end example
-
-@noindent
-Se l'asserzione non @`e verificata, si vedr@`a un messaggio simile a questo:
-
-@example
-mydata:1357: asserzione falsa: a <= 5 && b >= 17.1
-@end example
-
-@cindex @code{END}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
-@cindex criterio di ricerca @code{END}, funzione definita dall'utente @code{assert()} e
-C'@`e un piccolo problema con questa versione di @code{assert()}.
-Come visto, una regola @code{END} viene automaticamente aggiunta al programma
-che chiama @code{assert()}. Normalmente, se un programma consiste
-solo di una regola @code{BEGIN}, i file in input e/o lo standard input non
-vengono letti. Tuttavia, ora che il programma ha una regola @code{END},
-@command{awk} tenta di leggere i @value{DF} in input o lo standard input
-(@pxref{Usare BEGIN/END}), provocando molto probabilmente la sospensione del
-programma come se rimanesse in attesa di input.
-
-@cindex @code{BEGIN}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
-@cindex criterio di ricerca @code{BEGIN}, funzione definita dall'utente @code{assert()} e
-C'@`e un modo per aggirare questo problema:
-assicurarsi che la regola @code{BEGIN} termini sempre
-con un'istruzione @code{exit}.
-
-@node Funzione round
-@subsection Arrotondamento di numeri
-
-@cindex arrotondare numeri
-@cindex numeri, arrotondamento di
-@cindex libreria di funzioni @command{awk}, arrotondamento di numeri
-@cindex funzioni, libreria di, arrotondamento di numeri
-@cindex @code{print}, istruzione, funzione @code{sprintf()} e
-@cindex istruzione @code{print}, funzione @code{sprintf()} e
-@cindex @code{printf}, istruzione, funzione @code{sprintf()} e
-@cindex istruzione @code{printf}, funzione @code{sprintf()} e
-@cindex @code{sprintf()}, funzione, istruzioni @code{print}/@code{printf} e
-@cindex funzione @code{sprintf()}, istruzioni @code{print}/@code{printf} e
-Il modo in cui @code{printf} e @code{sprintf()}
-(@pxref{Printf})
-effettuano l'arrotondamento spesso dipende dalla subroutine C @code{sprintf()}
-del sistema. Su molte macchine, l'arrotondamento di @code{sprintf()} @`e
-@dfn{statistico}, il che significa che non sempre arrotonda un .5 finale per
-eccesso, contrariamente alle normali aspettative. Nell'arrotondamento
-statistico, .5 arrotonda alla cifra pari, anzich@'e sempre per eccesso, cos@`{@dotless{i}}
-1.5 arrotonda a 2 e 4.5 arrotonda a 4. Ci@`o significa che se si sta usando un
-formato che fa arrotondamenti (p.es. @code{"%.0f"}), si dovrebbe controllare
-quello che fa il sistema che si sta usando. La seguente funzione esegue un
-arrotondamento tradizionale; potrebbe essere utile nel caso in cui
-l'istruzione @code{printf}
-di @command{awk} che si sta usando faccia degli arrotondamenti statistici:
-
-@cindex @code{round()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{round()}
-@example
-@c file eg/lib/round.awk
-# round.awk --- effettua arrotondamento tradizionale
-@c endfile
-@ignore
-@c file eg/lib/round.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August, 1996
-@c endfile
-@end ignore
-@c file eg/lib/round.awk
-
-function round(x, ival, aval, frazione)
-@{
- ival = int(x) # parte intera, int() fa un troncamento
-
- # vedere se c'@`e la parte frazionale
- if (ival == x) # nessuna parte frazionale
- return ival # nessun decimale
-
- if (x < 0) @{
- aval = -x # valore assoluto
- ival = int(aval)
- frazione = aval - ival
- if (frazione >= .5)
- return int(x) - 1 # -2.5 --> -3
- else
- return int(x) # -2.3 --> -2
- @} else @{
- frazione = x - ival
- if (frazione >= .5)
- return ival + 1
- else
- return ival
- @}
-@}
-@c endfile
-@c don't include test harness in the file that gets installed
-
-# codice per testare, commentato
-# @{ print $0, round($0) @}
-@end example
-
-@node Funzione random Cliff
-@subsection Il generatore di numeri casuali Cliff
-@cindex numeri casuali, generatore Cliff
-@cindex Cliff, generatore di numeri casuali
-@cindex casuali, numeri, generatore Cliff di
-@cindex funzioni, libreria di, numeri casuali Cliff
-
-Il
-@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, generatore di numeri casuali Cliff}
-@`e un generatore di numeri casuali molto semplice che ``passa il test della sfera
-del rumore per la casualit@`a non mostrando di avere alcuna struttura.''
-@`E programmato in modo molto semplice, in meno di 10 righe di codice
-@command{awk}:
-
-@cindex @code{cliff_rand()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{cliff_rand()}
-@example
-@c file eg/lib/cliff_rand.awk
-# cliff_rand.awk --- generare numeri casuali con algoritmo di Cliff
-@c endfile
-@ignore
-@c file eg/lib/cliff_rand.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# December 2000
-@c endfile
-@end ignore
-@c file eg/lib/cliff_rand.awk
-
-BEGIN @{ _cliff_seme = 0.1 @}
-
-function cliff_rand()
-@{
- _cliff_seme = (100 * log(_cliff_seme)) % 1
- if (_cliff_seme < 0)
- _cliff_seme = - _cliff_seme
- return _cliff_seme
-@}
-@c endfile
-@end example
-
-Questo algoritmo richiede un ``seme'' iniziale di 0,1. Ogni nuovo valore
-usa il seme corrente come input per il calcolo.
-Se la funzione predefinita @code{rand()}
-(@pxref{Funzioni numeriche})
-non @`e abbastanza casuale, si pu@`o tentare di usare al suo posto questa funzione.
-
-@node Funzioni ordinali
-@subsection Tradurre tra caratteri e numeri
-
-@cindex libreria di funzioni @command{awk}, valori di carattere come numeri
-@cindex funzioni, libreria di, valori di carattere come numeri
-@cindex carattere, valore come numero
-@cindex numeri, come valori di carattere
-Un'implementazione commerciale di @command{awk} fornisce una funzione
-predefinita @code{ord()}, che prende un carattere e restituisce il valore
-numerico per quel carattere nella rappresentazione dei caratteri
-di quella particolare macchina. Se la
-stringa passata a @code{ord()} ha pi@`u di un carattere, viene usato solo il
-primo.
-
-L'inverso di questa funzione @`e @code{chr()} (dalla funzione con lo stesso nome
-in Pascal), che, dato un numero, restituisce il corrispondente carattere.
-Entrambe le funzioni si possono scrivere molto bene usando @command{awk};
-non vi @`e nessun reale motivo per inglobarle come funzioni predefinite
-@command{awk}:
-
-@cindex @code{ord()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{ord()}
-@cindex @code{chr()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{chr()}
-@cindex @code{_ord_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_ord_init()}
-@example
-@c file eg/lib/ord.awk
-# ord.awk --- implementa ord e chr
-
-# Identificatori globali:
-# _ord_: valori numerici indicizzati da caratteri
-# _ord_init: funzione per inizializzare _ord_
-@c endfile
-@ignore
-@c file eg/lib/ord.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# 16 January, 1992
-# 20 July, 1992, revised
-@c endfile
-@end ignore
-@c file eg/lib/ord.awk
-
-BEGIN @{ _ord_init() @}
-
-function _ord_init( basso, alto, i, t)
-@{
- basso = sprintf("%c", 7) # BEL @`e ascii 7
- if (basso == "\a") @{ # ascii regolare
- basso = 0
- alto = 127
- @} else if (sprintf("%c", 128 + 7) == "\a") @{
- # ascii, con il primo bit a 1 (mark)
- basso = 128
- alto = 255
- @} else @{ # ebcdic(!)
- basso = 0
- alto = 255
- @}
-
- for (i = basso; i <= alto; i++) @{
- t = sprintf("%c", i)
- _ord_[t] = i
- @}
-@}
-@c endfile
-@end example
-
-@cindex serie di caratteri (codifiche dei caratteri da parte della macchina)
-@cindex ASCII
-@cindex EBCDIC
-@cindex Unicode
-@cindex bit di parit@`a (in ASCII)
-@cindex @dfn{mark}, bit di parit@`a (in ASCII)
-Alcune spiegazioni riguardo ai numeri usati da @code{_ord_init()}
-non guastano.
-La serie di caratteri pi@`u importante oggi in uso @`e nota come
-ASCII.@footnote{La situazione sta per@`o
-cambiando: molti sistemi usano Unicode, una serie di caratteri molto ampia
-che comprende ASCII al suo interno.
-Nei sistemi che supportano interamente Unicode,
-un carattere pu@`o occupare fino a 32 bit, facendo diventare
-i semplici test usati qui eccessivamente complessi.}
-Sebbene un byte a
-8 bit possa contenere 256 valori distinti (da 0 a 255), ASCII definisce solo i
-caratteri che usano i valori da 0 a 127.@footnote{ASCII
-@`e stato esteso in molti paesi per usare i valori da 128 a 255 includendo
-i caratteri specifici del paese. Se il sistema in uso si avvale di queste
-estensioni, si pu@`o semplificare @code{_ord_init()} per eseguire un ciclo da
-0 a 255.} Nel lontano passato,
-almeno un produttore di microcomputer
-@c Pr1me, blech
-ha usato ASCII, ma con una parit@`a di tipo @dfn{mark}, cio@`e con il bit pi@`u a
-sinistra sempre a 1. Questo significa che su questi sistemi i caratteri
-ASCII hanno valori numerici da 128 a 255.
-Infine, i grandi elaboratori centrali usano la serie di caratteri EBCDIC, che
-prevede tutti i 256 valori.
-Ci sono altre serie di caratteri in uso su alcuni sistemi pi@`u vecchi, ma non
-vale la pena di considerarli:
-
-@example
-@c file eg/lib/ord.awk
-function ord(str, c)
-@{
- # solo il primo carattere @`e d'interesse
- c = substr(str, 1, 1)
- return _ord_[c]
-@}
-
-function chr(c)
-@{
- # trasforma c in un numero aggiungendo uno 0
- return sprintf("%c", c + 0)
-@}
-@c endfile
-
-#### programma di verifica ####
-# BEGIN @{
-# for (;;) @{
-# printf("immetti un carattere: ")
-# if (getline var <= 0)
-# break
-# printf("ord(%s) = %d\n", var, ord(var))
-# @}
-# @}
-@c endfile
-@end example
-
-Un ovvio miglioramento a queste funzioni @`e quello di spostare il codice per la
-funzione @code{@w{_ord_init}} nel corpo della regola @code{BEGIN}.
-Il programma @`e
-stato scritto inizialmente in questo modo per comodit@`a di sviluppo.
-C'@`e un ``programma di verifica'' in una regola @code{BEGIN}, per verificare
-la funzione. @`E commentato, per poter essere eventualmente usato in produzione.
-
-@node Funzione join
-@subsection Trasformare un vettore in una sola stringa
-
-@cindex libreria di funzioni @command{awk}, trasformare vettori in stringhe
-@cindex funzioni, libreria di, trasformare vettori in stringhe
-@cindex stringhe, trasformare vettori in
-@cindex vettori, trasformare in stringhe
-Quando si fanno elaborazioni su stringhe, spesso @`e utile poter unire
-tutte le stringhe di un vettore in una lunga stringa. La funzione seguente,
-@code{join()}, svolge questo compito. Verr@`a utilizzata nel seguito in diversi
-programmi applicativi
-@iftex
-(@pxrefil{Programmi di esempio}).
-@end iftex
-@ifnottex
-(@pxref{Programmi di esempio}).
-@end ifnottex
-
-La buona progettazione di una funzione @`e importante; la funzione dev'essere
-generale, ma potrebbe anche avere un ragionevole comportamento di default.
-Viene chiamata con un vettore e anche con gli indici iniziale e finale degli
-elementi del vettore da riunire.
-Questo presuppone che gli indici del vettore
-siano numerici---una supposizione logica, dato che il vettore probabilmente @`e
-stato creato con @code{split()}
-(@pxref{Funzioni per stringhe}):
-
-@cindex @code{join()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{join()}
-@example
-@c file eg/lib/join.awk
-# join.awk --- trasforma un vettore in una stringa
-@c endfile
-@ignore
-@c file eg/lib/join.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/lib/join.awk
-
-function join(vettore, iniz, fine, separ, risultato, i)
-@{
- if (separ == "")
- separ = " "
- else if (separ == SUBSEP) # valore magico
- separ = ""
- risultato = vettore[iniz]
- for (i = iniz + 1; i <= fine; i++)
- risultato = risultato separ vettore[i]
- return risultato
-@}
-@c endfile
-@end example
-
-Un ulteriore argomento opzionale @`e il separatore da usare quando si uniscono
-nuovamente le stringhe. Se il chiamante fornisce un valore non nullo,
-@code{join()} usa quello; se non viene fornito,
-per default ha un valore nullo.
-In questo caso, @code{join()} usa uno spazio singolo come separatore
-di default
-per le stringhe. Se il valore @`e uguale a @code{SUBSEP},
-@code{join()} unisce le stringhe senza un separatore tra di esse.
-@code{SUBSEP} serve come valore ``magico'' per indicare che potrebbe non esserci
-un separatore tra le stringhe componenti.@footnote{Sarebbe bello
-se @command{awk} avesse un operatore di assegnamento per la concatenazione.
-La mancanza di un esplicito operatore per la concatenazione rende le operazioni
-sulle stringhe pi@`u difficili di quanto potrebbero essere.}
-
-@node Funzione getlocaltime
-@subsection Gestione dell'ora del giorno
-
-@cindex libreria di funzioni @command{awk}, gestire ora del giorno (marcature temporali)
-@cindex funzioni, libreria di, gestione delle ore del giorno
-@cindex data e ora, formattate
-@cindex marcature temporali, formattate
-@cindex ora del giorno, gestire
-Le funzioni @code{systime()} e @code{strftime()} descritte nella
-@ref{Funzioni di tempo}
-forniscono la funzionalit@`a minima necessaria per visualizzare l'ora del giorno
-in una forma intelligibile. Sebbene @code{strftime()} offra un'ampia gamma di
-formattazioni, i formati di controllo non sono facili da ricordare o
-intuitivamente ovvii quando si legge un programma.
-
-La seguente funzione, @code{getlocaltime()}, riempie un vettore fornito
-dall'utente con informazioni sul tempo preformattate. Restituisce una stringa
-con data e ora corrente formattata come nel programma di utilit@`a @command{date}:
-
-@cindex @code{getlocaltime()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getlocaltime()}
-@example
-@c file eg/lib/gettime.awk
-# getlocaltime.awk --- ottiene l'ora del giorno in un formato usabile
-@c endfile
-@ignore
-@c file eg/lib/gettime.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993
-#
-@c endfile
-@end ignore
-@c file eg/lib/gettime.awk
-
-# Restituisce una stringa nel formato dell'output di date(1)
-# Riempie l'argomento del vettore time con valori individuali:
-# time["second"] -- secondi (0 - 59)
-# time["minute"] -- minuti (0 - 59)
-# time["hour"] -- ore (0 - 23)
-# time["althour"] -- ore (0 - 12)
-# time["monthday"] -- giorno del mese (1 - 31)
-# time["month"] -- mese dell'anno (1 - 12)
-# time["monthname"] -- nome del mese
-# time["shortmonth"] -- nome breve del mese
-# time["year"] -- anno modulo 100 (0 - 99)
-# time["fullyear"] -- anno completo
-# time["weekday"] -- giorno della settimana (domenica = 0)
-# time["altweekday"] -- giorno della settimana (luned@`{@dotless{i}} = 0)
-# time["dayname"] -- nome del giorno della settimana
-# time["shortdayname"] -- nome breve del giorno della settimana
-# time["yearday"] -- giorno dell'anno (0 - 365)
-# time["timezone"] -- abbreviazione del nome della zona di fuso orario
-# time["ampm"] -- designazione di AM o PM
-# time["weeknum"] -- numero della settimana, domenica primo giorno
-# time["altweeknum"] -- numero della settimana, luned@`{@dotless{i}} primmo giorno
-
-function getlocaltime(ora, ret, adesso, i)
-@{
- # ottiene data e ora una volta sola,
- # evitando chiamate di sistema non necessarie
- adesso = systime()
-
- # restituisce l'output in stile date(1)
-@c lun 8 giu 2015, 20.39.38, CEST
-@c "%a %e %b %Y , %H.%M.%S, %Z"
- ret = strftime("%a %e %b %Y, %H.%M.%S, %Z", adesso)
-
- # clear out target array
- delete time
-
- # immette i valori, forzando i valori numerici
- # a essere numerici aggiungendo uno 0
- time["second"] = strftime("%S", adesso) + 0
- time["minute"] = strftime("%M", adesso) + 0
- time["hour"] = strftime("%H", adesso) + 0
- time["althour"] = strftime("%I", adesso) + 0
- time["monthday"] = strftime("%d", adesso) + 0
- time["month"] = strftime("%m", adesso) + 0
- time["monthname"] = strftime("%B", adesso)
- time["shortmonth"] = strftime("%b", adesso)
- time["year"] = strftime("%y", adesso) + 0
- time["fullyear"] = strftime("%Y", adesso) + 0
- time["weekday"] = strftime("%w", adesso) + 0
- time["altweekday"] = strftime("%u", adesso) + 0
- time["dayname"] = strftime("%A", adesso)
- time["shortdayname"] = strftime("%a", adesso)
- time["yearday"] = strftime("%j", adesso) + 0
- time["timezone"] = strftime("%Z", adesso)
- time["ampm"] = strftime("%p", adesso)
- time["weeknum"] = strftime("%U", adesso) + 0
- time["altweeknum"] = strftime("%W", adesso) + 0
-
- return ret
-@}
-@c endfile
-@end example
-
-Gli indici di stringa sono pi@`u facili da usare e leggere rispetto ai
-vari formati
-richiesti da @code{strftime()}. Il programma @code{alarm} illustrato in
-@ref{Programma alarm}
-usa questa funzione.
-Una progettazione pi@`u generica della funzione @code{getlocaltime()}
-avrebbe permesso all'utente di fornire un valore di data e ora
-opzionale da usare al posto della data/ora corrente.
-
-@node Funzione readfile
-@subsection Leggere un intero file in una sola volta
-
-Spesso @`e conveniente avere il contenuto di un intero file disponibile
-in memoria, visto
-come un'unica stringa. Un modo chiaro e semplice per far ci@`o potrebbe essere
-questo:
-
-@example
-function readfile(file, temp, contenuto)
-@{
- if ((getline temp < file) < 0)
- return
-
- contenuto = temp
- while (getline temp < file) > 0)
- contenuto = contenuto RT tmp
-
- close(file)
- return contenuto
-@}
-@end example
-
-Questa funzione legge da @code{file} un record alla volta, ricostruendo
-l'intero contenuto del file nella variabile locale @code{contenuto}.
-Funziona, ma non @`e detto che sia efficiente.
-
-La funzione seguente, basata su un suggerimento di Denis Shirokov,
-legge l'intero contenuto del file in un colpo solo:
-
-@cindex @code{readfile()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{readfile()}
-@example
-@c file eg/lib/readfile.awk
-# readfile.awk --- legge un intero file in un colpo solo
-@c endfile
-@ignore
-@c file eg/lib/readfile.awk
-#
-# Idea originale di Denis Shirokov, cosmogen@@gmail.com, aprile 2013
-#
-@c endfile
-@end ignore
-@c file eg/lib/readfile.awk
-
-function readfile(file, temp, salva_rs)
-@{
- salva_rs = RS
- RS = "^$"
- getline temp < file
- close(file)
- RS = salva_rs
-
- return temp
-@}
-@c endfile
-@end example
-
-Funziona impostando @code{RS} a @samp{^$}, un'espressione regolare che
-non trova nessuna corrispondenza se il file ha un contenuto.
-@command{gawk}
-legge i dati dal file contenuto in @code{temp}, tentando di trovare una
-corrispondenza con @code{RS}.
-La ricerca dopo ogni lettura non ha mai successo, ma termina
-rapidamente, e quindi @command{gawk} inserisce in
-@code{temp} l'intero contenuto del file.
-(@xref{Record} per informazioni su @code{RT} e @code{RS}.)
-
-Se @code{file} @`e vuoto, il valore di ritorno @`e la stringa vuota.
-Quindi, il codice chiamante pu@`o usare qualcosa simile a questo:
-
-@example
-contenuto = readfile("/qualche/percorso")
-if (length(contenuto) == 0)
- # file vuoto @dots{}
-@end example
-
-La verifica serve a determinare se il file @`e vuoto o no. Una verifica
-equivalente potrebbe essere @samp{contenuto == ""}.
-
-@xref{Esempio di estensione Readfile} per una funzione di estensione
-anch'essa finalizzata a leggere un intero file in memoria.
-
-@node Apici alla shell
-@subsection Stringhe con apici da passare alla shell
-
-@c included by permission
-@ignore
-Date: Sun, 27 Jul 2014 17:16:16 -0700
-Message-ID: <CAKuGj+iCF_obaCLDUX60aSAgbfocFVtguG39GyeoNxTFby5sqQ@mail.gmail.com>
-Subject: Useful awk function
-From: Mike Brennan <mike@madronabluff.com>
-To: Arnold Robbins <arnold@skeeve.com>
-@end ignore
-
-Michael Brennan propone il seguente modello di programma,
-da lui usato spesso:
-
-@example
-#! /bin/sh
-
-awkp='
- @dots{}
- '
-
-@var{specifica_programma_da_eseguire} | awk "$awkp" | /bin/sh
-@end example
-
-Per esempio, un suo programma chiamato @command{flac-edit}@footnote{I
-file con suffisso @dfn{flac} contengono normalmente dei brani musicali.
-@command{metaflac} @`e un programma che permette di modificare
-le informazioni [@dfn{metadati}] contenute all'inizio di un file di tipo
-@dfn{flac}.} ha questa forma:
-
-@example
-$ @kbd{flac-edit -song="Whoope! That's Great" file.flac}
-@end example
-
-@command{flac-edit} genera in output il seguente script, da passare alla
-shell (@file{/bin/sh}) per essere eseguito:
-
-@example
-chmod +w file.flac
-metaflac --remove-tag=TITLE file.flac
-LANG=en_US.88591 metaflac --set-tag=TITLE='Whoope! That'"'"'s Great' file.flac
-chmod -w file.flac
-@end example
-
-Si noti la necessit@`a di gestire gli apici nello script da passare alla shell.
-La funzione
-@code{shell_quote()} li prepara nel formato richiesto.
-@code{SINGLE} @`e la stringa di un solo
-carattere @code{"'"} e @code{QSINGLE} @`e la stringa di tre caratteri
-@code{"\"'\""}:
-
-@example
-@c file eg/lib/shellquote.awk
-# shell_quote --- pone tra apici un argomento da passare alla shell
-@c endfile
-@ignore
-@c file eg/lib/shellquote.awk
-#
-# Michael Brennan
-# brennan@@madronabluff.com
-# September 2014
-@c endfile
-@end ignore
-@c file eg/lib/shellquote.awk
-
-function shell_quote(s, # parametro
- SINGLE, QSINGLE, i, X, n, ret) # variabili locali
-@{
- if (s == "")
- return "\"\""
-
- SINGLE = "\x27" # apice singolo
- QSINGLE = "\"\x27\"" # apice singolo incapsulato
- n = split(s, X, SINGLE)
-
- ret = SINGLE X[1] SINGLE
- for (i = 2; i <= n; i++)
- ret = ret QSINGLE SINGLE X[i] SINGLE
-
- return ret
-@}
-@c endfile
-@end example
-
-@node Gestione File Dati
-@section Gestione di @value{DF}
-
-@cindex file, gestione di
-@cindex gestione di file
-@cindex libreria di funzioni @command{awk}, gestire file di dati
-@cindex funzioni, libreria di, gestire file di dati
-Questa @value{SECTION} presenta funzioni utili per gestire
-@value{DF} da riga di comando.
-
-@menu
-* Funzione filetrans:: Una funzione per gestire il passaggio da un
- file in input al successivo.
-* Funzione rewind:: Una funzione per rileggere il file in input.
-* Controllo di file:: Controllare che i file in input siano
- accessibili.
-* File vuoti:: Controllare se i file in input sono vuoti.
-* Ignorare assegnamenti di variabili:: Trattare assegnamenti di variabili.
- come nomi di file.
-@end menu
-
-@node Funzione filetrans
-@subsection Trovare i limiti dei @value{DF}
-
-@cindex file, gestione di, limiti dei file-dati
-@cindex file, 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
-@command{awk} (@pxref{BEGIN/END}).
-Una volta noi (gli autori di @command{gawk}) siamo venuti in contatto
-con un utente che
-erroneamemnte pensava che le regole @code{BEGIN} venissero eseguite all'inizio
-di ogni @value{DF} e le regole @code{END} alla fine di ogni @value{DF}.
-
-Quando lo abbiamo informato che
-non era cos@`{@dotless{i}}, ci ha chiesto di aggiungere un nuovo criterio di ricerca speciale
-a @command{gawk}, chiamato @code{BEGIN_FILE} e @code{END_FILE}, che avesse il
-comportamento desiderato. Ci ha fornito anche il codice per far questo.
-
-Non @`e stato necessario aggiungere a @command{gawk} questi criteri di ricerca
-speciali; il lavoro si pu@`o fare tranquillamente usando @command{awk}, come
-illustrato nel seguente programma di libreria. @`E strutturato in modo da
-chiamare due funzioni fornite dall'utente, @code{a_inizio_file()} e
-@code{a_fine_file()}, all'inizio e alla fine di ogni @value{DF}. Oltre a risolvere
-il problema in sole nove(!) righe di codice,
-questa soluzione @`e @emph{portabile}; il
-programma funziona con qualsiasi implementazione di @command{awk}:
-
-@example
-# transfile.awk
-#
-# Dare all'utente un aggancio per il passaggio
-# da un file in input a quello successivo
-#
-# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
-# ciascuna delle quali @`e invocata
-# quando il file, rispettivamente,
-# inizia e finisce.
-@c #
-@c # Arnold Robbins, arnold@@skeeve.com, Public Domain
-@c # January 1992
-
-FILENAME != _nome_file_vecchio @{
- if (_nome_file_vecchio != "")
- a_fine_file(_nome_file_vecchio)
- _nome_file_vecchio = FILENAME
- a_inizio_file(FILENAME)
-@}
-
-END @{ a_fine_file(FILENAME) @}
-@end example
-
-Questo file [transfile.awk] dev'essere caricato prima del programma
-``principale'' dell'utente,
-in modo che la regola ivi contenuta venga eseguita per prima.
-
-Questa regola dipende dalla variabile di @command{awk} @code{FILENAME}, che
-cambia automaticamente per ogni nuovo @value{DF}. Il @value{FN} corrente viene
-salvato in una variabile privata, @code{_nome_file_vecchio}. Se @code{FILENAME} non @`e
-uguale a @code{_nome_file_vecchio}, inizia l'elaborazioone di un nuovo @value{DF} ed
-@`e necessario chiamare @code{a_fine_file()} per il vecchio file. Poich@'e
-@code{a_fine_file()} dovrebbe essere chiamato solo se un file @`e stato elaborato, il
-programma esegue prima un controllo per assicurarsi che @code{_nome_file_vecchio} non
-sia la stringa nulla. Il programma assegna poi il valore corrente di
-@value{FN} a @code{_nome_file_vecchio} e chiama @code{a_inizio_file()} per il file.
-Poich@'e, come tutte le variabili di @command{awk}, @code{_nome_file_vecchio} @`e
-inizializzato alla stringa nulla, questa regola viene eseguita correttamente
-anche per il primo @value{DF}.
-
-Il programma contiene anche una regola @code{END} per completare l'elaborazione
-per l'ultimo file. Poich@'e questa regola @code{END} viene prima di qualsiasi
-regola @code{END} contenuta nel programma ``principale'',
-@code{a_fine_file()} viene
-chiamata per prima. Ancora una volta, l'utilit@`a di poter avere pi@`u regole
-@code{BEGIN} ed @code{END} dovrebbe risultare chiara.
-
-@cindex @code{a_inizio_file()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{a_inizio_file()}
-@cindex @code{a_fine_file()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{a_fine_file()}
-Se lo stesso @value{DF} compare due volte di fila sulla riga di comando,
-@code{a_fine_file()} e @code{a_inizio_file()} non vengono eseguite alla fine del primo
-passaggio e all'inizio del secondo passaggio.
-La versione seguente risolve il problema:
-
-@example
-@c file eg/lib/ftrans.awk
-# ftrans.awk --- gestisce il passaggio da un file dati al successivo
-#
-# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
-@c endfile
-@ignore
-@c file eg/lib/ftrans.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# November 1992
-@c endfile
-@end ignore
-@c file eg/lib/ftrans.awk
-
-FNR == 1 @{
- if (_filename_ != "")
- a_fine_file(_filename_)
- _filename_ = FILENAME
- a_inizio_file(FILENAME)
-@}
-
-END @{ a_fine_file(_filename_) @}
-@c endfile
-@end example
-
-@iftex
-La
-@end iftex
-@ref{Programma wc}
-mostra come utilizzare questa funzione di libreria e come ci@`o
-semplifichi la scrittura del programma principale.
-
-@cindex sidebar, Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?
-@ifdocbook
-@docbook
-<sidebar><title>Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?</title>
-@end docbook
-
-
-Ci si chieder@`a, probabilmente: perch@'e, se le funzioni @code{a_inizio_file()} e
-@code{a_fine_file()} possono eseguire il compito, @command{gawk} prevede i
-criteri di
-ricerca @code{BEGINFILE} e @code{ENDFILE}?
-
-Buona domanda. Normalmente, se @command{awk} non riesce ad aprire un file,
-questo fatto
-provoca un errore fatale immediato. In tal caso, per una funzione definita
-dall'utente non vi @`e alcun modo di affrontare il problema, giacch@'e la
-chiamata verrebbe effettuata
-solo dopo aver aperto il file e letto il primo record.
-Quindi, la ragione principale di @code{BEGINFILE} @`e quella di dare un
-``aggancio'' per gestire i file che non posso essere elaborati.
-@code{ENDFILE} esiste per simmetria, e perch@'e consente facilmente
-una pulizia "file per file". Per maggiori informazioni si faccia
-riferimento alla @ref{BEGINFILE/ENDFILE}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?}
-
-
-
-Ci si chieder@`a, probabilmente: perch@'e, se le funzioni @code{a_inizio_file()} e
-@code{a_fine_file()} possono eseguire il compito, @command{gawk} prevede i
-criteri di
-ricerca @code{BEGINFILE} e @code{ENDFILE}?
-
-Buona domanda. Normalmente, se @command{awk} non riesce ad aprire un file,
-questo fatto
-provoca un errore fatale immediato. In tal caso, per una funzione definita
-dall'utente non vi @`e alcun modo di affrontare il problema, giacch@'e la
-chiamata verrebbe effettuata
-solo dopo aver aperto il file e letto il primo record.
-Quindi, la ragione principale di @code{BEGINFILE} @`e quella di dare un
-``aggancio'' per gestire i file che non posso essere elaborati.
-@code{ENDFILE} esiste per simmetria, e perch@'e consente facilmente
-una pulizia "file per file". Per maggiori informazioni si faccia
-riferimento alla @ref{BEGINFILE/ENDFILE}.
-@end cartouche
-@end ifnotdocbook
-
-@node Funzione rewind
-@subsection Rileggere il file corrente
-
-@cindex file, leggere un
-@cindex file, rileggere un
-Un'altra richiesta per una nuova funzione predefinita @`e stata per
-una funzione per rileggere il file corrente.
-L'utente che l'ha richiesta non voleva dover usare @code{getline}
-(@pxref{Getline})
-all'interno di un ciclo.
-
-Comunque, se non si @`e nella regola @code{END}, @`e piuttosto facile
-fare in modo di chiudere il corrente file in input immediatamente
-e ricominciare a leggerlo dall'inizio.
-In mancanza di un nome migliore, chiameremo la funzione @code{rewind()}:
-
-@cindex @code{rewind()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{rewind()}
-@example
-@c file eg/lib/rewind.awk
-# rewind.awk --- ricarica il file corrente e ricomincia a leggerlo
-@c endfile
-@ignore
-@c file eg/lib/rewind.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# September 2000
-@c endfile
-@end ignore
-@c file eg/lib/rewind.awk
-
-function rewind( i)
-@{
- # sposta in alto i rimanenti argomenti
- for (i = ARGC; i > ARGIND; i--)
- ARGV[i] = ARGV[i-1]
-
- # assicurarsi che gawk sappia raggiungerli
- ARGC++
-
- # fa s@`{@dotless{i}} che il file corrente sia il prossimo a essere letto
- ARGV[ARGIND+1] = FILENAME
-
- # do it
- nextfile
-@}
-@c endfile
-@end example
-
-La funzione @code{rewind()} dipende dalla variabile @code{ARGIND}
-(@pxref{Variabili auto-assegnate}), che @`e specifica di @command{gawk}. Dipende anche
-dalla parola chiave @code{nextfile} (@pxref{Istruzione nextfile}).
-Perci@`o, non si dovrebbe chiamarla da una regola @code{ENDFILE}.
-(Non sarebbe peraltro necessario, perch@'e @command{gawk} legge il file
-successivo non appena la regola @code{ENDFILE} finisce!)
-
-Occorre prestare attenzione quando si chiama @code{rewind()}. Si pu@`o
-provocare una ricorsione infinita se non si sta attenti. Ecco un
-esempio di uso:
-
-@example
-$ @kbd{cat dati}
-@print{} a
-@print{} b
-@print{} c
-@print{} d
-@print{} e
-
-$ cat @kbd{test.awk}
-@print{} FNR == 3 && ! riavvolto @{
-@print{} riavvolto = 1
-@print{} rewind()
-@print{} @}
-@print{}
-@print{} @{ print FILENAME, FNR, $0 @}
-
-$ @kbd{gawk -f rewind.awk -f test.awk dati }
-@print{} data 1 a
-@print{} data 2 b
-@print{} data 1 a
-@print{} data 2 b
-@print{} data 3 c
-@print{} data 4 d
-@print{} data 5 e
-@end example
-
-@node Controllo di file
-@subsection Controllare che i @value{DF} siano leggibili
-
-@cindex risoluzione di problemi, leggibilit@`a file-dati
-@cindex leggibilit@`a, file-dati@comma{} controllare la
-@cindex file, non elaborare
-Normalmente, se si fornisce ad @command{awk} un @value{DF} che non @`e leggibile,
-il programma
-si arresta con un errore fatale. Ci sono casi in cui sarebbe preferibile
-ignorare semplicemente questi file e proseguire.@footnote{Il criterio di
-ricerca speciale @code{BEGINFILE} (@pxref{BEGINFILE/ENDFILE}) fornisce un
-meccanismo alternativo per trattare i file che non sono leggibili.
-Tuttavia, il codice qui proposto fornisce una soluzione portabile.}
-Si pu@`o far questo facendo precedere il proprio programma @command{awk} dal
-seguente programma:
-
-@cindex @code{readable.awk}, programma
-@example
-@c file eg/lib/readable.awk
-# readable.awk --- file di libreria per saltare file non leggibili
-@c endfile
-@ignore
-@c file eg/lib/readable.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# October 2000
-# December 2010
-@c endfile
-@end ignore
-@c file eg/lib/readable.awk
-
-BEGIN @{
- for (i = 1; i < ARGC; i++) @{
- if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
- || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
- continue # assegnamento di variabile o standard input
- else if ((getline aperdere < ARGV[i]) < 0) # file non leggibile
- delete ARGV[i]
- else
- close(ARGV[i])
- @}
-@}
-@c endfile
-@end example
-
-@cindex risoluzione di problemi, funzione @code{getline}
-@cindex comando @code{getline}, risoluzione di problemi
-@cindex @code{getline}, comando, risoluzione di problemi
-Questo codice funziona, perch@'e l'errore di @code{getline} non @`e fatale.
-Rimuovendo l'elemento da @code{ARGV} con @code{delete}
-si tralascia il file (perch@'e non @`e pi@`u nella lista).
-Si veda anche @ref{ARGC e ARGV}.
-
-Poich@'e per i nomi delle variabili @command{awk} si possono usare solo lettere
-dell'alfabeto inglese, di proposito il controllo con espressioni regolari
-non usa classi di
-carattere come @samp{[:alpha:]} e @samp{[:alnum:]}
-(@pxref{Espressioni tra parentesi quadre}).
-
-@node File vuoti
-@subsection Ricerca di file di lunghezza zero
-
-Tutte le implementazioni note di @command{awk} ignorano senza
-mandare alcun messaggio i file di
-lunghezza zero. Questo @`e un effetto collaterale del ciclo implicito di
-@command{awk} "leggi un record e confrontalo con le regole": quando
-@command{awk} cerca di leggere un record da un file vuoto, riceve immediatamente
-un'indicazione di fine-file [@dfn{end-of-file}], chiude il file,
-e prosegue con il
-successivo @value{DF} presente nella riga di comando, @emph{senza}
-eseguire alcun codice
-di programma @command{awk} a livello di utente.
-
-Usando la variabile @code{ARGIND} di @command{gawk}
-(@pxref{Variabili predefinite}), @`e possibile accorgersi quando un @value{DF}
-@`e stato saltato. Simile al file di libreria illustrato in
-@ref{Funzione filetrans}, il seguente file di libreria chiama una funzione
-di nome @code{zerofile()} che l'utente deve fornire. Gli argomenti passati
-sono il @value{FN} e la posizione del file in @code{ARGV}:
-
-@cindex @code{zerofile.awk}, programma
-@example
-@c file eg/lib/zerofile.awk
-# zerofile.awk --- file di libreria per elaborare file in input vuoti
-@c endfile
-@ignore
-@c file eg/lib/zerofile.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# June 2003
-@c endfile
-@end ignore
-@c file eg/lib/zerofile.awk
-
-BEGIN @{ Argind = 0 @}
-
-ARGIND > Argind + 1 @{
- for (Argind++; Argind < ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-
-ARGIND != Argind @{ Argind = ARGIND @}
-
-END @{
- if (ARGIND > Argind)
- for (Argind++; Argind <= ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-@c endfile
-@end example
-
-La variabile definita dall'utente @code{Argind} permette al programma
-@command{awk}
-di tracciare il suo percorso all'interno di @code{ARGV}. Ogniqualvolta il
-programma rileva che @code{ARGIND} @`e maggiore di @samp{Argind + 1}, vuol dire
-che uno o pi@`u file vuoti sono stati tralasciati. L'azione chiama poi
-@code{zerofile()} per ogni file che @`e stato saltato, incrementando
-ogni volta @code{Argind}.
-
-La regola @samp{Argind != ARGIND} tiene semplicemente aggiornato @code{Argind}
-nel caso che non ci siano file vuoti.
-
-Infine, la regola @code{END} prende in considerazione il caso di un qualsiasi
-file vuoto alla fine degli argomenti nella riga di comando. Si noti che nella
-condizione del ciclo @code{for}, la verifica usa l'operatore @samp{<=}, non
-@samp{<}.
-
-@node Ignorare assegnamenti di variabili
-@subsection Trattare assegnamenti di variabile come @value{FNS}
-
-@cindex assegnamenti di variabile, visti come nomi di file
-@cindex file, nomi di, assegnamenti di variabile visti come
-@cindex nomi di file, assegnamenti di variabile visti come
-Occasionalmente, potrebbe essere pi@`u opportuno che @command{awk} non elabori gli
-assegnamenti di variabile presenti sulla riga di comando
-(@pxref{Opzioni di assegnamento}).
-In particolare, se si ha un @value{FN} che contiene un carattere @samp{=},
-@command{awk} tratta il @value{FN} come un assegnamento e non lo elabora.
-
-Alcuni utenti hanno suggerito un'opzione aggiuntiva da riga di comando per
-@command{gawk} per disabilitare gli assegnamenti dati sulla riga di comando.
-Comunque, poche righe di codice di programmazione in un file di libreria
-hanno lo stesso effetto:
-
-@cindex @code{noassign.awk}, programma
-@cindex programma @code{noassign.awk}
-@example
-@c file eg/lib/noassign.awk
-# noassign.awk --- file di libreria per evitare la necessit@`a
-# di una speciale opzione per disabilitare gli assegnamenti da
-# riga di comando
-@c endfile
-@ignore
-@c file eg/lib/noassign.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# October 1999
-@c endfile
-@end ignore
-@c file eg/lib/noassign.awk
-
-function disable_assigns(argc, argv, i)
-@{
- for (i = 1; i < argc; i++)
- if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
- argv[i] = ("./" argv[i])
-@}
-
-BEGIN @{
- if (Disabilita_variabili)
- disable_assigns(ARGC, ARGV)
-@}
-@c endfile
-@end example
-
-Il programma va poi eseguito in questo modo:
-
-@example
-awk -v Disabilita_variabili=1 -f noassign.awk -f vostro_programma.awk *
-@end example
-
-La funzione esegue un ciclo che esamina ogni argomento.
-Antepone @samp{./} a
-qualsiasi argomento che abbia la forma di un assegnamento
-di variabile, trasformando cos@`{@dotless{i}} quell'argomento in un @value{FN}.
-
-L'uso di @code{Disabilita_variabili} consente di disabilitare assegnamenti di
-variabile dati sulla riga di comando al momento dell'invocazione,
-assegnando alla variabile un valore @dfn{vero}.
-Se non viene impostata la variabile @`e inizializzata a zero (cio@`e
-@dfn{falso}), e gli argomenti sulla riga di comando
-non vengono modificati.
-
-@node Funzione getopt
-@section Elaborare opzioni specificate sulla riga di comando
-
-@cindex libreria di funzioni @command{awk}, opzioni sulla riga di comando
-@cindex funzioni, libreria di, opzioni sulla riga di comando
-@cindex riga di comando, opzioni, elaborazione di
-@cindex opzioni sulla riga di comando, elaborazione di
-@cindex funzioni, libreria di, libreria C
-@cindex argomenti, elaborazione di
-La maggior parte dei programmi di utilit@`a su sistemi compatibili con POSIX
-prevedono opzioni presenti sulla riga di comando che possono essere usate per
-cambiare il modo in cui un programma si comporta. @command{awk} @`e un esempio di
-tali programmi (@pxref{Opzioni}).
-Spesso le opzioni hanno degli @dfn{argomenti} (cio@`e, dati che servono al
-programma per eseguire correttamente le opzioni specificate
-sulla riga di comando).
-Per esempio, l'opzione @option{-F} di @command{awk} richiede di usare la stringa
-specificata
-come separatore di campo. La prima occorrenza, sulla riga di comando, di
-@option{--} o di una stringa che non inizia con @samp{-} segnala la fine
-delle opzioni.
-
-@cindex @code{getopt()}, funzione (libreria C)
-@cindex funzione @code{getopt()} (libreria C)
-I moderni sistemi Unix hanno una funzione C chiamata @code{getopt()} per
-elaborare gli argomenti presenti
-sulla riga di comando. Il programmatore fornisce una
-stringa che descrive le opzioni, ognuna delle quali consiste di
-una sola lettera. Se un'opzione richiede un
-argomento, nella stringa l'opzione @`e seguita da due punti.
-A @code{getopt()} vengono anche
-passati il numero e i valori degli argomenti presenti sulla riga di comando
-e viene chiamata in un ciclo.
-@code{getopt()} scandisce gli argomenti della riga di comando cercando
-le lettere delle opzioni.
-A ogni passaggio del ciclo restituisce un carattere
-singolo che rappresenta la successiva lettera di opzione trovata, o @samp{?}
-se viene trovata un'opzione non prevista.
-Quando restituisce @minus{}1, non ci sono ulteriori
-opzioni da trattare sulla riga di comando.
-
-Quando si usa @code{getopt()}, le opzioni che non prevedono argomenti
-possono essere raggruppate.
-Inoltre, le opzioni che hanno argomenti richiedono obbligatoriamente che
-l'argomento sia specificato.
-L'argomento pu@`o seguire immediatamente la lettera
-dell'opzione, o pu@`o costituire un argomento separato sulla riga di comando.
-
-Dato un ipotetico programma che ha tre opzioni sulla riga di comando,
-@option{-a}, @option{-b} e @option{-c}, dove
-@option{-b} richiede un argomento, tutti i seguenti sono modi validi per
-invocare il programma:
-
-@example
-programma -a -b pippo -c dati1 dati2 dati3
-programma -ac -bpippo -- dati1 dati2 dati3
-programma -acbpippo dati1 dati2 dati3
-@end example
-
-Si noti che quando l'argomento @`e raggruppato con la sua opzione,
-la parte rimanente
-dell'argomento @`e considerato come argomento dell'opzione.
-In quest'esempio, @option{-acbpippo} indica che tutte le opzioni
-@option{-a}, @option{-b} e @option{-c} sono presenti,
-e che @samp{pippo} @`e l'argomento dell'opzione @option{-b}.
-
-@code{getopt()} fornisce quattro variabili esterne a disposizione del
-programmatore:
-
-@table @code
-@item optind
-L'indice nel vettore dei valori degli argomenti (@code{argv}) dove si pu@`o
-trovare il primo argomento sulla riga di comando che non sia un'opzione.
-
-@item optarg
-Il valore (di tipo stringa) dell'argomento di un'opzione.
-
-@item opterr
-Solitamente @code{getopt()} stampa un messaggio di errore quando trova un'opzione
-non valida. Impostando @code{opterr} a zero si disabilita questa funzionalit@`a.
-(un'applicazione potrebbe voler stampare un proprio messaggio di errore.)
-
-@item optopt
-La lettera che rappresenta l'opzione sulla riga di comando.
-@end table
-
-Il seguente frammento di codice C mostra come @code{getopt()} potrebbe
-elaborare gli argomenti della riga di comando per @command{awk}:
-
-@example
-int
-main(int argc, char *argv[])
-@{
- @dots{}
- /* stampa un appropriato messaggio */
- opterr = 0;
- while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{
- switch (c) @{
- case 'f': /* file */
- @dots{}
- break;
- case 'F': /* separatore di campo */
- @dots{}
- break;
- case 'v': /* assegnamento di variabile */
- @dots{}
- break;
- case 'W': /* estensione */
- @dots{}
- break;
- case '?':
- default:
- messaggio_di_aiuto();
- break;
- @}
- @}
- @dots{}
-@}
-@end example
-
-Incidentalmente, @command{gawk} al suo interno usa la funzione GNU
-@code{getopt_long()} per elaborare sia le normali opzioni che quelle lunghe
-in stile GNU
-(@pxref{Opzioni}).
-
-L'astrazione fornita da @code{getopt()} @`e molto utile ed @`e piuttosto comoda
-anche nei programmi @command{awk}. Di seguito si riporta una versione
-@command{awk} di @code{getopt()}. Questa funzione mette in evidenza uno dei
-maggiori punti deboli di @command{awk}, che @`e quello di essere molto carente
-nella manipolazione di caratteri singoli. Sono necessarie ripetute chiamate a
-@code{substr()} per accedere a caratteri singoli.
-(@pxref{Funzioni per stringhe}).@footnote{Questa funzione
-@`e stata scritta prima che @command{gawk} acquisisse la capacit@`a di
-dividere le stringhe in caratteri singoli usando @code{""} come separatore.
-@`E stata lasciata cos@`{@dotless{i}}, poich@'e l'uso di @code{substr()} @`e pi@`u portabile.}
-
-La spiegazione della funzione viene data
-man mano che si elencano i pezzi di codice che la compongono:
-
-@cindex @code{getopt()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getopt()}
-@example
-@c file eg/lib/getopt.awk
-# getopt.awk --- imita in awk la funzione di libreria C getopt(3)
-@c endfile
-@ignore
-@c file eg/lib/getopt.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-#
-# Initial version: March, 1991
-# Revised: May, 1993
-@c endfile
-@end ignore
-@c file eg/lib/getopt.awk
-
-# Variabili esterne:
-# Optind -- indice in ARGV del primo argomento che non @`e un'opzione
-# Optarg -- valore di tipo stringa dell'argomento dell'opzione corrente
-# Opterr -- se diverso da zero, viene stampato un messaggio diagnostico
-# Optopt -- lettera dell'opzione corrente
-
-# Restituisce:
-# -1 alla fine delle opzioni
-# "?" per un'opzione non riconosciuta
-# <c> un carattere che rappresenta l'opzione corrente
-
-# Dati privati:
-# _opti -- indice in un'opzione multipla, p.es., -abc
-@c endfile
-@end example
-
-La funzione inizia con commenti che elencano e descrivono le variabili globali
-utilizzate, spiegano quali sono i valori di ritorno, il loro significato, e
-ogni altra variabile che @`e
-``esclusiva'' a questa funzione di libreria. Tale
-documentazione @`e essenziale per qualsiasi programma, e in modo particolare per
-le funzioni di libreria.
-
-La funzione @code{getopt()} dapprima controlla che sia stata effettivamente
-chiamata con una stringa di opzioni (il parametro @code{opzioni}). Se
-@code{opzioni} ha lunghezza zero, @code{getopt()} restituisce immediatamente
-@minus{}1:
-
-@cindex @code{getopt()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getopt()}
-@example
-@c file eg/lib/getopt.awk
-function getopt(argc, argv, opzioni, unaopz, i)
-@{
- if (length(opzioni) == 0) # nessuna opzione specificata
- return -1
-
-@group
- if (argv[Optind] == "--") @{ # fatto tutto
- Optind++
- _opti = 0
- return -1
-@end group
- @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{
- _opti = 0
- return -1
- @}
-@c endfile
-@end example
-
-Il successivo controllo cerca la fine delle opzioni. Due trattini
-(@option{--}) marcano la fine delle opzioni da riga di comando, e lo stesso
-fa qualsiasi
-argomento sulla riga di comando che non inizi con @samp{-}. @code{Optind} @`e
-usato per scorrere il vettore degli argomenti presenti sulla riga di comando;
-mantiene il suo valore attraverso chiamate successive a @code{getopt()}, perch@'e
-@`e una variabile globale.
-
-L'espressione regolare che viene usata, @code{@w{/^-[^:[:space:]/}},
-chiede di cercare un
-@samp{-} seguito da qualsiasi cosa che non sia uno spazio vuoto o un carattere
-di due punti. Se l'argomento corrente sulla riga di comando non corrisponde a
-quest'espressione regolare, vuol dire che non si tratta di un'opzione, e
-quindi viene terminata l'elaborazione delle opzioni. Continuando:
-
-@example
-@c file eg/lib/getopt.awk
- if (_opti == 0)
- _opti = 2
- unaopz = substr(argv[Optind], _opti, 1)
- Optopt = unaopz
- i = index(opzioni, unaopz)
- if (i == 0) @{
- if (Opterr)
- printf("%c -- opzione non ammessa\n", unaopz) > "/dev/stderr"
- if (_opti >= length(argv[Optind])) @{
- Optind++
- _opti = 0
- @} else
- _opti++
- return "?"
- @}
-@c endfile
-@end example
-
-La variabile @code{_opti} tiene traccia della posizione nell'argomento
-della riga di comando correntemente in esame
-(@code{argv[Optind]}). Se opzioni multiple sono
-raggruppate con un @samp{-} (p.es., @option{-abx}), @`e necessario
-restituirle all'utente una per volta.
-
-Se @code{_opti} @`e uguale a zero, viene impostato a due, ossia all'indice
-nella
-stringa del successivo carattere da esaminare (@samp{-}, che @`e alla
-posizione uno viene ignorato).
-La variabile @code{unaopz} contiene il carattere,
-ottenuto con @code{substr()}. Questo @`e salvato in @code{Optopt} per essere
-usato dal programma principale.
-
-Se @code{unaopz} non @`e nella stringa delle opzioni @code{opzioni},
-si tratta di un'opzione
-non valida. Se @code{Opterr} @`e diverso da zero, @code{getopt()} stampa un
-messaggio di errore sullo @dfn{standard error} che @`e simile al messaggio
-emesso dalla versione C di @code{getopt()}.
-
-Poich@'e l'opzione non @`e valida, @`e necessario tralasciarla e passare al successivo
-carattere di opzione. Se @code{_opti} @`e maggiore o uguale alla lunghezza
-dell'argomento corrente della riga di comando, @`e necessario passare al
-successivo argomento, in modo che @code{Optind} venga incrementato e
-@code{_opti} sia reimpostato a zero. In caso contrario, @code{Optind} viene
-lasciato com'@`e e @code{_opti} viene soltanto incrementato.
-
-In ogni caso, poich@'e l'opzione non @`e valida, @code{getopt()} restituisce
-@code{"?"}. Il programma principale pu@`o esaminare @code{Optopt} se serve
-conoscere quale lettera di opzione @`e quella non valida. Proseguendo:
-
-@example
-@c file eg/lib/getopt.awk
- if (substr(opzioni, i + 1, 1) == ":") @{
- # ottiene un argomento di opzione
- if (length(substr(argv[Optind], _opti + 1)) > 0)
- Optarg = substr(argv[Optind], _opti + 1)
- else
- Optarg = argv[++Optind]
- _opti = 0
- @} else
- Optarg = ""
-@c endfile
-@end example
-
-Se l'opzione richiede un argomento, la lettera di opzione @`e seguita da due punti
-nella stringa @code{opzioni}. Se rimangono altri caratteri nell'argomento
-corrente sulla riga di comando (@code{argv[Optind]}), il resto di quella stringa
-viene assegnato a @code{Optarg}. Altrimenti, viene usato il successivo
-argomento sulla riga di comando (@samp{-xFOO} piuttosto che
-@samp{@w{-x FOO}}). In
-entrambi i casi, @code{_opti} viene reimpostato a zero, perch@'e non ci sono altri
-caratteri da esaminare nell'argomento corrente sulla riga di comando.
-Continuando:
-
-@example
-@c file eg/lib/getopt.awk
- if (_opti == 0 || _opti >= length(argv[Optind])) @{
- Optind++
- _opti = 0
- @} else
- _opti++
- return unaopz
-@}
-@c endfile
-@end example
-
-Infine, se @code{_opti} @`e zero o maggiore della lunghezza dell'argomento
-corrente sulla riga di comando, significa che l'elaborazione di
-quest'elemento in @code{argv} @`e
-terminata, quindi @code{Optind} @`e incrementato per
-puntare al successivo elemento in @code{argv}. Se nessuna delle condizioni @`e
-vera, viene incrementato solo @code{_opti}, cosicch@'e la successiva lettera di
-opzione pu@`o essere elaborata con la successiva chiamata a @code{getopt()}.
-
-La regola @code{BEGIN} inizializza sia @code{Opterr} che @code{Optind} a uno.
-@code{Opterr} viene impostato a uno, perch@'e il comportamento di default per
-@code{getopt()} @`e quello di stampare un messaggio diagnostico dopo aver visto
-un'opzione non valida. @code{Optind} @`e impostato a uno, perch@'e non
-c'@`e alcun motivo
-per considerare il nome del programma, che @`e in @code{ARGV[0]}:
-
-@example
-@c file eg/lib/getopt.awk
-BEGIN @{
- Opterr = 1 # il default @`e eseguire una diagnosi
- Optind = 1 # salta ARGV[0]
-
- # programma di controllo
- if (_getopt_test) @{
- while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
- printf("c = <%c>, Optarg = <%s>\n",
- _go_c, Optarg)
- printf("argomenti che non sono opzioni:\n")
- for (; Optind < ARGC; Optind++)
- printf("\tARGV[%d] = <%s>\n",
- Optind, ARGV[Optind])
- @}
-@}
-@c endfile
-@end example
-
-Il resto della regola @code{BEGIN} @`e un semplice programma di controllo. Qui
-sotto si riportano i risultati di
-due esecuzioni di prova
-del programma di controllo:
-
-@example
-$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x}
-@print{} c = <a>, Optarg = <>
-@print{} c = <c>, Optarg = <>
-@print{} c = <b>, Optarg = <ARG>
-@print{} argomenti che non sono opzioni:
-@print{} ARGV[3] = <bax>
-@print{} ARGV[4] = <-x>
-
-$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc}
-@print{} c = <a>, Optarg = <>
-@error{} x -- opzione non ammessa
-@print{} c = <?>, Optarg = <>
-@print{} argomenti che non sono opzioni:
-@print{} ARGV[4] = <xyz>
-@print{} ARGV[5] = <abc>
-@end example
-
-In entrambe le esecuzioni, il primo @option{--} fa terminare gli argomenti dati
-ad @command{awk}, in modo che @command{awk} non tenti di interpretare le opzioni
-@option{-a}, etc. come sue opzioni.
-
-@quotation NOTA
-Dopo che @code{getopt()} @`e terminato,
-il codice a livello utente deve eliminare tutti gli elementi
-di @code{ARGV} da
-1 a @code{Optind}, in modo che @command{awk} non tenti di elaborare le opzioni
-sulla riga di comando come @value{FNS}.
-@end quotation
-
-Usare @samp{#!} con l'opzione @option{-E} pu@`o essere d'aiuto per evitare
-conflitti tra le opzioni del proprio programma e quelle di @command{gawk},
-poich@'e l'opzione @option{-E} fa s@`{@dotless{i}} che @command{gawk} abbandoni
-l'elaborazione di ulteriori opzioni.
-(@pxref{@dfn{Script} eseguibili} e
-@ifnotdocbook
-@pxref{Opzioni}).
-@end ifnotdocbook
-@ifdocbook
-@ref{Opzioni}).
-@end ifdocbook
-
-Molti degli esempi presentati in
-@ref{Programmi di esempio},
-usano @code{getopt()} per elaborare i propri argomenti.
-
-@node Funzioni Passwd
-@section Leggere la lista degli utenti
-
-@cindex libreria di funzioni @command{awk}, leggere la lista degli utenti
-@cindex funzioni, libreria di, leggera la lista degli utenti
-@cindex utenti, leggere la lista degli
-@cindex lista degli utenti@comma{} leggere la
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-Il vettore @code{PROCINFO}
-(@pxref{Variabili predefinite})
-d@`a accesso ai numeri ID reale ed effettivo dell'utente e del gruppo e, se
-disponibili, alla serie di gruppi ulteriori a cui l'utente appartiene.
-Comunque, poich@'e questi sono numeri, non forniscono informazioni molto utili per
-l'utente medio. Bisogna trovare un modo per reperire informazioni
-sull'utente associate con i numeri ID dell'utente e del gruppo. Questa
-@value{SECTION} illustra una raccolta di funzioni per ottenere le informazioni
-dalla lista gli utenti. @xref{Funzioni Group} per una raccolta di
-funzioni simili per ottenere informazioni dalla lista dei gruppi.
-
-@cindex @code{getpwent()}, funzione (libreria C)
-@cindex funzione @code{getpwent()} (libreria C)
-@cindex @code{getpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwent()}
-@cindex utenti, informazioni riguardo agli, ottenere
-@cindex login, informazioni
-@cindex account, informazioni sugli
-@cindex password, file delle
-@cindex file delle password
-Lo standard POSIX non definisce il file dove sono mantenute le informazioni
-degli utenti. Invece, fornisce il file d'intestazione @code{<pwd.h>}
-e diverse @dfn{subroutine} del linguaggio C per ottenere informazioni sugli
-utenti. La funzione primaria @`e @code{getpwent()}, che sta per ``get password
-entry''. La ``password'' proviene dal file originale della lista
-degli utenti, @file{/etc/passwd}, che contiene le informazioni sugli utenti
-assieme alle password criptate (da cui il nome).@footnote{Questo @`e
-vero per le versioni pi@`u antiche di Unix. In quelle pi@`u recenti,
-la @dfn{password} di ogni utente @`e stata trasferita nel file @file{/etc/shadow},
-un file non accessibile dall'utente normale. La struttura del file
-@file{/etc/passwd} @`e rimasta la stessa, ma al posto del campo @dfn{password}
-c'@`e una @code{x}.}
-
-@cindex @command{pwcat}, programma
-Sebbene un programma @command{awk} possa semplicemente leggere
-@file{/etc/passwd} direttamente, questo file pu@`o non contenere tutte le
-informazioni su tutti gli utenti del sistema.@footnote{Capita spesso che le
-informazioni sulla password siano memorizzate in una lista in rete.} Per
-essere sicuri di poter produrre una versione leggibile e completa della banca
-dati degli utenti, @`e necessario scrivere un piccolo programma in C che chiama
-@code{getpwent()}. @code{getpwent()} viene definita in modo da restituire un
-puntatore a una @code{struct passwd}. Ogni volta che viene chiamata,
-restituisce l'elemento successivo della lista. Quando non ci sono pi@`u
-elementi, restituisce @code{NULL}, il puntatore nullo. Quando accade ci@`o, il
-programma C dovrebbe chiamare @code{endpwent()} per chiudere la lista..
-Quel che segue @`e @command{pwcat}, un programma in C che ``concatena'' la
-lista delle password:
-
-@example
-@c file eg/lib/pwcat.c
-/*
- * pwcat.c
- *
- * Genera una versione stampabile della lista delle password.
- */
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-/*
- * Arnold Robbins, arnold@@skeeve.com, May 1993
- * Public Domain
- * December 2010, move to ANSI C definition for main().
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-#include <stdio.h>
-#include <pwd.h>
-
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-int
-main(int argc, char **argv)
-@{
- struct passwd *p;
-
- while ((p = getpwent()) != NULL)
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#ifdef ZOS_USS
- printf("%s:%ld:%ld:%s:%s\n",
- p->pw_name, (long) p->pw_uid,
- (long) p->pw_gid, p->pw_dir, p->pw_shell);
-#else
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
- printf("%s:%s:%ld:%ld:%s:%s:%s\n",
- p->pw_name, p->pw_passwd, (long) p->pw_uid,
- (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#endif
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-
- endpwent();
- return 0;
-@}
-@c endfile
-@end example
-
-Se non si conosce il linguaggio C, non @`e il caso di preoccuparsi.
-L'output di @command{pwcat} @`e la lista degli utenti, nel formato
-tradizionale del file @file{/etc/passwd} con campi separati da due punti.
-I campi sono:
-
-@table @asis
-@item Login name
-Il nome di login dell'utente.
-
-@item Encrypted password
-La password criptata dell'utente. Pu@`o non essere disponibile su alcuni sistemi.
-
-@item User-ID
-L'ID numerico dell'utente.
-(Su alcuni sistemi, @`e un numero di formato @code{long} [32bit]
-del linguaggio C, e non nel formato @code{int} [16bit].
-Quindi, lo cambieremo in @code{long} per sicurezza.)
-
-@item Group-ID
-L'ID di gruppo numerico dell'utente.
-(Valgono le stesse considerazioni su @code{long} al posto di @code{int}.)
-
-@item Full name
-Il nome completo dell'utente, e talora altre informazioni associate
-all'utente.
-
-@item Home directory
-La directory di login (o ``home'') (nota ai programmatori di shell come
-@code{$HOME}).
-
-@item Login shell
-Il programma che viene eseguito quando l'utente effettua l'accesso. Questo @`e
-comunemente una shell, come Bash.
-@end table
-
-Di seguito si riportano alcune righe di un possibile output di @command{pwcat}:
-
-@cindex Jacobs, Andrew
-@cindex Robbins, Arnold
-@cindex Robbins, Miriam
-@example
-$ @kbd{pwcat}
-@print{} root:x:0:1:Operator:/:/bin/sh
-@print{} nobody:x:65534:65534::/:
-@print{} daemon:x:1:1::/:
-@print{} sys:x:2:2::/:/bin/csh
-@print{} bin:x:3:3::/bin:
-@print{} arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/sh
-@print{} miriam:x:112:10:Miriam Robbins:/home/miriam:/bin/sh
-@print{} andy:x:113:10:Andy Jacobs:/home/andy:/bin/sh
-@dots{}
-@end example
-
-Dopo quest'introduzione, di seguito si riporta un gruppo di funzioni per
-ottenere informazioni sugli utenti. Ci sono diverse funzioni, che
-corrispondono alle omonime funzioni C:
-
-@cindex @code{_pw_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_pw_init()}
-@example
-@c file eg/lib/passwdawk.in
-# passwd.awk --- accedere alle informazioni del file delle password
-@c endfile
-@ignore
-@c file eg/lib/passwdawk.in
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised October 2000
-# Revised December 2010
-@c endfile
-@end ignore
-@c file eg/lib/passwdawk.in
-
-BEGIN @{
- # modificare per adattarlo al sistema in uso
- _pw_awklib = "/usr/local/libexec/awk/"
-@}
-
-function _pw_init( oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
-@{
- if (_pw_inizializzato)
- return
-
- oldfs = FS
- oldrs = RS
- olddol0 = $0
- using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
- using_fpat = (PROCINFO["FS"] == "FPAT")
- FS = ":"
- RS = "\n"
-
- pwcat = _pw_awklib "pwcat"
- while ((pwcat | getline) > 0) @{
- _pw_byname[$1] = $0
- _pw_byuid[$3] = $0
- _pw_bycount[++_pw_totale] = $0
- @}
- close(pwcat)
- _pw_contatore = 0
- _pw_inizializzato = 1
- FS = oldfs
- if (using_fw)
- FIELDWIDTHS = FIELDWIDTHS
- else if (using_fpat)
- FPAT = FPAT
- RS = oldrs
- $0 = olddol0
-@}
-@c endfile
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, programma @code{pwcat}
-@cindex criterio di ricerca @code{BEGIN}, programma @code{pwcat}
-La regola @code{BEGIN} imposta una variabile privata col nome
-della directory in cui si
-trova @command{pwcat}.
-Poich@'e @`e destinata a essere usata da una routine di
-libreria di @command{awk}, si @`e scelto di metterla in
-@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
-essere messa in una directory differente.
-
-La funzione @code{_pw_init()} mette tre copie delle informazioni sull'utente in
-tre vettori associativi. I vettori sono indicizzati per nome-utente
-(@code{_pw_byname}), per numero di ID-utente (@code{_pw_byuid}), e per ordine di
-occorrenza (@code{_pw_bycount}).
-La variabile @code{_pw_inizializzato} @`e usata per
-efficienza, poich@'e in questo modo @code{_pw_init()}
-viene chiamata solo una volta.
-
-@cindex @code{PROCINFO}, vettore, verificare la divisione in campi
-@cindex vettore @code{PROCINFO}, verificare la divisione in campi
-@cindex @code{getline}, comando, funzione definita dall'utente, @code{_pw_init()}
-@cindex comando @code{getline}, funzione definita dall'utente, @code{_pw_init()}
-Poich@'e questa funzione usa @code{getline} per leggere informazioni da
-@command{pwcat}, dapprima salva i valori di @code{FS}, @code{RS} e @code{$0}.
-Annota nella variabile @code{using_fw} se la suddivisione in campi
-usando @code{FIELDWIDTHS} @`e attiva o no.
-Far questo @`e necessario, poich@'e queste funzioni potrebbero essere chiamate da
-qualsiai parte all'interno di un programma dell'utente, e l'utente pu@`o
-suddividere i record in campi a suo piacimento.
-Ci@`o rende possibile ripristinare il corretto meccanismo di suddivisione dei
-campi in un secondo momento. La verifica pu@`o restituire solo @dfn{vero} per
-@command{gawk}.
-Il risultato pu@`o essere @dfn{falso} se si usa
-@code{FS} o @code{FPAT},
-o in qualche altra implementazione di @command{awk}.
-
-Il codice che controlla se si sta usando @code{FPAT}, utilizzando
-@code{using_fpat} e @code{PROCINFO["FS"]}, @`e simile.
-
-La parte principale della funzione usa un ciclo per leggere le righe della
-lista, suddividere le righe in campi, e poi memorizzare la riga
-all'interno di ogni vettore a seconda delle necessit@`a. Quando il ciclo @`e
-completato, @code{@w{_pw_init()}} fa pulizia chiudendo la @dfn{pipe},
-impostando @code{@w{_pw_inizializzato}} a uno, e ripristinando @code{FS}
-(e @code{FIELDWIDTHS} o @code{FPAT}
-se necessario), @code{RS} e @code{$0}.
-L'uso di @code{@w{_pw_contatore}} verr@`a spiegato a breve.
-
-@cindex @code{getpwnam()}, funzione (libreria C)
-@cindex funzione @code{getpwnam()} (libreria C)
-La funzione @code{getpwnam()} ha un nome utente come argomento di tipo
-stringa. Se
-quell'utente @`e presente nella lista, restituisce la riga appropriata.
-Altrimenti, il riferimento a un elemento inesistente del vettore
-aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
-
-@cindex @code{getpwnam()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwnam()}
-@example
-@group
-@c file eg/lib/passwdawk.in
-function getpwnam(nome)
-@{
- _pw_init()
- return _pw_byname[nome]
-@}
-@c endfile
-@end group
-@end example
-
-@cindex @code{getpwuid()}, funzione (libreria C)
-@cindex funzione @code{getpwuid()} (libreria C)
-In modo simile, la funzione @code{getpwuid()} ha per argomento
-il numero ID di un utente.
-Se un utente con quel numero si trova nella lista, restituisce la riga
-appropriata. Altrimenti restituisce la stringa nulla:
-
-@cindex @code{getpwuid()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwuid()}
-@example
-@c file eg/lib/passwdawk.in
-function getpwuid(uid)
-@{
- _pw_init()
- return _pw_byuid[uid]
-@}
-@c endfile
-@end example
-
-@cindex @code{getpwent()}, funzione (libreria C)
-@cindex funzione @code{getpwent()} (libreria C)
-La funzione @code{getpwent()} scorre semplicemnte la lista, un elemento
-alla volta. Usa @code{_pw_contatore} per tener traccia della posizione corrente
-nel vettore @code{_pw_bycount}:
-
-@cindex @code{getpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwent()}
-@example
-@c file eg/lib/passwdawk.in
-function getpwent()
-@{
- _pw_init()
- if (_pw_contatore < _pw_totale)
- return _pw_bycount[++_pw_contatore]
- return ""
-@}
-@c endfile
-@end example
-
-@cindex @code{endpwent()}, funzione (libreria C)
-@cindex funzione @code{endpwent()} (libreria C)
-La funzione @code{@w{endpwent()}} reimposta @code{@w{_pw_contatore}} a zero,
-in modo che chiamate successive a @code{getpwent()} ricomincino da capo:
-
-@cindex @code{endpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{endpwent()}
-@example
-@c file eg/lib/passwdawk.in
-function endpwent()
-@{
- _pw_contatore = 0
-@}
-@c endfile
-@end example
-
-In questa serie di funzioni, il fatto che ogni subroutine chiami
-@code{@w{_pw_init()}}
-per inizializzare il vettore della lista utenti risponde a una precisa
-scelta progettuale.
-Il lavoro necessario per eseguire un processo separato che generi la
-lista degli utenti, e l'I/O per esaminarla, si ha solo se il programma
-principale dell'utente chiama effettivamente una di queste funzioni.
-Se questo
-file di libreria viene caricato assieme a un programma dell'utente, ma non
-viene mai chiamata nessuna delle routine, non c'@`e nessun lavoro aggiuntivo
-richiesto in fase di esecuzione.
-(L'alternativa @`e quella di spostare il corpo di @code{@w{_pw_init()}}
-all'interno di una regola @code{BEGIN}, che esegua sempre @command{pwcat}.
-Questo semplifica il codice ma richiede di eseguire un processo extra
-il cui risultato potrebbe non essere mai utilizzato dal programma.)
-
-A sua volta, chiamare ripetutamente @code{_pw_init()} non @`e troppo
-dispendioso, perch@'e la
-variabile @code{_pw_inizializzato} permette di evitare di leggere
-i dati relativi agli utenti pi@`u di una
-volta. Se la preoccupazione @`e quella di minimizzare il tempo di
-esecuzione del programma @command{awk},
-il controllo di @code{_pw_inizializzato} potrebbe essere spostato
-al di fuori di @code{_pw_init()} e duplicato in tutte le altre funzioni.
-In pratica, questo non @`e necessario, poich@'e la maggior parte dei
-programmi di @command{awk}
-@`e I/O-bound@footnote{I programmi si distinguono tradizionalemente in
-CPU-bound e I/O-bound. Quelli CPU-bound effettuano elaborazioni che non
-richiedono molta attivit@`a di I/O, come ad esempio la preparazione di una
-tavola di numeri primi. Quelli I/O bound leggono dei file, ma richiedono
-poca attivit@`a di elaborazione per ogni record letto.},
-e una tale modifica complicherebbe inutilmente il codice.
-
-Il programma @command{id} in @ref{Programma id}
-usa queste funzioni.
-
-@node Funzioni Group
-@section Leggere la lista dei gruppi
-
-@cindex libreria di funzioni @command{awk}, leggere la lista dei gruppi
-@cindex funzioni, libreria di, leggere la lista dei gruppi
-@cindex gruppi, lista dei, leggere la
-@cindex lista dei gruppi, leggere la
-@cindex @code{PROCINFO}, vettore, e appartenenza a gruppi
-@cindex @code{getgrent()}, funzione (libreria C)
-@cindex funzione @code{getgrent()} (libreria C)
-@cindex @code{getgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrent()}
-@cindex gruppi@comma{} informazioni su
-@cindex account, informazioni sugli
-@cindex gruppi, file dei
-@cindex file dei gruppi
-Molto di quel che @`e stato detto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni Passwd}
-vale anche per la lista dei gruppi. Sebbene questa sia tradizionalmente
-contenuta in
-un file ben noto (@file{/etc/group}) in un altrettanto noto formato,
-lo standard
-POSIX prevede solo una serie di routine della libreria C
-(@code{<grp.h>} e @code{getgrent()})
-per accedere a tali informazioni.
-Anche se il file suddetto @`e disponibile, potrebbe non contenere delle
-informazioni
-complete. Perci@`o, come per la lista degli utenti, @`e necessario avere un
-piccolo programma in C che genera la lista dei gruppi come suo output.
-@command{grcat}, un programma in C che fornisce la lista dei gruppi,
-@`e il seguente:
-
-@cindex @command{grcat}, programma C
-@cindex programma C, @command{grcat}
-@example
-@c file eg/lib/grcat.c
-/*
- * grcat.c
- *
- * Genera una versione stampabile della lista dei gruppi.
- */
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-/*
- * Arnold Robbins, arnold@@skeeve.com, May 1993
- * Public Domain
- * December 2010, move to ANSI C definition for main().
- */
-
-/* Per OS/2, non fare nulla. */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-#ifndef HAVE_GETGRENT
-int main() { return 0; }
-#else
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
-#include <stdio.h>
-#include <grp.h>
-
-int
-main(int argc, char **argv)
-@{
- struct group *g;
- int i;
-
- while ((g = getgrent()) != NULL) @{
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#ifdef ZOS_USS
- printf("%s:%ld:", g->gr_name, (long) g->gr_gid);
-#else
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
- printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
- (long) g->gr_gid);
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#else
- printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
-#endif
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
- for (i = 0; g->gr_mem[i] != NULL; i++) @{
- printf("%s", g->gr_mem[i]);
-@group
- if (g->gr_mem[i+1] != NULL)
- putchar(',');
- @}
-@end group
- putchar('\n');
- @}
- endgrent();
- return 0;
-@}
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#endif /* HAVE_GETGRENT */
-@c endfile
-@end ignore
-@end example
-
-Ciascuna riga nella lista dei gruppi rappresenta un gruppo. I campi sono
-separati da due punti e rappresentano le seguenti informazioni:
-
-@table @asis
-@item Nome del gruppo
-Il nome del gruppo.
-
-@item Password del gruppo
-La password del gruppo criptata. In pratica, questo campo non viene mai usato;
-normalmente @`e vuoto o impostato a @samp{x}.
-
-@item Numero ID del gruppo
-Il numero ID del gruppo in formato numerico;
-l'associazione del nome al numero dev'essere univoca all'interno di questo file.
-(Su alcuni sistemi, @`e un numero nel formato @code{long} [32bit]
-del linguaggio C, e non nel formato @code{int} [16bit].
-Quindi, lo cambieremo in @code{long} per sicurezza.)
-
-@item Lista dei membri del gruppo
-Una lista di nomi utente separati da virgole.
-Questi utenti sono i membri del gruppo.
-I sistemi Unix moderni consentono agli utenti di appartenere a
-diversi gruppi simultaneamente. Se il sistema in uso @`e uno di questi, ci sono
-elementi in @code{PROCINFO} che vanno da @code{"group1"} fino a
-@code{"group@var{N}"} per quei numeri di ID di gruppo.
-(Si noti che @code{PROCINFO} @`e un'estensione @command{gawk};
-@pxref{Variabili predefinite}.)
-@end table
-
-Di seguito si riporta quel che @command{grcat} potrebbe produrre:
-
-@example
-$ @kbd{grcat}
-@print{} wheel:x:0:arnold
-@print{} nogroup:x:65534:
-@print{} daemon:x:1:
-@print{} kmem:x:2:
-@print{} staff:x:10:arnold,miriam,andy
-@print{} other:x:20:
-@dots{}
-@end example
-
-Qui ci sono le funzioni per ottenere informazioni relative alla lista dei
-gruppi. Ce ne sono diverse, costruite sul modello delle omonime funzioni della
-libreria C:
-
-@cindex @code{getline}, comando, funzione definita dall'utente, @code{_gr_init()}
-@cindex comando @code{getline}, funzione definita dall'utente, @code{_gr_init()}
-@cindex @code{_gr_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_gr_init()}
-@example
-@c file eg/lib/groupawk.in
-# group.awk --- funzioni per il trattamento del file dei gruppi
-@c endfile
-@ignore
-@c file eg/lib/groupawk.in
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised October 2000
-# Revised December 2010
-@c endfile
-@end ignore
-@c line break on _gr_init for smallbook
-@c file eg/lib/groupawk.in
-
-BEGIN @{
- # Modificare in base alla struttura del proprio sistema
- _gr_awklib = "/usr/local/libexec/awk/"
-@}
-
-function _gr_init( oldfs, oldrs, olddol0, grcat,
- using_fw, using_fpat, n, a, i)
-@{
- if (_gr_inizializzato)
- return
-
- oldfs = FS
- oldrs = RS
- olddol0 = $0
- using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
- using_fpat = (PROCINFO["FS"] == "FPAT")
- FS = ":"
- RS = "\n"
-
- grcat = _gr_awklib "grcat"
- while ((grcat | getline) > 0) @{
- if ($1 in _gr_byname)
- _gr_byname[$1] = _gr_byname[$1] "," $4
- else
- _gr_byname[$1] = $0
- if ($3 in _gr_bygid)
- _gr_bygid[$3] = _gr_bygid[$3] "," $4
- else
- _gr_bygid[$3] = $0
-
- n = split($4, a, "[ \t]*,[ \t]*")
- for (i = 1; i <= n; i++)
- if (a[i] in _gr_groupsbyuser)
- _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
- else
- _gr_groupsbyuser[a[i]] = $1
-
- _gr_bycount[++_gr_contatore] = $0
- @}
- close(grcat)
- _gr_contatore = 0
- _gr_inizializzato++
- FS = oldfs
- if (using_fw)
- FIELDWIDTHS = FIELDWIDTHS
- else if (using_fpat)
- FPAT = FPAT
- RS = oldrs
- $0 = olddol0
-@}
-@c endfile
-@end example
-
-La regola @code{BEGIN} imposta una variabile privata con il nome della
-directory in cui si trova @command{grcat}.
-Poich@'e @`e destinata a essere usata da una routine di
-libreria di @command{awk}, si @`e scelto di metterla in
-@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
-essere messa in una directory differente.
-
-Queste routine seguono le stesse linee generali delle routine per formare la
-lista degli utenti (@pxref{Funzioni Passwd}).
-La variabile @code{@w{_gr_inizializzato}} @`e usata per
-essere sicuri che la lista venga letta una volta sola.
-La funzione @code{@w{_gr_init()}} dapprima salva @code{FS},
-@code{RS} e
-@code{$0}, e poi imposta @code{FS} e @code{RS} ai valori da usare nel
-passare in rassegna le informazioni di gruppo. Inoltre
-viene annotato se si stanno usando @code{FIELDWIDTHS} o @code{FPAT}, per
-poter poi
-ripristinare il meccanismo di suddivisione in campi appropriato.
-
-Le informazioni sui gruppi sono memorizzate in diversi vettori associativi.
-I vettori sono indicizzati per nome di gruppo (@code{@w{_gr_byname}}), per
-numero ID del gruppo (@code{@w{_gr_bygid}}), e per posizione nella lista
-(@code{@w{_gr_bycount}}). C'@`e un vettore aggiuntivo indicizzato per nome utente
-(@code{@w{_gr_groupsbyuser}}), che @`e una lista, separata da spazi, dei
-gruppi ai quali ciascun utente appartiene.
-
-Diversamente dalla lista degli utenti, @`e possibile avere pi@`u record
-nella lista per lo stesso gruppo. Questo @`e frequente quando un gruppo ha
-un gran numero di membri. Un paio di tali voci potrebbero essere come queste:
-
-@example
-tvpeople:x:101:johnny,jay,arsenio
-tvpeople:x:101:david,conan,tom,joan
-@end example
-
-Per questo motivo, @code{_gr_init()} controlla se un nome di gruppo o un numero
-di ID di gruppo @`e stato gi@`a visto. Se cos@`{@dotless{i}} fosse, i nomi utente vanno
-semplicemente concatenati con la precedente lista di utenti.@footnote{C'@`e un
-piccolo problema col codice appena illustrato. Supponiamo che la prima volta
-non ci siano nomi. Questo codice aggiunge i nomi con una virgola iniziale.
-Inoltre non controlla che ci sia un @code{$4}.}
-
-Infine, @code{_gr_init()} chiude la @dfn{pipe} a @command{grcat}, ripristina
-@code{FS} (e @code{FIELDWIDTHS} o @code{FPAT}, se necessario), @code{RS} e
-@code{$0}, inizializza @code{_gr_contatore} a zero
-(per essere usato pi@`u tardi), e rende @code{_gr_inizializzato} diverso da zero.
-
-@cindex @code{getgrnam()}, funzione (libreria C)
-@cindex funzione @code{getgrnam()} (libreria C)
-La funzione @code{getgrnam()} ha come argomento un nome di gruppo, e se quel
-gruppo esiste, viene restituito.
-
-Altrimenti, il riferimento a un elemento inesistente del vettore
-aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
-
-@cindex @code{getgrnam()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrnam()}
-@example
-@c file eg/lib/groupawk.in
-function getgrnam(group)
-@{
- _gr_init()
- return _gr_byname[group]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgrgid()}, funzione (libreria C)
-@cindex funzione @code{getgrgid()} (libreria C)
-La funzione @code{getgrgid()} @`e simile; ha come argomento un numero ID di
-gruppo e controlla le informazioni assiciate con quell'ID di gruppo:
-
-@cindex @code{getgrgid()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrgid()}
-@example
-@c file eg/lib/groupawk.in
-function getgrgid(gid)
-@{
- _gr_init()
- return _gr_bygid[gid]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgruser()}, funzione (libreria C)
-@cindex funzione @code{getgruser()} (libreria C)
-La funzione @code{getgruser()} non ha un equivalente in C. Ha come argomento un
-nome-utente e restituisce l'elenco dei gruppi di cui l'utente @`e membro:
-
-@cindex @code{getgruser()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgruser()}
-@example
-@c file eg/lib/groupawk.in
-function getgruser(user)
-@{
- _gr_init()
- return _gr_groupsbyuser[user]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgrent()}, funzione (libreria C)
-@cindex funzione @code{getgrent()} (libreria C)
-La funzione @code{getgrent()} scorre la lista un elemento alla volta.
-Usa @code{_gr_contatore} per ricordare la posizione corrente nella lista:
-
-@cindex @code{getgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrent()}
-@example
-@c file eg/lib/groupawk.in
-function getgrent()
-@{
- _gr_init()
- if (++_gr_contatore in _gr_bycount)
- return _gr_bycount[_gr_contatore]
- return ""
-@}
-@c endfile
-@end example
-
-@cindex @code{endgrent()}, funzione (libreria C)
-@cindex funzione @code{endgrent()} (libreria C)
-La funzione @code{endgrent()} reimposta @code{_gr_contatore} a zero in modo che
-@code{getgrent()} possa ricominciare da capo:
-
-@cindex @code{endgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{endgrent()}
-@example
-@c file eg/lib/groupawk.in
-function endgrent()
-@{
- _gr_contatore = 0
-@}
-@c endfile
-@end example
-
-Come con le routine per la lista degli utenti, ogni funzione chiama
-@code{_gr_init()} per inizializzare i vettori.
-Cos@`{@dotless{i}} facendo si avr@`a il solo
-lavoro aggiuntivo di eseguire @command{grcat} se queste funzioni vengono
-usate (rispetto a spostare il corpo di @code{_gr_init()} all'interno della
-regola @code{BEGIN}).
-
-La maggior parte del lavoro consiste nell'ispezionare la lista e nel
-costruire i vari vettori associativi. Le funzioni che l'utente chiama sono
-di per s@'e molto semplici, poich@'e si appoggiano sui vettori associativi di
-@command{awk} per fare il lavoro.
-
-Il programma @command{id} in @ref{Programma id}
-usa queste funzioni.
-
-@node Visitare vettori
-@section Attraversare vettori di vettori
-
-@iftex
-La
-@end iftex
-@ref{Vettori di vettori} trattava come @command{gawk}
-avere a disposizione vettori di vettori. In particolare, qualsiasi elemento di
-un vettore pu@`o essere uno scalare o un altro vettore. La funzione
-@code{isarray()} (@pxref{Funzioni per i tipi})
-permette di distinguere un vettore
-da uno scalare.
-La seguente funzione, @code{walk_array()}, attraversa ricorsivamente
-un vettore, stampando gli indici e i valori di ogni elemento.
-Viene chiamata col vettore e con una stringa che contiene il nome
-del vettore:
-
-@cindex @code{walk_array()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{walk_array()}
-@example
-@c file eg/lib/walkarray.awk
-function walk_array(vett, nome, i)
-@{
- for (i in vett) @{
- if (isarray(vett[i]))
- walk_array(vett[i], (nome "[" i "]"))
- else
- printf("%s[%s] = %s\n", nome, i, vett[i])
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-Funziona eseguendo un ciclo su ogni elemento del vettore. Se un dato elemento
-@`e esso stesso un vettore, la funzione chiama s@'e stessa ricorsivamente,
-passando il sottovettore e una nuova stringa che rappresenta l'indice corrente.
-In caso contrario, la funzione stampa semplicemente il nome, l'indice e il
-valore dell'elemento.
-Qui di seguito si riporta un programma principale che ne mostra l'uso:
-
-@example
-BEGIN @{
- a[1] = 1
- a[2][1] = 21
- a[2][2] = 22
- a[3] = 3
- a[4][1][1] = 411
- a[4][2] = 42
-
- walk_array(a, "a")
-@}
-@end example
-
-Quando viene eseguito, il programma produce il seguente output:
-
-@example
-$ @kbd{gawk -f walk_array.awk}
-@print{} a[1] = 1
-@print{} a[2][1] = 21
-@print{} a[2][2] = 22
-@print{} a[3] = 3
-@print{} a[4][1][1] = 411
-@print{} a[4][2] = 42
-@end example
-
-La funzione appena illustrata stampa semplicemente il nome e il valore
-di ogni elemento costituito da un vettore scalare. Comunque @`e facile
-generalizzarla, passandole il nome di una funzione da chiamare
-quando si attraversa un vettore. La funzione modificata @`e simile a questa:
-
-@example
-@c file eg/lib/processarray.awk
-function process_array(vett, nome, elab, do_arrays, i, nuovo_nome)
-@{
- for (i in vett) @{
- nuovo_nome = (nome "[" i "]")
- if (isarray(vett[i])) @{
- if (do_arrays)
- @@elab(nuovo_nome, vett[i])
- process_array(vett[i], nuovo_nome, elab, do_arrays)
- @} else
- @@elab(nuovo_nome, vett[i])
- @}
-@}
-@c endfile
-@end example
-
-Gli argomenti sono i seguenti:
-
-@table @code
-@item vett
-Il vettore.
-
-@item nome
-Il nome del vettore (una stringa).
-
-@item elab
-Il nome della funzione da chiamare.
-
-@item do_arrays
-Se vale @dfn{vero}, la funzione pu@`o gestire elementi che sono sottovettori.
-@end table
-
-Se devono essere elaborati sottovettori, questo vien fatto prima di
-attraversarne altri.
-
-Quando viene eseguita con la seguente struttura, la funzione produce lo stesso
-risultato della precedente versione di @code{walk_array()}:
-
-@example
-BEGIN @{
- a[1] = 1
- a[2][1] = 21
- a[2][2] = 22
- a[3] = 3
- a[4][1][1] = 411
- a[4][2] = 42
-
- process_array(a, "a", "do_print", 0)
-@}
-
-function do_print(nome, elemento)
-@{
- printf "%s = %s\n", nome, elemento
-@}
-@end example
-
-@node Sommario funzioni di libreria
-@section Riassunto
-
-@itemize @value{BULLET}
-@item
-Leggere i programmi @`e un eccellente metodo per imparare la "buona
-programmazione". Le funzioni e i programmi contenuti in questo @value{CHAPTER}
-e nel successivo si propongo questo obiettivo.
-
-@item
-Quando si scrivono funzioni di libreria di uso generale, si deve stare attenti
-ai nomi da dare alle variabili globali, facendo in modo che non entrino in
-conflitto con le variabili di un programma dell'utente.
-
-@item
-Le funzioni descritte qui appartengono alle seguenti categorie:
-
-@c nested list
-@table @asis
-@item Problemi generali
-Conversione di numeri in stringhe, verifica delle asserzioni, arrotondamenti,
-generazione di numeri casuali, conversione di caratteri in numeri, unione di
-stringhe, ottenimento di informazioni su data e ora facilmente usabili,
-e lettura di un intero file in una volta sola
-
-@item Gestione dei @value{DF}
-Annotazione dei limiti di un @value{DF}, rilettura del file corrente,
-ricerca di
-file leggibili, ricerca di file di lunghezza zero, e trattamento degli
-assegnamenti di variabili fatti sulla riga comando come @value{FNS}
-
-@item Elaborazione di opzioni sulla riga di comando
-Una versione @command{awk} della funzione del C standard @code{getopt()}
-
-@item Lettura dei file degli utenti e dei gruppi
-Due serie di routine equivalenti alle versioni disponibili nella libreria
-del linguaggio C
-
-@item Attraversamento di vettori di vettori
-Due funzioni che attraversano un vettore di vettori fino in fondo
-@end table
-@c end nested list
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi con le librerie
-@section Esercizi
-
-@enumerate
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{File vuoti}, abbiamo illustrato il programma @file{zerofile.awk},
-che fa uso della variabile di @command{gawk} @code{ARGIND}. Questo problema pu@`o
-essere risolto senza dipendere da @code{ARGIND}? Se s@`{@dotless{i}}, come?
-
-@ignore
-# zerofile2.awk --- same thing, portably
-
-BEGIN @{
- ARGIND = Argind = 0
- for (i = 1; i < ARGC; i++)
- Fnames[ARGV[i]]++
-
-@}
-FNR == 1 @{
- while (ARGV[ARGIND] != FILENAME)
- ARGIND++
- Seen[FILENAME]++
- if (Seen[FILENAME] == Fnames[FILENAME])
- do
- ARGIND++
- while (ARGV[ARGIND] != FILENAME)
-@}
-ARGIND > Argind + 1 @{
- for (Argind++; Argind < ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-ARGIND != Argind @{
- Argind = ARGIND
-@}
-END @{
- if (ARGIND < ARGC - 1)
- ARGIND = ARGC - 1
- if (ARGIND > Argind)
- for (Argind++; Argind <= ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-@end ignore
-
-@item
-Come esercizio collegato, rivedere quel codice per gestire il caso in cui un
-valore contenuto in @code{ARGV} sia un assegnamento di variabile.
-
-@ignore
-@c June 13 2015: Antonio points out that this is answered in the text. Ooops.
-@item
-@ref{Visitare vettori} ha illustrato una funzione che ispezionava un vettore
-multidimensionale per stamparlo. Comunque, ispezionare un vettore ed elaborare
-ogni elemento @`e un'operazione generica. Generalizzare la funzione
-@code{walk_array()} agggiungendo un parametro aggiuntivo chiamato
-@code{elab}.
-
-Quindi, all'interno del ciclo, invece di stampare l'indice e il valore
-dell'elemento del vettore, usare la sintassi della chiamata indiretta a una
-funzione (@pxref{Chiamate indirette})
-su @code{elab}, passandole l'indice e il valore.
-
-Nel chiamare @code{walk_array()}, si passa il nome di una
-funzione definita dall'utente che aspetta di ricevere un indice e un valore
-per poi elaborare l'elemento.
-
-Verificare la nuova versione stampando il vettore; si dovrebbe ottenere un
-output identico a quello della versione originale.
-@end ignore
-
-@end enumerate
-@c EXCLUDE END
-
-@node Programmi di esempio
-@chapter Programmi utili scritti in @command{awk}
-@cindex @command{awk}, programmi, esempi di
-@cindex programmi @command{awk}, esempi di
-@cindex esempi di programmi @command{awk}
-
-@c FULLXREF ON
-@iftex
-Il
-@end iftex
-@ref{Funzioni di libreria},
-ha prospettato l'idea che la lettura di programmi scritti in un certo
-linguaggio possa aiutare a imparare quel linguaggio. Questo
-@value{CHAPTER} ripropone lo stesso tema, presentando una miscellanea di
-programmi @command{awk} per il piacere di leggerli.
-@c FULLXREF OFF
-@ifnotinfo
-Ci sono tre @value{SECTIONS}.
-La prima spiega come eseguire i programmi descritti in questo
-@value{CHAPTER}.
-
-La seconda illustra la versione @command{awk}
-di parecchi comuni programmi di utilit@`a disponibili in POSIX.
-Si presuppone che si abbia gi@`a una certa familiarit@`a con questi programmi,
-e che quindi i problemi a loro legati siano facilmente comprensibili.
-Riscrivendo questi programmi in @command{awk},
-ci si pu@`o focalizzare sulle particolarit@`a di @command{awk} nella
-risoluzione dei problemi di programmazione.
-
-La terza sezione @`e una collezione di programmi interessanti.
-Essi mirano a risolvere un certo numero di differenti problemi di
-manipolazione e di gestione dati. Molti dei programmi sono brevi, per
-evidenziare la capacit@`a di @command{awk} di fare molte cose usando solo
-poche righe di codice.
-@end ifnotinfo
-
-Molti di questi programmi usano le funzioni di libreria che sono state presentate
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}.
-
-@menu
-* Eseguire esempi:: Come eseguire questi esempi.
-* Cloni:: Cloni di programmi di utilit@`a comuni.
-* Programmi vari:: Alcuni interessanti programmi in
- @command{awk}.
-* Sommario dei programmi:: Sommario dei programmi.
-* Esercizi sui programmi:: Esercizi.
-@end menu
-
-@node Eseguire esempi
-@section Come eseguire i programmi di esempio.
-
-
-Per eseguire un dato programma, si procederebbe tipicamente cos@`{@dotless{i}}:
-
-@example
-awk -f @var{programma} -- @var{opzioni} @var{file}
-@end example
-
-@noindent
-Qui, @var{programma} @`e il nome del programma @command{awk} (p.es.
-@file{cut.awk}), @var{opzioni} sono le opzioni sulla riga di comando
-per il programma che iniziano con un @samp{-}, e @var{file} sono i
-@value{DF} in input.
-
-Se il sistema prevede il meccanismo @samp{#!} di specifica di un
-@dfn{interprete}
-(@pxref{@dfn{Script} eseguibili}),
-si pu@`o invece eseguire direttamente un programma:
-
-@example
-cut.awk -c1-8 i_miei_file > risultati
-@end example
-
-Se @command{awk} non @`e @command{gawk}, pu@`o invece essere necessario usare:
-
-@example
-cut.awk -- -c1-8 i_miei_file > risultati
-@end example
-
-@node Cloni
-@section Reinventare la ruota per divertimento e profitto
-@cindex programmi POSIX, implementazione in @command{awk}
-@cindex POSIX, programmi, implementazione in @command{awk}
-
-Questa @value{SECTION} presenta un certo numero di programmi di utilit@`a
-POSIX implementati in @command{awk}. Riscrivere questi programmi in
-@command{awk} @`e spesso divertente,
-perch@'e gli algoritmi possono essere espressi molto chiaramente, e il codice
-@`e normalmente molto semplice e conciso. Ci@`o @`e possibile perch@'e @command{awk}
-facilita molto le cose al programmatore.
-
-Va precisato che questi programmi non sono necessariamente scritti per
-sostituire le versioni installate sul sistema in uso.
-Inoltre, nessuno di questi programmi @`e del tutto aderente ai pi@`u recenti
-standard POSIX. Questo non @`e un problema; il loro scopo
-@`e di illustrare la programmazione in linguaggio @command{awk} che serve nel
-``mondo reale''.
-
-I programmi sono presentati in ordine alfabetico.
-
-@menu
-* Programma cut:: Il programma di utilit@`a @command{cut}.
-* Programma egrep:: Il programma di utilit@`a @command{egrep}.
-* Programma id:: Il programma di utilit@`a @command{id}.
-* Programma split:: Il programma di utilit@`a @command{split}.
-* Programma tee:: Il programma di utilit@`a @command{tee}.
-* Programma uniq:: Il programma di utilit@`a @command{uniq}.
-* Programma wc:: Il programma di utilit@`a @command{wc}.
-@end menu
-
-@node Programma cut
-@subsection Ritagliare campi e colonne
-
-@cindex @command{cut}, programma di utilit@`a
-@cindex programma di utilit@`a @command{cut}
-@cindex campi, ritagliare
-@cindex colonne, ritagliare
-Il programma di utilit@`a @command{cut} seleziona, o ``taglia'' (@dfn{cut}),
-caratteri o campi dal suo standard input e li
-spedisce al suo standard output.
-I campi sono separati da caratteri TAB per default,
-ma @`e possibile fornire un'opzione dalla riga di comando per cambiare il campo
-@dfn{delimitatore} (cio@`e, il carattere che separa i campi). La definizione di
-campo di @command{cut} @`e meno generale di quella di @command{awk}.
-
-Un uso comune del comando @command{cut} potrebbe essere quello di estrarre
-i nomi degli utenti correntemente collegati al sistema, a partire
-dall'output del comando @command{who}. Per esempio, la seguente
-pipeline genera una lista in ordine alfabetico, senza doppioni, degli utenti
-correntemente collegati al sistema:
-
-@example
-who | cut -c1-8 | sort | uniq
-@end example
-
-Le opzioni per @command{cut} sono:
-
-@table @code
-@item -c @var{lista}
-Usare @var{lista} come lista di caratteri da ritagliare. Elementi
-all'interno della lista
-possono essere separati da virgole, e intervalli di caratteri possono essere
-separated da trattini. La lista
-@samp{1-8,15,22-35} specifica i caratteri da 1 a 8, 15, e da 22 a 35.
-
-@item -f @var{lista}
-Usare @var{lista} come lista di campi da ritagliare.
-
-@item -d @var{delimitatore}
-Usare @var{delimitatore} come carattere che separa i campi invece del
-carattere TAB.
-
-@item -s
-Evita la stampa di righe che non contengono il delimitatore di campo.
-@end table
-
-L'implementazione @command{awk} del comando @command{cut} usa la funzione
-di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-Il programma inizia con un commento che descrive le opzioni, le funzioni
-di libreria necessarie, e una funzione @code{sintassi()} che stampa un
-messaggio ed esce. @code{sintassi()} @`e chiamato se si specificano degli
-argomenti non validi:
-
-@cindex @code{cut.awk}, programma
-@cindex programma @code{cut.awk}
-@example
-@c file eg/prog/cut.awk
-# cut.awk --- implementa cut in awk
-@c endfile
-@ignore
-@c file eg/prog/cut.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/cut.awk
-
-# Opzioni:
-# -f lista Ritagliare campi
-# -d c Carattere di delimitazione di campo
-# -c lista Ritagliare caratteri
-#
-# -s Sopprimere righe che non contengono il delimitatore
-#
-# Richiede le funzioni di libreria getopt() e join()
-
-@group
-function sintassi()
-@{
- print("sintassi: cut [-f lista] [-d c] [-s] [file...]") > "/dev/stderr"
- print("sintassi: cut [-c lista] [file...]") > "/dev/stderr"
- exit 1
-@}
-@end group
-@c endfile
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, eseguire programmi @command{awk} e
-@cindex criterio di ricerca @code{BEGIN}, eseguire programmi @command{awk} e
-@cindex @code{FS}, variabile, eseguire programmi @command{awk} e
-@cindex variabile @code{FS}, eseguire programmi @command{awk} e
-Subito dopo c'@`e una regola @code{BEGIN} che analizza le opzioni della riga
-di comando.
-Questa regola imposta @code{FS} a un solo carattere TAB, perch@'e quello @`e
-il separatore di campo di @command{cut} per default.
-La regola poi imposta il separatore di campo in output allo stesso valore
-del separatore di campo in input. Un ciclo che usa @code{getopt()} esamina
-le opzioni della riga di comando. Una e una sola delle variabili
-@code{per_campi} o @code{per_caratteri} @`e impostata a "vero", per indicare
-che l'elaborazione sar@`a fatta per campi o per caratteri, rispettivamente.
-Quando si ritaglia per caratteri, il separatore di campo in output @`e
-impostato alla stringa nulla:
-
-@example
-@c file eg/prog/cut.awk
-BEGIN @{
- FS = "\t" # default
- OFS = FS
- while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{
- if (c == "f") @{
- per_campi = 1
- lista_campi = Optarg
- @} else if (c == "c") @{
- per_caratteri = 1
- lista_campi = Optarg
- OFS = ""
- @} else if (c == "d") @{
- if (length(Optarg) > 1) @{
- printf("cut: usa il primo carattere di %s" \
- " come delimitatore\n", Optarg) > "/dev/stderr"
- Optarg = substr(Optarg, 1, 1)
- @}
- fs = FS = Optarg
- OFS = FS
- if (FS == " ") # mette specifica in formato awk
- FS = "[ ]"
- @} else if (c == "s")
- sopprimi = 1
- else
- sintassi()
- @}
-
- # Toglie opzioni da riga di comando
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-@c endfile
-@end example
-
-@cindex separatori di campo, spazi come
-@cindex spazi come separatori di campo
-Nella scrittura del codice si deve porre particolare attenzione quando il
-delimitatore di campo @`e uno spazio. Usare
-un semplice spazio (@code{@w{" "}}) come valore per @code{FS} @`e
-sbagliato: @command{awk} separerebbe i campi con serie di spazi,
-TAB, e/o ritorni a capo, mentre devono essere separati solo da uno spazio.
-Per far questo, salviamo il carattere di spazio originale nella variabile
-@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{"[ ]"} non
-@`e possibile usarlo direttamente per vedere se il carattere delimitatore di
-campo @`e nella stringa.
-
-Si ricordi anche che dopo che si @`e finito di usare @code{getopt()}
-(come descritto nella @ref{Funzione getopt}),
-@`e necessario
-eliminare tutti gli elementi del vettore @code{ARGV} da 1 a @code{Optind},
-in modo che @command{awk} non tenti di elaborare le opzioni della riga di comando
-come @value{FNS}.
-
-Dopo aver elaborato le opzioni della riga di comando, il programma verifica
-che le opzioni siano coerenti. Solo una tra le opzioni @option{-c}
-e @option{-f} dovrebbe essere presente, ed entrambe richiedono una lista di
-campi. Poi il programma chiama
-@code{prepara_lista_campi()} oppure @code{prepara_lista_caratteri()} per
-preparare la lista dei campi o dei caratteri:
-
-@example
-@c file eg/prog/cut.awk
- if (per_campi && per_caratteri)
- sintassi()
-
- if (per_campi == 0 && per_caratteri == 0)
- per_campi = 1 # default
-
- if (lista_campi == "") @{
- print "cut: specificare lista per -c o -f" > "/dev/stderr"
- exit 1
- @}
-
- if (per_campi)
- prepara_lista_campi()
- else
- prepara_lista_caratteri()
-@}
-@c endfile
-@end example
-
-@code{prepara_lista_campi()} pone la lista campi, usando la virgola come
-separatore, in un vettore. Poi, per
-ogni elemento del vettore, controlla che esso non sia un intervallo. Se @`e
-un intervallo, lo fa diventare un elenco. La funzione controlla l'intervallo
-specificato, per assicurarsi che il primo numero sia minore del secondo.
-Ogni numero nella lista @`e aggiunto al vettore @code{lista_c}, che
-semplicemente elenca i campi che saranno stampati. Viene usata la normale
-separazione in campi di @command{awk}. Il programma lascia ad @command{awk}
-il compito di separare i campi:
-
-@example
-@c file eg/prog/cut.awk
-function prepara_lista_campi( n, m, i, j, k, f, g)
-@{
- n = split(lista_campi, f, ",")
- j = 1 # indice in lista_c
- for (i = 1; i <= n; i++) @{
- if (index(f[i], "-") != 0) @{ # un intervallo
- m = split(f[i], g, "-")
-@group
- if (m != 2 || g[1] >= g[2]) @{
- printf("cut: lista campi errata: %s\n",
- f[i]) > "/dev/stderr"
- exit 1
- @}
-@end group
- for (k = g[1]; k <= g[2]; k++)
- lista_c[j++] = k
- @} else
- lista_c[j++] = f[i]
- @}
- ncampi = j - 1
-@}
-@c endfile
-@end example
-
-La funzione @code{prepara_lista_caratteri()} @`e pi@`u complicata di
-@code{prepara_lista_campi()}.
-L'idea qui @`e di usare la variabile di @command{gawk} @code{FIELDWIDTHS}
-(@pxref{Dimensione costante}),
-che descrive input a larghezza costante. Quando si usa una lista di
-caratteri questo @`e proprio il nostro caso.
-
-Impostare @code{FIELDWIDTHS} @`e pi@`u complicato che semplicemente elencare
-i campi da stampare. Si deve tener traccia dei campi da
-stampare e anche dei caratteri che li separano, che vanno saltati.
-Per esempio, supponiamo che si vogliano i caratteri da 1 a 8, 15,
-e da 22 a 35. Per questo si specifica @samp{-c 1-8,15,22-35}. Il valore che
-corrisponde a questo nella variabile @code{FIELDWIDTHS} @`e
-@code{@w{"8 6 1 6 14"}}. Questi sono cinque campi, e quelli da stampare
-sono @code{$1}, @code{$3}, e @code{$5}.
-I campi intermedi sono @dfn{riempitivo} (@dfn{filler}),
-ossia @`e ci@`o che separa i dati che si desidera estrarre.
-@code{lista_c} lista i campi da stampare, e @code{t} traccia l'elenco
-completo dei campi, inclusi i riempitivi:
-
-@example
-@c file eg/prog/cut.awk
-function prepara_lista_caratteri( campo, i, j, f, g, n, m, t,
- filler, ultimo, lungo)
-@{
- campo = 1 # contatore totale campi
- n = split(lista_campi, f, ",")
- j = 1 # indice in lista_c
- for (i = 1; i <= n; i++) @{
- if (index(f[i], "-") != 0) @{ # intervallo
- m = split(f[i], g, "-")
- if (m != 2 || g[1] >= g[2]) @{
- printf("cut: lista caratteri errata: %s\n",
- f[i]) > "/dev/stderr"
- exit 1
- @}
- lungo = g[2] - g[1] + 1
- if (g[1] > 1) # calcola lunghezza del riempitivo
- filler = g[1] - ultimo - 1
- else
- filler = 0
-@group
- if (filler)
- t[campo++] = filler
-@end group
- t[campo++] = lungo # lunghezza del campo
- ultimo = g[2]
- lista_c[j++] = campo - 1
- @} else @{
- if (f[i] > 1)
- filler = f[i] - ultimo - 1
- else
- filler = 0
- if (filler)
- t[campo++] = filler
- t[campo++] = 1
- ultimo = f[i]
- lista_c[j++] = campo - 1
- @}
- @}
- FIELDWIDTHS = join(t, 1, campo - 1)
- ncampi = j - 1
-@}
-@c endfile
-@end example
-
-Poi viene la regola che elabora i dati. Se l'opzione @option{-s} @`e stata
-specificata, il flag @code{sopprimi}
-@`e vero. La prima istruzione
-@code{if} accerta che il record in input abbia il separatore di
-campo. Se @command{cut} sta elaborando dei campi, e @code{sopprimi} @`e vero,
-e il carattere di separazione dei campi non @`e presente nel record, il
-record @`e ignorato.
-
-Se il record @`e valido, @command{gawk} ha gi@`a separato i dati in campi,
-usando il carattere in @code{FS} o usando campi a lunghezza fissa
-e @code{FIELDWIDTHS}. Il ciclo scorre attraverso la lista di campi che
-si dovrebbero stampare. Il campo corrispondente @`e stampato se contiene dati.
-Se il campo successivo contiene pure dei dati, il carattere di separazione @`e
-scritto tra i due campi:
-
-@example
-@c file eg/prog/cut.awk
-@{
- if (per_campi && sopprimi && index($0, fs) == 0)
- next
-
- for (i = 1; i <= ncampi; i++) @{
- if ($lista_c[i] != "") @{
- printf "%s", $lista_c[i]
- if (i < ncampi && $lista_c[i+1] != "")
- printf "%s", OFS
- @}
- @}
- print ""
-@}
-@c endfile
-@end example
-
-Questa versione di @command{cut} utilizza la variabile @code{FIELDWIDTHS} di
-@command{gawk} per ritagliare in base alla posizione dei caratteri. @`E
-possibile, in altre implementazioni di @command{awk} usare @code{substr()}
-(@pxref{Funzioni per stringhe}), ma
-la cosa @`e molto pi@`u complessa.
-La variabile @code{FIELDWIDTHS} fornisce una soluzione elegante al problema
-di suddividere la riga in input in singoli caratteri.
-
-
-@node Programma egrep
-@subsection Ricercare espressioni regolari nei file
-
-@cindex espressioni regolari, ricerca di
-@cindex ricercare, in file, espressioni regolari
-@cindex file, ricercare espressioni regolari nei
-@cindex @command{egrep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{egrep}
-Il programma di utilit@`a @command{egrep} ricerca occorrenze di espressioni
-regolari all'interno di file. Usa
-espressioni regolari che sono quasi identiche a quelle disponibili in
-@iftex
-@command{awk} (@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-@command{awk} (@pxref{Espressioni regolari}).
-@end ifnottex
-Si richiama cos@`{@dotless{i}}:
-
-@display
-@command{egrep} [@var{opzioni}] @code{'@var{espressione}'} @var{file} @dots{}
-@end display
-
-@var{espressione} @`e un'espressione regolare. Normalmente, l'espressione
-regolare @`e protetta da apici per impedire alla shell di espandere ogni
-carattere speciale come @value{FN}.
-Normalmente, @command{egrep} stampa le righe per cui @`e stata trovata una
-corrispondenza. Se nella riga di comando si richiede di operare su pi@`u di un
-@value{FN}, ogni riga in output @`e preceduta dal nome del file, e dal segno
-due punti.
-
-Le opzioni di @command{egrep} sono le seguenti:
-
-@table @code
-@item -c
-Stampa un contatore delle righe che corrispondono al criterio di ricerca,
-e non le righe stesse.
-
-@item -s
-Funziona in silenzio. Non si produce alcun output ma il codice di ritorno
-indica se il criterio di ricerca ha trovato almeno una corrispondenza.
-
-@item -v
-Inverte il senso del test. @command{egrep} stampa le righe che
-@emph{non} soddisfano il criterio di ricerca ed esce con successo se il
-criterio di ricerca non @`e soddisfatto.
-
-@item -i
-Ignora maiuscolo/minuscolo sia nel criterio di ricerca che nei dati in input.
-
-@item -l
-Stampa (elenca) solo i nomi dei file che corrispondono, e non le righe trovate.
-
-@item -e @var{espressione}
-Usa @var{espressione} come @dfn{regexp} da ricercare. Il motivo per cui
-@`e prevista l'opzione @option{-e} @`e di
-permettere dei criteri di ricerca che
-inizino con un @samp{-}.
-@end table
-
-Questa versione usa la funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e il programma di libreria che gestisce il passaggio da un file dati
-al successivo
-(@pxref{Funzione filetrans}).
-
-Il programma inizia con un commento descrittivo e poi c'@`e una regola
-@code{BEGIN}
-che elabora gli argomenti della riga di comando usando @code{getopt()}.
-L'opzione @option{-i} (ignora maiuscolo/minuscolo) @`e particolarmente facile
-da implementare con @command{gawk}; basta usare la variabile predefinita
-@code{IGNORECASE}
-(@pxref{Variabili predefinite}):
-
-@cindex @code{egrep.awk}, programma
-@cindex programma @code{egrep.awk}
-@example
-@c file eg/prog/egrep.awk
-# egrep.awk --- simula egrep in awk
-#
-@c endfile
-@ignore
-@c file eg/prog/egrep.awk
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-
-@c endfile
-@end ignore
-@c file eg/prog/egrep.awk
-# Opzioni:
-# -c conta le righe trovate
-# -s sileziosa: genera solo il codice di ritorno
-# -v inverte test, successo se @dfn{regexp} non presente
-# -i ignora maiuscolo/minuscolo
-# -l stampa solo nomi file
-# -e espressione da ricercare
-#
-# Richiede la funzione getopt() e il programma di libreria
-# che gestisce il passaggio da un file dati al successivo
-
-BEGIN @{
- while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{
- if (c == "c")
- conta_e_basta++
- else if (c == "s")
- non_stampare++
- else if (c == "v")
- inverti_test++
- else if (c == "i")
- IGNORECASE = 1
- else if (c == "l")
- solo_nomi_file++
- else if (c == "e")
- criterio_di_ricerca = Optarg
- else
- sintassi()
- @}
-@c endfile
-@end example
-
-Nel seguito c'@`e il codice che gestisce il comportamento specifico di
-@command{egrep}. Se non @`e fornito esplicitamente alcun criterio di ricerca
-tramite l'opzione @option{-e}, si usa il primo argomento sulla riga di
-comando che non sia un'opzione.
-Gli argomenti della riga di comando di @command{awk} fino ad
-@code{ARGV[Optind]} vengono cancellati,
-in modo che @command{awk} non tenti di elaborarli come file. Se
-non @`e stato specificato alcun nome di file, si usa lo standard input, e se
-@`e presente pi@`u di un nome di file, lo si annota, in modo che i @value{FNS}
-vengano scritti prima di ogni riga di output corrispondente:
-
-@example
-@c file eg/prog/egrep.awk
- if (criterio_di_ricerca == "")
- criterio_di_ricerca = ARGV[Optind++]
-
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
- if (Optind >= ARGC) @{
- ARGV[1] = "-"
- ARGC = 2
- @} else if (ARGC - Optind > 1)
- servono_nomi_file++
-
-# if (IGNORECASE)
-# criterio_di_ricerca = tolower(criterio_di_ricerca)
-@}
-@c endfile
-@end example
-
-Le ultime due righe sono solo dei commenti, in quanto non necessarie in
-@command{gawk}. Per altre versioni di
-@command{awk}, potrebbe essere necessario utilizzarle come istruzioni
-effettive (togliendo il "#").
-
-Il prossimo insieme di righe dovrebbe essere decommentato
-se non si sta usando @command{gawk}.
-Questa regola converte in minuscolo tutti i caratteri della riga in input,
-se @`e stata specificata l'opzione @option{-i}.@footnote{Inoltre, qui si
-introduce un errore subdolo; se una corrispondenza viene trovata, viene
-inviata in output la riga tradotta, non quella originale.}
-La regola @`e
-commentata perch@'e non @`e necessaria se si usa @command{gawk}:
-
-@example
-@c file eg/prog/egrep.awk
-#@{
-# if (IGNORECASE)
-# $0 = tolower($0)
-#@}
-@c endfile
-@end example
-
-La funzione @code{a_inizio_file()} @`e chiamata dalla regola in @file{ftrans.awk}
-quando ogni nuovo file viene elaborato. In questo caso, non c'@`e molto da fare;
-ci si limita a inizializzare una variabile @code{contatore_file} a zero.
-@code{contatore_file} serve a ricordare quante righe nel file corrente
-corrispondono al criterio di ricerca.
-Scegliere come nome di parametro @code{da_buttare} indica che sappiamo che
-@code{a_inizio_file()} @`e chiamata con un parametro, ma che noi non siamo
-interessati al suo valore:
-
-@example
-@c file eg/prog/egrep.awk
-function a_inizio_file(da_buttare)
-@{
- contatore_file = 0
-@}
-@c endfile
-@end example
-
-La funzione @code{endfile()} viene chiamata dopo l'elaborazione di ogni file.
-Ha influenza sull'output solo quando l'utente desidera un contatore del
-numero di righe che sono state individuate. @code{non_stampare} @`e vero nel
-caso si desideri solo il codice di
-ritorno. @code{conta_e_basta} @`e vero se si desiderano solo i contatori
-delle righe trovate. @command{egrep}
-quindi stampa i contatori solo se
-sia la stampa che il conteggio delle righe sono stati abilitati.
-Il formato di output deve tenere conto del numero di file sui quali si
-opera. Per finire, @code{contatore_file} @`e aggiunto a @code{totale}, in
-modo da stabilire qual @`e il numero totale di righe che ha soddisfatto il
-criterio di ricerca:
-
-@example
-@c file eg/prog/egrep.awk
-function endfile(file)
-@{
- if (! non_stampare && conta_e_basta) @{
- if (servono_nomi_file)
- print file ":" contatore_file
- else
- print contatore_file
- @}
-
- totale += contatore_file
-@}
-@c endfile
-@end example
-
-Si potrebbero usare i criteri di ricerca speciali @code{BEGINFILE} ed
-@code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}),
-ma in quel caso il programma funzionerebbe solo usando @command{gawk}.
-Inoltre, questo esempio @`e stato scritto prima che a @command{gawk} venissero
-aggiunti i criteri speciali @code{BEGINFILE} ed @code{ENDFILE}.
-
-La regola seguente fa il grosso del lavoro per trovare righe corrispondenti
-al criterio di ricerca fornito. La variabile
-@code{corrisponde} @`e vera se la riga @`e individuata dal criterio di ricerca.
-Se l'utente chiede invece le righe che non corrispondono, il senso di
-@code{corrisponde} @`e invertito, usando l'operatore @samp{!}.
-@code{contatore_file} @`e incrementato con il valore di
-@code{corrisponde}, che vale uno o zero, a seconda che la corrispondenza sia
-stata trovata oppure no. Se la riga non corrisponde, l'istruzione
-@code{next} passa ad esaminare il record successivo.
-
-Vengono effettuati anche altri controlli, ma soltanto se non
-si sceglie di contare le righe. Prima di tutto, se l'utente desidera solo
-il codice di ritorno (@code{non_stampare} @`e vero), @`e sufficiente sapere
-che @emph{una} riga nel file corrisponde, e si pu@`o passare al file successivo
-usando @code{nextfile}. Analogamente, se stiamo solo stampando @value{FNS},
-possiamo stampare il @value{FN}, e quindi saltare al file successivo con
-@code{nextfile}.
-Infine, ogni riga viene stampata, preceduta, se necessario, dal @value{FN} e
-dai due punti:
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@example
-@c file eg/prog/egrep.awk
-@{
- corrisponde = ($0 ~ criterio_di_ricerca)
- if (inverti_test)
- corrisponde = ! corrisponde
-
- contatore_file += corrisponde # 1 o 0
-
- if (! corrisponde)
- next
-
- if (! conta_e_basta) @{
- if (non_stampare)
- nextfile
-
- if (solo_nomi_file) @{
- print nome_file
- nextfile
- @}
-
- if (servono_nomi_file)
- print nome_file ":" $0
- else
- print
- @}
-@}
-@c endfile
-@end example
-
-La regola @code{END} serve a produrre il codice di ritorno corretto. Se
-non ci sono corrispondenze, il codice di ritorno @`e uno; altrimenti, @`e zero:
-
-@example
-@c file eg/prog/egrep.awk
-END @{
- exit (totale == 0)
-@}
-@c endfile
-@end example
-
-La funzione @code{sintassi()} stampa un messaggio per l'utente, nel caso
-siano state specificate opzioni non valide, e quindi esce:
-
-@example
-@c file eg/prog/egrep.awk
-function sintassi()
-@{
- print("sintassi: egrep [-csvil] [-e criterio_di_ricerca] [file ...]")\
- > "/dev/stderr"
- print("\n\tegrep [-csvil] criterio_di_ricerca [file ...]") > "/dev/stderr"
- exit 1
-@}
-@c endfile
-@end example
-
-
-@node Programma id
-@subsection Stampare informazioni sull'utente
-
-@cindex stampare informazioni utente
-@cindex utenti, informazioni riguardo agli, stampare
-@cindex @command{id}, programma di utilit@`a
-@cindex programma di utilit@`a @command{id}
-Il programma di utilit@`a @command{id} elenca i numeri identificativi (ID)
-reali ed effettivi di un utente, e l'insieme dei gruppi a cui l'utente
-appartiene, se ve ne sono.
-@command{id} stampa i numeri identificativi di utente e di gruppo solo se
-questi sono differenti da quelli reali. Se possibile, @command{id} elenca
-anche i corrispondenti nomi di utente e di gruppo.
-L'output potrebbe essere simile a questo:
-
-@example
-$ @kbd{id}
-@print{} uid=1000(arnold) gid=1000(arnold) groups=1000(arnold),4(adm),7(lp),27(sudo)
-@end example
-
-@cindex @code{PROCINFO}, vettore, e @dfn{process ID} di utente e di gruppo
-Questa informazione @`e parte di ci@`o che @`e reso disponibile dal vettore
-@code{PROCINFO} di @command{gawk} (@pxref{Variabili predefinite}).
-Comunque, il programma di utilit@`a @command{id} fornisce un output pi@`u
-comprensibile che non una semplice lista di numeri.
-
-Ecco una versione semplice di @command{id} scritta in @command{awk}.
-Usa le funzioni di libreria che riguardano il database degli utenti
-(@pxref{Funzioni Passwd})
-e le funzioni di libreria che riguardano il database dei gruppi
-(@pxref{Funzioni Group})
-contenute
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}.
-
-Il programma @`e abbastanza semplice. Tutto il lavoro @`e svolto nella regola
-@code{BEGIN}. I numeri ID di utente e di gruppo sono ottenuti da
-@code{PROCINFO}.
-Il codice @`e ripetitivo. La riga nel database degli utenti che descrive
-l'ID reale dell'utente @`e divisa in parti, separate tra loro da @samp{:}.
-Il nome @`e il primo campo. Un codice analogo @`e usato per l'ID effettivo, e
-per i numeri che descrivono i gruppi:
-
-@cindex @code{id.awk}, programma
-@cindex programma @code{id.awk}
-@example
-@c file eg/prog/id.awk
-# id.awk --- implement id in awk
-#
-# Richiede funzioni di libreria per utente e gruppo
-@c endfile
-@ignore
-@c file eg/prog/id.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised February 1996
-# Revised May 2014
-# Revised September 2014
-
-@c endfile
-@end ignore
-@c file eg/prog/id.awk
-# l'output @`e:
-# uid=12(pippo) euid=34(pluto) gid=3(paperino) \
-# egid=5(paperina) groups=9(nove),2(due),1(uno)
-
-@group
-BEGIN @{
- uid = PROCINFO["uid"]
- euid = PROCINFO["euid"]
- gid = PROCINFO["gid"]
- egid = PROCINFO["egid"]
-@end group
-
- printf("uid=%d", uid)
- pw = getpwuid(uid)
- stampa_primo_campo(pw)
-
- if (euid != uid) @{
- printf(" euid=%d", euid)
- pw = getpwuid(euid)
- stampa_primo_campo(pw)
- @}
-
- printf(" gid=%d", gid)
- pw = getgrgid(gid)
- stampa_primo_campo(pw)
-
- if (egid != gid) @{
- printf(" egid=%d", egid)
- pw = getgrgid(egid)
- stampa_primo_campo(pw)
- @}
-
- for (i = 1; ("group" i) in PROCINFO; i++) @{
- if (i == 1)
- printf(" gruppi=")
- group = PROCINFO["group" i]
- printf("%d", group)
- pw = getgrgid(group)
- stampa_primo_campo(pw)
- if (("group" (i+1)) in PROCINFO)
- printf(",")
- @}
-
- print ""
-@}
-
-function stampa_primo_campo(str, a)
-@{
- if (str != "") @{
- split(str, a, ":")
- printf("(%s)", a[1])
- @}
-@}
-@c endfile
-@end example
-
-Il test incluso nel ciclo @code{for} @`e degno di nota.
-Ogni ulteriore gruppo nel vettore @code{PROCINFO} ha come indice da
-@code{"group1"} a @code{"group@var{N}"} dove il numero
-@var{N} @`e il numero totale di gruppi ulteriori).
-Tuttavia, non si sa quanti di questi gruppi ci siano per un dato utente.
-
-Questo ciclo inizia da uno, concatena il valore di ogni iterazione con
-@code{"group"}, e poi usando l'istruzione @code{in} verifica se quella
-chiave @`e nel vettore (@pxref{Visitare elementi}). Quando @code{i} @`e
-incrementato oltre l'ultimo gruppo presente nel vettore, il ciclo termina.
-
-Il ciclo funziona correttamente anche se @emph{non} ci sono ulteriori
-gruppi; in quel caso la condizione risulta falsa fin dal primo controllo, e
-il corpo del ciclo non viene mai eseguito.
-
-La funzione @code{stampa_primo_campo()} semplicemente incapsula quelle parti di
-codice che vengono usate ripetutamente, rendendo il programma pi@`u conciso e
-ordinato.
-In particolare, inserendo in questa funzione il test per la stringa nulla
-consente di risparmiare parecchie righe di programma.
-
-
-@node Programma split
-@subsection Suddividere in pezzi un file grosso
-
-@c FIXME: One day, update to current POSIX version of split
-
-@cindex file, splitting
-@cindex @code{split}, programma di utilit@`a
-@cindex programma di utilit@`a @code{split}
-Il programma @command{split} divide grossi file di testo in pezzi pi@`u piccoli.
-La sua sintassi @`e la seguente:@footnote{Questo @`e la sintassi tradizionale.
-La versione POSIX del comando ha una sintassi differente, ma per lo scopo di
-questo programma @command{awk} la cosa non ha importanza.}
-
-@display
-@command{split} [@code{-@var{contatore}}] [@var{file}] [@var{prefisso}]
-@end display
-
-Per default,
-i file di output avranno nome @file{xaa}, @file{xab}, e cos@`{@dotless{i}} via. Ogni file
-contiene 1.000 righe, con la probabile
-eccezione dell'ultimo file. Per
-cambiare il numero di righe in ogni file, va indicato un numero sulla riga
-di comando, preceduto da un segno meno (p.es., @samp{-500} per file con 500
-righe ognuno invece che 1.000). Per modificare i nomi dei file di output in
-qualcosa del tipo
-@file{miofileaa}, @file{miofileab}, e cos@`{@dotless{i}} via, va indicato un argomento
-ulteriore che specifica il prefisso del @value{FN}.
-
-Ecco una versione di @command{split} in @command{awk}. Usa le funzioni
-@code{ord()} e @code{chr()} descritte nella
-@ref{Funzioni ordinali}.
-
-Il programma dapprima imposta i suoi valori di default, e poi controlla che
-non siano stati specificati troppi argomenti. Quindi esamina gli argomenti
-uno alla volta. Il primo
-argomento potrebbe essere un segno meno seguito da un numero. Poich@'e il
-numero in questione pu@`o apparire negativo, lo si fa diventare positivo, e
-viene usato per contare le righe. Il nome del @value{DF} @`e per ora ignorato
-e l'ultimo argomento @`e usato come prefisso per i @value{FNS} in output:
-
-@cindex @code{split.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{split.awk}
-@example
-@c file eg/prog/split.awk
-# split.awk --- comando split scritto in awk
-#
-# Richiede le funzioni di libreria ord() e chr()
-@c endfile
-@ignore
-@c file eg/prog/split.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised slightly, May 2014
-
-@c endfile
-@end ignore
-@c file eg/prog/split.awk
-# sintassi: split [-contatore] [file] [nome_in_output]
-
-BEGIN @{
- outfile = "x" # default
- contatore = 1000
- if (ARGC > 4)
- sintassi()
-
- i = 1
- if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) @{
- contatore = -ARGV[i]
- ARGV[i] = ""
- i++
- @}
- # testa argv nel caso che si legga da stdin invece che da file
- if (i in ARGV)
- i++ # salta nome file-dati
- if (i in ARGV) @{
- outfile = ARGV[i]
- ARGV[i] = ""
- @}
-
- s1 = s2 = "a"
- out = (outfile s1 s2)
-@}
-@c endfile
-@end example
-
-La regola seguente fa il grosso del lavoro. @code{contatore_t}
-(contatore temporaneo) tiene conto di
-quante righe sono state stampate sul file di output finora. Se questo
-numero supera il valore di @code{contatore}, @`e ora di chiudere il file
-corrente e di iniziare a scriverne uno nuovo.
-Le variabili @code{s1} e @code{s2} sono usate per creare i suffissi
-da apporre a @value{FN}. Se entrambi arrivano al valore @samp{z}, il file
-@`e troppo grosso. Altrimenti, @code{s1} passa alla successiva lettera
-dell'alfabeto e @code{s2} ricomincia da @samp{a}:
-
-@c else on separate line here for page breaking
-@example
-@c file eg/prog/split.awk
-@{
- if (++contatore_t > contatore) @{
- close(out)
- if (s2 == "z") @{
- if (s1 == "z") @{
- printf("split: %s @`e troppo grosso da suddividere\n",
- nome_file) > "/dev/stderr"
- exit 1
- @}
- s1 = chr(ord(s1) + 1)
- s2 = "a"
- @}
-@group
- else
- s2 = chr(ord(s2) + 1)
-@end group
- out = (outfile s1 s2)
- contatore_t = 1
- @}
- print > out
-@}
-@c endfile
-@end example
-
-@noindent
-La funzione @code{sintassi()} stampa solo un messaggio di errore ed esce:
-
-@example
-@c file eg/prog/split.awk
-function sintassi()
-@{
- print("sintassi: split [-num] [file] [nome_in_output]") > "/dev/stderr"
- exit 1
-@}
-@c endfile
-@end example
-
-Questo programma @`e un po' approssimativo; conta sul fatto che @command{awk} chiuda
-automaticamente l'ultimo file invece di farlo in una regola @code{END}.
-Un altro presupposto del programma @`e che le lettere dell'alfabeto siano
-in posizioni consecutive nella codifica in uso, il che non @`e vero per i
-sistemi che usano la codifica EBCDIC.
-
-@ifset FOR_PRINT
-Si potrebbe pensare a come eliminare l'uso di
-@code{ord()} e @code{chr()}; la cosa si pu@`o fare in modo tale da risolvere
-anche il problema posto dalla codifica EBCDIC.
-@end ifset
-
-
-@node Programma tee
-@subsection Inviare l'output su pi@`u di un file
-
-@cindex file, multipli@comma{} duplicare l'output su
-@cindex output, duplicarlo su pi@`u file
-@cindex @code{tee}, programma di utilit@`a
-@cindex programma di utilit@`a @code{tee}
-Il programma @code{tee} @`e noto come @dfn{pipe fitting} (tubo secondario).
-@code{tee} copia il suo standard input al suo standard output e inoltre lo
-duplica scrivendo sui file indicati nella riga di comando. La sua sintassi
-@`e la seguente:
-
-@display
-@command{tee} [@option{-a}] @var{file} @dots{}
-@end display
-
-L'opzione @option{-a} chiede a @code{tee} di aggiungere in fondo al file
-indicato, invece che riscriverlo dall'inizio.
-
-La regola @code{BEGIN} dapprima fa una copia di tutti gli argomenti presenti
-sulla riga di comando, in un vettore di nome @code{copia}.
-@code{ARGV[0]} non serve, e quindi non viene copiato.
-@code{tee} non pu@`o usare @code{ARGV} direttamente, perch@'e @command{awk} tenta
-di elaborare ogni @value{FN} in @code{ARGV} come dati in input.
-
-@cindex flag, variabili di tipo
-@cindex variabili di tipo indicatore [@dfn{flag}]
-Se il primo argomento @`e @option{-a}, la variabile flag
-@code{append} viene impostata a vero, e sia @code{ARGV[1]} che
-@code{copia[1]} vengono cancellati. Se @code{ARGC} @`e minore di due, nessun
-@value{FN} @`e stato fornito, e @code{tee} stampa un messaggio di sintassi ed
-esce.
-Infine, @command{awk} viene obbligato a leggere lo standard input
-impostando @code{ARGV[1]} al valore @code{"-"} e @code{ARGC} a due:
-
-@cindex @code{tee.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{tee.awk}
-@example
-@c file eg/prog/tee.awk
-# tee.awk --- tee in awk
-#
-# Copia lo standard input a tutti i file di output indicati.
-# Aggiunge in fondo se viene data l'opzione -a.
-#
-@c endfile
-@ignore
-@c file eg/prog/tee.awk
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised December 1995
-
-@c endfile
-@end ignore
-@c file eg/prog/tee.awk
-BEGIN @{
- for (i = 1; i < ARGC; i++)
- copia[i] = ARGV[i]
-
- if (ARGV[1] == "-a") @{
- append = 1
- delete ARGV[1]
- delete copia[1]
- ARGC--
- @}
- if (ARGC < 2) @{
- print "sintassi: tee [-a] file ..." > "/dev/stderr"
- exit 1
- @}
- ARGV[1] = "-"
- ARGC = 2
-@}
-@c endfile
-@end example
-
-La seguente regola @`e sufficiente da sola a eseguire il lavoro. Poich@'e non @`e
-presente alcun criterio di ricerca, la regola @`e eseguita per ogni riga di
-input. Il corpo della regola si limita a stampare la riga su ogni file
-indicato nella riga di comando, e poi sullo standard output:
-
-@example
-@c file eg/prog/tee.awk
-@{
- # spostare l'if fuori dal ciclo ne velocizza l'esecuzione
- if (append)
- for (i in copia)
- print >> copia[i]
- else
- for (i in copia)
- print > copia[i]
- print
-@}
-@c endfile
-@end example
-
-@noindent
-@`E anche possibile scrivere il ciclo cos@`{@dotless{i}}:
-
-@example
-for (i in copia)
- if (append)
- print >> copia[i]
- else
- print > copia[i]
-@end example
-
-@noindent
-Questa forma @`e pi@`u concisa, ma anche meno efficiente. L'@samp{if} @`e
-eseguito per ogni record e per ogni file di output. Duplicando il corpo
-del ciclo, l'@samp{if} @`e eseguito solo una volta per ogni record in input.
-Se ci sono
-@var{N} record in input e @var{M} file di output, il primo metodo esegue solo
-@var{N} istruzioni @samp{if}, mentre il secondo esegue
-@var{N}@code{*}@var{M} istruzioni @samp{if}.
-
-Infine, la regola @code{END} fa pulizia, chiudendo tutti i file di output:
-
-@example
-@c file eg/prog/tee.awk
-END @{
- for (i in copia)
- close(copia[i])
-@}
-@c endfile
-@end example
-
-@node Programma uniq
-@subsection Stampare righe di testo non duplicate
-
-@c FIXME: One day, update to current POSIX version of uniq
-
-@cindex stampare righe di testo non duplicate
-@cindex testo@comma{} stampare, righe non duplicate di
-@cindex @command{uniq}, programma di utilit@`a
-@cindex programma di utilit@`a @command{uniq}
-Il programma di utilit@`a @command{uniq} legge righe di dati ordinati sul suo
-standard input, e per default rimuove righe duplicate. In altre parole,
-stampa solo righe uniche; da cui il
-nome. @command{uniq} ha diverse opzioni. La sintassi @`e la seguente:
-
-@display
-@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}] [@var{file_input} [@var{file_output}]]
-@end display
-
-Le opzioni per @command{uniq} sono:
-
-@table @code
-@item -d
-Stampa solo righe ripetute (duplicate).
-
-@item -u
-Stampa solo righe non ripetute (uniche).
-
-@item -c
-Contatore righe. Quest'opzione annulla le opzioni @option{-d} e @option{-u}.
-Sia le righe ripetute che quelle non ripetute vengono contate.
-
-@item -@var{n}
-Salta @var{n} campi prima di confrontare le righe. La definizione di campo
-@`e simile al default di @command{awk}: caratteri non bianchi, separati da
-sequenze di spazi e/o TAB.
-
-@item +@var{n}
-Salta @var{n} caratteri prima di confrontare le righe. Eventuali campi
-specificati con @samp{-@var{n}} sono saltati prima.
-
-@item @var{file_input}
-I dati sono letti dal file in input specificato sulla riga di comando, invece
-che dallo standard input.
-
-@item @var{file_output}
-L'output generato @`e scritto sul file di output specificato, invece che sullo
-standard output.
-@end table
-
-Normalmente @command{uniq} si comporta come se siano state specificate entrambe
-le opzioni @option{-d} e @option{-u}.
-
-@command{uniq} usa la
-funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-Il programma inizia con una funzione @code{sintassi()} e poi con una breve
-spiegazione delle opzioni e del loro significato, sotto forma di commenti.
-La regola @code{BEGIN} elabora gli argomenti della riga di comando e le
-opzioni. Viene usato un artificio per poter impiegare @code{getopt()} con
-opzioni della forma @samp{-25},
-trattando quest'opzione come la lettera di opzione @samp{2} con
-l'argomento @samp{5}. Se si specificano due o pi@`u cifre (@code{Optarg}
-sembra essere numerico), @code{Optarg} @`e concatenato con la cifra che
-costituisce l'opzione e poi al risultato @`e addizionato zero, per trasformarlo
-in un numero. Se c'@`e solo una cifra nell'opzione, @code{Optarg} non @`e
-necessario. In tal caso, @code{Optind} dev'essere decrementata, in modo che
-@code{getopt()} la elabori quando viene nuovamente richiamato. Questo codice
-@`e sicuramente un po' intricato.
-
-Se non sono specificate opzioni, per default si stampano sia le righe
-ripetute che quelle non ripetute. Il file di output, se specificato, @`e
-assegnato a @code{file_output}. In precedenza, @code{file_output} @`e
-inizializzato allo standard output, @file{/dev/stdout}:
-
-@cindex @code{uniq.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{uniq.awk}
-@example
-@c file eg/prog/uniq.awk
-@group
-# uniq.awk --- implementa uniq in awk
-#
-# Richiede le funzioni di libreria getopt() e join()
-@end group
-@c endfile
-@ignore
-@c file eg/prog/uniq.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/uniq.awk
-
-function sintassi()
-@{
- print("sintassi: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
- exit 1
-@}
-
-# -c contatore di righe. prevale su -d e -u
-# -d solo righe ripetute
-# -u solo righe non ripetute
-# -n salta n campi
-# +n salta n caratteri, salta prima eventuali campi
-
-BEGIN @{
- contatore = 1
- file_output = "/dev/stdout"
- opts = "udc0:1:2:3:4:5:6:7:8:9:"
- while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
- if (c == "u")
- solo_non_ripetute++
- else if (c == "d")
- solo_ripetute++
- else if (c == "c")
- conta_record++
- else if (index("0123456789", c) != 0) @{
- # getopt() richiede argomenti per le opzioni
- # questo consente di gestire cose come -5
- if (Optarg ~ /^[[:digit:]]+$/)
- contatore_file = (c Optarg) + 0
- else @{
- contatore_file = c + 0
- Optind--
- @}
- @} else
- sintassi()
- @}
-
- if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
- conta_caratteri = substr(ARGV[Optind], 2) + 0
- Optind++
- @}
-
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-
- if (solo_ripetute == 0 && solo_non_ripetute == 0)
- solo_ripetute = solo_non_ripetute = 1
-
- if (ARGC - Optind == 2) @{
- file_output = ARGV[ARGC - 1]
- ARGV[ARGC - 1] = ""
- @}
-@}
-@c endfile
-@end example
-
-La funzione seguente, @code{se_sono_uguali()}, confronta la riga corrente,
-@code{$0}, con la riga precedente, @code{ultima}. Gestisce il salto di
-campi e caratteri. Se non sono stati richiesti n@'e contatori di campo n@'e
-contatori di carattere, @code{se_sono_uguali()} restituisce uno o zero a
-seconda del risultato di un semplice confronto tra le stringhe @code{ultima}
-e @code{$0}.
-
-In caso contrario, le cose si complicano. Se devono essere saltati dei campi,
-ogni riga viene suddivisa in un vettore, usando @code{split()}
-(@pxref{Funzioni per stringhe}); i campi desiderati sono poi nuovamente uniti in
-un'unica riga usando @code{join()}. Le righe ricongiunte vengono
-immagazzinate in @code{campi_ultima} e @code{campi_corrente}. Se non ci
-sono campi da saltare, @code{campi_ultima} e @code{campi_corrente} sono
-impostati a @code{ultima} e @code{$0}, rispettivamente. Infine, se
-occorre saltare dei caratteri, si usa @code{substr()} per eliminare i primi
-@code{conta_caratteri} caratteri in @code{campi_ultima} e
-@code{campi_corrente}. Le due stringhe sono poi confrontare e
-@code{se_sono_uguali()} restituisce il risultato del confronto:
-
-@example
-@c file eg/prog/uniq.awk
-function se_sono_uguali( n, m, campi_ultima, campi_corrente,\
-vettore_ultima, vettore_corrente)
-@{
- if (contatore_file == 0 && conta_caratteri == 0)
- return (ultima == $0)
-
- if (contatore_file > 0) @{
- n = split(ultima, vettore_ultima)
- m = split($0, vettore_corrente)
- campi_ultima = join(vettore_ultima, contatore_file+1, n)
- campi_corrente = join(vettore_corrente, contatore_file+1, m)
- @} else @{
- campi_ultima = ultima
- campi_corrente = $0
- @}
- if (conta_caratteri) @{
- campi_ultima = substr(campi_ultima, conta_caratteri + 1)
- campi_corrente = substr(campi_corrente, conta_caratteri + 1)
- @}
-
- return (campi_ultima == campi_corrente)
-@}
-@c endfile
-@end example
-
-Le due regole seguenti sono il corpo del programma. La prima @`e eseguita solo
-per la prima riga dei dati. Imposta @code{ultima} al record corrente
-@code{$0}, in modo che le righe di testo successive abbiano qualcosa con cui
-essere confrontate.
-
-La seconda regola fa il lavoro. La variabile @code{uguale} vale uno o zero,
-a seconda del risultato del confronto effettuato in @code{se_sono_uguali()}.
-Se @command{uniq} sta contando le righe ripetute, e le righe sono uguali,
-viene incrementata la variabile @code{contatore}.
-Altrimenti, viene stampata la riga e azzerato @code{contatore},
-perch@'e le due righe non sono uguali.
-
-Se @command{uniq} non sta contando, e se le righe sono uguali,
-@code{contatore} @`e incrementato.
-Non viene stampato niente, perch@'e l'obiettivo @`e quello di rimuovere i duplicati.
-Altrimenti, se @command{uniq} sta contando le righe ripetute e viene trovata pi@`u
-di una riga, o se @command{uniq} sta contando le righe non ripetute
-e viene trovata solo una riga, questa riga viene stampata, e @code{contatore} @`e
-azzerato.
-
-Infine, una logica simile @`e usata nella regola @code{END} per stampare
-l'ultima riga di dati in input:
-
-@example
-@c file eg/prog/uniq.awk
-NR == 1 @{
- ultima = $0
- next
-@}
-
-@{
- uguale = se_sono_uguali()
-
- if (conta_record) @{ # prevale su -d e -u
- if (uguale)
- contatore++
- else @{
- printf("%4d %s\n", contatore, ultima) > file_output
- ultima = $0
- contatore = 1 # reset
- @}
- next
- @}
-
- if (uguale)
- contatore++
- else @{
- if ((solo_ripetute && contatore > 1) ||
- (solo_non_ripetute && contatore == 1))
- print ultima > file_output
- ultima = $0
- contatore = 1
- @}
-@}
-
-END @{
- if (conta_record)
- printf("%4d %s\n", contatore, ultima) > file_output
- else if ((solo_ripetute && contatore > 1) ||
- (solo_non_ripetute && contatore == 1))
- print ultima > file_output
- close(file_output)
-@}
-@c endfile
-@end example
-
-@c FIXME: Include this?
-@ignore
-This program does not follow our recommended convention of naming
-global variables with a leading capital letter. Doing that would
-make the program a little easier to follow.
-@end ignore
-
-@ifset FOR_PRINT
-La logica per scegliere quali righe stampare rappresenta una @dfn{macchina a
-stati}, che @`e ``un dispositivo che pu@`o trovarsi in una tra un dato numero di
-condizioni stabili, a seconda della sua condizione precedente e del valore
-corrente dei suoi input.''@footnote{Questa @`e la definizione trovata
-cercando @code{define: state machine} in Google.}
-Brian Kernighan suggerisce che
-``un approccio alternativo alle macchine a stati @`e quello di mettere l'input
-in un vettore, e poi usare gli indici. @`E quasi sempre pi@`u facile da
-programmare e, per molti input in cui si pu@`o usare questo metodo,
-altrettanto veloce.'' Si consideri come riscrivere la logica di questo
-programma per seguite questo suggerimento.
-@end ifset
-
-
-
-@node Programma wc
-@subsection Contare cose
-
-@c FIXME: One day, update to current POSIX version of wc
-
-@cindex contare
-@cindex file in input, contare elementi nel
-@cindex parole, contare le
-@cindex caratteri, contare i
-@cindex righe, contare le
-@cindex @command{wc}, programma di utilit@`a
-@cindex programma di utilit@`a @command{wc}
-Il programma di utilit@`a @command{wc} (@dfn{word count}, contatore di parole)
-conta righe, parole, e caratteri in uno o pi@`u file in input. La sua sintassi
-@`e la seguente:
-
-@display
-@command{wc} [@option{-lwc}] [@var{file} @dots{}]
-@end display
-
-Se nessun file @`e specificato sulla riga di comando, @command{wc} legge il suo
-standard input. Se ci sono pi@`u file, stampa anche il contatore totale di
-tutti i file. Le opzioni e il loro significato sono i seguenti:
-
-@table @code
-@item -l
-Conta solo le righe.
-
-@item -w
-Conta solo le parole.
-Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da
-spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk}
-separa i campi nei suoi record in input.
-
-@item -c
-Conta solo i caratteri.
-@end table
-
-Implementare @command{wc} in @command{awk} @`e particolarmente elegante,
-perch@'e @command{awk} fa molto lavoro al posto nostro; divide le righe in
-parole (cio@`e, campi) e le conta, conta le righe (cio@`e, i record),
-e pu@`o facilmente dire quanto @`e lunga una riga.
-
-Questo programma usa la funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e le funzioni di passaggio da un file all'altro
-(@pxref{Funzione filetrans}).
-
-Questa versione ha una differenza significativa rispetto alle versioni
-tradizionali di @command{wc}: stampa sempre i contatori rispettando l'ordine
-righe, parole e caratteri. Le versioni tradizionali rilevano l'ordine in cui
-sono specificate le opzioni @option{-l}, @option{-w} e @option{-c} sulla riga
-di comando, e stampano i contatori in quell'ordine.
-
-La regola @code{BEGIN} si occupa degli argomenti. La variabile
-@code{stampa_totale} @`e vera se pi@`u di un file @`e presente sulla
-riga di comando:
-
-@cindex @code{wc.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{wc.awk}
-@example
-@c file eg/prog/wc.awk
-# wc.awk --- conta righe, parole, caratteri
-@c endfile
-@ignore
-@c file eg/prog/wc.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/wc.awk
-
-# Opzioni:
-# -l conta solo righe
-# -w conta solo parole
-# -c conta solo caratteri
-#
-# Il default @`e di contare righe, parole, caratteri
-#
-# Richiede le funzioni di libreria getopt()
-# e il programma di libreria che gestisce
-# il passaggio da un file dati al successivo
-
-BEGIN @{
- # consente a getopt() di stampare un messaggio se si specificano
- # opzioni non valide. Noi le ignoriamo
- while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{
- if (c == "l")
- conta_righe = 1
- else if (c == "w")
- conta_parole = 1
- else if (c == "c")
- conta_caratteri = 1
- @}
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-
- # se nessuna opzione @`e specificata, conta tutto
- if (! conta_righe && ! conta_parole && ! conta_caratteri)
- conta_righe = conta_parole = conta_caratteri = 1
-
- stampa_totale = (ARGC - i > 1)
-@}
-@c endfile
-@end example
-
-La funzione @code{a_inizio_file()} @`e semplice; si limita ad azzerare i contatori
-di righe, parole e caratteri, e salva il valore corrente di @value{FN} in
-@code{nome_file}:
-
-@example
-@c file eg/prog/wc.awk
-function a_inizio_file(file)
-@{
- righe = parole = caratteri = 0
- nome_file = FILENAME
-@}
-@c endfile
-@end example
-
-La funzione @code{a_fine_file()} aggiunge i numeri del file corrente al totale
-di righe, parole, e caratteri. Poi stampa i numeri relativi al file appena
-letto. La funzione
-@code{a_inizio_file()} azzera i numeri relativi al @value{DF} seguente:
-
-@example
-@c file eg/prog/wc.awk
-function a_fine_file(file)
-@{
- totale_righe += righe
- totale_parole += parole
- totale_caratteri += caratteri
- if (conta_righe)
- printf "\t%d", righe
-@group
- if (conta_parole)
- printf "\t%d", parole
-@end group
- if (conta_caratteri)
- printf "\t%d", caratteri
- printf "\t%s\n", nome_file
-@}
-@c endfile
-@end example
-
-C'@`e una regola che viene eseguita per ogni riga. Aggiunge la lunghezza del record
-pi@`u uno, a @code{caratteri}.@footnote{Poich@'e @command{gawk} gestisce le
-localizzazioni in cui un carattere pu@`o occupare pi@`u di un byte, questo codice
-conta i caratteri, non i byte.}
-Aggiungere uno alla lunghezza del record
-@`e necessario, perch@'e il carattere di ritorno a capo, che separa i record
-(il valore di @code{RS}) non @`e parte del record stesso, e quindi non @`e
-incluso nella sua lunghezza. Poi, @code{righe} @`e incrementata per ogni riga
-letta, e @code{parole} @`e incrementato con il valore @code{NF}, che @`e il
-numero di ``parole'' su questa riga:
-
-@example
-@c file eg/prog/wc.awk
-# per ogni riga...
-@{
- caratteri += length($0) + 1 # aggiunge un ritorno a capo
- righe++
- parole += NF
-@}
-@c endfile
-@end example
-
-Infine, la regola @code{END} si limita a stampare i totali per tutti i file:
-
-@example
-@c file eg/prog/wc.awk
-END @{
- if (stampa_totale) @{
- if (conta_righe)
- printf "\t%d", totale_righe
- if (conta_parole)
- printf "\t%d", totale_parole
- if (conta_caratteri)
- printf "\t%d", totale_caratteri
- print "\ttotale"
- @}
-@}
-@c endfile
-@end example
-
-@node Programmi vari
-@section Un paniere di programmi @command{awk}
-
-Questa @value{SECTION} @`e un ``paniere'' che contiene vari programmi.
-Si spera che siano interessanti e divertenti.
-
-@menu
-* Programma dupword:: Trovare parole duplicate in un documento.
-* Programma alarm:: Un programma di sveglia.
-* Programma translate:: Un programma simile al programma di utilit@`a
- @command{tr}.
-* Programma labels:: Stampare etichette per lettere.
-* Programma utilizzo parole:: Un programma per produrre un contatore
- dell'uso di parole in un testo.
-* Programma riordino diario:: Eliminare righe doppie da un file di
- cronologia.
-* Programma extract :: Estrarre programmi da file sorgenti Texinfo.
-* Programma sed semplice:: Un semplice editor di flusso.
-* Programma igawk:: Un programma per fornire ad
- @command{awk} la possibilit@`a di includere
- file.
-* Programma anagram:: Trovare anagrammi da una lista di parole.
-* Programma signature:: La gente fa cose stupefacenti se ha troppo
- tempo libero.
-@end menu
-
-@node Programma dupword
-@subsection Trovare parole duplicate in un documento
-
-@cindex parole duplicate, ricerca di
-@cindex ricerca di parole
-@cindex documenti@comma{} ricerca in
-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 questo programma fa quanto segue@dots{}'' Quando il testo @`e pubblicato in rete, spesso
-le parole duplicate sono poste tra il termine di
-@iftex
-di
-@end iftex
-una 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
-e cerca le occorrenze adiacenti della stessa parola. Conserva anche
-l'ultima parola di ogni riga (nella variabile @code{precedente}) per
-confrontarla con la prima parola sulla riga successiva.
-
-@cindex Texinfo
-Le prime due istruzioni fanno s@`{@dotless{i}} che la riga sia tutta in minuscolo,
-in modo che, per esempio, ``Il'' e ``il'' risultino essere la stessa parola.
-L'istruzione successiva sostituisce i caratteri che sono non alfanumerici e
-diversi dagli
-spazi bianchi con degli spazi, in modo che neppure la punteggiatura influenzi
-i confronti.
-I caratteri sono rimpiazzati da spazi in modo che i controlli di formattazione
-non creino parole prive di senso (p.es., l'espressione Texinfo
-@samp{@@code@{NF@}} diventa @samp{codeNF}, se ci si limita a eliminare la
-punteggiatura). Il record @`e poi
-suddiviso di nuovo in campi, producendo cos@`{@dotless{i}} solo la lista delle parole
-presenti sulla riga, esclusi eventuali campi nulli.
-
-Se, dopo aver rimosso tutta la punteggiatura, non rimane alcun campo, il
-record corrente @`e saltato. In caso contrario, il programma esegue il ciclo
-per ogni parola, confrontandola con quella che la precede:
-
-@cindex @code{dupword.awk}, programma
-@cindex programma @code{dupword.awk}
-@example
-@c file eg/prog/dupword.awk
-# dupword.awk --- trova parole duplicate in un testo
-@c endfile
-@ignore
-@c file eg/prog/dupword.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# December 1991
-# Revised October 2000
-
-@c endfile
-@end ignore
-@c file eg/prog/dupword.awk
-@{
- $0 = tolower($0)
- gsub(/[^[:alnum:][:blank:]]/, " ");
- $0 = $0 # divide di nuovo in campi
- if (NF == 0)
- next
- if ($1 == prec)
- printf("%s:%d: duplicato %s\n",
- nome_file, FNR, $1)
- for (i = 2; i <= NF; i++)
- if ($i == $(i-1))
- printf("%s:%d: duplicato %s\n",
- nome_file, FNR, $i)
- prec = $NF
-@}
-@c endfile
-@end example
-
-@node Programma alarm
-@subsection Un programma di sveglia
-@cindex insonnia, cura per
-@cindex Robbins, Arnold
-@quotation
-@i{Nessuna cura contro l'insonnia @`e efficace quanto una sveglia che suona.}
-@author Arnold Robbins
-@end quotation
-@cindex Quanstrom, Erik
-@ignore
-Date: Sat, 15 Feb 2014 16:47:09 -0500
-Subject: Re: 9atom install question
-Message-ID: <l2jcvx6j6mey60xnrkb0hhob.1392500829294@email.android.com>
-From: Erik Quanstrom <quanstro@quanstro.net>
-To: Aharon Robbins <arnold@skeeve.com>
-
-yes.
-
-- erik
-
-Aharon Robbins <arnold@skeeve.com> wrote:
-
->> sleep is for web developers.
->
->Can I quote you, in the gawk manual?
->
->Thanks,
->
->Arnold
-@end ignore
-@quotation
-@i{Il sonno @`e per sviluppatori web.}
-@author Erik Quanstrom
-@end quotation
-
-@cindex tempo, sveglia, programma di esempio
-@cindex sveglia, programma di esempio
-Il seguente programma @`e un semplice programma di ``sveglia''.
-Si pu@`o specificare un'ora del giorno e un messaggio opzionale. All'ora
-specificata, il programma stampa il messaggio sullo standard output. Inoltre,
-si pu@`o specificare il numero di volte in cui il messaggio va ripetuto, e
-anche un intervallo di tempo (ritardo) tra ogni ripetizione.
-
-Questo programma usa la funzione @code{getlocaltime()}
-@iftex
-dalla
-@end iftex
-@ifnottex
-da
-@end ifnottex
-@ref{Funzione getlocaltime}.
-
-Tutto il lavoro @`e svolto nella regola @code{BEGIN}. La prima parte @`e
-il controllo degli argomenti e l'impostazione dei valori di default:
-l'intervallo prima di ripetere, il contatore, e il messaggio da stampare.
-Se l'utente ha fornito un messaggio che non contiene il carattere ASCII BEL
-(noto come carattere ``campanello'', @code{"\a"}), questo viene aggiunto al
-messaggio. (Su molti sistemi, stampare il carattere ASCII BEL genera un suono
-udibile. Quindi, quando la sveglia suona, il sistema richiama l'attenzione
-su di s@'e nel caso che l'utente non stia guardando il computer.)
-Per amor di variet@`a, questo programma usa un'istruzione @code{switch}
-(@pxref{Istruzione switch}), ma l'elaborazione potrebbe anche essere fatta
-con una serie di istruzioni @code{if}-@code{else}.
-Ecco il programma:
-
-@cindex @code{alarm.awk}, programma
-@cindex programma @code{alarm.awk}
-@example
-@c file eg/prog/alarm.awk
-# alarm.awk --- impostare una sveglia
-#
-# Richiede la funzione di libreria getlocaltime()
-@c endfile
-@ignore
-@c file eg/prog/alarm.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised December 2010
-
-@c endfile
-@end ignore
-@c file eg/prog/alarm.awk
-# sintassi: alarm a_che_ora [ "messaggio" [ contatore [ ritardo ] ] ]
-
-BEGIN @{
- # Controllo iniziale congruit@`a argomenti
- sintassi1 = "sintassi: alarm a_che_ora ['messaggio' [contatore [ritardo]]]"
- sintassi2 = sprintf("\t(%s) formato ora: ::= hh:mm", ARGV[1])
-
- if (ARGC < 2) @{
- print sintassi1 > "/dev/stderr"
- print sintassi2 > "/dev/stderr"
- exit 1
- @}
- switch (ARGC) @{
- case 5:
- ritardo = ARGV[4] + 0
- # vai al caso seguente
- case 4:
- contatore = ARGV[3] + 0
- # vai al caso seguente
- case 3:
- messaggio = ARGV[2]
- break
- default:
- if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{
- print sintassi1 > "/dev/stderr"
- print sintassi2 > "/dev/stderr"
- exit 1
- @}
- break
- @}
-
- # imposta i valori di default per quando arriva l'ora desiderata
- if (ritardo == 0)
- ritardo = 180 # 3 minuti
-@group
- if (contatore == 0)
- contatore = 5
-@end group
- if (messaggio == "")
- messaggio = sprintf("\aAdesso sono le %s!\a", ARGV[1])
- else if (index(message, "\a") == 0)
- messaggio = "\a" messaggio "\a"
-@c endfile
-@end example
-
-La successiva @value{SECTION} di codice scompone l'ora specificata in ore e
-minuti, la converte (se @`e il caso) al formato 24-ore, e poi calcola il
-relativo numero di secondi dalla mezzanotte. Poi trasforma l'ora corrente in
-un contatore dei secondi dalla
-mezzanotte. La differenza tra i due @`e il tempo di attesa che deve passare
-prima di far scattare la sveglia:
-
-@example
-@c file eg/prog/alarm.awk
- # scomponi ora della sveglia
- split(ARGV[1], ore_minuti, ":")
- ora = ore_minuti[1] + 0 # trasforma in numero
- minuto = ore_minuti[2] + 0 # trasforma in numero
-
- # ottiene ora corrente divisa in campi
- getlocaltime(adesso)
-
- # se l'ora desiderata @`e in formato 12-ore ed @`e nel pomeriggio
- # (p.es., impostare `alarm 5:30' alle 9 del mattino
- # vuol dire far suonare la sveglia alle 5:30 pomeridiane)
- # aggiungere 12 all'ora richiesta
- if (hour < 12 && adesso["hour"] > ora)
- ora += 12
-
- # imposta l'ora in secondi dalla mezzanotte
- sveglia = (ora * 60 * 60) + (minuto * 60)
-
- # ottieni l'ora corrente in secondi dalla mezzanotte
- corrente = (now["hour"] * 60 * 60) + \
- (now["minute"] * 60) + now["second"]
-
- # quanto restare appisolati
- sonno = sveglia - corrente
- if (sonno <= 0) @{
- print "alarm: l'ora @`e nel passato!" > "/dev/stderr"
- exit 1
- @}
-@c endfile
-@end example
-
-@cindex @command{sleep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sleep}
-Infine, il programma usa la funzione @code{system()}
-(@pxref{Funzioni di I/O})
-per chiamare il programma di utilit@`a @command{sleep}. Il programma di utilit@`a
-@command{sleep} non fa altro che aspettare per il numero di secondi
-specificato. Se il codice di ritorno restituito @`e diverso da zero, il
-programma suppone che @command{sleep} sia stato interrotto ed esce. Se
-@command{sleep} @`e terminato con un codice di ritorno corretto, (zero), il
-programma stampa il messaggio in un ciclo, utilizzando ancora @command{sleep}
-per ritardare per il numero di secondi necessario:
-
-@example
-@c file eg/prog/alarm.awk
- # zzzzzz..... esci se sleep @`e interrotto
- if (system(sprintf("sleep %d", sonno)) != 0)
- exit 1
-
- # @`e ora di avvisare!
- command = sprintf("sleep %d", ritardo)
- for (i = 1; i <= contatore; i++) @{
- print messaggio
- # se il comando sleep @`e interrotto, esci
- if (system(command) != 0)
- break
- @}
-
- exit 0
-@}
-@c endfile
-@end example
-
-@node Programma translate
-@subsection Rimpiazzare o eliminare caratteri
-
-@cindex caratteri, rimpiazzare
-@cindex rimpiazzare caratteri
-@cindex @command{tr}, programma di utilit@`a
-@cindex programma di utilit@`a @command{tr}
-Il programma di utilit@`a di sistema @command{tr} rimpiazza caratteri. Per
-esempio, @`e spesso usato per trasformare lettere maiuscole in lettere minuscole
-in vista di ulteriori elaborazioni:
-
-@example
-@var{generare dei dati} | tr 'A-Z' 'a-z' | @var{elaborare dei dati} @dots{}
-@end example
-
-@command{tr} richiede due liste di caratteri.@footnote{Su alcuni sistemi
-pi@`u datati, incluso Solaris, la versione di sistema di @command{tr} pu@`o
-richiedere che le liste siano scritte come espressioni di intervallo,
-racchiuse in parentesi quadre
-(@samp{[a-z]}) e tra apici, per evitare che la shell effettui
-espansioni di @value{FN}. Questo non @`e un miglioramento.} Quando
-si elabora l'input, il primo carattere della prima lista @`e rimpiazzato con il
-primo carattere della seconda lista, il secondo carattere della prima lista @`e
-rimpiazzato con il secondo carattere della seconda lista, e cos@`{@dotless{i}} via. Se ci
-sono pi@`u caratteri nella lista ``da'' che in quella ``a'', l'ultimo carattere
-della lista ``a'' @`e usato per i restanti caratteri della lista ``da''.
-
-In un lontano passato,
-@c early or mid-1989!
-un utente propose di aggiungere una funzione di traslitterazione a
-@command{gawk}.
-@c Wishing to avoid gratuitous new features,
-@c at least theoretically
-Il programma seguente @`e stato scritto per dimostrare che la traslitterazione
-di caratteri poteva essere fatta con una funzione definita dall'utente.
-Questo programma non @`e cos@`{@dotless{i}} completo come il programma di utilit@`a di sistema
-@command{tr}, ma svolge buona parte dello stesso lavoro.
-
-Il programma @command{translate} @`e stato scritto molto prima che @command{gawk}
-fosse in grado di separare ciascun carattere di una stringa in elementi
-distinti di un vettore. Questo @`e il motivo per cui usa ripetutamente le
-funzioni predefinite @code{substr()}, @code{index()}, e @code{gsub()}
-(@pxref{Funzioni per stringhe}).
-Ci sono due funzioni. La prima, @code{traduci_stringa()},
-richiede tre argomenti:
-
-@table @code
-@item da
-Una lista di caratteri da cui traslitterare
-
-@item a
-Una lista di caratteri a cui traslitterare
-
-@item stringa
-La stringa su cui effettuare la traslitterazione
-@end table
-
-I vettori associativi facilitano molto la parte di traslitterazione.
-@code{vettore_trad} contiene i caratteri ``a'', indicizzato dai
-caratteri ``da''. Poi un semplice
-ciclo scandisce @code{da}, un carattere alla volta. Per ogni carattere
-in @code{da}, se il carattere compare in @code{stringa}
-@`e rimpiazzato con il corrispondente carattere @code{a}.
-
-La funzione @code{traducilo()} chiama @code{traduci_stringa()}, usando @code{$0}
-come stringa. Il programma principale imposta due variabili globali, @code{DA} e
-@code{A}, dalla riga di comando, e poi modifica @code{ARGV} in modo che
-@command{awk} legga dallo standard input.
-
-Infine, la regola di elaborazione si limita a chiamare @code{traducilo()}
-per ogni record:
-
-@cindex @code{translate.awk}, programma
-@cindex programma @code{translate.awk}
-@example
-@c file eg/prog/translate.awk
-# translate.awk --- fa cose simili al comando tr
-@c endfile
-@ignore
-@c file eg/prog/translate.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August 1989
-# February 2009 - bug fix
-
-@c endfile
-@end ignore
-@c file eg/prog/translate.awk
-# Bug: non gestisce cose del tipo tr A-Z a-z; deve 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'.
-
-function traduci_stringa(da, a, stringa, lf, lt, lstringa, vettore_trad,
- i, c, risultato)
-@{
- lf = length(da)
- lt = length(a)
- lstringa = length(stringa)
- for (i = 1; i <= lt; i++)
- vettore_trad[substr(da, i, 1)] = substr(a, i, 1)
- if (lt < lf)
- for (; i <= lf; i++)
- vettore_trad[substr(da, i, 1)] = substr(a, lt, 1)
- for (i = 1; i <= lstringa; i++) @{
- c = substr(stringa, i, 1)
- if (c in vettore_trad)
- c = vettore_trad[c]
- risultato = risultato c
- @}
- return risultato
-@}
-
-function traducilo(da, a)
-@{
- return $0 = traduci_stringa(da, a, $0)
-@}
-
-# programma principale
-BEGIN @{
-@group
- if (ARGC < 3) @{
- print "sintassi: translate da a" > "/dev/stderr"
- exit
- @}
-@end group
- DA = ARGV[1]
- A = ARGV[2]
- ARGC = 2
- ARGV[1] = "-"
-@}
-
-@{
- traducilo(DA, A)
- print
-@}
-@c endfile
-@end example
-
-@`E possibile effettuare la traslitterazione di caratteri in una funzione a
-livello utente, ma non @`e detto che sia efficiente, e noi (sviluppatori
-di @command{gawk}) abbiamo iniziato a prendere in considerazione l'aggiunta di una funzione.
-Tuttavia, poco dopo aver scritto questo programma, abbiamo saputo che Brian
-Kernighan aveva aggiunto le funzioni @code{toupper()} e @code{tolower()} alla
-sua versione di @command{awk} (@pxref{Funzioni per stringhe}). Queste
-funzioni gestiscono la maggior parte dei casi in cui serva la traslitterazione
-di caratteri, e quindi abbiamo deciso di limitarci ad aggiungere le stesse
-funzioni a @command{gawk}, e di disinteressarci del resto.
-
-Un miglioramento ovvio a questo programma sarebbe di impostare il vettore
-@code{vettore_trad} solo una volta, in una regola @code{BEGIN}. Tuttavia, ci@`o
-presuppone che le liste ``da'' e ``a'' non cambino mai durante tutta
-l'esecuzione del programma.
-
-Un altro miglioramento ovvio @`e di consentire l'uso di intervalli, come
-@samp{a-z}, come consentito dal programma di utilit@`a @command{tr}. Si pu@`o
-trarre ispirazione dal codice di @file{cut.awk} (@pxref{Programma cut}).
-
-
-@node Programma labels
-@subsection Stampare etichette per lettere
-
-@cindex stampare etichette per lettera
-@cindex etichette per lettera@comma{} stampare
-Ecco un programma ``del mondo-reale''@footnote{``Del mondo-reale'' @`e definito
-come ``un programma effettivamente usato per realizzare qualcosa''.}.
-Questo script legge elenchi di nomi e indirizzi, e genera etichette per
-lettera. Ogni pagina di etichette contiene 20 etichette, su due file da 10
-etichette l'una. Gli indirizzi non possono contenere pi@`u di cinque righe di
-dati. Ogni indirizzo @`e separato dal successivo da una riga bianca.
-
-L'idea di base @`e di leggere dati per 20 etichette. Ogni riga di ogni etichetta
-@`e immagazzinata nel vettore @code{riga}. L'unica regola si occupa di riempire
-il vettore @code{riga} e di stampare la pagina dopo che sono state lette 20
-etichette.
-
-La regola @code{BEGIN} si limita a impostare @code{RS} alla stringa vuota, in
-modo che @command{awk} divida un record dal successivo quando incontra una riga
-bianca.
-(@pxref{Record}).
-Inoltre imposta @code{LIMITE_LINEE} a 100,
-perch@'e 100 @`e il massimo numero di righe sulla pagina
-@iftex
-(@math{20 @cdot 5 = 100}).
-@end iftex
-@ifnottex
-@ifnotdocbook
-(20 * 5 = 100).
-@end ifnotdocbook
-@end ifnottex
-@docbook
-(20 &sdot; 5 = 100).
-@end docbook
-
-Il grosso del lavoro @`e svolto nella funzione @code{stampa_pagina()}.
-Le righe che compongono le etichette sono immagazzinate sequenzialmente nel vettore
-@code{riga}. Ma occorre stamparle in
-orizzontale: @code{riga[1]} a fianco di @code{riga[6]}, @code{riga[2]} a
-fianco di @code{riga[7]}, e cos@`{@dotless{i}} via. Questo si pu@`o fare utilizzando due
-cicli. Quello pi@`u esterno, controllato dalla variabile @code{i}, gestisce 10
-righe di dati, ovvero la stampa di due etichette una a fianco dell'altra.
-Il ciclo pi@`u interno
-controllato dalla variabile @code{j}, gestisce le singole righe che compongono
-ognuno degli indirizzi.
-Poich@'e @code{j} varia da 0 a 4, @samp{i+j} @`e la riga @code{j}-esima
-dell'indirizzo di sinistra, e @samp{i+j+5} @`e quella stampata alla sua destra.
-L'output @`e simile a quello mostrato qui sotto:
-
-@example
-riga 1 riga 6
-riga 2 riga 7
-riga 3 riga 8
-riga 4 riga 9
-riga 5 riga 10
-@dots{}
-@end example
-
-@noindent
-La stringa di formato per @code{printf} @samp{%-41s} allinea a
-sinistra i dati, e li stampa in un campo di lunghezza fissa.
-
-Come nota finale, un'ulteriore riga bianca extra viene stampata alle righe 21 e
-61, per mantenere entro i bordi l'output sulle etichette. Ci@`o dipende dalla
-particolare marca di etichette in uso quando il programma @`e stato scritto.
-Si noti anche che ci sono due righe bianche a inizio pagina e due righe
-bianche a fine pagina.
-
-La regola @code{END} si occupa di stampare l'ultima pagina di
-etichette; @`e improbabile che il numero di indirizzi da stampare sia un
-multiplo esatto di 20:
-
-@cindex @code{labels.awk}, programma
-@cindex programma @code{labels.awk}
-@example
-@c file eg/prog/labels.awk
-# labels.awk --- stampare etichette per lettera
-@c endfile
-@ignore
-@c file eg/prog/labels.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# June 1992
-# December 2010, minor edits
-@c endfile
-@end ignore
-@c file eg/prog/labels.awk
-
-# Ogni etichetta @`e 5 righe di dati, qualcuna delle quali pu@`o essere bianca.
-# I fogli con le etichetta hanno 2 righe bianche in cima alla pagina e altre 2
-# a fine pagina.
-
-BEGIN @{ RS = "" ; LIMITE_LINEE = 100 @}
-
-function stampa_pagina( i, j)
-@{
- if (NUMEROrighe <= 0)
- return
-
- printf "\n\n" # in cima
-
- for (i = 1; i <= NUMEROrighe; i += 10) @{
- if (i == 21 || i == 61)
- print ""
- for (j = 0; j < 5; j++) @{
- if (i + j > LIMITE_LINEE)
- break
- printf " %-41s %s\n", riga[i+j], riga[i+j+5]
- @}
- print ""
- @}
-
- printf "\n\n" # in fondo
-
- delete riga
-@}
-
-# regola principale
-@{
- if (contatore >= 20) @{
- stampa_pagina()
- contatore = 0
- NUMEROrighe = 0
- @}
- n = split($0, a, "\n")
- for (i = 1; i <= n; i++)
- riga[++NUMEROrighe] = a[i]
- for (; i <= 5; i++)
- riga[++NUMEROrighe] = ""
- contatore++
-@}
-
-END @{
- stampa_pagina()
-@}
-@c endfile
-@end example
-
-@node Programma utilizzo parole
-@subsection Generare statistiche sulla frequenza d'uso delle parole
-
-@cindex parole, statistica utilizzo delle
-@cindex statistica utilizzo delle parole
-
-Quando si lavora con una grande quantit@`a di testo, pu@`o essere interessante
-sapere quanto spesso ricorrono le diverse parole. Per esempio, un autore pu@`o
-fare un uso eccessivo di certe parole, e in questo caso si potrebbero
-trovare sinonimi da sostituire a
-parole che appaiono troppo spesso.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} spiega come
-scrivere un programma per contare le parole e presentare in un formato
-utile le informazioni relative alla loro frequenza.
-
-A prima vista, un programma come questo sembrerebbe essere sufficiente:
-
-@example
-# wordfreq-first-try.awk --- stampa lista frequenze utilizzo parole
-
-@{
- for (i = 1; i <= NF; i++)
- freq[$i]++
-@}
-
-END @{
- for (word in freq)
- printf "%s\t%d\n", word, freq[word]
-@}
-@end example
-
-Il programma si affida al meccanismo con cui @command{awk} divide i campi per
-default, per suddividere ogni riga in ``parole'' e usa un vettore associativo
-di nome @code{freq}, che ha per indici le singole parole, per contare il
-numero di volte che ogni parola viene usata. Nella regola @code{END}, stampa i
-contatori.
-
-Questo programma ha parecchi problemi che lo rendono praticamente inutile
-su file di testo reali:
-
-@itemize @value{BULLET}
-@item
-Il linguaggio @command{awk} considera i caratteri maiuscoli e minuscoli come
-distinti (non equivalenti). Quindi, ``barista'' e ``Barista'' sono
-considerate parole differenti. Questo non @`e un comportamento auspicabile,
-perch@'e le parole iniziano con la lettera maiuscola se sono a inizio frase in
-un testo normale, e un analizzatore di frequenze dovrebbe ignorare la
-distinzione maiuscolo/minuscolo.
-
-@item
-Le parole sono individuate usando la convenzione @command{awk} secondo cui i
-campi sono separati solo da spazi bianchi. Altri caratteri nell'input
-(tranne il ritorno a capo) non hanno alcun particolare significato per
-@command{awk}. Questo significa che i segni di interpunzione sono visti come
-parte di una parola.
-
-@item
-L'output non @`e scritto in alcun ordine utile. Si @`e probabilmente pi@`u
-interessati a sapere quali parole ricorrono pi@`u di frequente, o ad avere
-una tabella in ordine alfabetico che mostra quante volte ricorre ogni parola.
-@end itemize
-
-@cindex @command{sort}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sort}
-Il primo problema si pu@`o risolvere usando @code{tolower()} per rimuovere la
-distinzione maiuscolo/minuscolo. Il secondo problema si pu@`o risolvere usando
-@code{gsub()} per rimuovere i caratteri di interpunzione. Infine, per
-risolvere il terzo problema si pu@`o usare il programma di utilit@`a
-@command{sort} per elaborare l'output dello script @command{awk}. Ecco la
-nuova versione del programma:
-
-@cindex @code{wordfreq.awk}, programma
-@cindex programma @code{wordfreq.awk}
-@example
-@c file eg/prog/wordfreq.awk
-# wordfreq.awk --- stampa la lista con la frequenza delle parole
-
-@{
- $0 = tolower($0) # togli maiuscolo/minuscolo
- # togli interpunzione
- gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
- for (i = 1; i <= NF; i++)
- freq[$i]++
-@}
-
-@c endfile
-END @{
- for (word in freq)
- printf "%s\t%d\n", word, freq[word]
-@}
-@end example
-
-La @dfn{regexp} @code{/[^[:alnum:]_[:blank:]]/} si poteva scrivere come
-@code{/[[:punct:]]/}, ma in questo modo il caratteri trattino basso sarebbe
-stato rimosso, mentre si desidera conservarlo.
-
-Supponendo di aver salvato questo programma in un file di nome
-@file{wordfreq.awk},
-e che i dati siano in @file{file1}, il seguente comando con @dfn{pipeline}:
-
-@example
-awk -f wordfreq.awk file1 | sort -k 2nr
-@end example
-
-@noindent
-produce una tabella delle parole che appaiono in @file{file1} in ordine
-descrescente di frequenza.
-
-Il programma @command{awk} da solo gestisce adeguatamente i dati e produce
-una tabella delle frequenza che non @`e ordinata.
-L'output di @command{awk} @`e poi messo in ordine dal programma di utilit@`a
-@command{sort} e stampato sullo schermo.
-
-Le opzioni passate a @command{sort}
-richiedono un ordinamento che usi come chiave il secondo campo di ogni riga
-in input (saltando il primo campo), che le chiavi di ordinamento siano
-trattate come quantit@`a numeriche
-(altrimenti @samp{15} sarebbe stampato prima di @samp{5}), e che l'ordinamento
-sia fatto in ordine decrescente (inverso).
-
-Il comando @command{sort} potrebbe anche essere richiamato dall'interno del
-programma, cambiando l'azione da fare nella regola @code{END} a:
-
-@example
-@c file eg/prog/wordfreq.awk
-END @{
- sort = "sort -k 2nr"
- for (word in freq)
- printf "%s\t%d\n", word, freq[word] | sort
- close(sort)
-@}
-@c endfile
-@end example
-
-Questa maniera di ordinare dev'essere usata su sistemi che non hanno delle
-vere e proprie @dfn{pipe} a livello di riga di comando (o di procedura di
-comandi).
-Si veda la documentazione generale riguardo al sistema operativo per maggiori
-informazioni su come usare il programma @command{sort}.
-
-@node Programma riordino diario
-@subsection Eliminare duplicati da un file non ordinato
-
-@cindex righe, duplicate@comma{} rimuovere
-@cindex rimuovere righe duplicate
-Il programma @command{uniq}
-(@pxref{Programma uniq})
-rimuove righe duplicate da dati @emph{ordinati}.
-
-Si supponga, tuttavia, di dover rimuovere righe duplicate da un @value{DF},
-ma di voler conservare l'ordine in cui le righe sono state scritte. Un buon
-esempio di questo tipo potrebbe essere un file della cronologia dei comandi
-della shell. Il file della cronologia dei comandi
-mantiene copia di tutti i comandi che sono stati dati, e non @`e
-insolito ripetere un comando molte volte di fila. Occasionalmente si
-potrebbe voler compattare la cronologia togliendo le righe duplicate.
-Tuttavia sarebbe opportuno mantenere l'ordine originale dei comandi.
-
-Questo semplice programma fa questo. Usa due vettori. Il vettore @code{dati}
-ha come indice il testo di ogni riga.
-Per ogni riga, @code{dati[$0]} @`e incrementato di uno.
-Se una particolare riga non @`e stata ancora vista, @code{dati[$0]} @`e zero.
-In tal caso, il testo della riga @`e immagazzinato in @code{righe[contatore]}.
-Ogni elemento del vettore @code{righe} @`e un comando unico, e gli
-indici di @code{righe} indicano l'ordine in cui quelle righe sono state
-incontrate.
-La regola @code{END} stampa semplicemente le righe, in ordine:
-
-@cindex Rakitzis, Byron
-@cindex @code{histsort.awk}, programma
-@cindex programma @code{histsort.awk}
-@example
-@c file eg/prog/histsort.awk
-# histsort.awk --- compatta un file della cronologia dei comandi della shell
-# Grazie a Byron Rakitzis per l'idea generale
-@c endfile
-@ignore
-@c file eg/prog/histsort.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/histsort.awk
-
-@group
-@{
- if (dati[$0]++ == 0)
- righe[++contatore] = $0
-@}
-@end group
-
-@group
-END @{
- for (i = 1; i <= contatore; i++)
- print righe[i]
-@}
-@end group
-@c endfile
-@end example
-
-Questo programma pu@`o essere un punto di partenza per generare altre
-informazioni utili.
-Per esempio, usando la seguente istruzione @code{print} nella regola
-@code{END} permette di sapere quante volte viene usato un certo comando:
-
-@example
-print dati[righe[i]], righe[i]
-@end example
-
-@noindent
-Questo si pu@`o fare perch@'e @code{dati[$0]} @`e incrementato ogni volta che una
-riga @`e stata trovata.
-
-@node Programma extract
-@subsection Estrarre programmi da un file sorgente Texinfo
-
-@cindex Texinfo, estrarre programma da file sorgente
-@cindex estrarre programma da file sorgente Texinfo
-@cindex file Texinfo, estrarre programma da
-@ifnotinfo
-Sia questo capitolo che il precedente
-(@ref{Funzioni di libreria})
-presentano un numero elevato di programmi @command{awk}.
-@end ifnotinfo
-@ifinfo
-I nodi
-@ref{Funzioni di libreria},
-e @ref{Programmi di esempio},
-sono nodi al livello pi@`u elevato, e
-contengono nodi che descrivono un numero elevato di programmi @command{awk}.
-@end ifinfo
-Se si vuole fare pratica con questi programmi, @`e fastidioso doverli
-digitare di nuovo manualmente. @`E per questo che abbiamo pensato a un programma
-in grado di estrarre parti di un file in input Texinfo e metterli in file
-separati.
-
-@cindex Texinfo
-Questo @value{DOCUMENT} @`e scritto in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
-il programma di formattazione di documenti del progetto GNU.
-Un solo file sorgente Texinfo pu@`o essere usato per produrre sia la
-documentazione stampata, usando @TeX{}, sia quella online.
-@ifnotinfo
-(Texinfo @`e esaurientemente documentato nel libro
-@cite{Texinfo---The GNU Documentation Format},
-disponibile alla Free Software Foundation,
-e anche @uref{http://www.gnu.org/software/texinfo/manual/texinfo/, online}.)
-@end ifnotinfo
-@ifinfo
-(Il linguaggio Texinfo @`e descritto esaurientemente, a partire da
-@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}.)
-@end ifinfo
-
-Per quel che ci riguarda, @`e sufficiente sapere tre cose riguardo ai file di
-input Texinfo:
-
-@itemize @value{BULLET}
-@item
-Il simbolo ``chiocciola'' (@samp{@@}) @`e speciale per
-Texinfo, proprio come la barra inversa (@samp{\}) lo @`e per il linguaggio C
-o per @command{awk}. I simboli @samp{@@} sono rappresentati nel sorgente
-Texinfo come @samp{@@@@}.
-
-@item
-I commenti iniziano con @samp{@@c} o con @samp{@@comment}.
-Il programma di estrazione file funziona usando dei commenti speciali che
-sono posti all'inizio di una riga.
-
-@item
-Righe contenenti comandi @samp{@@group} e @samp{@@end group} racchiudono testi
-di esempio che non dovrebbero andare a cavallo di due pagine.
-(Sfortunatamente, @TeX{} non @`e sempre in grado di fare le cose in maniera
-esatta, e quindi va un po' aiutato).
-@end itemize
-
-Il programma seguente, @file{extract.awk}, legge un file sorgente Texinfo
-e fa due cose, basandosi sui commenti speciali.
-Dopo aver visto il commento @samp{@w{@@c system @dots{}}},
-esegue un comando, usando il testo del comando contenuto nella
-riga di controllo e passandolo alla funzione @code{system()}
-(@pxref{Funzioni di I/O}).
-Dopo aver trovato il commento @samp{@@c file @var{nome_file}}, ogni riga
-successiva @`e spedita al file @var{nome_file}, fino a che si trova un
-commento @samp{@@c endfile}.
-Le regole in @file{extract.awk} sono soddisfatte sia quando incontrano
-@samp{@@c} che quando incontrano @samp{@@comment} e quindi la parte
-@samp{omment} @`e opzionale.
-Le righe che contengono @samp{@@group} e @samp{@@end group} sono semplicemente
-ignorate.
-@file{extract.awk} usa la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-I programmi di esempio nel sorgente Texinfo online di @cite{@value{TITLE}}
-(@file{gawktexi.in}) sono stati tutti inseriti tra righe @samp{file} e righe
-@samp{endfile}. La distribuzione di @command{gawk} usa una copia di
-@file{extract.awk} per estrarre i programmi di esempio e per installarne
-molti in una particolare directory dove @command{gawk} li pu@`o trovare.
-Il file Texinfo ha un aspetto simile a questo:
-
-@example
-@dots{}
-Questo programma ha una regola @@code@{BEGIN@}
-che stampa un messaggio scherzoso:
-
-@@example
-@@c file esempi/messages.awk
-BEGIN @@@{ print "Non v'allarmate!" @@@}
-@@c endfile
-@@end example
-
-Stampa anche qualche avviso conclusivo:
-
-@@example
-@@c file esempi/messages.awk
-END @@@{ print "Evitate sempre gli archeologi annoiati!" @@@}
-@@c endfile
-@@end example
-@dots{}
-@end example
-
-Il programma @file{extract.awk} inizia con l'impostare @code{IGNORECASE} a
-uno, in modo che un miscuglio di lettere maiuscole e minuscole nelle direttive
-non faccia differenza.
-
-La prima regola gestisce le chiamate a @code{system()}, controllando che sia
-stato fornito un comando (@code{NF} dev'essere almeno tre) e controllando
-anche che il comando termini con un codice di ritorno uguale a zero, che sta
-a significare che tutto @`e andato bene:
-
-@cindex @code{extract.awk}, programma
-@cindex programma @code{extract.awk}
-@example
-@c file eg/prog/extract.awk
-# extract.awk --- estrae file ed esegue programmi dal file Texinfo
-@c endfile
-@ignore
-@c file eg/prog/extract.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised September 2000
-@c endfile
-@end ignore
-@c file eg/prog/extract.awk
-
-BEGIN @{ IGNORECASE = 1 @}
-
-/^@@c(omment)?[ \t]+system/ @{
- if (NF < 3) @{
- e = ("extract: " FILENAME ":" FNR)
- e = (e ": riga `system' con formato errato")
- print e > "/dev/stderr"
- next
- @}
- $1 = ""
- $2 = ""
- stat = system($0)
- if (stat != 0) @{
- e = ("extract: " FILENAME ":" FNR)
- e = (e ": attenzione: system ha restituito " stat)
- print e > "/dev/stderr"
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-La variabile @code{e} @`e stata usata per far s@`{@dotless{i}} che la regola
-sia agevolemente contenuta nella @value{PAGE}.
-
-La seconda regola gestisce il trasferimento di dati in un file. Verifica che
-nella direttiva sia stato fornito un @value{FN}.
-Se il nome del file non @`e quello del file corrente, il file
-corrente viene chiuso. Mantenere aperto il file corrente finch@'e non si trova
-un nuovo nome file permette di usare la ridirezione @samp{>} per stampare i
-contenuti nel file, semplificando la gestione dei file aperti.
-
-Il ciclo @code{for} esegue il lavoro. Legge le righe usando @code{getline}
-(@pxref{Getline}).
-Se si raggiunge una fine-file inattesa, viene chiamata la funzione
-@code{@w{fine_file_inattesa()}}. Se la riga @`e una riga ``endfile'',
-il ciclo viene abbandonato.
-Se la riga inizia con @samp{@@group} o @samp{@@end group}, la riga viene
-ignorata, e si passa a quella seguente. Allo stesso modo, eventuali commenti
-all'interno degli esempi vengono ignorati.
-
-Il grosso del lavoro @`e nelle poche righe che seguono. Se la riga non ha
-simboli @samp{@@}, il programma la pu@`o
-stampare cos@`{@dotless{i}} com'@`e. Altrimenti, ogni @samp{@@} a inizio parola dev'essere
-eliminato.
-Per rimuovere i simboli @samp{@@}, la riga viene divisa nei singoli elementi
-del vettore @code{a}, usando la funzione @code{split()}
-(@pxref{Funzioni per stringhe}).
-Il simbolo @samp{@@} @`e usato come carattere di separazione.
-Ogni elemento del vettore @code{a} che risulti vuoto indica due caratteri
-@samp{@@} contigui nella riga originale. Per ogni due elementi vuoti
-(@samp{@@@@} nel file originale), va inserito un solo simbolo @samp{@@} nel
-file in output.
-
-Una volta terminato di esaminare il vettore, viene chiamata la funzione @code{join()}
-specificando nella chiamata il valore di @code{SUBSEP}
-(@pxref{Vettori multidimensionali}),
-per riunire nuovamente i pezzi in una riga sola.
-La riga @`e poi stampata nel file di output:
-
-@example
-@c file eg/prog/extract.awk
-/^@@c(omment)?[ \t]+file/ @{
- if (NF != 3) @{
- e = ("extract: " FILENAME ":" FNR ": riga `file' con formato errato")
- print e > "/dev/stderr"
- next
- @}
- if ($3 != file_corrente) @{
- if (file_corrente != "")
- close(file_corrente)
- file_corrente = $3
- @}
-
- for (;;) @{
- if ((getline riga) <= 0)
- fine_file_inattesa()
- if (riga ~ /^@@c(omment)?[ \t]+endfile/)
- break
- else if (riga ~ /^@@(end[ \t]+)?group/)
- continue
- else if (riga ~ /^@@c(omment+)?[ \t]+/)
- continue
- if (index(riga, "@@") == 0) @{
- print riga > file_corrente
- continue
- @}
- n = split(riga, a, "@@")
- # if a[1] == "", vuol dire riga che inizia per @@,
- # non salvare un @@
- for (i = 2; i <= n; i++) @{
- if (a[i] == "") @{ # era un @@@@
- a[i] = "@@"
- if (a[i+1] == "")
- i++
- @}
- @}
- print join(a, 1, n, SUBSEP) > file_corrente
- @}
-@}
-@c endfile
-@end example
-
-@`E importante notare l'uso della ridirezione @samp{>} .
-L'output fatto usando @samp{>} apre il file solo la prima volta; il file resta
-poi aperto, e ogni scrittura successiva @`e aggiunta in fondo al file.
-(@pxref{Ridirezione}).
-Ci@`o rende possibile mischiare testo del programm e commenti esplicativi
-(come @`e stato fatto qui) nello stesso file sorgente, senza nessun problema.
-Il file viene chiuso solo quando viene trovato un nuovo nome di
-@value{DF} oppure alla fine del file in input.
-
-Per finire, la funzione @code{@w{fine_file_inattesa()}} stampa un
-appropriato messaggio di errore ed esce.
-La regola @code{END} gestisce la pulizia finale, chiudendo il file aperto:
-
-@example
-@c file eg/prog/extract.awk
-@group
-function fine_file_inattesa()
-@{
- printf("extract: %s:%d: fine-file inattesa, o errore\n",
- FILENAME, FNR) > "/dev/stderr"
- exit 1
-@}
-@end group
-
-END @{
- if (file_corrente)
- close(file_corrente)
-@}
-@c endfile
-@end example
-
-@node Programma sed semplice
-@subsection Un semplice editor di flusso
-
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-@cindex flusso, editori di
-Il programma di utilit@`a @command{sed} @`e un @dfn{editore di flusso},
-ovvero un programma che legge un flusso di dati, lo modifica, e scrive il file
-cos@`{@dotless{i}} modificato.
-@`E spesso usato per fare modifiche generalizzate a un grosso file, o a un
-flusso di dati generato da una @dfn{pipeline} di comandi.
-Sebbene @command{sed} sia un programma piuttosto complesso di suo, l'uso che
-se ne fa solitamente @`e di effettuare delle sostituzioni globali attraverso
-una @dfn{pipeline}:
-
-@example
-@var{comando1} < dati.originali | sed 's/vecchio/nuovo/g' | @var{comando2} > risultato
-@end example
-
-Qui, @samp{s/vecchio/nuovo/g} chiede a @command{sed} di ricercare la
-@dfn{regexp} @samp{vecchio} in ogni riga di input e di sostituirla
-dappertutto con il testo @samp{nuovo} (cio@`e, in tutte le occorrenze di
-ciascuna riga). Questo @`e simile a quello che fa la funzione di @command{awk}
-@code{gsub()}
-(@pxref{Funzioni per stringhe}).
-
-Il programma seguente, @file{awksed.awk}, accetta almeno due argomenti dalla
-riga di comando: l'espressione da ricercare e il testo con cui rimpiazzarla.
-Ogni ulteriore argomento @`e considerato
-come un nome di @value{DF} da elaborare. Se non ne viene fornito alcuno, si
-usa lo standard input:
-
-@cindex Brennan, Michael
-@cindex @command{awksed.awk}, programma
-@cindex programma @command{awksed.awk}
-@c @cindex simple stream editor
-@c @cindex stream editor, simple
-@example
-@c file eg/prog/awksed.awk
-# awksed.awk --- fa s/pippo/pluto/g usando solo print
-# Ringraziamenti a Michael Brennan per l'idea
-@c endfile
-@ignore
-@c file eg/prog/awksed.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August 1995
-@c endfile
-@end ignore
-@c file eg/prog/awksed.awk
-
-function sintassi()
-@{
- print "sintassi: awksed espressione rimpiazzo [file...]" > "/dev/stderr"
- exit 1
-@}
-
-BEGIN @{
- # valida argomenti
- if (ARGC < 3)
- sintassi()
-
- RS = ARGV[1]
- ORS = ARGV[2]
-
- # non usare argomenti come nomi di file
- ARGV[1] = ARGV[2] = ""
-@}
-
-@group
-# guarda, mamma, senza mani!
-@{
- if (RT == "")
- printf "%s", $0
- else
- print
-@}
-@end group
-@c endfile
-@end example
-
-Il programma fa assegnamento sulla capacit@`a di @command{gawk} di avere come
-@code{RS} una @dfn{regexp},
-e anche sul fatto che @code{RT} viene impostato al testo che effettivamente
-delimita il record (@pxref{Record}).
-
-L'idea @`e di usare @code{RS} come espressione da ricercare. @command{gawk}
-automaticamente imposta @code{$0} al testo che compare tra due corrispondenze
-all'espressione di ricerca.
-Questo @`e appunto il testo che vogliamo conservare inalterato. Quindi,
-impostando @code{ORS} al testo che si vuole sostituire, una semplice
-istruzione @code{print} scrive il testo che si vuole mantenere, seguito dal
-testo che si vuole invece sostituire.
-
-C'@`e un problema in questo schema, ossia cosa fare se l'ultimo record
-non termina con un testo che corrisponde a @code{RS}. Usando un'istruzione
-@code{print} incondizionatamente stampa il testo da sostituire, il che non
-@`e corretto.
-Tuttavia, se il file non termina con del testo che corrisponde a @code{RS},
-@code{RT} @`e impostata alla stringa nulla. In tal caso, si pu@`o stampare
-@code{$0} usando @code{printf}
-(@pxref{Printf}).
-
-La regola @code{BEGIN} gestisce la preparazione, controllando che ci sia
-il numero giusto di argomenti e chiamando @code{sintassi()} se c'@`e un problema.
-Poi imposta @code{RS} e @code{ORS} dagli argomenti della riga di comando e
-imposta @code{ARGV[1]} e @code{ARGV[2]} alla stringa nulla, per impedire che
-vengano considerati dei @value{FNS}
-(@pxref{ARGC e ARGV}).
-
-La funzione @code{sintassi()} stampa un messaggio di errore ed esce.
-Per finire, l'unica regola gestisce lo schema di stampa delineato pi@`u sopra,
-usando @code{print} o @code{printf} come richiesto, a seconda del valore di
-@code{RT}.
-
-@node Programma igawk
-@subsection Una maniera facile per usare funzioni di libreria
-
-@cindex libreria di funzioni @command{awk}, programma di esempio per usare
-@cindex funzioni, librerie di, programma di esempio per usare
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Includere file}, abbiamo visto come @command{gawk} preveda la
-possibilit@`a di includere file. Tuttavia, questa @`e un'estensione @command{gawk}.
-Questa @value{SECTION} evidenzia l'utilit@`a di rendere l'inclusione di
-file disponibile per @command{awk} standard, e mostra come farlo utilizzando
-una combinazione di programmazione di shell e di @command{awk}.
-
-Usare funzioni di libreria in @command{awk} pu@`o presentare molti vantaggi.
-Incoraggia il riutilizzo di codice e la scrittura di funzioni di tipo
-generale. I programmi sono pi@`u snelli e quindi pi@`u comprensibili.
-Tuttavia, usare funzioni di libreria @`e facile solo in fase di scrittura di
-programmi @command{awk}; @`e invece complicato al momento di eseguirli,
-rendendo necessario specificare molte opzioni @option{-f}. Se @command{gawk}
-non @`e disponibile, non lo sono neppure la variabile d'ambiente @env{AWKPATH} e
-la possibilit@`a di conservare funzioni @command{awk} in una directory di
-libreria (@pxref{Opzioni}).
-Sarebbe bello poter scrivere programmi nel modo seguente:
-
-@example
-# funzioni di libreria
-@@include getopt.awk
-@@include join.awk
-@dots{}
-
-# programma principale
-BEGIN @{
- while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1)
- @dots{}
- @dots{}
-@}
-@end example
-
-Il programma seguente, @file{igawk.sh}, fornisce questo servizio.
-Simula la ricerca da parte di @command{gawk} della variabile d'ambiente
-@env{AWKPATH} e permette anche delle inclusioni @dfn{nidificate} (cio@`e,
-un file che @`e stato incluso tramite
-@code{@@include} pu@`o contenere ulteriori istruzioni @code{@@include}).
-@command{igawk} tenta di includere ogni file una volta sola, in modo che delle
-inclusioni nidificate non contengano accidentalmente una funzione di libreria
-pi@`u di una volta.
-
-@command{igawk} dovrebbe comportarsi esternamente proprio come @command{gawk}.
-Questo vuol dire che dovrebbe accettare sulla riga di comando tutti gli
-argomenti di @command{gawk}, compresa
-la capacit@`a di specificare pi@`u file
-sorgenti tramite l'opzione @option{-f}
-e la capacit@`a di mescolare istruzioni da riga di comando e file di sorgenti di
-libreria.
-
-Il programma @`e scritto usando il linguaggio della Shell POSIX
-(@command{sh}).@footnote{Una spiegazione dettagliata del linguaggio della
-@command{sh} non rientra negli intenti di questo libro. Qualche spiegazione
-sommaria viene fornita, ma se si desidera una comprensione pi@`u dettagliata, si
-dovrebbe consultare un buon libro sulla programmazione della shell.}
-Il funzionamento @`e il seguente:
-
-@enumerate
-@item
-Esegue un ciclo attraverso gli argomenti, salvando tutto ci@`o che non si presenta come
-codice sorgente @command{awk}, per quando il programma espanso sar@`a eseguito.
-
-@item
-Per ogni argomento che rappresenta del codice @command{awk}, mette l'argomento
-in una variabile di shell che verr@`a espansa. Ci sono due casi:
-
-@enumerate a
-@item
-Un testo letterale, fornito con l'opzione @option{-e} o @option{--source}.
-Questo testo viene aggiunto direttamente in fondo.
-
-@item
-@value{FNS} sorgenti, forniti con l'opzione @option{-f}. Usiamo il trucchetto
-di aggiungere @samp{@@include @var{nome_file}} in fondo ai contenuti della
-variabile di shell. Poich@'e il programma di inclusione dei file funziona
-allo stesso modo in cui funziona @command{gawk}, ne risulta che il file viene
-incluso nel programma al punto giusto.
-@end enumerate
-
-@item
-Esegue un programma (naturalmente @command{awk}) sui contenuti della variabile
-di shell per espandere le istruzioni
-@code{@@include}. Il programma espanso @`e messo in una seconda variabile di
-shell.
-
-@item
-Esegue il programma espanso richiamando @command{gawk} e tutti gli altri
-argomenti originalmente forniti dall'utente sulla riga di comando (come p.es.
-dei nomi di @value{DF}).
-@end enumerate
-
-Questo programma usa variabili di shell in quantit@`a: per immagazzinare
-argomenti della riga di comando e
-il testo del programma @command{awk} che espander@`a il programma dell'utente,
-per il programma originale dell'utente e per il programma espanso. Questo
-modo di procedere risolve potenziali
-problemi che potrebbero presentarsi se si usassero invece dei file temporanei,
-ma rende lo script un po' pi@`u complicato.
-
-La parte iniziale del programma attiva il tracciamento della shell se il primo
-argomento @`e @samp{debug}.
-
-La parte successiva esegue un ciclo che esamina ogni argomento della riga di
-comando.
-Ci sono parecchi casi da esaminare:
-
-@c @asis for docbook
-@table @asis
-@item @option{--}
-Quest'opzione termina gli argomenti per @command{igawk}. Tutto quel che segue
-dovrebbe essere passato al programma @command{awk} dell'utente senza essere
-preso in considerazione.
-
-@item @option{-W}
-Questo indica che l'opzione successiva @`e propria di @command{gawk}. Per
-facilitare l'elaborazione degli argomenti, l'opzione @option{-W} @`e aggiunta
-davanti agli argomenti rimanenti, e il
-ciclo continua. (Questo @`e un trucco di programmazione della @command{sh}.
-Non @`e il caso di preoccuparsene se non si ha familiarit@`a con il comando
-@command{sh}.)
-
-@item @option{-v}, @option{-F}
-Queste opzioni sono conservate e lasciate da gestire a @command{gawk}.
-
-@item @option{-f}, @option{--file}, @option{--file=}, @option{-Wfile=}
-Il @value{FN} @`e aggiunto alla variabile di shell @code{programma}, insieme
-a un'istruzione @code{@@include}.
-Il programma di utilit@`a @command{expr} @`e usato per eliminare la parte
-iniziale dell'argomento (p.es., @samp{--file=}).
-(La sintassi tipica di @command{sh} richiederebbe di usare il comando
-@command{echo} e il programma di utilit@`a @command{sed} per far questo.
-Sfortunatamente, alcune versioni di @command{echo} valutano le sequenze
-di protezione contenute nei loro argomenti, e questo potrebbe finire per
-alterare il testo del programma.
-L'uso di @command{expr} evita questo problema.)
-
-@item @option{--source}, @option{--source=}, @option{-Wsource=}
-Il testo sorgente @`e aggiunto in fondo a @code{programma}.
-
-@item @option{--version}, @option{-Wversion}
-@command{igawk} stampa il proprio numero di versione, esegue
-@samp{gawk --version} per ottenere l'informazione relativa alla versione di
-@command{gawk}, ed esce.
-@end table
-
-Se nessuno degli argomenti
-@option{-f}, @option{--file}, @option{-Wfile}, @option{--source},
-o @option{-Wsource} @`e stato fornito, il primo argomento che non @`e un'opzione
-dovrebbe essere il programma @command{awk}. Se non ci sono argomenti rimasti
-sulla riga di comando, @command{igawk} stampa un messaggio di errore ed esce.
-Altrimenti, il primo argomento @`e aggiunto in fondo a @code{programma}.
-In qualsiasi caso, dopo che gli argomenti sono stati elaborati,
-la variabile di shell
-@code{programma} contiene il testo completo del programma originale
-@command{awk}.
-
-Il programma @`e il seguente:
-
-@cindex @code{igawk.sh}, programma
-@cindex programma @code{igawk.sh}
-@example
-@c file eg/prog/igawk.sh
-#! /bin/sh
-# igawk --- come gawk ma abilita l'uso di @@include
-@c endfile
-@ignore
-@c file eg/prog/igawk.sh
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# July 1993
-# December 2010, minor edits
-@c endfile
-@end ignore
-@c file eg/prog/igawk.sh
-
-if [ "$1" = debug ]
-then
- set -x
- shift
-fi
-
-# Un ritorno a capo letterale,
-# per formattare correttamente il testo del programma
-n='
-'
-
-# Inizializza delle variabili alla stringa nulla
-programma=
-opts=
-
-while [ $# -ne 0 ] # ciclo sugli argomenti
-do
- case $1 in
- --) shift
- break ;;
-
- -W) shift
- # Il costrutto $@{x?'messaggio qui'@} stampa un
- # messaggio diagnostico se $x @`e la stringa nulla
- set -- -W"$@{@@?'manca operando'@}"
- continue ;;
-
- -[vF]) opts="$opts $1 '$@{2?'manca operando'@}'"
- shift ;;
-
- -[vF]*) opts="$opts '$1'" ;;
-
- -f) programma="$programma$n@@include $@{2?'manca operando'@}"
- shift ;;
-
- -f*) f=$(expr "$1" : '-f\(.*\)')
- programma="$programma$n@@include $f" ;;
-
- -[W-]file=*)
- f=$(expr "$1" : '-.file=\(.*\)')
- programma="$programma$n@@include $f" ;;
-
- -[W-]file)
- programma="$programma$n@@include $@{2?'manca operando'@}"
- shift ;;
-
- -[W-]source=*)
- t=$(expr "$1" : '-.source=\(.*\)')
- programma="$programma$n$t" ;;
-
- -[W-]source)
- programma="$programma$n$@{2?'manca operando'@}"
- shift ;;
-
- -[W-]version)
- echo igawk: version 3.0 1>&2
- gawk --version
- exit 0 ;;
-
- -[W-]*) opts="$opts '$1'" ;;
-
- *) break ;;
- esac
- shift
-done
-
-if [ -z "$programma" ]
-then
- programma=$@{1?'manca programma'@}
- shift
-fi
-
-# A questo punto, `programma' contiene il programma.
-@c endfile
-@end example
-
-Il programma @command{awk} che elabora le direttive @code{@@include}
-@`e immagazzinato nella variabile di shell @code{progr_che_espande}. Ci@`o serve
-a mantenere leggibile lo script. Questo programma @command{awk} legge
-tutto il programma dell'utente, una riga per volta, usando @code{getline}
-(@pxref{Getline}). I @value{FNS} in input e le istruzioni @code{@@include}
-sono gestiti usando una pila. Man mano che viene trovata una @code{@@include},
-il valore corrente di @value{FN} @`e
-``spinto'' sulla pila e il file menzionato nella direttiva @code{@@include}
-diventa il @value{FN} corrente. Man mano che un file @`e finito,
-la pila viene ``disfatta'', e il precedente file in input diventa nuovamente il
-file in input corrente. Il processo viene iniziato ponendo il file originale
-come primo file sulla pila.
-
-La funzione @code{percorso()} trova qual @`e il percorso completo di un file.
-Simula il comportamento di @command{gawk} quando utilizza la variabile
-d'ambiente @env{AWKPATH}
-(@pxref{AWKPATH (Variabile)}).
-Se un @value{FN} contiene una @samp{/}, non viene effettuata la ricerca del
-percorso. Analogamente, se il
-@value{FN} @`e @code{"-"}, viene usato senza alcuna modifica. Altrimenti,
-il @value{FN} @`e concatenato col nome di ogni directory nella lista dei
-percorsi, e vien fatto un tentativo per aprire il @value{FN} cos@`{@dotless{i}} generato.
-Il solo modo di controllare se un file @`e leggibile da @command{awk} @`e di
-andare avanti e tentare di leggerlo con
-@code{getline}; questo @`e quel che
-@code{percorso()} fa.@footnote{In alcune versioni molto datate di
-@command{awk}, il test @samp{getline da_buttare < t} pu@`o ripetersi in un ciclo
-infinito se il file esiste ma @`e vuoto.}
-Se il file pu@`o essere letto, viene chiuso e viene restituito il valore di
-@value{FN}:
-
-@ignore
-An alternative way to test for the file's existence would be to call
-@samp{system("test -r " t)}, which uses the @command{test} utility to
-see if the file exists and is readable. The disadvantage to this method
-is that it requires creating an extra process and can thus be slightly
-slower.
-@end ignore
-
-@example
-@c file eg/prog/igawk.sh
-progr_che_espande='
-
-function percorso(file, i, t, da_buttare)
-@{
- if (index(file, "/") != 0)
- return file
-
- if (file == "-")
- return file
-
- for (i = 1; i <= n_dir; i++) @{
- t = (lista_percorsi[i] "/" file)
-@group
- if ((getline da_buttare < t) > 0) @{
- # found it
- close(t)
- return t
- @}
-@end group
- @}
- return ""
-@}
-@c endfile
-@end example
-
-Il programma principale @`e contenuto all'interno di una regola @code{BEGIN}.
-La prima cosa che fa @`e di impostare il vettore @code{lista_percorsi} usato
-dalla funzione @code{percorso()}. Dopo aver diviso la lista usando come
-delimitatore @samp{:}, gli elementi nulli sono sostituiti da @code{"."},
-che rappresenta la directory corrente:
-
-@example
-@c file eg/prog/igawk.sh
-BEGIN @{
- percorsi = ENVIRON["AWKPATH"]
- n_dir = split(percorsi, lista_percorsi, ":")
- for (i = 1; i <= n_dir; i++) @{
- if (lista_percorsi[i] == "")
- lista_percorsi[i] = "."
- @}
-@c endfile
-@end example
-
-La pila @`e inizializzata con @code{ARGV[1]}, che sar@`a @code{"/dev/stdin"}.
-Il ciclo principale viene subito dopo. Le righe in input sono lette una dopo
-l'altra. Righe che non iniziano con @code{@@include} sono stampate cos@`{@dotless{i}} come
-sono.
-Se la riga inizia con @code{@@include}, il @value{FN} @`e in @code{$2}.
-La funzione @code{percorso()} @`e chiamata per generare il percorso completo.
-Se questo non riesce, il programma stampa un messaggio di errore e continua.
-
-Subito dopo occorre controllare se il file sia gi@`a stato incluso. Il vettore
-@code{gia_fatto} @`e indicizzato dal nome completo di ogni @value{FN} incluso
-e tiene traccia per noi di questa informazione. Se un file viene visto pi@`u
-volte, viene stampato un messaggio di avvertimento. Altrimenti il nuovo
-@value{FN} @`e aggiunto alla pila e l'elaborazione continua.
-
-Infine, quando @code{getline} giunge alla fine del file in input, il file
-viene chiuso, e la pila viene elaborata. Quando @code{indice_pila} @`e minore
-di zero, il programma @`e terminato:
-
-@example
-@c file eg/prog/igawk.sh
- indice_pila = 0
- input[indice_pila] = ARGV[1] # ARGV[1] @`e il primo file
-
- for (; indice_pila >= 0; indice_pila--) @{
- while ((getline < input[indice_pila]) > 0) @{
- if (tolower($1) != "@@include") @{
- print
- continue
- @}
- cammino = percorso($2)
-@group
- if (cammino == "") @{
- printf("igawk: %s:%d: non riesco a trovare %s\n",
- input[indice_pila], FNR, $2) > "/dev/stderr"
- continue
- @}
-@end group
- if (! (cammino in gia_fatto)) @{
- gia_fatto[cammino] = input[indice_pila]
- input[++indice_pila] = cammino # aggiungilo alla pila
- @} else
- print $2, "incluso in", input[indice_pila],
- "era gi@`a incluso in",
- gia_fatto[cammino] > "/dev/stderr"
- @}
- close(input[indice_pila])
- @}
-@}' # l'apice chiude la variabile `progr_che_espande'
-
-programma_elaborato=$(gawk -- "$progr_che_espande" /dev/stdin << EOF
-$programma
-EOF
-)
-@c endfile
-@end example
-
-Il costrutto di shell @samp{@var{comando} << @var{marcatore}} @`e chiamato
-@dfn{here document} (@dfn{documento sul posto}). Ogni riga presente nello
-script di shell fino al @var{marcatore} @`e passato in input a @var{comando}.
-La shell elabora i contenuti dell'@dfn{here document} sostituendo, dove serve,
-variabili e comandi (ed eventualmente altre cose, a seconda della shell
-in uso).
-
-Il costrutto di shell @samp{$(@dots{})} @`e chiamato @dfn{sostituzione di comando}.
-L'output del comando posto all'interno delle parentesi @`e sostituito
-nella riga di comando.
-Poich@'e il risultato @`e usato in un assegnamento di variabile,
-viene salvato come un'unica stringa di caratteri, anche se il risultato
-contiene degli spazi bianchi.
-
-Il programma espanso @`e salvato nella variabile @code{programma_elaborato}.
-Il tutto avviene secondo le fasi seguenti:
-
-@enumerate
-@item
-Si esegue @command{gawk} con il programma che gestisce le @code{@@include}
-(il valore della variabile di shell
-@code{progr_che_espande}) leggendo lo standard input.
-
-@item
-Lo standard input contiene il programma dell'utente,
-nella variabile di shell @code{programma}.
-L'input @`e passato a @command{gawk} tramite un @dfn{here document}.
-
-@item
-I risultati di questo processo sono salvati nella variabile di shell
-@code{programma_elaborato} usando la sostituzione di comando.
-@end enumerate
-
-L'ultima fase @`e la chiamata a @command{gawk} con il programma espanso,
-insieme alle opzioni originali e agli argomenti della riga di comando che
-l'utente aveva fornito:
-
-@example
-@c file eg/prog/igawk.sh
-eval gawk $opts -- '"$programma_elaborato"' '"$@@"'
-@c endfile
-@end example
-
-Il comando @command{eval} @`e una struttura della shell che riesegue
-l'elaborazione dei parametri della riga di comando. Gli apici proteggono le
-parti restanti.
-
-Questa versione di @command{igawk} @`e la quinta versione di questo programma.
-Ci sono quattro semplificazioni migliorative:
-
-@itemize @value{BULLET}
-@item
-L'uso di @code{@@include} anche per i file specificati tramite l'opzione
-@option{-f} consente di semplificare di molto la preparazione del programma
-iniziale @command{awk}; tutta l'elaborazione delle istruzioni @code{@@include}
-pu@`o essere svolta in una sola volta.
-
-@item
-Non tentare di salvare la riga letta tramite @code{getline} all'interno della
-funzione @code{percorso()} quando si controlla se il file @`e accessibile
-per il successivo uso nel programma principale semplifica notevolmente
-le cose.
-
-@item
-Usare un ciclo di @code{getline} nella regola @code{BEGIN} rende possibile
-fare tutto in un solo posto. Non @`e necessario programmare un ulteriore ciclo
-per elaborare le istruzioni @code{@@include} nidificate.
-
-@item
-Invece di salvare il programma espanso in un file temporaneo, assegnarlo a
-una variabile di shell evita alcuni potenziali problemi di sicurezza.
-Ci@`o per@`o ha lo svantaggio di basare lo script su funzionalit@`a del
-linguaggio @command{sh}, il che rende pi@`u difficile la comprensione a chi non
-abbia familiarit@`a con il comando
-@command{sh}.
-@end itemize
-
-Inoltre, questo programma dimostra come spesso valga la pena di utilizzare
-insieme la programmazione della @command{sh} e quella di @command{awk}.
-Solitamente, si pu@`o fare parecchio senza dover ricorrere alla programmazione
-di basso livello in C o C++, ed @`e spesso pi@`u facile fare certi tipi di
-manipolazioni di stringhe e argomenti usando la shell, piuttosto che
-@command{awk}.
-
-Infine, @command{igawk} dimostra che non @`e sempre necessario aggiungere nuove
-funzionalit@`a a un programma; queste possono spesso essere aggiunte in
-cima.@footnote{@command{gawk}
-@`e in grado di elaborare istruzioni @code{@@include} al suo stesso interno, per
-permettere l'uso di programmi @command{awk} come script Web CGI.}
-
-
-@node Programma anagram
-@subsection Trovare anagrammi da una lista di parole
-
-@cindex anagrammi, trovare
-Un'interessante sfida per il programmatore @`e quella di cercare @dfn{anagrammi} in una
-lista di parole (come
-@file{/usr/share/dict/italian} presente in molti sistemi GNU/Linux).
-Una parola @`e un anagramma di un'altra se entrambe le parole contengono
-le stesse lettere
-(p.es., ``branzino'' e ``bronzina'').
-
-La Colonna 2, Problema C, della seconda edizione del libro di Jon Bentley
-@cite{Programming Pearls}, presenta un algoritmo elegante.
-L'idea @`e di assegnare a parole che sono anagrammi l'una dell'altra una
-firma comune, e poi di ordinare tutte le parole in base alla loro
-firma e di stamparle.
-Il Dr.@: Bentley fa notare che prendere tutte le lettere di ogni parola ed
-elencarle in ordine alfabetico produce queste firme comuni.
-
-Il programma seguente usa vettori di vettori per riunire
-parole con la stessa firma, e l'ordinamento di vettori per stampare le
-parole trovate in ordine alfabetico:
-
-@cindex @code{anagram.awk}, programma
-@cindex programma @code{anagram.awk}
-@example
-@c file eg/prog/anagram.awk
-# anagram.awk --- Un'implementazione dell'algoritmo per trovare anagrammi
-# dalla seconda edizione
-# del libro di Jon Bentley "Programming Pearls".
-# Addison Wesley, 2000, ISBN 0-201-65788-0.
-# Colonna 2, Problema C, sezione 2.8, pp 18-20.
-@c endfile
-@ignore
-@c file eg/prog/anagram.awk
-#
-# Questo programma richiede gawk 4.0 o una versione successiva.
-# Funzionalit@`a di gawk richieste:
-# - veri vettori multidimensionali
-# - split() con separatore "" per separare ogni singolo carattere
-# - le funzioni asort() e asorti()
-#
-# Vedere http://savannah.gnu.org/projects/gawk.
-#
-# Arnold Robbins
-# arnold@@skeeve.com
-# Public Domain
-# January, 2011
-@c endfile
-@end ignore
-@c file eg/prog/anagram.awk
-
-/'s$/ @{ next @} # Salta i genitivi sassoni
-@c endfile
-@end example
-
-Il programma inizia con un'intestazione, e poi una regola per saltare
-i genitivi sassoni eventualmente contenuti nel file che contiene la lista di
-parole. La regola
-successiva costruisce la struttura dei dati. Il primo indice del vettore
-@`e rappresentato dalla firma; il secondo @`e la parola stessa:
-
-@example
-@c file eg/prog/anagram.awk
-@{
- chiave = da_parola_a_chiave($1) # costruisce la firma
- data[chiave][$1] = $1 # Immagazzina parola con questa firma
-@}
-@c endfile
-@end example
-
-La funzione @code{da_parola_a_chiave()} crea la firma.
-Divide la parola in lettere singole, mette in ordine alfabetico le lettere,
-e poi le rimette ancora insieme:
-
-@example
-@c file eg/prog/anagram.awk
-# da_parola_a_chiave --- divide parole in lettere, ordina e riunisce
-
-function da_parola_a_chiave(parola, a, i, n, risultato)
-@{
- n = split(parola, a, "")
- asort(a)
-
- for (i = 1; i <= n; i++)
- risultato = risultato a[i]
-
- return risultato
-@}
-@c endfile
-@end example
-
-Infine, la regola @code{END} percorre tutto il vettore e stampa
-le liste degli anagrammi. L'output @`e poi passato al
-comando di sistema @command{sort} perch@'e altrimenti gli
-anagrammi sarebbero elencati in ordine arbitrario:
-
-@example
-@c file eg/prog/anagram.awk
-END @{
- sort = "sort"
- for (chiave in data) @{
- # ordina parole con la stessa chiave
- n_parole = asorti(data[chiave], parole)
- if (n_parole == 1)
- continue
-
- # e stampa. Problema minore: uno spazio extra a fine di ogni riga
- for (j = 1; j <= n_parole; j++)
- printf("%s ", parole[j]) | sort
- print "" | sort
- @}
- close(sort)
-@}
-@c endfile
-@end example
-
-Ecco una piccola parte dell'output quando il programma @`e eseguito:
-
-@example
-$ @kbd{gawk -f anagram.awk /usr/share/dict/italian | grep '^b'}
-@dots{}
-baraste bastare serbata
-barasti basarti
-baratro tabarro
-barattoli ribaltato tribolata
-barbieri birberia
-barche brache
-barcollerei corbelleria
-bare erba
-bareremmo brameremo
-barili librai
-@dots{}
-@end example
-
-
-@node Programma signature
-@subsection E ora per qualcosa di completamente differente
-
-@cindex @code{signature}, programma
-@cindex programma @code{signature}
-@cindex Brini, Davide
-Il programma seguente @`e stato scritto da Davide Brini
-@c (@email{dave_br@@gmx.com})
-ed @`e pubblicato sul @uref{http://backreference.org/2011/02/03/obfuscated-awk/,
-suo sito web}.
-Serve come sua firma nel gruppo Usenet @code{comp.lang.awk}.
-Questi sono i termini da lui stabiliti per il copyright:
-
-@quotation
-Copyright @copyright{} 2008 Davide Brini
-
-Copying and distribution of the code published in this page, with or without
-modification, are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.
-@end quotation
-
-Ecco il programma:
-
-@example
-awk 'BEGIN@{O="~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c";
-printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O,
-X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O,
-O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),x-O@}'
-@end example
-@c genera l'email del tizio:
-@c dave_br@gmx.com
-
-@cindex Johansen, Chris
-Viene lasciato al lettore il piacere di stabilire cosa fa il programma.
-(Se si @`e sull'orlo della disperazione nel tentativo di comprensione, si veda
-la spiegazione di Chris Johansen,
-che @`e contenuta nel file sorgente Texinfo di questo @value{DOCUMENT}.)
-
-@ignore
-To: "Arnold Robbins" <arnold@skeeve.com>
-Date: Sat, 20 Aug 2011 13:50:46 -0400
-Subject: The GNU Awk User's Guide, Section 13.3.11
-From: "Chris Johansen" <johansen@main.nc.us>
-Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan>
-
-Arnold, tu non mi conosci, ma c'@`e un sottile legame tra noi. Mia moglie @`e
-Barbara A. Field, FAIA, GIT '65 (B. Arch.).
-
-Ho un paio di copie cartacee di "Effective Awk Programming" da
-anni, ed ora sto leggendo di nuovo la versione Kindle di "The GNU Awk User's
-Guide". Quando sono arrivato alla sezione 13.3.11, ho riformattato e
-brevemente commentato lo script di firma di Davide Brin per comprenderne il funzionamento.
-
-Mi pare che questo possa avere un valore pedagogico come esempio
-(sia pure imperfetto) del significato di spazi bianchi e commenti, e un
-punto di partenza per una tale discussione. Sicuramente ha aiutato _me_ a
-capire quel che succede. Se vuoi
-usarlo, com'@`e o modificato, sentiti libero di farlo (a condizione di
-rispettare i vincoli posti da Davide, naturalmente, che credo siano stati
-da me rispettati).
-
-Se dovessi includere questa spiegazione in una futura edizione, la inserirei
-a una certa distanza dalla sezione 13.3.11, diciamo come una nota o come
-un'appendice, in modo da non rivelare immediatamente la soluzione dell'enigma.
-
-Cordiali saluti,
---
-Chris Johansen {johansen at main dot nc dot us}
- . . . collapsing the probability wave function, sending ripples of
-certainty through the space-time continuum.
-
-
-#! /usr/bin/gawk -f
-
-# Da "13.3.11 E ora per qualcosa di completamente differente"
-# http://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program
-
-# Copyright © 2008 Davide Brini
-
-# Copying and distribution of the code published in this page, with
-# or without modification, are permitted in any medium without
-# royalty provided the copyright notice and this notice are preserved.
-
-BEGIN {
- O = "~" ~ "~"; # 1
- o = "==" == "=="; # 1
- o += +o; # 2
- x = O "" O; # 11
-
-
- while ( X++ <= x + o + o ) c = c "%c";
-
- # O vale 1
- # o vale 2
- # x vale 11
- # X vale 17
- # c vale "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
-
- printf c,
- ( x - O )*( x - O), # 100 d
- x*( x - o ) - o, # 97 a
- x*( x - O ) + x - O - o, # 118 v
- +x*( x - O ) - x + o, # 101 e
- X*( o*o + O ) + x - O, # 95 _
- X*( X - x ) - o*o, # 98 b
- ( x + X )*o*o + o, # 114 r
- x*( X - x ) - O - O, # 64 @
- x - O + ( O + o + X + x )*( o + O ), # 103 g
- X*X - X*( x - O ) - x + O, # 109 m
- O + X*( o*( o + O ) + O ), # 120 x
- +x + O + X*o, # 46 .
- x*( x - o), # 99 c
- ( o + X + x )*o*o - ( x - O - O ), # 111 0
- O + ( X - x )*( X + O ), # 109 m
- x - O # 10 \n
-}
-@end ignore
-
-@node Sommario dei programmi
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-I programmi illustrati in questo @value{CHAPTER}
-ripropongo la tesi secondo cui leggere programmi @`e una maniera eccellente
-per imparare a fare della buona programmazione.
-
-@item
-Usare @samp{#!} per rendere i programmi @command{awk} direttamente eseguibili
-ne rende pi@`u semplice l'uso. In alternativa, si pu@`o invocare un
-programma usando @samp{awk -f @dots{}}.
-
-@item
-Reimplementare programmi POSIX standard in @command{awk} @`e un esercizio
-piacevole; il potere espressivo di @command{awk} consente di scrivere tali
-programmi usando relativamente poche righe di codice, nonostante i programmi
-risultanti siano funzionalmente completi e utilizzabili.
-
-@item
-Una delle debolezze della versione standard di @command{awk} riguarda il
-lavorare con singoli caratteri. La possibilit@`a di usare @code{split()} con
-la stringa nulla come separatore pu@`o semplificare considerevolmente tale
-compito.
-
-@item
-Gli esempi proposti dimostrano l'utilit@`a delle funzioni di libreria introdotte
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}
-per un numero (sia pur piccolo) di programmi reali.
-
-@item
-Oltre a reinventare la ruota POSIX, altri programmi risolvono una serie di
-problemi interessanti, come trovare delle parole duplicate in un testo,
-stampare etichette per lettere, e trovare anagrammi.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi sui programmi
-@section Esercizi
-
-@enumerate
-@item
-Riscrivere @file{cut.awk} (@pxref{Programma cut})
-usando @code{split()} con @code{""} come separatore.
-
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Programma egrep}, @`e detto che @samp{egrep -i} potrebbe essere
-simulato in versioni di @command{awk} che non prevedono @code{IGNORECASE}
-usando @code{tolower()} sulla riga e nei criteri di ricerca. In una nota a
-pi@`e di pagina @`e anche detto che questa soluzione ha un problema: in output
-viene scritta la riga tradotta (a lettere minuscole), e non quella originale.
-Risolvere questo problema.
-@c Exercise: Fix this, w/array and new line as key to original line
-
-@item
-La versione POSIX di @command{id} accetta opzioni che controllano quali
-informazioni stampare. Modificare la versione @command{awk}
-(@pxref{Programma id}) per accettare gli stessi argomenti e funzionare allo
-stesso modo.
-
-@item
-Il programma @code{split.awk} (@pxref{Programma split}) presuppone che le
-lettere siano contigue nella codifica dei caratteri,
-il che non @`e vero per sistemi che usano la codifica EBCDIC.
-Risolvere questo problema.
-(Suggerimento: Considerare un modo diverso di analizzare l'alfabeto,
-senza appoggiarsi sulle funzioni @code{ord()} e @code{chr()}.)
-
-@item
-Nel programma @file{uniq.awk} (@pxref{Programma uniq}, la
-logica per scegliere quali righe stampare rappresenta una
-@dfn{macchina a stati},
-ossia ``un dispositivo che pu@`o essere in uno di un insieme di stati
-stabili, a seconda dello stato in cui si trovava in precedenza, e del
-valore corrente dei suoi
-input.''@footnote{Questo @`e la definizione trovata usando
-@code{define: state machine} come chiave di ricerca in Google.}
-Brian Kernighan suggerisce che
-``un approccio alternativo alle macchine a stati @`e di leggere tutto l'input
-e metterlo in un vettore, e quindi usare gli indici. @`E quasi sempre pi@`u
-semplice da programmare, e per la maggior parte degli input in cui si pu@`o
-usare, altrettanto veloce in esecuzione.'' Riscrivere la logica del
-programma seguendo questa indicazione.
-
-
-@item
-Perch@'e il programma @file{wc.awk} (@pxref{Programma wc}) non pu@`o
-limitarsi a usare il valore di @code{FNR} nella funziona @code{a_fine_file()}?
-Suggerimento: Esaminare il codice
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzione filetrans}.
-
-@ignore
-@command{wc} can't just use the value of @code{FNR} in
-@code{endfile()}. If you examine the code in @ref{Filetrans Function},
-you will see that @code{FNR} has already been reset by the time
-@code{endfile()} is called.
-@end ignore
-
-@item
-La manipolazione di singoli caratteri nel programma @command{translate}
-(@pxref{Programma translate}) @`e farraginosa usando le funzione standard
-@command{awk}. Poich@'e @command{gawk} pu@`o dividere stringhe in caratteri
-singoli usando come separatore @code{""}, come si potrebbe usare questa
-funzionalit@`a per semplificare il programma?
-
-@item
-Il programma @file{extract.awk} (@pxref{Programma extract}) @`e stato
-scritto prima che @command{gawk} avesse a disposizione la funzione
-@code{gensub()}. Usarla per semplificare il codice.
-
-@item
-Si confronti la velocit@`a di esecuzione del programma @file{awksed.awk}
-(@pxref{Programma sed semplice}) con il pi@`u diretto:
-
-@example
-BEGIN @{
- stringa = ARGV[1]
- rimpiazzo = ARGV[2]
- ARGV[1] = ARGV[2] = ""
-@}
-
-@{ gsub(stringa, rimpiazzo); print @}
-@end example
-
-@item
-Quali sono vantaggi e svantaggi di @file{awksed.awk} rispetto al vero
-programma di utilit@`a @command{sed}?
-
-@ignore
- Advantage: egrep regexps
- speed (?)
- Disadvantage: no & in replacement text
-
-Others?
-@end ignore
-
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Programma igawk}, si @`e detto che non tentando di salvare la riga
-letta con @code{getline} nella funzione @code{percorso()}, mentre si
-controlla l'accessibilit@`a del file da usare nel programma principale,
-semplifica notevolmente le cose. Quale problema @`e peraltro generato cos@`{@dotless{i}}
-facendo?
-@c answer, reading from "-" o /dev/stdin
-
-@cindex percorso di ricerca per file sorgente
-@cindex ricerca, percorso di, per file sorgente
-@cindex file sorgente, percorso di ricerca per
-@cindex directory, ricerca
-@item
-Come ulteriore esempio dell'idea che non sempre @`e necessario aggiungere
-nuove funzionalit@`a a un programma, si consideri l'idea di avere due file in
-una directory presente nel percorso di ricerca:
-
-@table @file
-@item default.awk
-Questo file contiene un insieme di funzioni di libreria di default, come
-@code{getopt()} e @code{assert()}.
-
-@item sito.awk
-Questo file contiene funzioni di libreria che sono specifiche di
-un sito o di un'installazione; cio@`e, funzioni sviluppate localmente.
-Mantenere due file separati consente a @file{default.awk} di essere
-modificato in seguito a nuove versioni di @command{gawk}, senza che
-l'amministratore di sistema debba ogni volta aggiornarlo aggiungendo le
-funzioni locali.
-@end table
-
-Un utente
-@c Karl Berry, karl@ileaf.com, 10/95
-ha suggerito che @command{gawk} venga modificato per leggere automaticamente
-questi file alla partenza. Piuttosto, sarebbe molto semplice
-modificare @command{igawk} per farlo. Poich@'e @command{igawk} @`e capace di
-elaborare direttive @code{@@include}
-nidificate, @file{default.awk} potrebbe contenere semplicemente la lista di
-direttive @code{@@include} con le funzioni di libreria desiderate.
-Fare questa modifica.
-
-@item
-Modificare @file{anagram.awk} (@pxref{Programma anagram}), per evitare di
-usare il programma di utilit@`a esterno @command{sort}.
-
-@end enumerate
-@c EXCLUDE END
-
-@ifnotinfo
-@part @value{PART3}Andare oltre @command{awk} con @command{gawk}
-@end ifnotinfo
-
-@ifdocbook
-La Parte III riguarda funzionalit@`a proprie di @command{gawk}.
-Contiene i seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Funzionalit@`a avanzate}
-
-@item
-@ref{Internazionalizzazione}
-
-@item
-@ref{Debugger}
-
-@item
-@ref{Calcolo con precisione arbitraria}
-
-@item
-@ref{Estensioni dinamiche}
-@end itemize
-@end ifdocbook
-
-@node Funzionalit@`a avanzate
-@chapter Funzionalit@`a avanzate di @command{gawk}
-@cindex @command{gawk}, funzionalit@`a avanzate
-@cindex avanzate, funzionalit@`a, di @command{gawk}
-@ignore
-Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com>
-
- Found in Steve English's "signature" line:
-
-"Write documentation as if whoever reads it is a violent psychopath
-who knows where you live."
-@end ignore
-@cindex Langston, Peter
-@cindex English, Steve
-@quotation
-@i{Scrivete la documentazione supponendo che chiunque la legger@`a sia uno psicopatico
-violento, che conosce il vostro indirizzo di casa.}
-@author Steve English, citato da Peter Langston
-@end quotation
-
-Questo @value{CHAPTER} tratta delle funzionalit@`a avanzate in @command{gawk}.
-@`E un po' come un ``pacco sorpresa'' di argomenti che non sono collegati tra di
-loro in altro modo.
-Per prima cosa, vediamo un'opzione da riga di comando che consente a
-@command{gawk} di riconoscere i numeri non-decimali nei dati in input, e non
-soltanto nei programmi @command{awk}.
-Poi vengono illustrate delle funzionalit@`a speciali di @command{gawk} per
-l'ordinamento di vettori. Quindi viene trattato dettagliatamente l'I/O
-bidirezionale, di cui si @`e fatto cenno in precedenti parti di questo
-@value{DOCUMENT}, assieme ai fondamenti sulle reti TCP/IP.
-Infine, vediamo come @command{gawk}
-pu@`o tracciare il @dfn{profilo} di un programma @command{awk}, cos@`{@dotless{i}} che si
-possa ritoccarlo per migliorarne le prestazioni.
-
-@c FULLXREF ON
-Altre funzionalit@`a avanzate vengono trattate separatamente dedicando un
-@value{CHAPTER} per ciascuna di esse:
-
-@itemize @value{BULLET}
-@item
-@iftex
-Il
-@end iftex
-@ref{Internazionalizzazione}, parla di come internazionalizzare
-i propri programmi @command{awk}, in modo che parlino pi@`u lingue
-nazionali.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Debugger}, descrive il debugger dalla riga di comando disponibile
-all'interno di
-@command{gawk} per individuare errori nei programmi @command{awk}.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Calcolo con precisione arbitraria}, illustra come si pu@`o usare
-@command{gawk} per eseguire calcoli con precisione arbitraria.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche},
-tratta della capacit@`a di aggiungere dinamicamente nuove funzioni predefinite a
-@command{gawk}.
-@end itemize
-@c FULLXREF OFF
-
-@menu
-* Dati non decimali:: Consentire dati di input non decimali.
-* Ordinamento di vettori:: Modi per controllare la visita di un vettore
- e il suo ordinamento.
-* I/O bidirezionale:: Comunicazione bidirezionale con un altro
- processo.
-* Reti TCP/IP:: Usare @command{gawk} per programmazione di rete.
-* Profilare:: Profilare i propri programmi @command{awk}.
-* Sommario funzionalit@`a avanzate:: Sommario delle funzionalit@`a avanzate.
-@end menu
-
-@node Dati non decimali
-@section Consentire dati di input non decimali
-@cindex opzione @option{--non-decimal-data}
-@c @cindex funzionalit@`a avanzate, dati di input non decimali
-@cindex input, dati non decimali
-@cindex costanti, non decimali
-
-Se si esegue @command{gawk} con l'opzione @option{--non-decimal-data},
-si possono avere valori in base diversa da dieci nei dati di input:
-
-@example
-$ @kbd{echo 0123 123 0x123 |}
-> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n", $1, $2, $3 @}'}
-@print{} 83, 123, 291
-@end example
-
-Affinch@'e questa funzionalit@`a sia disponibile, i programmi devono essere
-scritti in modo che @command{gawk} tratti i dati come valori numerici:
-
-@example
-$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'}
-@print{} 0123 123 0x123
-@end example
-
-@noindent
-L'istruzione @code{print} tratta le sue espressioni come se fossero stringhe.
-Sebbene i campi possano comportarsi come numeri, quando necessario,
-essi rimangono sempre stringhe, per cui @code{print} non cerca di elaborarli
-come se fossero numeri. Si deve aggiungere zero a un campo affich@'e venga
-considerato come un numero. Per esempio:
-
-@example
-$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '}
-> @kbd{@{ print $1, $2, $3}
-> @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'}
-@print{} 0123 123 0x123
-@print{} 83 123 291
-@end example
-
-Poich@'e capita comunemente di avere dati di tipo decimale con degli zeri iniziali,
-e poich@'e l'uso di questa funzionalit@`a pu@`o portare a risultati inattesi, il
-comportamento di default @`e quello lasciarla disabilitata. Se si vuole, la si
-deve richiedere esplicitamente.
-
-@cindex programmazione, convenzioni di, opzione @code{--non-decimal-data}
-@cindex @option{--non-decimal-data}, opzione, funzione @code{strtonum()} e
-@cindex @code{strtonum()}, funzione (@command{gawk}), opzione @code{--non-decimal-data} e
-@quotation ATTENZIONE
-@emph{L'uso di questa opzione non @`e consigliata.}
-Pu@`o provocare errori molto seri eseguendo vecchi programmi.
-Al suo posto @`e meglio usare la funzione @code{strtonum()} per convertire i dati
-(@pxref{Funzioni per stringhe}).
-Questo rende i programmi pi@`u facili da scrivere e pi@`u facili da leggere, e
-porta a risultati meno inattesi.
-
-Quest'opzione potrebbe sparire dalle versioni future di @command{gawk}.
-@end quotation
-
-@node Ordinamento di vettori
-@section Controllare la visita di un vettore e il suo ordinamento
-
-@command{gawk} permette di controllare l'ordine con cui un ciclo
-@samp{for (@var{indice} in @var{vettore})}
-attraversa un vettore.
-
-Inoltre, due funzioni predefinite, @code{asort()} e @code{asorti()},
-permettono di mettere in ordine i vettori sulla base, rispettivamente, dei
-valori e degli indici del vettore. Queste due funzioni danno anche il
-controllo sui criteri in base ai quali riordinare gli elementi del vettore.
-
-@menu
-* Controllare visita vettori:: Come usare PROCINFO["sorted_in"].
-* Funzioni di ordinamento di vettori:: Come usare @code{asort()} e @code{asorti()}.
-@end menu
-
-@node Controllare visita vettori
-@subsection Controllare visita vettori
-
-Per default, l'ordine secondo il quale un ciclo @samp{for (@var{indice} in
-@var{vettore})} scorre un vettore non @`e definito; in genere si basa
-sull'implementazione interna dei vettori all'interno di @command{awk}.
-
-Spesso, tuttavia, si vorrebbe poter eseguire un ciclo sugli elementi in un
-determinato ordine scelto dall'utente programmatore. Con @command{gawk}
-si pu@`o fare.
-
-@iftex
-La
-@end iftex
-@ref{Controllare visita} parla di come si possono assegnare valori speciali
-predefiniti a @code{PROCINFO["sorted_in"]} per controllare l'ordine secondo il
-quale @command{gawk} attraversa un vettore
-durante un ciclo @code{for}.
-
-Inoltre, il valore di @code{PROCINFO["sorted_in"]} pu@`o essere un nome di
-funzione.@footnote{Questo @`e il motivo per cui gli ordinamenti predefiniti
-iniziano con il carattere @samp{@@}, che non pu@`o essere usato in un
-identificatore.}
-Questo consente di scorrere un vettore sulla base di un qualsiasi criterio
-personalizzato. Gli elementi del vettore vengono ordinati in accordo col valore
-ritornato da questa funzione. La funzione che fa il confronto dovrebbe essere
-definita con almeno quattro argomenti:
-
-@example
-function confronta(i1, v1, i2, v2)
-@{
- @var{confronta gli elementi 1 e 2 in qualche modo}
- @var{return < 0; 0; o > 0}
-@}
-@end example
-
-Qui, @code{i1} e @code{i2} sono gli indici, e @code{v1} e @code{v2}
-sono i corrispondenti valori dei due elementi che si stanno confrontando.
-@code{v1} oppure @code{v2}, o entrambi, possono essere vettori se il vettore
-che si sta visitando contiene sottovettori come valori.
-(@xref{Vettori di vettori} per maggiori informazioni sui sottovettori.)
-I tre possibili valori di ritorno sono interpretati nel seguente modo:
-
-@table @code
-@item confronta(i1, v1, i2, v2) < 0
-L'indice @code{i1} viene prima dell'indice @code{i2} durante l'avanzamento
-del ciclo.
-
-@item confronta(i1, v1, i2, v2) == 0
-Gli indici @code{i1} e @code{i2}
-sono equivalenti, ma l'ordine tra loro non @`e definito.
-
-@item confronta(i1, v1, i2, v2) > 0
-L'indice @code{i1} viene dopo l'indice @code{i2} durante l'avanzamento del
-ciclo.
-@end table
-
-La prima funzione di confronto pu@`o essere usata per scorrere un vettore
-secondo l'ordine numerico degli indici:
-
-@example
-function cfr_ind_num(i1, v1, i2, v2)
-@{
- # confronto di indici numerici, ordine crescente
- return (i1 - i2)
-@}
-@end example
-
-La seconda funzione scorre un vettore secondo l'ordine delle stringhe
-dei valori degli elementi piuttosto che secondo gli indici:
-
-@example
-function cfr_val_str(i1, v1, i2, v2)
-@{
- # confronto di valori di stringa, ordine crescente
- v1 = v1 ""
- v2 = v2 ""
- if (v1 < v2)
- return -1
- return (v1 != v2)
-@}
-@end example
-
-La terza funzione di confronto restituisce dapprima tutti i numeri, e dopo
-questi le stringhe numeriche senza spazi iniziali o finali, durante
-l'avanzamento del ciclo:
-
-@example
-function cfr_val_num_str(i1, v1, i2, v2, n1, n2)
-@{
- # confronto mettendo i numeri prima dei valori di stringa,
- # ordine crescente
- n1 = v1 + 0
- n2 = v2 + 0
- if (n1 == v1)
- return (n2 == v2) ? (n1 - n2) : -1
- else if (n2 == v2)
- return 1
- return (v1 < v2) ? -1 : (v1 != v2)
-@}
-@end example
-
-Qui vediamo un programma principale che mostra come @command{gawk}
-si comporta usando ciascuna delle funzioni precedenti:
-
-@example
-BEGIN @{
- data["uno"] = 10
- data["due"] = 20
- data[10] = "uno"
- data[100] = 100
- data[20] = "due"
-
- f[1] = "cfr_ind_num"
- f[2] = "cfr_val_str"
- f[3] = "cfr_val_num_str"
- for (i = 1; i <= 3; i++) @{
- printf("Funzione di ordinamento: %s\n", f[i])
- PROCINFO["sorted_in"] = f[i]
- for (j in data)
- printf("\tdata[%s] = %s\n", j, data[j])
- print ""
- @}
-@}
-@end example
-
-I risultati dell'esecuzione del programma sono questi:
-
-@example
-$ @kbd{gawk -f compdemo.awk}
-@print{} Funzione di ordinamento: cfr_ind_num @ii{Ordinamento per indice numerico}
-@print{} data[uno] = 10
-@print{} data[due] = 20 @ii{Entrambe le stringhe sono numericamente zero}
-@print{} data[10] = uno
-@print{} data[20] = due
-@print{} data[100] = 100
-@print{}
-@print{} Funzione di ordinamento: cfr_val_str @ii{Ordinamento per valore degli}
-@print{} @ii{elementi come stringhe}
-@print{} data[uno] = 10
-@print{} data[100] = 100 @ii{La stringa 100 @`e minore della stringa 20}
-@print{} data[due] = 20
-@print{} data[20] = due
-@print{} data[10] = uno
-@print{}
-@print{} Funzione di ordinamento: cfr_val_num_str @ii{Ordinamento con tutti i}
-@print{} @ii{valori numerici prima di tutte le stringhe}
-@print{} data[uno] = 10
-@print{} data[due] = 20
-@print{} data[100] = 100
-@print{} data[20] = due
-@print{} data[10] = uno
-@end example
-
-Si provi a ordinare gli elementi di un file delle password del sistema GNU/Linux
-in base al nome d'accesso dell'utente. Il seguente programma ordina i record
-secondo una specifica posizione del campo e pu@`o essere usato per questo scopo:
-
-@example
-# passwd-sort.awk --- semplice programma per ordinare in base alla
-# posizione del campo
-# la posizione del campo @`e specificata dalla variabile globale POS
-
-function per_campo(i1, v1, i2, v2)
-@{
- # confronto per valore, come stringa, e in ordine crescente
- return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS])
-@}
-
-@{
- for (i = 1; i <= NF; i++)
- a[NR][i] = $i
-@}
-
-END @{
- PROCINFO["sorted_in"] = "per_campo"
- if (POS < 1 || POS > NF)
- POS = 1
- for (i in a) @{
- for (j = 1; j <= NF; j++)
- printf("%s%c", a[i][j], j < NF ? ":" : "")
- print ""
- @}
-@}
-@end example
-
-Il primo campo di ogni elemento del file delle password @`e il nome d'accesso
-dell'utente, e i campi sono separati tra loro da due punti.
-Ogni record definisce un sottovettore,
-con ogni campo come elemento nel sottovettore.
-L'esecuzione del programma produce
-il seguente output:
-
-@example
-$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd}
-@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin
-@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin
-@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin
-@dots{}
-@end example
-
-Il confronto normalmente dovrebbe restituire sempre lo stesso valore quando
-vien dato come argomento un preciso paio di elementi del vettore. Se viene
-restituito un risultato non coerente, l'ordine @`e indefinito. Questo
-comportamento pu@`o essere sfruttato per introdurre un ordinamento casuale in
-dati apparentemente ordinati:
-
-@example
-function ordina_a_caso(i1, v1, i2, v2)
-@{
- # ordine casuale (attenzione: potrebbe non finire mai!)
- return (2 - 4 * rand())
-@}
-@end example
-
-Come gi@`a accennato, l'ordine degli indici @`e arbitrario se due elementi
-risultano uguali. Normalmente questo non @`e un problema, ma lasciare che
-elementi di uguale valore compaiano in ordine arbitrario pu@`o essere un
-problema, specialmente quando si confrontano valori di elementi di un elenco.
-L'ordine parziale di elementi uguali pu@`o cambiare quando il vettore viene
-visitato di nuovo, se nel vettore vengono aggiunti o rimossi elementi. Un modo
-per superare l'ostacolo quando si confrontano elementi con valori uguali @`e
-quello di includere gli indici nelle regole di confronto. Si noti che questo
-potrebbe rendere meno efficiente l'attraversamento del ciclo, per cui si
-consiglia di farlo solo se necessario. Le seguenti funzioni di confronto
-impongono un ordine deterministico, e si basano sul fatto che gli indici
-(di stringa) di due elementi non sono mai uguali:
-@example
-function per_numero(i1, v1, i2, v2)
-@{
- # confronto di valori numerici (e indici), ordine decrescente
- return (v1 != v2) ? (v2 - v1) : (i2 - i1)
-@}
-
-function per_stringa(i1, v1, i2, v2)
-@{
- # confronto di valori di stringa (e indici), ordine decrescente
- v1 = v1 i1
- v2 = v2 i2
- return (v1 > v2) ? -1 : (v1 != v2)
-@}
-@end example
-
-@c Avoid using the term ``stable'' when describing the unpredictable behavior
-@c if two items compare equal. Usually, the goal of a "stable algorithm"
-@c is to maintain the original order of the items, which is a meaningless
-@c concept for a list constructed from a hash.
-
-Una funzione di confronto personalizzata spesso pu@`o semplificare
-l'attraversamento del
-ciclo ordinato, e il solo limite @`e il cielo, quando si va a progettare
-una funzione di questo tipo.
-
-Quando i confronti tra stringhe son fatti durante un'operazione di ordinamento,
-per valori di elementi che, uno o entrambi, non sono numeri, o per
-indici di elementi gestiti come stringhe, il valore di @code{IGNORECASE}
-(@pxref{Variabili predefinite}) controlla se
-i confronti trattano corrispondenti lettere maiuscole e minuscole
-come equivalenti o come distinte.
-
-Un'altra cosa da tenere a mente @`e che nel caso di sottovettori, i valori degli
-elementi possono essere a loro volta dei vettori; una funzione di confronto in
-produzione dovrebbe usare la funzione @code{isarray()}
-(@pxref{Funzioni per i tipi})
-per controllare ci@`o, e scegliere un ordinamento preciso per i sottovettori.
-
-Tutti gli ordinamenti basati su @code{PROCINFO["sorted_in"]}
-sono disabilitati in modalit@`a POSIX,
-perch@'e il vettore @code{PROCINFO} in questo caso non @`e speciale.
-
-Come nota a margine, si @`e visto che ordinare gli indici del vettore prima di
-scorrere il vettore porta a un incremento variabile dal 15% al 20% del tempo di
-esecuzione dei programmi @command{awk}. Per questo motivo l'attraversamento
-ordinato di vettori non @`e il default.
-
-@c The @command{gawk}
-@c maintainers believe that only the people who wish to use a
-@c feature should have to pay for it.
-
-@node Funzioni di ordinamento di vettori
-@subsection Ordinare valori e indici di un vettore con @command{gawk}
-
-@cindex vettori, ordinamento dei
-@cindexgawkfunc{asort}
-@cindex @code{asort()}, funzione (@command{gawk}), ordinamento di vettori
-@cindex funzione @code{asort()} (@command{gawk}), ordinamento di vettori
-@cindexgawkfunc{asorti}
-@cindex @code{asorti()}, funzione (@command{gawk}), ordinamento di vettori
-@cindex funzione @code{asorti()} (@command{gawk}), ordinamento di vettori
-@cindex @code{sort()}, funzione, ordinamento di vettori
-@cindex funzione @code{sort()}, ordinamento di vettori
-Nella maggior parte delle implementazioni di @command{awk}, ordinare un vettore
-richiede una funzione @code{sort()}. Questo pu@`o essere istruttivo per provare
-diversi algoritmi di ordinamento, ma normalmente non @`e questo lo scopo del
-programma. In @command{gawk} ci sono le funzioni predefinite @code{asort()} e
-@code{asorti()} (@pxref{Funzioni per stringhe}) per i vettori ordinati.
-Per esempio:
-
-@example
-@var{riempire il vettore} dati
-n = asort(dati)
-for (i = 1; i <= n; i++)
- @var{fare qualcosa con} dati[i]
-@end example
-
-Dopo la chiamata ad @code{asort()}, il vettore @code{dati} @`e indicizzato da 1
-a @var{n}, il numero totale di elementi in @code{dati}.
-(Questo conteggio @`e il valore di ritorno di @code{asort()}).
-@code{dati[1]} @value{LEQ} @code{dati[2]} @value{LEQ} @code{dati[3]}, e cos@`{@dotless{i}}
-via. Il confronto di default @`e basato sul tipo di elementi
-(@pxref{Tipi di variabile e confronti}).
-Tutti i valori numerici vengono prima dei valori di stringa,
-che a loro volta vengono prima di tutti i sottovettori.
-
-@cindex effetti collaterali, funzione @code{asort()}
-@cindex funzione @code{asort()}, effetti collaterali
-Un effetto collaterale rilevante nel chiamare @code{asort()} @`e che
-@emph{gli indici originali del vettore vengono persi irreparabilmente}.
-Poich@'e questo non sempre @`e opportuno, @code{asort()} accetta un
-secondo argomento:
-
-@example
-@var{populate the array} orig
-n = asort(orig, dest)
-for (i = 1; i <= n; i++)
- @var{fai qualcosaa con} dest[i]
-@end example
-
-In questo caso, @command{gawk} copia il vettore @code{orig} nel vettore
-@code{dest} e ordina @code{dest}, distruggendo i suoi indici.
-Tuttavia il vettore @code{orig} non viene modificato.
-
-Spesso, ci@`o di cui si ha bisogno @`e di ordinare per i valori degli
-@emph{indici} invece che per i valori degli elementi. Per far questo si usa la
-funzione @code{asorti()}. L'interfaccia e il comportamento sono identici a
-quelli di @code{asort()}, solo che per l'ordinamento vengono usati i valori
-degli indici, che diventano i valori del vettore risultato:
-
-@example
-@{ orig[$0] = una_funz($0) @}
-
-END @{
- n = asorti(orig, dest)
- for (i = 1; i <= n; i++) @{
- @ii{Lavora direttamente con gli indici ordinati:}
- @var{fa qualcosa con} dest[i]
- @dots{}
- @ii{Accede al vettore originale attraverso gli indici ordinati:}
- @var{fa qualcosa con} orig[dest[i]]
- @}
-@}
-@end example
-
-Fin qui, tutto bene. Ora inizia la parte interessante. Sia @code{asort()}
-che @code{asorti()} accettano un terzo argomento di stringa per controllare il
-confronto di elementi del vettore. Quando abbiamo introdotto @code{asort()} e
-@code{asorti()} nella @ref{Funzioni per stringhe}, abbiamo ignorato questo terzo
-argomento; comunque, @`e giunto il momento di descrivere come questo argomento
-influenza queste due funzioni.
-
-Fondamentalmente, il terzo argomento specifica come dev'essere ordinato il
-vettore. Ci sono due possibilit@`a. Come per @code{PROCINFO["sorted_in"]},
-quest'argomento pu@`o essere uno degli argomenti predefiniti che @command{gawk}
-fornisce (@pxref{Controllare visita}), o pu@`o essere il nome di una funzione
-definita dall'utente (@pxref{Controllare visita vettori}).
-
-Nell'ultimo caso, @emph{la funzione pu@`o confrontare gli elementi in qualunque
-modo si voglia}, prendendo in considerazione solo gli indici, solo i valori,
-o entrambi. Questo @`e estremamente potente.
-
-Una volta che il vettore @`e ordinato, @code{asort()} prende i @emph{valori} nel
-loro ordine finale e li usa per riempire il vettore risultato, mentre
-@code{asorti()} prende gli @emph{indici} nel loro ordine finale e li usa per
-riempire il vettore risultato.
-
-@cindex conteggio riferimenti, ordinamento vettori
-@quotation NOTA
-Copiare indici ed elementi non @`e dispendioso in termini di memoria.
-Internamente, @command{gawk} mantiene un @dfn{conteggio dei riferimenti} ai
-dati. Per esempio, dopo che @code{asort()} copia il primo vettore nel
-secondo, in memoria c'@`e ancora una sola copia dei dati degli elementi
-del vettore originale, ed entrambi i vettori accedono all'unica copia di
-valori che esiste in memoria.
-@end quotation
-
-@c Document It And Call It A Feature. Sigh.
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
-@cindex @code{IGNORECASE}, variabile, e funzioni di ordinamento dei vettori
-@cindex variabile @code{IGNORECASE}, e funzioni di ordinamento dei vettori
-Poich@'e @code{IGNORECASE} influenza i confronti tra stringhe, il valore di
-@code{IGNORECASE} influisce anche sull'ordinamento sia con @code{asort()} che
-con @code{asorti()}.
-Si noti inoltre che l'ordinamento della localizzazione @emph{non} entra in
-gioco; i confronti sono basati solamente sul valore dei
-caratteri.@footnote{Ci@`o @`e vero perch@'e il confronto basato sulla localizzazione
-avviene solo quando si @`e in modalit@`a POSIX-compatibile, e poich@'e @code{asort()}
-e @code{asorti()} sono estensioni di @command{gawk}, esse non sono disponibili
-in quel caso.}
-
-L'esempio seguente mostra l'uso di una funzione di confronto usata con
-@code{asort()}. La funzione di confronto, @code{confronta_in_minuscolo()},
-trasforma gli elementi da confrontare in lettere minuscole, in modo da avere
-confronti che non dipendono da maiuscolo/minuscolo.
-
-@example
-# confronta_in_minuscolo --- confronta stringhe ignorando maiuscolo/minuscolo
-
-function confronta_in_minuscolo(i1, v1, i2, v2, l, r)
-@{
- l = tolower(v1)
- r = tolower(v2)
-
- if (l < r)
- return -1
- else if (l == r)
- return 0
- else
- return 1
-@}
-@end example
-
-E questo programma pu@`o essere usato per provarla:
-
-@example
-# programma di test
-
-BEGIN @{
- Letters = "abcdefghijklmnopqrstuvwxyz" \
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- split(Letters, data, "")
-
- asort(data, risultato, "confronta_in_minuscolo")
-
- j = length(risultato) # numero elementi del vettore "risultato"
- for (i = 1; i <= j; i++) @{
- printf("%s", risultato[i])
- if (i % (j/2) == 0)
- # a met@`a, la stampa del vettore va a capo
- printf("\n")
- else
- printf(" ")
- @}
-@}
-@end example
-
-Se si esegue il programma, si ottiene:
-
-@example
-$ @kbd{gawk -f confronta_in_minuscolo.awk}
-@print{} A a B b c C D d e E F f g G H h i I J j k K l L M m
-@print{} n N O o p P Q q r R S s t T u U V v w W X x y Y z Z
-@end example
-
-@node I/O bidirezionale
-@section Comunicazioni bidirezionali con un altro processo
-
-@c 8/2014. Neither Mike nor BWK saw this as relevant. Commenting it out.
-@ignore
-@cindex Brennan, Michael
-@cindex programmers, attractiveness of
-@smallexample
-@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan
-From: brennan@@whidbey.com (Mike Brennan)
-Newsgroups: comp.lang.awk
-Subject: Re: Learn the SECRET to Attract Women Easily
-Date: 4 Aug 1997 17:34:46 GMT
-@c Organization: WhidbeyNet
-@c Lines: 12
-Message-ID: <5s53rm$eca@@news.whidbey.com>
-@c References: <5s20dn$2e1@chronicle.concentric.net>
-@c Reply-To: brennan@whidbey.com
-@c NNTP-Posting-Host: asn202.whidbey.com
-@c X-Newsreader: slrn (0.9.4.1 UNIX)
-@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403
-
-On 3 Aug 1997 13:17:43 GMT, Want More Dates???
-<tracy78@@kilgrona.com> wrote:
->Learn the SECRET to Attract Women Easily
->
->The SCENT(tm) Pheromone Sex Attractant For Men to Attract Women
-
-The scent of awk programmers is a lot more attractive to women than
-the scent of perl programmers.
---
-Mike Brennan
-@c brennan@@whidbey.com
-@end smallexample
-@end ignore
-
-@cindex funzionalit@`a avanzate, processi@comma{} comunicare con
-@cindex processi, comunicazioni bidirezionali con
-Spesso @`e utile poter
-inviare dati a un programma separato che
-li elabori e in seguito leggere il risultato. Questo pu@`o essere sempre
-fatto con file temporanei:
-
-@example
-# Scrivere i dati per l'elaborazione
-filetemp = ("mieidati." PROCINFO["pid"])
-while (@var{non dipendente dai dati})
- print @var{dati} | ("sottoprogramma > " filetemp)
-close("sottoprogramma > " filetemp)
-
-# Legge il risultato, rimuove filetemp quando ha finito
-while ((getline nuovidati < filetemp) > 0)
- @var{elabora} nuovidati @var{secondo le esigenze}
-close(filetemp)
-system("rm " filetemp)
-@end example
-
-@noindent
-Questo funziona, ma non @`e elegante. Tra le altre cose, richiede che il
-programma venga eseguito in una directory che non pu@`o essere condivisa tra gli
-utenti; per esempio, @file{/tmp} non pu@`o esserlo, poich@'e potrebbe accadere che
-un altro utente stia usando un file temporaneo con lo stesso
-nome.@footnote{Michael Brennan suggerisce l'uso di @command{rand()} per
-generare @value{FNS} unici. Questo @`e un punto valido; tuttavia, i file
-temporanei rimangono pi@`u difficili da usare delle @dfn{pipe} bidirezionali.} @c 8/2014
-
-@cindex coprocessi
-@cindex input/output bidirezionale
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex @command{csh}, comando, operatore @code{|&}, confronto con
-@cindex comando @command{csh}, operatore @code{|&}, confronto con
-Comunque, con @command{gawk}, @`e possibile aprire una @dfn{pipe}
-@emph{bidirezionale}
-verso un altro processo. Il secondo processo @`e chiamato @dfn{coprocesso},
-poich@'e viene eseguito in parallelo con @command{gawk}. La connessione
-bidirezionale viene creata usando l'operatore @samp{|&} (preso in prestito
-dalla shell Korn, @command{ksh}):@footnote{Questo @`e molto diverso dallo stesso
-operatore nella C shell e in Bash.}
-
-@example
-do @{
- print @var{dati} |& "sottoprogramma"
- "sottoprogramma" |& getline risultato
-@} while (@var{ci sono ancora dati da elaborare})
-close("sottoprogramma")
-@end example
-
-La prima volta che viene eseguita un'operazione I/O usando l'operatore
-@samp{|&},
-@command{gawk} crea una @dfn{pipeline} bidirezionale verso un processo figlio
-che esegue l'altro programma. L'output creato con @code{print} o con
-@code{printf} viene scritto nello standard input del programma, e il contenuto
-dello standard output del programma pu@`o essere letto dal programma
-@command{gawk} usando @code{getline}.
-Come accade coi processi avviati con @samp{|}, il sottoprogramma pu@`o
-essere un qualsiasi programma, o una @dfn{pipeline} di programmi, che pu@`o essere
-avviato dalla shell.
-
-Ci sono alcune avvertenze da tenere presenti:
-
-@itemize @value{BULLET}
-@item
-Per come funziona internamente @command{gawk}, lo standard error
-dei coprocessi va nello stesso posto dove va lo standard error del
-genitore @command{gawk}. Non @`e possibile leggere lo standard error del
-figlio separatamente.
-
-@cindex stalli
-@cindex abbracci mortali
-@cindex @dfn{deadlocks}, vedi stalli
-@cindex bufferizzazione, dell'input/output
-@cindex input/output, bufferizzazione
-@cindex @code{getline}, comando, stalli e
-@item
-La permanenza in memoria (bufferizzazione) dell'I/O del sottoprocesso potrebbe
-essere un problema. @command{gawk} automaticamente scrive su disco tutto
-l'output spedito tramite la @dfn{pipe} al coprocesso.
-Tuttavia, se il coprocesso non scrive su disco il suo output,
-@command{gawk} potrebbe bloccarsi mentre esegue una @code{getline} per leggere
-il risultato del coprocesso. Questo pu@`o portare a una situazione
-conosciuta come @dfn{stallo} (@dfn{deadlock}, abbraccio mortale), in cui ciascun
-processo rimane in attesa
-che l'altro processo faccia qualcosa.
-@end itemize
-
-@cindex @code{close()}, funzione, @dfn{pipe} bidirezionali e
-@cindex funzione @code{close()}, @dfn{pipe} bidirezionali e
-@`E possibile chiudere una @dfn{pipe} bidirezionale con un coprocesso solo in una
-direzione, fornendo un secondo argomento, @code{"to"} o @code{"from"}, alla
-funzione @code{close()} (@pxref{Chiusura file e @dfn{pipe}}).
-Queste stringhe dicono a @command{gawk} di chiudere la @dfn{pipe}, rispettivamente
-nella direzione che invia i dati al coprocesso e nella direzione che legge da
-esso.
-
-@cindex @command{sort}, programma di utilit@`a, coprocessi e
-@cindex programma di utilit@`a @command{sort}, coprocessi e
-Questo @`e particolarmente necessario per usare il programma di utilit@`a
-di sistema @command{sort} come parte di un coprocesso;
-@command{sort} deve leggere @emph{tutti} i dati di input
-prima di poter produrre un qualsiasi output.
-Il programma @command{sort} non riceve un'indicazione di fine-file
-(end-of-file) finch@'e @command{gawk} non chiude l'estremit@`a in scrittura della
-@dfn{pipe}.
-
-Una volta terminata la scrittura dei dati sul programma @command{sort},
-si pu@`o chiudere il lato @code{"to"} della @dfn{pipe}, e quindi iniziare a leggere
-i dati ordinati via @code{getline}.
-Per esempio:
-
-@example
-BEGIN @{
- comando = "LC_ALL=C sort"
- n = split("abcdefghijklmnopqrstuvwxyz", a, "")
-
- for (i = n; i > 0; i--)
- print a[i] |& comando
- close(comando, "to")
-
- while ((comando |& getline line) > 0)
- print "ricevuto", line
- close(comando)
-@}
-@end example
-
-Questo programma scrive le lettere dell'alfabeto in ordine inverso, uno per
-riga, attraverso la @dfn{pipe} bidirezionale verso @command{sort}. Poi chiude la
-direzione di scrittura della @dfn{pipe}, in modo che @command{sort} riceva
-un'indicazione di fine-file. Questo fa in modo che @command{sort} ordini i
-dati e scriva i dati ordinati nel programma @command{gawk}. Una volta che
-tutti i dati sono stati letti, @command{gawk} termina il coprocesso ed esce.
-
-Come nota a margine, l'assegnamento @samp{LC_ALL=C} nel comando @command{sort}
-assicura che @command{sort} usi l'ordinamento tradizionale di Unix (ASCII).
-Ci@`o non @`e strettamente necessario in questo caso, ma @`e bene sapere come farlo.
-
-Occorre prestare attenzione quando si chiude il lato @code{"from"} di una
-@dfn{pipe} bidirezionale; in tal caso @command{gawk} attende che il
-processo-figlio termini, il che pu@`o causare lo stallo del programma
-@command{awk} in esecuzione. (Per questo motivo, questa particolare
-funzionalit@`a @`e molto meno usata, in pratica, di quella che consente la
-possibilit@`a di chiudere il lato @code{"to"} della @dfn{pipe}.)
-
-@quotation ATTENZIONE
-Normalmente,
-@`e un errore fatale (che fa terminare il programma @command{awk})
-scrivere verso il lato @code{"to"} di una @dfn{pipe} bidirezionale che
-@`e stata chiusa, e lo stesso vale se si legge dal lato @code{"from"}
-di una @dfn{pipe} bidirezionale che sia stata chiusa.
-
-@`E possibile impostare @code{PROCINFO["@var{comando}", "NONFATAL"]}
-per far s@`{@dotless{i}} che tali operazioni non provochino la fine del programma
-@command{awk}. Se lo si fa, @`e necessario controllare il valore
-di @code{ERRNO} dopo ogni istruzione @code{print}, @code{printf},
-o @code{getline}.
-@xref{Continuazione dopo errori} per ulteriori informazioni.
-@end quotation
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore, e comunicazioni attraverso le @dfn{pty}
-Per le comunicazioni bidirezionali si possono anche usare delle pseudo @dfn{tty}
-(@dfn{pty}) al posto delle @dfn{pipe}, se il sistema in uso le prevede.
-Questo vien fatto, a seconda del comando da usare, impostando un elemento
-speciale nel vettore @code{PROCINFO}
-(@pxref{Variabili auto-assegnate}),
-in questo modo:
-
-@example
-comando = "sort -nr" # comando, salvato in una variabile
-PROCINFO[comando, "pty"] = 1 # aggiorna PROCINFO
-print @dots{} |& comando # avvia la @dfn{pipe} bidirezionale
-@dots{}
-@end example
-
-@noindent
-Se il sistema in uso non ha le @dfn{pty}, o se tutte le @dfn{pty} del sistema
-sono in uso, @command{gawk} automaticamente torna a usare le @dfn{pipe}
-regolari.
-
-Usare le @dfn{pty} in genere evita i problemi di stallo del buffer descritti
-precedentemente, in cambio di un piccolo calo di prestazioni. Ci@`o dipende
-dal fatto che la gestione delle @dfn{tty} @`e fatta una riga per volta.
-Su sistemi che hanno il comando @command{stdbuf} (parte del pacchetto
-@uref{http://www.gnu.org/software/coreutils/coreutils.html,
-GNU Coreutils}), si pu@`o usare tale programma, invece delle @dfn{pty}.
-
-Si noti anche che le @dfn{pty} non sono completamente trasparenti.
-Alcuni codici di controllo binari, come @kbd{Ctrl-d} per indicare la
-condizione di file-file, sono interpetati dal gestore di @dfn{tty}
-e non sono passati all'applicazione.
-
-@quotation ATTENZIONE
-In ultima analisi, i coprocessi danno adito alla possibilit@`a di uno
-@dfn{stallo} (deadlock) tra @command{gawk} e il programma in esecuzione
-nel coprocesso. Ci@`o pu@`o succedere se si inviano ``troppi'' dati al
-coprocesso, prima di leggere dati inviati dallo stesso; entrambi i
-processi sono bloccati sulla scrittura dei dati, e nessuno dei due
-@`e disponibile a leggere quelli che sono gi@`a stati scritti dall'altro.
-Non c'@`e modo di evitare completamente una tale situazione; occorre una
-programmazione attenta, insieme alla conoscenza del comportamento del
-coprocesso.
-@end quotation
-
-@node Reti TCP/IP
-@section Usare @command{gawk} per la programmazione di rete
-@cindex funzionalit@`a avanzate, programmazione di rete
-@cindex avanzate, funzionalit@`a, programmazione di rete
-@cindex reti, programmazione di
-@cindex TCP/IP
-@cindex @code{/inet/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet/@dots{}} (in @command{gawk})
-@cindex @code{/inet4/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet4/@dots{}} (in @command{gawk})
-@cindex @code{/inet6/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet6/@dots{}} (in @command{gawk})
-@cindex @code{EMRED}
-@ifnotdocbook
-@quotation
-@code{EMRED}:@*
-@ @ @ @ @i{A host is a host from coast to coast,@*
-@ @ @ @ and nobody talks to a host that's close,@*
-@ @ @ @ unless the host that isn't close@*
-@ @ @ @ is busy, hung, or dead.}
-
-@code{EMRED}:@*
-@ @ @ @ @i{Un computer @`e un computer lontano o vicino,@*
-@ @ @ @ e nessuno parla con un computer vicino,@*
-@ @ @ @ a meno che il computer lontano@*
-@ @ @ @ sia occupato, fuori linea, o spento.}
-@author Mike O'Brien (noto anche come Mr.@: Protocol)
-@end quotation
-@end ifnotdocbook
-
-@docbook
-<blockquote>
-<attribution>Mike O'Brien (aka Mr.&nbsp;Protocol)</attribution>
-<literallayout class="normal"><literal>EMRED</literal>:
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>A host is a host from coast to coast,</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>and no-one can talk to host that's close,</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>unless the host that isn't close</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>is busy, hung, or dead.</emphasis></literallayout>
-</blockquote>
-@end docbook
-
-Oltre a poter aprire una @dfn{pipeline} bidirezionale verso un coprocesso
-sullo stesso sistema
-(@pxref{I/O bidirezionale}),
-@`e possibile attivare una connessione bidirezionale verso un altro processo
-o verso un altro sistema attraverso una connessione di rete IP.
-
-Si pu@`o pensare a questo semplicemente come a una @dfn{pipeline} bidirezionale
-@emph{molto lunga} verso un coprocesso.
-Il modo in cui @command{gawk} stabilisce quando usare una rete TCP/IP @`e
-mediante il riconoscimento di speciali @value{FNS} che iniziano con
-@samp{/inet/}, con @samp{/inet4/} o con @samp{/inet6/}.
-
-La sintassi completa del @value{FN} speciale @`e
-@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}.
-I componenti sono:
-
-@table @var
-@item tipo-rete
-Specifica il tipo di connessione a internet da stabilire.
-Si usa @samp{/inet4/} per usare solo IPv4, e
-@samp{/inet6/} per usare solo IPv6.
-Il semplice @samp{/inet/} (che usualmente @`e l'unica opzione) usa
-il tipo di default del sistema, quasi certamente IPv4.
-
-@item protocollo
-Il protocollo da usare sull'IP. Questo dev'essere o @samp{tcp} o
-@samp{udp}, per una connessione IP rispettivamente TCP o UDP.
-TCP dovrebbe venir usato per la maggior parte delle applicazioni.
-
-@item porta-locale
-@cindex @code{getaddrinfo()}, funzione (libreria C)
-@cindex funzione @code{getaddrinfo()} (libreria C)
-Il numero di porta TCP o UDP da usare. Si usa un numero di porta di valore
-@samp{0} quando si vuole che sia il sistema a scegliere una porta.
-Questo @`e quel che si dovrebbe fare quando si scrive un'applicazione
-cliente TCP o UDP.
-Si pu@`o usare anche un nome di un servizio noto, come @samp{smtp}
-o @samp{http}, nel qual caso @command{gawk} tenta di determinare
-il numero di porta predefinito usando la funzione C @code{getaddrinfo()}.
-
-@item host-remoto
-L'indirizzo IP o il nome di dominio completamente qualificato dell'host
-internet al quale ci si vuol connettere.
-
-@item porta-remota
-Il numero di porta TCP o UDP da usare sul particolare @var{host remoto}.
-Anche in questo caso, si usi @samp{0} se non ci sono preferenze,
-o alternativamente, un nome di servizio comunemente noto.
-@end table
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile
-@cindex variabile @code{ERRNO}
-@quotation NOTA
-Un insuccesso nell'apertura di un socket bidirezionale dar@`a luogo alla
-segnalazione di un errore non fatale al codice chiamante.
-Il valore di @code{ERRNO} indica l'errore (@pxref{Variabili auto-assegnate}).
-@end quotation
-
-Si consideri il seguente esempio molto semplice:
-
-@example
-BEGIN @{
- Servizio = "/inet/tcp/0/localhost/daytime"
- Servizio |& getline
- print $0
- close(Servizio)
-@}
-@end example
-
-Questo programma legge la data e l'ora corrente dal server @code{daytime}
-TCP del sistema locale.
-Stampa poi il risultato e chiude la connessione.
-
-Poich@'e questo tema @`e molto ampio, l'uso di @command{gawk} per
-la programmazione TCP/IP viene documentato separatamente.
-@ifinfo
-Si veda
-@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
-@end ifinfo
-@ifnotinfo
-Si veda
-@uref{http://www.gnu.org/software/gawk/manual/gawkinet/,
-@cite{@value{GAWKINETTITLE}}},
-che fa parte della distribuzione @command{gawk},
-@end ifnotinfo
-per una introduzione e trattazione molto pi@`u completa e con molti
-esempi.
-
-@quotation NOTA
-@command{gawk} pu@`o aprire solo socket diretti. Al momento non c'@`e alcun modo
-per accedere ai servizi disponibili su Secure Socket Layer
-(SSL); questo comprende qualsiasi servizio web il cui URL inizia con
-@samp{https://}.
-@end quotation
-
-
-@node Profilare
-@section Profilare i propri programmi @command{awk}
-@cindex @command{awk}, programmi, profilare
-@cindex profilare programmi @command{awk}
-@cindex @code{awkprof.out}, file
-@cindex file @code{awkprof.out}
-
-@`E possibile tener traccia dell'esecuzione dei propri programmi @command{awk}.
-Ci@`o si pu@`o fare passando l'opzione @option{--profile} a @command{gawk}.
-Al termine dell'esecuzione, @command{gawk} crea un profilo del programma in un
-file chiamato @file{awkprof.out}. A causa dell'attivit@`a di profilazione
-l'esecuzione del programma @`e pi@`u lenta fino al 45% rispetto al normale.
-
-@cindex @option{--profile}, opzione
-@cindex opzione @option{--profile}
-Come mostrato nel seguente esempio,
-l'opzione @option{--profile} pu@`o essere usata per cambiare il nome del file
-su cui @command{gawk} scriver@`a il profilo:
-
-@example
-gawk --profile=mioprog.prof -f mioprog.awk dati1 dati2
-@end example
-
-@noindent
-Nell'esempio precedente, @command{gawk} mette il profilo in
-@file{mioprog.prof} anzich@'e in @file{awkprof.out}.
-
-Vediamo ora una sessione d'esempio che mostra un semplice programma
-@command{awk}, i suoi dati in input, e il risultato dell'esecuzione di
-@command{gawk} con l'opzione @option{--profile}. Innanzitutto, il
-programma @command{awk}:
-
-@example
-BEGIN @{ print "Prima regola BEGIN" @}
-
-END @{ print "Prima regola END" @}
-
-/pippo/ @{
- print "trovato /pippo/, perbacco"
- for (i = 1; i <= 3; i++)
- sing()
-@}
-
-@{
- if (/pippo/)
- print "l'if @`e vero"
- else
- print "l'else @`e vero"
-@}
-
-BEGIN @{ print "Seconda regola BEGIN" @}
-
-END @{ print "Seconda regola END" @}
-
-function sing( ignora)
-@{
- print "Devo essere io!"
-@}
-@end example
-
-Questi sono i dati in input:
-
-@example
-pippo
-pluto
-paperino
-pippo
-cianfrusaglie
-@end example
-
-E questo @`e il file @file{awkprof.out} che @`e il risultato dell'esecuzione
-del profilatore di @command{gawk} su questo programma e sui dati (quest'esempio
-dimostra anche che i programmatori di @command{awk} a volte si alzano molto
-presto al mattino per lavorare):
-
-@cindex @code{BEGIN}, criterio di ricerca, e profilatura
-@cindex criterio di ricerca @code{BEGIN}, e profilatura
-@cindex @code{END}, criterio di ricerca, e profilatura
-@cindex criterio di ricerca @code{END}, e profilatura
-@example
- # profilo gawk, creato Mon Sep 29 05:16:21 2014
-
- # BEGIN regola(e)
-
- BEGIN @{
- 1 print "Prima regola BEGIN"
- @}
-
- BEGIN @{
- 1 print "Seconda regola BEGIN"
- @}
-
- # Regola(e)
-
- 5 /pippo/ @{ # 2
- 2 print "trovato /pippo/, perbacco"
- 6 for (i = 1; i <= 3; i++) @{
- 6 sing()
- @}
- @}
-
- 5 @{
- 5 if (/pippo/) @{ # 2
- 2 print "l'if @`e vero"
- 3 @} else @{
- 3 print "l'else @`e vero"
- @}
- @}
-
- # END regola(e)
-
- END @{
- 1 print "Prima regola END"
- @}
-
- END @{
- 1 print "Seconda regola END"
- @}
-
-
- # Funzioni, in ordine alfabetico
-
- 6 function sing(ignora)
- @{
- 6 print "Devo essere io!"
- @}
-@end example
-
-Quest'esempio illustra molte caratteristiche fondamentali dell'output
-della profilazione.
-Queste sono:
-
-@itemize @value{BULLET}
-@item
-Il programma viene stampato nell'ordine: regole @code{BEGIN},
-regole @code{BEGINFILE},
-regole criterio di ricerca--azione,
-regole @code{ENDFILE}, regole @code{END}, e funzioni, elencate
-in ordine alfabetico.
-Le regole @code{BEGIN} ed @code{END} multiple conservano le loro
-distinte identit@`a, cos@`{@dotless{i}} come le regole @code{BEGINFILE} ed @code{ENDFILE}
-multiple.
-
-@cindex criteri di ricerca, conteggi, in un profilo
-@item
-Le regole criterio di ricerca--azione hanno due conteggi.
-Il primo conteggio, a sinistra della regola, mostra quante volte
-il criterio di ricerca della regola @`e stato @emph{testato}.
-Il secondo conteggio, alla destra della parentesi graffa aperta,
-all'interno di un commento,
-mostra quante volte l'azione della regola @`e stata @emph{eseguita}.
-La differenza tra i due indica quante volte il criterio di ricerca della regola
-@`e stato valutato come falso.
-
-@item
-Analogamente,
-il conteggio per un'istruzione @code{if}-@code{else} mostra quante volte
-la condizione @`e stata testata.
-Alla destra della parentesi graffa sinistra aperta per il corpo di @code{if}
-c'@`e un conteggio che mostra quante volte la condizione @`e stata trovata vera.
-Il conteggio per @code{else} indica
-quante volte la verifica non ha avuto successo.
-
-@cindex cicli, conteggi per l'intestazione, in un profilo
-@item
-Il conteggio per un ciclo (come @code{for}
-o @code{while}) mostra quante volte il test del ciclo @`e stato eseguito.
-(Per questo motivo, non si pu@`o solamente guardare il conteggio sulla prima
-istruzione in una regola per determinare quante volte la regola @`e stata
-eseguita. Se la prima istruzione @`e un ciclo, il conteggio @`e ingannevole.)
-
-@cindex funzioni definite dall'utente, conteggi, in un profilo
-@cindex definite dall'utente, funzioni, conteggi, in un profilo
-@item
-Per le funzioni definite dall'utente, il conteggio vicino alla parola chiave
-@code{function} indica quante volte la funzione @`e stata chiamata.
-I conteggi vicino alle istruzioni nel corpo mostrano quante volte
-quelle istruzioni sono state eseguite.
-
-@cindex @code{@{@}} (parentesi graffe)
-@cindex parentesi graffe (@code{@{@}})
-@item
-L'impaginazione usa lo stile ``K&R'' con le tabulazioni.
-Le parentesi graffe sono usate dappertutto, anche dove il corpo di un
-@code{if}, di un @code{else} o di un ciclo @`e formato da un'unica istruzione.
-
-@cindex @code{()} (parentesi), in un profilo
-@cindex parentesi (@code{()}), in un profilo
-@item
-Le parentesi vengono usate solo dov'@`e necessario, come si rileva dalla
-struttura del programma e dalle regole di precedenza.
-Per esempio, @samp{(3 + 5) * 4} significa sommare tre e cinque, quindi
-moltiplicare il totale per quattro. Di contro, @samp{3 + 5 * 4} non ha
-parentesi, e significa @samp{3 + (5 * 4)}.
-
-@ignore
-@item
-All string concatenations are parenthesized too.
-(This could be made a bit smarter.)
-@end ignore
-
-@item
-Le parentesi vengono usate attorno agli argomenti di @code{print}
-e @code{printf} solo quando l'istruzione
-@code{print} o @code{printf} @`e seguita da una ridirezione.
-Similarmente, se
-l'oggetto di una ridirezione non @`e uno scalare, viene messo tra parentesi.
-
-@item
-@command{gawk} mette dei commenti iniziali
-davanti alle regole @code{BEGIN} ed @code{END},
-alle regole @code{BEGINFILE} ed @code{ENDFILE},
-alle regole criterio_di_ricerca--azione e alle funzioni.
-
-@end itemize
-
-La versione profilata del proprio programma potrebbe non apparire esattamente
-come quella scritta durante la stesura del programma. Questo perch@'e
-@command{gawk} crea la versione profilata facendo una ``stampa elegante'' della
-sua rappresentazione interna del programma. Un vantaggio di ci@`o @`e che
-@command{gawk} pu@`o produrre una rappresentazione standard.
-Inoltre, cose come:
-
-@example
-/pippo/
-@end example
-
-@noindent
-appaiono come:
-
-@example
-/pippo/ @{
- print $0
-@}
-@end example
-
-@noindent
-che @`e corretto, ma probabilmente inatteso.
-
-@cindex profilare programmi @command{awk}, dinamicamente
-@cindex @command{gawk}, programma, profilazione dinamica
-@cindex profilazione dinamica
-Oltre a creare profili una volta completato il programma,
-@command{gawk} pu@`o generare un profilo mentre @`e in esecuzione.
-Questo @`e utile se il proprio programma @command{awk} entra in un ciclo
-infinito e si vuol vedere cosa @`e stato eseguito.
-Per usare questa funzionalit@`a, bisogna eseguire @command{gawk} con l'opzione
-@option{--profile} in background:
-
-@example
-$ @kbd{gawk --profile -f mioprog &}
-[1] 13992
-@end example
-
-@cindex @command{kill}, comando@comma{} profilazione dinamica e
-@cindex comando @command{kill}@comma{} profilazione dinamica e
-@cindex @code{USR1}, segnale, per profilazione dinamica
-@cindex @code{SIGUSR1}, segnale, per profilazione dinamica
-@cindex segnali @code{USR1}/@code{SIGUSR1}, per profilazione
-@noindent
-La shell stampa un numero di job e il numero di ID del relativo processo;
-in questo caso, 13992. Si usi il comando @command{kill} per inviare il
-segnale @code{USR1} a @command{gawk}:
-
-@example
-$ @kbd{kill -USR1 13992}
-@end example
-
-@noindent
-Come al solito, la versione profilata del programma @`e scritta nel file
-@file{awkprof.out}, o in un file differente se ne viene specificato uno
-con l'opzione @option{--profile}.
-
-Assieme al profilo regolare, come mostrato in precedenza, il file del profilo
-include una traccia di ogni funzione attiva:
-
-@example
-# `Stack' (Pila) Chiamate Funzione:
-
-# 3. paperino
-# 2. pluto
-# 1. pippo
-# -- main --
-@end example
-
-Si pu@`o inviare a @command{gawk} il segnale @code{USR1} quante volte si vuole.
-Ogni volta, il profilo e la traccia della chiamata alla funzione vengono
-aggiunte in fondo al file di profilo creato.
-
-@cindex @code{HUP}, segnale, per profilazione dinamica
-@cindex @code{SIGHUP}, segnale, per profilazione dinamica
-@cindex segnali @code{HUP}/@code{SIGHUP}, per profilazione
-Se si usa il segnale @code{HUP} invece del segnale @code{USR1}, @command{gawk}
-genera il profilo e la traccia della chiamata alla funzione ed esce.
-
-@cindex @code{INT}, segnale (MS-Windows)
-@cindex @code{SIGINT}, segnale (MS-Windows)
-@cindex segnali @code{INT}/@code{SIGINT} (MS-Windows)
-@cindex @code{QUIT}, segnale (MS-Windows)
-@cindex @code{SIGQUIT}, segnale (MS-Windows)
-@cindex segnali @code{QUIT}/@code{SIGQUIT} (MS-Windows)
-Quando @command{gawk} viene eseguito sui sistemi MS-Windows, usa i segnali
-@code{INT} e @code{QUIT} per generare il profilo, e nel
-caso del segnale @code{INT}, @command{gawk} esce. Questo perch@'e
-questi sistemi non prevedono il comando @command{kill}, per cui gli unici
-segnali che si possono trasmettere a un programma sono quelli generati dalla
-tastiera. Il segnale @code{INT} @`e generato dalle combinazioni di tasti
-@kbd{Ctrl-c} o @kbd{Ctrl-BREAK}, mentre il segnale
-@code{QUIT} @`e generato dalla combinazione di tasti @kbd{Ctrl-\}.
-
-Infine, @command{gawk} accetta anche un'altra opzione, @option{--pretty-print}.
-Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa elegante''
-del programma nel file @file{awkprof.out}, senza conteggi sull'esecuzione.
-
-@quotation NOTA
-Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma.
-Ora non pi@`u.
-@end quotation
-
-C'@`e una differenza significativa tra l'output creato durante la profilazione, e
-quello creato durante la stampa elegante. L'output della stampa elegante
-preserva i commenti originali che erano nel programma, anche se la loro
-posizione pu@`o non corrispondere esattamente alle posizioni originali che
-avevano nel codice sorgente.@footnote{@command{gawk} fa del suo meglio
-per mantenere la distinzione tra commenti posti dopo delle istruzioni e
-commenti su righe a s@'e stanti. Per limiti insiti nell'implementazione,
-non sempre questo pu@`o avvenire in maniera corretta, in particolare nel
-caso di istruzioni @code{switch}. I manutentori di @command{gawk}
-sperano di poter migliorare la situazione in una futura versione.}
-
-Comunque, per una precisa scelta progettuale, l'output della profilazione
-@emph{omette} i commenti del programma originale. Questo permette di
-concentrarsi sui dati del conteggio di esecuzione ed evita la tentazione di
-usare il profilatore per creare una stampa elegante.
-
-Oltre a ci@`o, l'output stampato in modo elegante non ha l'indentazione iniziale
-che ha l'output della profilazione. Questo rende agevole la stampa elegante
-del proprio codice una volta completato lo sviluppo, usando poi il risultato
-come versione finale del programma.
-
-Poich@'e la rappresentazione interna del programma @`e formattata per
-essere aderente al programma @command{awk} in questione, la profilatura
-e la formattazione graziosa (opzione @option{--pretty-print}) disabilitano
-automaticamente le optimizzazioni di default di @command{gawk}.
-
-La formattazione elegante mantiene anche il formato originale delle
-costanti numeriche; se sono stati usati dei valori ottali o esadecimali
-nel codice sorgente, questi compariranno nell'output nello stesso
-formato con cui sono stati inseriti.
-
-@node Sommario funzionalit@`a avanzate
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-L'opzione @option{--non-decimal-data} fa s@`{@dotless{i}} che @command{gawk} tratti
-i dati di input che hanno l'aspetto ottale ed esadecimale come valori ottali ed
-esadecimali. L'opzione dovrebbe essere usata con prudenza o non usata affatto;
-@`e preferibile l'uso di @code{strtonum()}.
-Si noti che quest'opzione potrebbe sparire nelle prossime versioni di
-@command{gawk}.
-
-@item
-Si pu@`o prendere il completo controllo dell'ordinamento nello scorrere il
-vettore con @samp{for (@var{indice} in @var{vettore})}, impostando
-@code{PROCINFO["sorted_in"]} al nome di una funzione definita dall'utente che
-fa il confronto tra elementi del vettore basandosi su indice e valore.
-
-@item
-Analogamente, si pu@`o fornire il nome di una funzione di confronto definita
-dall'utente come terzo argomento di @code{asort()} o di @command{asorti()} per
-controllare come queste funzioni ordinano i vettori. O si pu@`o fornire una delle
-stringhe di controllo predefinite che funzionano per
-@code{PROCINFO["sorted_in"]}.
-
-@item
-Si pu@`o usare l'operatore @samp{|&} per creare una @dfn{pipe} bidirezionale
-verso un coprocesso. Si legge dal coprocesso con @code{getline}, ci si
-scrive sopra con @code{print} o con @code{printf}. Usare @code{close()}
-per bloccare il coprocesso completamente o, se necessario, chiudere le
-comunicazioni bidirezionali in una direzione.
-
-@item
-Usando degli speciali @value{FNS} con l'operatore @samp{|&}, si pu@`o aprire una
-connessione TCP/IP (o UDP/IP) verso host remoti su internet. @command{gawk}
-supporta sia IPv4 che IPv6.
-
-@item
-Si possono generare profili del proprio programma con i conteggi del numero
-di esecuzione di ogni singola
-istruzione. Questo pu@`o essere d'aiuto nel determinare quali parti del programma
-potrebbero portar via la maggior parte del tempo, consentendo cos@`{@dotless{i}} di
-aggiustarli pi@`u agevolmente. Inviando il segnale @code{USR1} durante la
-profilazione @command{gawk} scrive il profilo, includendo la
-stack della chiamata alla funzione e prosegue nell'elaborazione.
-
-@item
-Si pu@`o anche fare solo una ``stampa elegante'' del programma.
-
-@end itemize
-@node Internazionalizzazione
-@chapter Internazionalizzazione con @command{gawk}
-
-Tanto tempo fa i produttori di computer
-scrivevano software che comunicava solo in inglese.
-Col passare del tempo, i venditori di hardware e di software si sono
-resi conto che se i loro sistemi avessero comunicato anche nelle lingue
-materne di paesi dove non si parlava inglese,
-ci@`o avrebbe avuto come risultato un incremento delle vendite.
-Per questo motivo, l'internazionalizzazione e la localizzazione
-di programmi e sistemi software @`e divenuta una pratica comune.
-
-@cindex internazionalizzazione, localizzazione
-@cindex @command{gawk}, internazionalizzazione e, si veda internazionalizzazione
-@cindex internazionalizzazione, localizzazione, @command{gawk} e
-Per molti anni la possibilit@`a di fornire l'internazionalizzazione
-era sostanzialmente limitata ai programmi scritti in C e C++.
-Questo @value{CHAPTER} descrive la libreria @dfn{ad hoc} utilizzata da
-@command{gawk}
-per l'internazionalizzazione e anche il modo in cui le funzionalit@`a che
-consentono l'internazionalizzazione sono rese disponibili da @command{gawk}
-a ogni programma scritto in @command{awk}.
-La disponibilit@`a dell'internazionalizzazione a livello di programma
-@command{awk} offre ulteriore flessibilit@`a agli sviluppatori di software:
-non sono pi@`u obbligati a scrivere in C o C++ quando l'internazionalizzazione
-@`e necessaria in un programma.
-
-@menu
-* I18N e L10N:: Internazionalizzazione e localizzazione.
-* Utilizzare @command{gettext}:: Come funziona il comando GNU @command{gettext}.
-* I18N per programmatore:: Funzionalit@`a per il programmatore.
-* I18N per traduttore:: Funzionalit@`a per il traduttore.
-* Esempio I18N:: Un semplice esempio di internazionalizzazione.
-* Gawk internazionalizzato:: Anche @command{gawk} @`e internazionalizzato.
-* Sommario I18N:: Sommario dell'internazionalizzazione.
-@end menu
-
-@node I18N e L10N
-@section Internazionalizzazione e localizzazione
-
-@cindex internazionalizzazione di programmi @command{awk}
-@cindex localizzazione, si veda internazionalizzazione@comma{} localizzazione
-@cindex localizzazione
-@dfn{Internazionalizzazione} significa scrivere (o modificare) un programma
-una volta sola,
-in maniera tale che possa usare pi@`u di una lingua senza
-bisogno di ulteriori modifiche al file sorgente.
-@dfn{Localizzazione}
-significa fornire i dati necessari perch@'e un programma
-internazionalizzato sia in grado di funzionare con una data lingua.
-Questi termini si riferiscono comunemente a funzionalit@`a quali la lingua
-usata per stampare messaggi di errore, quella usata per leggere
-risposte, e alle informazioni
-relative al modo di leggere e di stampare dati di tipo numerico o valutario.
-
-@node Utilizzare @command{gettext}
-@section Il comando GNU @command{gettext}
-
-@cindex internazionalizzare un programma
-@cindex @command{gettext}, libreria
-@cindex libreria @command{gettext}
-@command{gawk} usa il comando GNU @command{gettext} per rendere disponibili
-le proprie funzionalit@`a di internazionalizzazione.
-L'attenzione del comando GNU @command{gettext} @`e rivolta principalmente
-ai messaggi: stringhe di caratteri stampate da un programma, sia
-direttamente sia usando la formattazione prevista dalle istruzioni
-@code{printf} o @code{sprintf()}.@footnote{Per alcuni sistemi operativi,
-la relativa versione di @command{gawk}
-non supporta il comando GNU @command{gettext}.
-Per questo motivo, queste funzionalit@`a non sono disponibili nel caso
-si stia lavorando con uno di questi sistemi operativi. Siamo spiacenti.}
-
-@cindex portabilit@`a, libreria @command{gettext} e
-Quando si usa il comando GNU @command{gettext}, ogni applicazione ha il
-proprio @dfn{dominio di testo}. Questo @`e un nome unico come,
-p.es., @samp{kpilot} o @samp{gawk},
-che identifica l'applicazione.
-Un'applicazione completa pu@`o avere pi@`u componenti: programmi scritti
-in C o C++, come pure script di @command{sh} o di @command{awk}.
-Tutti i componenti usano lo stesso dominio di testo.
-
-Per andare sul concreto, si supponga di scrivere un'applicazione
-chiamata @command{guide}. L'internazionalizzazione per quest'applicazione
-pu@`o essere implementata seguendo nell'ordine i passi qui delineati:
-
-@enumerate
-@item
-Il programmatore esamina i sorgenti di tutti i componenti dell'applicazione
-@command{guide} e prende nota di ogni stringa che potrebbe aver bisogno
-di traduzione.
-Per esempio, @code{"`-F': option required"} @`e una stringa che sicuramente
-necessita di una traduzione.
-Una tabella che contenga stringhe che sono nomi di opzioni @emph{non}
-necessita di traduzione.
-(P.es., l'opzione di @command{gawk} @option{--profile}
-dovrebbe restare immutata, a prescindere dalla lingua locale).
-
-@cindex @code{textdomain()}, funzione (libreria C)
-@cindex funzione @code{textdomain()} (libreria C)
-@item
-Il programmatore indica il dominio di testo dell'applicazione
-(@command{"guide"}) alla libreria @command{gettext},
-chiamando la funzione @code{textdomain()}.
-
-@cindex @code{.pot}, file
-@cindex file @code{.pot}
-@cindex @dfn{portable object template} (.pot), file
-@cindex file, @dfn{portable object template} (.pot)
-@item
-I messaggi dell'applicazione che vanno tradotti sono estratti dal codice
-sorgente e messi in un file di tipo
-@dfn{portable object template}
-[modello di oggetto portabile]
-di nome @file{guide.pot},
-che elenca le stringhe e le relative traduzioni.
-Le traduzioni sono inizialmente vuote
-(esiste la struttura che definisce la stringa tradotta, ma la stringa
-tradotta @`e una stringa nulla).
-Il messaggio originale (normalmente in inglese) @`e utilizzato come chiave
-di riferimento per le traduzioni.
-
-@cindex @code{.po}, file
-@cindex file @code{.po}
-@cindex @dfn{portable object} file (.po)
-@cindex file, @dfn{portable object} (.po)
-@item
-Per ogni lingua per cui sia disponibile un traduttore, il file
-@file{guide.pot} @`e copiato in un file di tipo
-@dfn{portable object}
-[oggetto portabile]
-(dal suffisso @code{.po})
-e le traduzioni sono effettuate su quel file,
-che viene distribuito con l'applicazione.
-Per esempio, potrebbe esserci un file @file{it.po} per la traduzione italiana.
-
-@cindex @code{.gmo}, file
-@cindex file @code{.gmo}
-@cindex @dfn{message object} file (.mo)
-@cindex file, @dfn{message object} (.mo)
-@item
-Il file @file{.po} di ogni lingua @`e convertito in un formato binario,
-detto @dfn{message object} (file @file{.gmo}).
-Un file di tipo @dfn{message object} contiene i messaggi originali e le loro
-traduzioni in un formato binario che facilita il ritrovamento delle
-traduzioni quando l'applicazione viene eseguita.
-
-@item
-Quando @command{guide} @`e compilato e installato, i file binari contenenti le
-traduzioni sono installati in una directory standard.
-
-@cindex @code{bindtextdomain()}, funzione (libreria C)
-@cindex funzione @code{bindtextdomain()} (libreria C)
-@item
-Durante la fase di prova e sviluppo, @`e possibile chiedere a @command{gettext}
-di usare un file @file{.gmo} in una directory diversa da quella standard,
-usando la funzione @code{bindtextdomain()}.
-
-@cindex @code{.gmo}, file, specificare la directory di
-@cindex file @code{.gmo}, specificare la directory di
-@cindex @dfn{message object} file (.mo), specificare la directory di
-@cindex file, @dfn{message object} (.mo), specificare la directory di
-@item
-Quando viene eseguito, il programma @command{awk} @command{guide} cerca ogni
-stringa da tradurre facendo una chiamata a @code{gettext()}. La stringa
-ricevuta in ritorno @`e la stringa tradotta, se @`e stata trovata, o la stringa
-originale, se una traduzione non @`e disponibile.
-
-@item
-Se necessario, @`e possibile procurarsi dei messaggi tradotti da un dominio di
-testo diverso da quello proprio dell'applicazione, senza dover altalenare fra
-questo secondo dominio e quello dell'applicazione.
-@end enumerate
-
-@cindex @code{gettext()}, funzione (libreria C)
-@cindex funzione @code{gettext()} (libreria C)
-In C (o C++), la marcatura della stringa la ricerca dinamica
-della traduzione si fanno inserendo ogni stringa da tradurre in una chiamata
-a @code{gettext()}:
-
-@example
-printf("%s", gettext("Don't Panic!\n"));
-@end example
-
-Gli strumenti software che estraggono messaggi dal codice sorgente
-individuano tutte le stringhe racchiuse nelle chiamate a @code{gettext()}.
-
-@cindex @code{_} (trattino basso), macro C
-@cindex trattino basso (@code{_}), macro C
-Gli sviluppatori del comando GNU @command{gettext}, riconoscendo che
-continuare a immettere @samp{gettext(@dots{})} @`e sia faticoso che poco
-elegante da vedere, usano la macro @samp{_} (un trattino basso) per
-facilitare la cosa:
-
-@example
-/* Nel file di intestazione standard: */
-#define _(str) gettext(str)
-
-/* Nel testo del programma: */
-printf("%s", _("Don't Panic!\n"));
-@end example
-
-@cindex internazionalizzazione, localizzazione, categorie di localizzazione
-@cindex @command{gettext}, libreria, categorie di localizzazione
-@cindex libreria @command{gettext}, categorie di localizzazione
-@cindex categorie di localizzazione
-@noindent
-Questo permette di ridurre la digitazione extra a solo tre caratteri per
-ogni stringa da tradurre e inoltre migliora di molto la leggibit@`a.
-
-Ci sono @dfn{categorie} di localizzazione per tipi diversi di informazioni
-legate a una particolare localizzazione.
-Le categorie di localizzazione note a @command{gettext} sono:
-
-@table @code
-@cindex @code{LC_MESSAGES}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_MESSAGES}
-@item LC_MESSAGES
-Testo dei messaggi. Questa @`e la categoria di default usata all'interno di
-@command{gettext}, ma @`e possibile specificarne esplicitamente una differente,
-se necessario. (Questo non @`e quasi mai necessario.)
-
-@cindex ordinare caratteri in lingue differenti
-@cindex @code{LC_COLLATE}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_COLLATE}
-@item LC_COLLATE
-Informazioni sull'ordinamento alfabetico (cio@`e, come caratteri diversi e/o
-gruppi di carattere sono ordinati in un dato linguaggio).
-@c ad esempio i vari caratteri accentati in italiano, vanno ordinati
-@c insieme alla loro lettera "principale" (e @`e @'e).
-
-@cindex @code{LC_CTYPE}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_CTYPE}
-@item LC_CTYPE
-Informazioni sui singoli caratteri (alfabetico, numerico, maiuscolo
-o minuscolo, etc.), come pure sulla codifica dei caratteri.
-@ignore
-In June 2001 Bruno Haible wrote:
-- Description of LC_CTYPE: It determines both
- 1. character encoding,
- 2. character type information.
- (For example, in both KOI8-R and ISO-8859-5 the character type information
- is the same - cyrillic letters could as 'alpha' - but the encoding is
- different.)
-@end ignore
-Quest'informazione @`e utilizzata per stabilire le classi di caratteri come
-definite nello standard POSIX, nelle espressioni regolari,
-come p. es. @code{/[[:alnum:]]/}
-(@pxref{Espressioni tra parentesi quadre}).
-
-@cindex informazioni di tipo monetario, localizzazione
-@cindex monete, simboli di, nella localizzazione
-@cindex simboli di monete, nella localizzazione
-@cindex monete, rappresentazioni di, nella localizzazione
-@cindex rappresentazioni di monete, nella localizzazione
-@cindex @code{LC_MONETARY}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_MONETARY}
-@item LC_MONETARY
-Le informazioni di tipo monetario, quali il simbolo della moneta, e se
-il simbolo va prima o dopo il valore numerico.
-
-@cindex @code{LC_NUMERIC}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_NUMERIC}
-@item LC_NUMERIC
-Informazioni di tipo numerico, quali il carattere da usare per separare le
-cifre decimali e quello per separare le migliaia.@footnote{Gli americani usano
-una virgola ogni tre cifre decimali, e un punto per separare la parte decimale
-di un numero, mentre molti europei (fra cui gli italiani) fanno esattamente
-l'opposto: 1,234.56 invece che 1.234,56.}
-
-@cindex tempo, localizzazione e
-@cindex date, informazioni relative alla localizzazione
-@cindex @code{LC_TIME}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_TIME}
-@item LC_TIME
-Informazioni relative alle date e alle ore,
-come l'uso di ore nel formato a 12 ore oppure a 24 ore, il mese stampato
-prima o dopo il giorno in una data, le abbreviazioni dei mesi nella lingua
-locale, e cos@`{@dotless{i}} via.
-
-@cindex @code{LC_ALL}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_ALL}
-@item LC_ALL
-Tutte le categorie viste sopra. (Non molto utile nel contesto del comando
-@command{gettext}.)
-@end table
-
-@quotation NOTA
-@cindex @env{LANGUAGE}, variabile d'ambiente
-@cindex variabile d'ambiente @env{LANGUAGE}
-Come descritto in @ref{Localizzazioni}, le variabili d'ambiente
-che hanno lo stesso nome delle categorie di localizzazione
-(@env{LC_CTYPE}, @env{LC_ALL}, etc.) influenzano il comportamento di
-@command{gawk} (e quello di altri programmi di utilit@`a).
-
-Solitamente, queste variabili influenzano anche il modo con cui
-la libreria @code{gettext} trova le traduzioni. Tuttavia, la
-variabile d'ambiente @env{LANGUAGE} prevale sulle variabili
-della famiglia @env{LC_@var{xxx}}. Molti sistemi GNU/Linux possono
-aver definito questa variabile senza esplicitamente notificarlo
-all'utente, e questo potrebbe far s@`{@dotless{i}} che @command{gawk} non riesca a
-trovare le traduzioni corrette. Se si incontra questa situazione,
-occorre controllare se la variabile d'ambiente @env{LANGUAGE} @`e
-definita, e, in questo caso, va usato il comando @command{unset}
-per rimuoverla.
-@end quotation
-
-Per il test di traduzioni dei messaggi inviati da @command{gawk} stesso, si pu@`o
-impostare la variabile d'ambiente @env{GAWK_LOCALE_DIR}. Si veda la
-documentazione per la funzione C @code{bindtextdomain()}, e si veda anche
-@ref{Altre variabili d'ambiente}.
-
-@node I18N per programmatore
-@section Internazionalizzare programmi @command{awk}
-@cindex programmi @command{awk}, internazionalizzare
-@cindex internazionalizzazione di programmi @command{awk}
-
-@command{gawk} prevede le seguenti variabili per l'internazionalizzazione:
-
-@table @code
-@cindex @code{TEXTDOMAIN}, variabile
-@cindex variabile @code{TEXTDOMAIN}
-@item TEXTDOMAIN
-Questa variabile indica il dominio di testo dell'applicazione.
-Per compatibilit@`a con il comando GNU @command{gettext}, il valore di default
-@`e @code{"messages"}.
-
-@cindex internazionalizzazione, localizzazione, stringhe marcate
-@cindex stringhe, marcare per localizzazione
-@item _"questo @`e un messaggio da tradurre"
-Costanti di tipo stringa marcate con un trattino basso iniziale
-sono candidate per essere tradotte al momento dell'esecuzione del
-programma @command{gawk}.
-Costanti di tipo stringa non precedute da un trattino basso non
-verranno tradotte.
-@end table
-
-@command{gawk} fornisce le seguenti funzioni al servizio
-dell'internazionalizzazione:
-
-@table @code
-@cindexgawkfunc{dcgettext}
-@item @code{dcgettext(@var{string}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
-Restituisce la traduzione di @var{stringa} nel
-dominio di testo @var{dominio} per la categoria di localizzazione @var{categoria}.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-Se si assegna un valore a @var{categoria}, dev'essere una stringa uguale a
-una delle categorie di localizzazione note, descritte
-@ifnotinfo
-nella precedente @value{SECTION}.
-@end ifnotinfo
-@ifinfo
-@ref{Utilizzare @command{gettext}}.
-@end ifinfo
-Si deve anche specificare un dominio di testo. Si usi @code{TEXTDOMAIN} se
-si desidera usare il dominio corrente.
-
-@quotation ATTENZIONE
-L'ordine degli argomenti per la versione @command{awk}
-della funzione @code{dcgettext()} @`e differente, per una scelta di progetto,
-dall'ordine degli argomenti passati alla funzione C che ha lo stesso nome.
-L'ordine della versione @command{awk} @`e stato scelto per amore di
-semplicit@`a e per consentire di avere dei valori di default per gli
-argomenti che fossero il pi@`u possibile simili, come stile, a quello di
-@command{awk}.
-@end quotation
-
-@cindexgawkfunc{dcngettext}
-@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
-Restituisce la forma, singolare o plurale, da usare a seconda del valore
-di @var{numero} per la
-traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
-@var{dominio} per la categoria di localizzazione @var{categoria}.
-@var{stringa1} @`e la variante al singolare in inglese di un messaggio,
-e @var{stringa2} @`e la variante al plurale in inglese dello stesso messaggio.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-Valgono le stesse osservazioni riguardo all'ordine degli argomenti
-fatte a proposito della funzione @code{dcgettext()}.
-
-@cindex @code{.gmo}, file, specificare la directory di
-@cindex file @code{.gmo}, specificare la directory di
-@cindex @dfn{message object} file (.mo), specificare la directory di
-@cindex file, @dfn{message object} (.mo), specificare la directory di
-@cindexgawkfunc{bindtextdomain}
-@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio} ]@code{)}
-Cambia la directory nella quale
-@command{gettext} va a cercare i file @file{.gmo}, per il caso in cui questi
-non possano risiedere nelle posizioni standard
-(p.es., in fase di test).
-Restituisce la directory alla quale @var{dominio} @`e ``collegato''.
-
-Il @var{dominio} di default @`e il valore di @code{TEXTDOMAIN}.
-Se l'argomento @var{directory} @`e impostato alla stringa nulla (@code{""}),
-@code{bindtextdomain()} restituisce il collegamento corrente applicabile
-al @var{dominio} specificato.
-@end table
-
-Per usare queste funzionalit@`a in un programma @command{awk},
-va seguita la procedura qui indicata:
-
-@enumerate
-@cindex @code{BEGIN}, criterio di ricerca, variabile @code{TEXTDOMAIN} e
-@cindex criterio di ricerca @code{BEGIN}, variabile @code{TEXTDOMAIN} e
-@cindex @code{TEXTDOMAIN}, variabile, criterio di ricerca @code{BEGIN} e
-@cindex variabile @code{TEXTDOMAIN}, criterio di ricerca @code{BEGIN} e
-@item
-Impostare la variabile @code{TEXTDOMAIN} al dominio di testo del
-programma. @`E meglio fare ci@`o all'interno di una regola @code{BEGIN}
-(@pxref{BEGIN/END}),
-ma si pu@`o anche fare dalla riga di comando, usando l'opzione @option{-v}
-(@pxref{Opzioni}):
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide"
- @dots{}
-@}
-@end example
-
-@cindex @code{_} (trattino basso), stringa traducibile
-@cindex trattino basso (@code{_}), stringa traducibile
-@item
-Marcare tutte le stringhe traducibili anteponendo loro un
-trattino basso (@samp{_}). Il trattino @emph{deve} essere adiacente ai
-doppi apici di apertura della stringa. Per esempio:
-
-@example
-print _"hello, world"
-x = _"you goofed"
-printf(_"Number of users is %d\n", nusers)
-@end example
-
-@item
-Se le stringhe da visualizzare sono create dinamicamente, @`e ancora possibile
-tradurle, usando la funzione predefinita @code{dcgettext()}:@footnote{I miei
-ringraziamenti a Bruno Haible per questo esempio.}
-
-@example
-if (assonnato)
- messaggio = dcgettext("%d clienti mi scocciano\n", "adminprog")
-else
- messaggio = dcgettext("mi diverto con %d clienti\n", "adminprog")
-printf(messaggio, numero_clienti)
-@end example
-
-In questo esempio, la chiamata a @code{dcgettext()} specifica un diverso
-dominio di testo (@code{"adminprog"}) in cui trovare il
-messaggio, ma usa la categoria di default @code{"LC_MESSAGES"}.
-
-Il precedente esempio funziona solo se @code{numero_clienti} @`e un numero maggiore
-di uno.
-Per questo esempio sarebbe pi@`u appropriato usare la funzione @code{dcngettext()}:
-
-@example
-if (assonnato)
- messaggio = dcngettext("%d cliente mi scoccia\n",
- "%d clienti mi scocciano\n",
- numero_clienti, "adminprog")
-else
- messaggio = dcngettext("mi diverto con %d cliente\n",
- "mi diverto con %d clienti\n",
- numero_clienti, "adminprog")
-printf(messaggio, numero_clienti)
-@end example
-
-
-@cindex @code{LC_MESSAGES}, categoria di localizzazione, funzione @code{bindtextdomain()} di (@command{gawk})
-@item
-In fase di sviluppo, si pu@`o scegliere di tenere il file @file{.gmo}
-in una directory a parte, solo per provarlo. Ci@`o si fa
-con la funzione predefinita @code{bindtextdomain()}:
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide" # dominio di testo regolare
- if (Testing) @{
- # dove trovare il file in prova
- bindtextdomain("testdir")
- # joe si occupa del programma adminprog
- bindtextdomain("../joe/testdir", "adminprog")
- @}
- @dots{}
-@}
-@end example
-
-@end enumerate
-
-@xref{Esempio I18N}
-per un programma di esempio che illustra i passi da seguire per creare
-e usare traduzioni nei programmi @command{awk}.
-
-@node I18N per traduttore
-@section Traduzione dei programmi @command{awk}
-
-@cindex @code{.po}, file
-@cindex file @code{.po}
-@cindex @dfn{portable object} file (.po)
-@cindex file, @dfn{portable object} (.po)
-Dopo aver marcato le stringhe che si desidera tradurre in un programma,
-queste vanno estratte per creare il file iniziale @file{.pot}.
-Durante la traduzione, @`e spesso utile modificare l'ordine nel quale
-gli argomenti passati a @code{printf} vengono stampati.
-
-L'opzione da riga di comando @option{--gen-pot} di @command{gawk} serve a
-estrarre i messaggi, ed @`e esposta qui di seguito.
-Dopo di che, verr@`a illustrata la possibilit@`a di modificare l'ordine
-in cui l'istruzione @code{printf} stampa gli argomenti che le sono passati
-in fase di esecuzione.
-
-@menu
-* Estrazione di stringhe:: Estrarre stringhe marcate.
-* Ordinamento di printf:: Riordinare argomenti @code{printf}
-* Portabilit@`a nell'I18N:: Problemi di portabilit@`a a livello di @command{awk}.
-@end menu
-
-@node Estrazione di stringhe
-@subsection Estrarre stringhe marcate
-@cindex stringhe, estrazione di
-@cindex stringhe marcate, estrazione di
-@cindex @option{--gen-pot}, opzione
-@cindex opzione @option{--gen-pot}
-@cindex opzioni sulla riga di comando, estrazione stringhe
-@cindex riga di comando, opzioni, estrazione stringhe
-@cindex stringhe marcate, estrazione di (internazionalizzazione)
-@cindex marcate, estrazione di stringhe (internazionalizzazione)
-@cindex estrazione di stringhe marcate (internazionalizzazione)
-
-@cindex @option{--gen-pot}, opzione
-@cindex opzione @option{--gen-pot}
-Una volta che il programma @command{awk} funziona, e tutte le stringhe
-sono state marcate ed @`e stato impostato (e forse fissato) il dominio di
-testo, @`e ora di preparare le traduzioni.
-Per prima cosa, usando l'opzione di riga di comando @option{--gen-pot},
-si crea il file iniziale @file{.pot}:
-
-@example
-gawk --gen-pot -f guide.awk > guide.pot
-@end example
-
-@cindex @code{xgettext}, programma di utilit@`a
-@cindex programma di utilit@`a @code{xgettext}
-Quando viene chiamato specificando @option{--gen-pot}, @command{gawk} non
-esegue il programma. Il programma viene esaminato come al solito, e tutte
-le stringhe che sono state marcate per essere tradotte vengono scritte nello
-standard output, nel formato di un file Portable Object di GNU
-@command{gettext}.
-L'output comprende anche quelle stringhe costanti che appaiono come primo
-argomento della funzione @code{dcgettext()} o come primo e secondo
-argomento della funzione @code{dcngettext()}.@footnote{Il comando di utilit@`a
-@command{xgettext} che fa parte del pacchetto distribuito come
-@command{gettext} @`e in grado di gestire i file di tipo @file{.awk}.}
-Il file @file{.pot} cos@`{@dotless{i}} generato
-andrebbe distribuito insieme al programma @command{awk}; i traduttori
-potranno eventualmente utilizzarlo per preparare delle traduzioni, le quali
-potranno a loro volta essere distribuite.
-@xref{Esempio I18N}
-per una lista esauriente dei passi necessari per creare e testare
-traduzioni per il programma @command{guide}.
-
-@node Ordinamento di printf
-@subsection Riordinare argomenti di @code{printf}
-
-@cindex @code{printf}, istruzione, specificatori di posizione
-@cindex istruzione @code{printf}, specificatori posizionali
-@cindex posizionali, specificatori, istruzione @code{printf}
-@cindex specificatori posizionali, istruzione @code{printf}
-Le stringhe di formattazione per @code{printf} e @code{sprintf()}
-(@pxref{Printf})
-hanno un problema speciale con le traduzioni.
-Si consideri il seguente esempio:@footnote{Questo esempio @`e preso in
-prestito dal manuale del comando GNU @command{gettext}.}
-
-@example
-printf(_"String `%s' has %d characters\n",
- string, length(string)))
-@end example
-
-Una possibile traduzione in italiano di questo messaggio potrebbe essere:
-
-@example
-"%d @`e la lunghezza della stringa `%s'\n"
-@end example
-
-Il problema dovrebbe essere ovvio: l'ordine delle specifiche di
-formattazione @`e differente da quello originale!
-@code{gettext()}, che pure pu@`o restituire la stringa tradotta
-in fase di esecuzione, non @`e in grado di cambiare l'ordine degli argomenti
-nella chiamata a @code{printf}.
-
-Per risolvere questo problema, gli specificatori di formato di @code{printf}
-possono avere un elemento in pi@`u, facoltativo, detto @dfn{specificatore
-posizionale}. Per esempio:
-
-@example
-"%2$d @`e la lunghezza della stringa `%1$s'\n"
-@end example
-
-Qui, lo specificatore posizionale consiste in un numero intero, che indica
-quale argomento utilizzare, seguito da un carattere @samp{$}.
-I numeri partono da uno, e la stringa di formattazione vera e propria
-@emph{non} @`e inclusa. Quindi, nell'esempio seguente, @samp{stringa} @`e
-il primo argomento e @samp{length(stringa)} @`e il secondo:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{stringa = "Non v\47allarmate!"}
-> @kbd{printf "%2$d caratteri compongono \"%1$s\"\n",}
-> @kbd{stringa, length(stringa)}
-> @kbd{@}'}
-@print{} 16 caratteri compongono "Non v\47allarmate!"
-@end example
-
-Se presenti, gli specificatori posizionali precedono, nella specifica di
-formato, i flag, la larghezza del campo e/o la precisione.
-
-Gli specificatori posizionali possono essere usati anche se si specifica una
-larghezza dinamica dei campi, e della capacit@`a di precisione:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{printf("%*.*s\n", 10, 20, "hello")}
-> @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")}
-> @kbd{@}'}
-@print{} hello
-@print{} hello
-@end example
-
-@quotation NOTA
-Se si usa @samp{*} con uno specificatore posizionale, il carattere @samp{*}
-viene per primo, seguito dal numero che indica la posizione, a sua volta
-seguito dal @samp{$}.
-Ci@`o pu@`o parere poco intuitivo.
-@end quotation
-
-@cindex istruzione @code{printf}, specificatori posizionali, frammisti a formati standard
-@cindex @code{printf}, istruzione, specificatori posizionali, frammisti a formati standard
-@cindex specificatori posizionali, istruzione @code{printf}, frammisti a formati standard
-@cindex formato, specificatori di, frammisti a specificatori posizionali non standard
-@cindex specificatori di formato, frammisti a specificatori posizionali non standard
-@command{gawk} non consente di mischiare specificatori di formato standard
-con altri contenenti degli specificatori posizionali in una stessa stringa di
-formato:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "ciao" @}'}
-@error{} gawk: riga com.:1: fatale: `count$' va usato per tutti
-@error{} i formati o per nessuno
-@end example
-
-@quotation NOTA
-Ci sono alcuni casi patologici in cui @command{gawk} potrebbe non inviare
-alcun messaggio diagnostico, anche quando sarebbe necessario.
-In tali casi, l'output pu@`o non essere quello atteso.
-Rimane sempre una pessima idea quella di tentare di mischiare i formati,
-anche se @command{gawk} non riesce ad accorgersene.
-@end quotation
-
-Sebbene gli specificatori posizionali possano essere usati direttamente nei
-programmi @command{awk}, il motivo per cui sono stati introdotti @`e perch@'e
-siano d'aiuto nel produrre traduzioni corrette della stringa di
-formattazione in lingue differenti da quella nella quale il programma @`e stato
-originariamente scritto.
-
-@node Portabilit@`a nell'I18N
-@subsection Problemi di portabilit@`a a livello di @command{awk}
-
-@cindex portabilit@`a, internazionalizzazione e
-@cindex internazionalizzazione, localizzazione, portabilit@`a e
-Le funzionalit@`a di internazionalizzazione di @command{gawk} sono state
-appositamente implementate per avere il minimo impatto possibile sulla
-portabilit@`a, verso altre versioni di @command{awk}, dei programmi
-@command{awk} che ne fanno uso.
-Si consideri questo programma:
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide"
- if (Test_Guide) # da impostare tramite -v
- bindtextdomain("/test/guide/messages")
- print _"don't panic!"
-@}
-@end example
-
-@noindent
-Per il modo in cui @`e scritto, non funzioner@`a con altre versioni di
-@command{awk}.
-Tuttavia, @`e in realt@`a quasi portabile, e richiede modifiche minime:
-
-@itemize @value{BULLET}
-@cindex @code{TEXTDOMAIN}, variabile, portabilit@`a e
-@cindex variabile @code{TEXTDOMAIN}, portabilit@`a e
-@item
-Le assegnazioni di valori a @code{TEXTDOMAIN} non avranno effetto alcuno,
-perch@'e @code{TEXTDOMAIN} non @`e una variabile speciale in altre
-implementazioni di @command{awk}.
-
-@item
-Versioni Non-GNU di @command{awk} considerano le stringhe marcate
-come la concatenazione di una variabile di nome @code{_} con la stringa che
-viene subito dopo.@footnote{Questo @`e
-un buon materiale per una gara di ``Oscurit@`a @command{awk}''.}
-Tipicamente, la variabile @code{_} ha come valore la stringa nulla
-(@code{""}), il che produce come risultato la stringa
-originale.
-
-@item
-Definendo delle funzioni ``fittizie'' per sostituire @code{dcgettext()},
-@code{dcngettext()} e @code{bindtextdomain()}, il programma @command{awk}
-pu@`o essere reso eseguibile, ma
-tutti i messaggi verranno inviati nella lingua originale del programma.
-Per esempio:
-
-@cindex @code{bindtextdomain()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{bindtextdomain()} (@command{gawk}), portabilit@`a e
-@cindex @code{dcgettext()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{dcgettext()} (@command{gawk}), portabilit@`a e
-@cindex @code{dcngettext()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{dcngettext()} (@command{gawk}), portabilit@`a e
-@example
-@c file eg/lib/libintl.awk
-function bindtextdomain(dir, domain)
-@{
- return dir
-@}
-
-function dcgettext(string, domain, category)
-@{
- return string
-@}
-
-function dcngettext(string1, string2, number, domain, category)
-@{
- return (number == 1 ? string1 : string2)
-@}
-@c endfile
-@end example
-
-@item
-L'uso di specificazioni posizionali in @code{printf} o
-@code{sprintf()} @emph{non} @`e portabile.
-Per supportare @code{gettext()} nella programmazione in linguaggio C,
-molte versioni C di @code{sprintf()} supportano specificatori posizionali.
-Ma la cosa funziona solo se nella chiamata di funzione sono stati specificati
-argomenti a sufficienza. Molte
-versioni di @command{awk} passano i formati e gli argomenti di @code{printf},
-senza modificarli, alla funzione di libreria in linguaggio C @code{sprintf()},
-ma solo un formato e un argomento alla volta. Quel che succede se si usa una
-specificazione posizionale resta indeterminato.
-Tuttavia, poich@'e le specificazioni posizionali sono usate principalmente
-per le stringhe di formattazione @emph{tradotte}, e poich@'e le versioni
-non-GNU di @command{awk} non utilizzano mai le stringhe tradotte, ci@`o non
-dovrebbe, in pratica, causare problemi.
-@end itemize
-
-@node Esempio I18N
-@section Un semplice esempio di internazionalizzazione.
-
-Vediamo ora un esempio dettagliato di come internazionalizzare e localizzare
-un semplice programma @command{awk}, usando come nostro programma sorgente
-originale il file @file{guide.awk}:
-
-@example
-@c file eg/prog/guide.awk
-BEGIN @{
- TEXTDOMAIN = "guide"
- bindtextdomain(".") # per la fase di test
- print _"Don't Panic"
- print _"The Answer Is", 42
- print "Pardon me, Zaphod who?"
-@}
-@c endfile
-@end example
-
-@noindent
-Eseguire @samp{gawk --gen-pot} per creare il file @file{.pot}:
-
-@example
-$ @kbd{gawk --gen-pot -f guide.awk > guide.pot}
-@end example
-
-@noindent
-Questo produce:
-
-@example
-@c file eg/data/guide.po
-#: guide.awk:4
-msgid "Don't Panic"
-msgstr ""
-
-#: guide.awk:5
-msgid "The Answer Is"
-msgstr ""
-
-@c endfile
-@end example
-
-Questo modello di @dfn{portable object} va salvato e riutilizzato per ogni
-lingua in cui l'applicazione viene tradotta. La stringa @code{msgid} @`e
-seguita dalla stringa originale da tradurre, e la stringa @code{msgstr}
-conterr@`a la traduzione.
-
-@quotation NOTA
-Le stringhe non aventi come prefisso un trattino basso non sono inserite
-nel file @file{guide.pot}.
-@end quotation
-
-Successivamente, i messaggi devono essere tradotti.
-Questa @`e una traduzione in un ipotetico dialetto dell'inglese,
-chiamato ``Mellow'':@footnote{Forse sarebbe meglio chiamarlo
-``Hippy.'' Meglio non indagare oltre.}
-
-@example
-@group
-$ @kbd{cp guide.pot guide-mellow.po}
-@var{Aggiungere traduzioni al file} guide-mellow.po @dots{}
-@end group
-@end example
-
-@noindent
-Ecco le traduzioni:
-
-@example
-@c file eg/data/guide-mellow.po
-#: guide.awk:4
-msgid "Don't Panic"
-msgstr "Hey man, relax!"
-
-#: guide.awk:5
-msgid "The Answer Is"
-msgstr "Like, the scoop is"
-
-@c endfile
-@end example
-
-@cindex Linux
-@cindex GNU/Linux
-Il passo successivo @`e di creare la directory che contenga il file binario
-con le traduzioni dei messaggi (file .mo [message object]) e
-creare in quella directory il file @file{guide.mo}.
-Si presume che il file in questione debba essere usato nella localizzazione
-@code{en_US.UTF-8}, perch@'e si deve usare un nome di localizzazione che sia
-noto alle routine del comando C @command{gettext}.
-La disposizione delle directory qui utilizzata @`e standard per il comando
-GNU @command{gettext} sui sistemi GNU/Linux. Altre versioni di
-@command{gettext} possono usare una disposizione differente:
-
-@example
-$ @kbd{mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES}
-@end example
-
-@cindex @code{.po}, file, conversione in @code{.mo}
-@cindex file @code{.po}, conversione in @code{.mo}
-@cindex @code{.mo}, file, conversione da @code{.po}
-@cindex file @code{.mo}, conversione da @code{.po}
-@cindex @dfn{portable object} file (.po), conversione in @dfn{message object} file
-@cindex file, @dfn{portable object} (.po), conversione in @dfn{message object} file
-@cindex @dfn{message object} file (.mo), conversione da @dfn{portable object} file
-@cindex file, @dfn{message object} (.mo), conversione da @dfn{portable object} file
-@cindex @command{msgfmt}, programma di utilit@`a
-@cindex programma di utilit@`a @command{msgfmt}
-Il programma di utilit@`a @command{msgfmt} effettua la conversione dal file
-leggibile, in formato testo, @file{.po} nel file, in formato binario,
-@file{.mo}.
-Per default, @command{msgfmt} crea un file di nome @file{messages}.
-A questo file dev'essere assegnato un nome appropriato, e va messo nella
-directory predisposta (usando l'opzione @option{-o}) in modo che
-@command{gawk} sia in grado di trovarlo:
-
-@example
-$ @kbd{msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo}
-@end example
-
-Infine, eseguiamo il programma per provare se funziona:
-
-@example
-$ @kbd{gawk -f guide.awk}
-@print{} Hey man, relax!
-@print{} Like, the scoop is 42
-@print{} Pardon me, Zaphod who?
-@end example
-
-Se le tre funzioni che rimpiazzano @code{dcgettext()}, @code{dcngettext()},
-e @code{bindtextdomain()}
-(@pxref{Portabilit@`a nell'I18N})
-sono contenute in un file di nome @file{libintl.awk},
-@`e possibile eseguire @file{guide.awk} senza modificarlo, nel modo seguente:
-
-@example
-$ @kbd{gawk --posix -f guide.awk -f libintl.awk}
-@print{} Don't Panic
-@print{} The Answer Is 42
-@print{} Pardon me, Zaphod who?
-@end example
-
-@node Gawk internazionalizzato
-@section @command{gawk} stesso @`e internazionalizzato
-
-Il comando @command{gawk} stesso @`e stato internazionalizzato
-usando il pacchetto GNU @command{gettext}.
-(GNU @command{gettext} @`e descritto in
-maniera esauriente in
-@ifinfo
-@inforef{Top, , GNU @command{gettext} utilities, gettext, GNU @command{gettext} utilities}.)
-@end ifinfo
-@ifnotinfo
-@uref{http://www.gnu.org/software/gettext/manual/,
-@cite{GNU @command{gettext} utilities}}.)
-@end ifnotinfo
-Al momento in cui questo libro @`e stato scritto, la versione pi@`u recente di
-GNU @command{gettext} @`e
-@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.19.4.tar.gz,
-@value{PVERSION} 0.19.4}.
-
-Se esiste una traduzione dei messaggi di @command{gawk},
-@command{gawk} invia messaggi, avvertimenti, ed errori fatali
-utilizzando la lingua locale.
-
-@node Sommario I18N
-@section Sommario
-@itemize @value{BULLET}
-@item
-Internazionalizzazione significa scrivere un programma in modo che
-possa interagire in molte lingue senza che sia necessario cambiare il codice
-sorgente.
-Localizzazione significa fornire i dati necessari perch@'e un programma
-internazionalizzato possa interagire usando una determinata lingua.
-
-@item
-@command{gawk} usa il comando GNU @command{gettext} per consentire
-l'internazionalizzazione e la localizzazione di programmi @command{awk}.
-Un dominio di testo di un programma identifica il programma, e consente di
-raggruppare tutti i messaggi e gli altri dati del programma in un solo posto.
-
-@item
-Si marcano le stringhe in un programma da tradurre preponendo loro un
-trattino basso. Una volta fatto questo, queste stringhe sono estratte
-in un file @file{.pot}. Questo file @`e copiato, per ogni lingua, in un file
-@file{.po} e i file @file{.po} sono
-compilati in file @file{.gmo} che saranno usati in fase di
-esecuzione del programma.
-
-@item
-@`E possibile usare specificazioni posizionali con le istruzioni
-@code{sprintf()} e @code{printf} per modificare la posizione del valore
-degli argomenti nelle stringhe di formato e nell'output. Ci@`o @`e utile nella
-traduzione di stringhe di
-formattazione dei messaggi.
-
-@item
-Le funzionalit@`a di internazionalizzazione sono state progettate in modo
-da poter essere facilmente gestite in un programma @command{awk} standard.
-
-@item
-Anche il comando @command{gawk} @`e stato internazionalizzato e viene
-distribuito con traduzioni in molte lingue dei messaggi inviati in fase di
-esecuzione.
-
-@end itemize
-
-
-@node Debugger
-@chapter Effettuare il debug dei programmi @command{awk}
-@cindex debug dei programmi @command{awk}
-
-@c The original text for this chapter was contributed by Efraim Yawitz.
-@c FIXME: Add more indexing.
-
-Sarebbe bello se i programmi per il calcolatore funzionassero perfettamente la
-prima volta che vengono eseguiti, ma nella vita reale questo accade raramente,
-qualunque sia la complessit@`a dei programmi. Perci@`o la maggior parte dei
-linguaggi di programmazione hanno a disposizione degli strumenti che facilitano
-la ricerca di errori (@dfn{debugging}) nei programmi, e @command{awk} non fa
-eccezione.
-
-Il @dfn{debugger} di @command{gawk} @`e di proposito costruito sul modello del
-debugger da riga di comando
-@uref{http://www.gnu.org/software/gdb/, GNU Debugger (GDB)}.
-Se si ha familiarit@`a con GDB, sar@`a facile imparare come usare @command{gawk}
-per eseguire il debug dei propri programmi.
-
-@menu
-* Debugging:: Introduzione al debugger di @command{gawk}.
-* Esempio di sessione di debug:: Esempio di sessione di debug.
-* Lista dei comandi di debug:: Principali comandi di debug.
-* Supporto per Readline:: Supporto per Readline.
-* Limitazioni:: Limitazioni e piani per il futuro.
-* Sommario sul debug:: Sommario sul debug.
-@end menu
-
-@node Debugging
-@section Introduzione al debugger di @command{gawk}
-
-Questa @value{SECTION}, dopo un'introduzione sul debug in generale, inizia
-la trattazione del debug in @command{gawk}.
-
-@menu
-* Nozioni sul debug:: Generalit@`a sul debug.
-* Terminologia nel debug:: Ulteriori nozioni sul debug.
-* Debug di Awk:: Eseguire il debug di Awk.
-@end menu
-
-@node Nozioni sul debug
-@subsection Generalit@`a sul debug
-
-(Se si sono usati dei debugger in altri linguaggi, si pu@`o andare direttamente
-alla @ref{Debug di Awk}.)
-
-Naturalmente, un programma di debug non pu@`o correggere gli errori al posto del
-programmatore, perch@'e non pu@`o sapere quello che il programmatore o gli utenti
-considerano un ``bug'' e non una ``funzionalit@`a''. (Talvolta, anche noi umani
-abbiamo difficolt@`a nel determinarlo.)
-In quel caso, cosa ci si pu@`o aspettare da un tale strumento? La risposta
-dipende dal linguaggio su cui si effettua il debug, comunque in generale ci si
-pu@`o attendere almeno questo:
-
-@itemize @value{BULLET}
-@item
-La possibilit@`a di osservare l'esecuzione delle istruzioni di un programma una
-per una, dando al programmatore l'opportunit@`a di pensare a quel che accade a
-una scala temporale di secondi, minuti od ore, piuttosto che alla scala dei
-nanosecondi alla quale normalmente viene eseguito il codice.
-
-@item
-L'opportunit@`a, non solo di osservare passivamente le operazioni del progamma,
-ma di controllarlo e tentare diversi percorsi di esecuzione, senza dover
-modificare i file sorgenti.
-
-@item
-La possibilit@`a di vedere i valori o i dati nel programma in qualsiasi punto
-dell'esecuzione, e anche di cambiare i dati al volo, per vedere come questo
-influisca su ci@`o che accade dopo. (Questo include spesso la capacit@`a di
-esaminare le strutture interne dei dati oltre alle variabili che
-sono state effettivamente definite nel codice del programma.)
-
-@item
-La possibilit@`a di ottenere ulteriori informazioni sullo stato del programma
-o anche sulle sue strutture interne.
-@end itemize
-
-Tutti questi strumenti sono di grande aiuto e permettono di usare l'abilit@`a
-che si possiede e la comprensione che si ha degli obiettivi del programma
-per trovare dove si verificano i problemi (o, in alternativa, per
-comprendere meglio la logica di un programma funzionante, di cui si sia
-l'autore, o anche di un programma scritto da altri).
-
-@node Terminologia nel debug
-@subsection Concetti fondamentali sul debug
-
-Prima di entrare nei dettagli, dobbiamo introdurre diversi
-importanti concetti che valgono per tutti i debugger.
-La seguente lista definisce i termini usati nel resto di
-questo @value{CHAPTER}:
-
-@table @dfn
-@cindex @dfn{stack frame}
-@item Stack frame
-Durante la loro esecuzione i programmi normalmente chiamano delle funzioni.
-Una funzione pu@`o a sua volta chiamarne un'altra, o pu@`o richiamare se stessa
-(ricorsione). La
-catena di funzioni chiamate (il programma principale chiama A, che chiama B,
-che chiama C) pu@`o essere vista come una pila di funzioni in esecuzione: la
-funzione correntemente in esecuzione @`e quella in cima alla pila, e quando
-questa finisce (ritorna al chiamante),
-quella immediatamente sotto diventa la funzione
-attiva. Tale pila (@dfn{stack}) @`e chiamata @dfn{call stack} (pila delle chiamate).
-
-Per ciascuna funzione della pila delle chiamate (@dfn{call stack}), il sistema
-mantiene un'area di dati che contiene i parametri della funzione, le variabili
-locali e i valori di ritorno, e anche ogni altra informazione ``contabile''
-necessaria per gestire la pila delle chiamate. Quest'area di dati @`e chiamata
-@dfn{stack frame}.
-
-Anche @command{gawk} segue questo modello, e permette l'accesso alla pila
-delle chiamate e a ogni @dfn{stack frame}. @`E possibile esaminare la pila
-delle chiamate, e anche sapere da dove ciascuna funzione sulla pila @`e stata
-invocata. I comandi che stampano la pila delle chiamate stampano anche le
-informazioni su ogni @dfn{stack frame} (come vedremo pi@`u avanti in dettaglio).
-
-@item Punto d'interruzione
-@cindex breakpoint
-@cindex punto d'interruzione
-Durante le operazioni di debug, spesso si preferisce lasciare che il programma
-venga eseguito finch@'e non raggiunge un certo punto, e da quel punto in poi si
-continua l'esecuzione un'istruzione alla volta. Il modo per farlo @`e quello di
-impostare un @dfn{punto d'interruzione} all'interno del programma. Un punto
-d'interruzione @`e il punto dove l'esecuzione del programma dovrebbe
-interrompersi (fermarsi), in modo da assumere il controllo dell'esecuzione del
-programma. Si possono aggiungere e togliere quanti punti d'interruzione si
-vogliono.
-
-@item Punto d'osservazione
-@cindex @dfn{watchpoint}
-@cindex punto d'osservazione
-Un punto d'osservazione @`e simile a un punto d'interruzione. La differenza @`e
-che i punti d'interruzione sono orientati attorno al codice; fermano il
-programma quando viene raggiunto un certo punto nel codice. Un punto
-d'osservazione, invece, fa fermare il programma quando @`e stato
-cambiato il @emph{valore di un dato}. Questo @`e utile, poich@'e a volte succede
-che una variabile riceva un valore errato, ed @`e difficile rintracciare il punto
-dove ci@`o accade solo leggendo il codice sorgente.
-Usando un punto d'osservazione, si pu@`o fermare il programma in qualunque punto
-vi sia un'assegnazione di variabile, e di solito si individua il codice che
-genera l'errore abbastanza velocemente.
-@end table
-
-@node Debug di Awk
-@subsection Il debug di @command{awk}
-
-Il debug di un programma @command{awk} ha delle particolarit@`a proprie, che
-non sono presenti in programmi scritti in altri linguaggi.
-
-Prima di tutto, il fatto che i programmi @command{awk} ricevano generalmente
-l'input riga per riga da uno o pi@`u file e operino su tali righe usando regole
-specifiche, rende particolarmente agevole organizzare l'esame
-dell'esecuzione del programma facendo riferimento a tali regole.
-Come vedremo, ogni
-regola @command{awk} viene trattata quasi come una chiamata di funzione, col
-proprio specifico blocco di istruzioni.
-
-Inoltre, poich@'e @command{awk} @`e un linguaggio deliberatamente molto
-conciso, @`e facile perdere di vista tutto ci@`o che avviene ``dentro''
-ogni riga di codice @command{awk}. Il debugger d@`a l'opportunit@`a di
-guardare le singole istruzioni primitive la cui esecuzione @`e innescata
-dai comandi di alto livello di @command{awk}.
-
-@node Esempio di sessione di debug
-@section Esempio di sessione di debug di @command{gawk}
-@cindex esempio di sessione di debug
-@cindex debug, esempio di sessione
-
-Per illustrare l'uso di @command{gawk} come debugger, vediamo un esempio di
-sessione di debug. Come esempio verr@`a usata l'implementazione @command{awk}
-del comando POSIX @command{uniq} descritta in precedenza (@pxref{Programma
-uniq}).
-
-@menu
-* Invocazione del debugger:: Come far partire il debugger.
-* Trovare il bug:: Trovare il bug.
-@end menu
-
-@node Invocazione del debugger
-@subsection Come avviare il debugger
-@cindex avviare il debugger
-@cindex debugger, come avviarlo
-@cindex debugger, comandi del, si veda comando del debugger
-
-Per avviare il debugger in @command{gawk} si richiama il comando esattamente
-come al solito, specificando solo un'opzione aggiuntiva,
-@option{--debug}, o la corrispondente opzione breve @option{-D}.
-I file (o il file) che contengono
-il programma e ogni codice ulteriore sono immessi sulla riga di comando come
-argomenti a una o pi@`u opzioni @option{-f}. (@command{gawk} non @`e progettato per
-eseguire il debug di programmi scritti sulla riga di comando, ma solo per
-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}
-@end example
-
-@noindent
-dove entrambi i file @file{getopt.awk} e @file{uniq.awk} sono in @env{$AWKPATH}.
-(Gli utenti esperti di GDB o debugger simili dovrebbero tener presente che
-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.)
-L'opzione @option{-1} @`e un'opzione per @file{uniq.awk}.
-
-Invece di eseguire direttamente il programma sul @file{file_di_input}, come
-@command{gawk} farebbe normalmente, il debugger semplicemente carica
-i file sorgenti del programma, li compila internamente, e poi mostra
-la riga d'invito:
-
-@example
-gawk>
-@end example
-
-@noindent
-da dove si possono impartire i comandi al debugger. Sin qui non @`e
-stato ancora eseguito nessun codice.
-
-@node Trovare il bug
-@subsection Trovare il bug
-
-Poniamo di avere un problema usando (una versione difettosa di)
-@file{uniq.awk} nella modalit@`a ``salta-campi'', perch@'e sembra che non
-catturi le righe che dovrebbero essere identiche dopo aver saltato il primo
-campo, come:
-
-@example
-awk, ecco un programma meraviglioso!
-gawk, ecco un programma meraviglioso!
-@end example
-
-Questo potrebbe accadere se noi pensassimo (come in C) che i campi in un record
-siano numerati prendendo come base lo zero, per cui, invece di scrivere:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file+1, n)
-campi_corrente = join(vettore_corrente, contatore_file+1, m)
-@end example
-
-@noindent
-abbiamo scritto:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file, n)
-campi_corrente = join(vettore_corrente, contatore_file, m)
-@end example
-
-La prima cosa da fare quando si tenta di indagare su un problema come questo @`e
-quella di mettere un punto d'interruzione (@dfn{breakpoint}) nel programma, in modo
-da poterlo vedere al lavoro e catturare quello che non va. Una posizione
-ragionevole per un punto d'interruzione in @file{uniq.awk} @`e all'inizio della
-funzione @code{se_sono_uguali()}, che confronta la riga corrente con la precedente.
-Per impostare il punto d'interruzione, usare il comando @code{b} (@dfn{breakpoint}):
-
-@example
-gawk> @kbd{b se_sono_uguali}
-@print{} Breakpoint 1 impostato al file `uniq.awk', riga 63
-@end example
-
-Il debugger mostra il file e il numero di riga dove si trova il punto
-d'interruzione. Ora bisogna immettere @samp{r} o @samp{run} e il programma
-viene eseguito fino al primo punto d'interruzione:
-
-@example
-gawk> @kbd{r}
-@print{} Partenza del programma:
-@print{} Mi fermo in Rule ...
-@print{} Breakpoint 1, se_sono_uguali(n, m, campi_ultima, campi_corrente,
-@print{} vettore_ultima, vettore_corrente)
-@print{} a `uniq.awk':63
-@print{} 63 if (contatore_file == 0 && conta_caratteri == 0)
-gawk>
-@end example
-
-Ora possiamo osservare cosa accade all'interno del nostro programma.
-Prima di tutto, vediamo come siamo arrivati a questo punto. Sulla riga di
-comando battiamo @samp{bt} (che sta per ``backtrace''), e il debugger risponde
-con un listato degli @dfn{stack frame} correnti:
-
-@example
-gawk> @kbd{bt}
-@print{} #0 se_sono_uguali(n, m, campi_ultima, campi_corrente,
-@print{} vettore_ultima, vettore_corrente)
-@print{} a `uniq.awk':63
-@print{} #1 in main() a `uniq.awk':88
-@end example
-
-Questo ci dice che la funzione @code{se_sono_uguali()} @`e stata chiamata
-dal programma principale alla riga 88 del file @file{uniq.awk}. (Questo non
-sorprende, perch@'e @`e questa l'unica chiamata a @code{se_sono_uguali()} nel
-programma, per@`o in programmi
-pi@`u complessi, sapere chi ha chiamato una funzione e con quali parametri pu@`o
-essere la chiave per trovare l'origine del problema.)
-
-Ora che siamo in @code{se_sono_uguali()}, possiamo iniziare a guardare i valori di
-alcune variabili. Immaginiamo di battere @samp{p n}
-(@code{p} sta per @dfn{print} [stampa]). Ci aspetteremo di vedere il valore di
-@code{n}, un parametro di @code{se_sono_uguali()}. In realt@`a, il debugger
-ci d@`a:
-
-@example
-gawk> @kbd{p n}
-@print{} n = untyped variable
-@end example
-
-@noindent
-In questo caso, @code{n} @`e una variabile locale non inizializzata, perch@'e la
-funzione @`e stata chiamata senza argomenti (@pxref{Chiamate di funzione}).
-
-Una variabile pi@`u utile da visualizzare potrebbe essere la seguente:
-
-@example
-gawk> @kbd{p $0}
-@print{} $0 = "gawk, ecco un programma meraviglioso!"
-@end example
-
-@noindent
-All'inizio questo potrebbe lasciare un tantino perplessi, perch@'e @`e la seconda
-riga dell'input del test. Vediamo @code{NR}:
-
-@example
-gawk> @kbd{p NR}
-@print{} NR = 2
-@end example
-
-@noindent
-Come si pu@`o vedere, @code{se_sono_uguali()} @`e stata chiamata solo per la seconda
-riga del file. Naturalmente, ci@`o accade perch@'e il nostro programma contiene
-una regola per @samp{NR == 1}:
-
-@example
-NR == 1 @{
- ultima = $0
- next
-@}
-@end example
-
-Bene, controlliamo che questa funzioni correttamente:
-
-@example
-gawk> @kbd{p ultima}
-@print{} ultima = "awk, ecco un programma meraviglioso!"
-@end example
-
-Tutto ci@`o che @`e stato fatto fin qui ha verificato che il programma funziona
-come previsto fino alla chiamata a @code{se_sono_uguali()} compresa; quindi
-il problema dev'essere all'interno di questa funzione. Per indagare
-ulteriormente, iniziamo a ``scorrere una ad una'' le righe di
-@code{se_sono_uguali()}. Cominciamo col battere @samp{n} (per ``next''
-[successivo]):
-
-@example
-gawk> @kbd{n}
-@print{} 66 if (contatore_file > 0) @{
-@end example
-
-Questo ci dice che @command{gawk} ora @`e pronto per eseguire la riga 66, che
-decide se assegnare alle righe il trattamento speciale ``salta-campi''
-indicato dall'opzione sulla riga di comando @option{-1}. (Si noti che abbiamo
-saltato da dov'eravamo prima, alla riga 63, a qui, perch@'e la condizione nella
-riga 63, @samp{if (contatore_file == 0 && conta_caratteri == 0)}, era falsa.)
-
-Continuando a scorrere le righe, ora raggiungiamo la divisione del record
-corrente e dell'ultimo:
-
-@example
-gawk> @kbd{n}
-@print{} 67 n = split(ultima, vettore_ultima)
-gawk> @kbd{n}
-@print{} 68 m = split($0, vettore_corrente)
-@end example
-
-A questo punto, potremmo stare a vedere in quante parti il nostro record
-@`e stato suddiviso, quindi proviamo a osservare:
-
-@example
-gawk> @kbd{p n m vettore_ultima vettore_corrente}
-@print{} n = 5
-@print{} m = untyped variable
-@print{} vettore_ultima = array, 5 elements
-@print{} vettore_corrente = untyped variable
-@end example
-
-@noindent
-(Il comando @code{p} pu@`o accettare pi@`u argomenti, analogamente
-all'istruzione di @command{awk} @code{print}.)
-
-Questo ci lascia piuttosto perplessi. Tutto ci@`o che abbiamo trovato @`e che ci
-sono cinque elementi in @code{vettore_ultima}; @code{m} e @code{vettore_corrente} non hanno valori
-perch@'e siamo alla riga 68 che non @`e ancora stata eseguita. Questa
-informazione @`e abbastanza utile (ora sappiamo che nessuna delle parole @`e stata
-lasciata fuori accidentalmente), ma sarebbe desiderabile vedere i valori
-del vettore.
-
-Una prima possibilit@`a @`e quella di usare degli indici:
-
-@example
-gawk> @kbd{p vettore_ultima[0]}
-@print{} "0" non presente nel vettore `vettore_ultima'
-@end example
-
-@noindent
-Oops!
-
-@example
-gawk> @kbd{p vettore_ultima[1]}
-@print{} vettore_ultima["1"] = "awk,"
-@end example
-
-Questo metodo sarebbe piuttosto lento per un vettore con 100 elementi, per cui
-@command{gawk} fornisce una scorciatoia (che fa venire in mente un altro
-linguaggio che non nominiamo):
-
-@example
-gawk> @kbd{p @@vettore_ultima}
-@print{} vettore_ultima["1"] = "awk,"
-@print{} vettore_ultima["2"] = "ecco"
-@print{} vettore_ultima["3"] = "un"
-@print{} vettore_ultima["4"] = "programma"
-@print{} vettore_ultima["5"] = "meraviglioso!"
-@end example
-
-Finora, sembra che tutto vada bene. Facciamo un altro passo,
-o anche due:
-
-@example
-gawk> @kbd{n}
-@print{} 69 campi_ultima = join(vettore_ultima, contatore_file, n)
-gawk> @kbd{n}
-@print{} 70 campi_corrente = join(vettore_corrente, contatore_file, m)
-@end example
-
-Bene, eccoci arrivati al nostro errore (ci spiace di aver rovinato la
-sorpresa).
-Quel che avevamo in mente era di unire i campi a partire dal secondo per
-creare il record virtuale da confrontare, e se il primo campo aveva il numero
-zero, questo avrebbe funzionato. Vediamo quel che abbiamo finora:
-
-@example
-gawk> @kbd{p campi_ultima campi_corrente}
-@print{} campi_ultima = "awk, ecco un programma meraviglioso!"
-@print{} campi_corrente = "gawk, ecco un programma meraviglioso!"
-@end example
-
-Ehi! queste frasi suonano piuttosto familiari! Sono esattamente i nostri
-record di input originali, inalterati. Pensandoci un po' (il cervello umano @`e
-ancora il miglior strumento di debug), ci si rende conto che eravamo fuori di
-uno!
-
-Usciamo dal debugger:
-
-@example
-gawk> @kbd{q}
-@print{} Il programma @`e in esecuzione. Esco comunque (y/n)? @kbd{y}
-@end example
-
-@noindent
-Quindi modifichiamo con un editore di testo:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file+1, n)
-campi_corrente = join(vettore_corrente, contatore_file+1, m)
-@end example
-
-@noindent
-e il problema @`e risolto!
-
-@node Lista dei comandi di debug
-@section I principali comandi di debug
-
-L'insieme dei comandi del debugger di @command{gawk} pu@`o essere diviso nelle
-seguenti categorie:
-
-@itemize @value{BULLET}
-
-@item
-Controllo di punti d'interruzione
-
-@item
-Controllo di esecuzione
-
-@item
-Vedere e modificare dati
-
-@item
-Lavorare con le pile
-
-@item
-Ottenere informazioni
-
-@item
-Comandi vari
-@end itemize
-
-Ciascuna di esse @`e trattata nelle sottosezioni che seguono.
-Nelle descrizioni seguenti, i comandi che possono essere abbreviati
-mostrano l'abbreviazione su una seconda riga di descrizione.
-Un nome di comando del debugger pu@`o essere anche troncato se la parte gi@`a scritta
-non @`e ambigua. Il debugger ha la capacit@`a predefinita di ripetere
-automaticamente il precedente comando semplicemente battendo @kbd{Invio}.
-Questo vale per i comandi @code{list}, @code{next}, @code{nexti},
-@code{step}, @code{stepi} e @code{continue} quando sono eseguiti senza
-argomenti.
-
-@menu
-* Controllo dei breakpoint:: Controllo dei punti d'interruzione.
-* Controllo esecuzione debugger:: Controllo di esecuzione.
-* Vedere e modificare dati:: Vedere e modificare dati.
-* Stack di esecuzione:: Lavorare con le pile.
-* Informazioni sul debugger:: Ottenere informazioni sullo stato del
- programma e del debugger.
-* Comandi vari del debugger:: Comandi vari del debugger.
-@end menu
-
-@node Controllo dei breakpoint
-@subsection Controllo dei punti d'interruzione
-
-Come abbiamo gi@`a visto, la prima cosa che si dovrebbe fare in una sessione di
-debug @`e quella di definire dei punti d'interruzione, poich@'e altrimenti il
-programma verr@`a eseguito come se non fosse sotto il debugger. I comandi per
-controllare i punti d'interruzione sono:
-
-@table @asis
-@cindex comando del debugger, @code{b} (alias per @code{break})
-@cindex comando del debugger, @code{break}
-@cindex @code{break}, comando del debugger
-@cindex @code{b}, comando del debugger (alias per @code{break})
-@cindex impostare un punto d'interruzione
-@cindex breakpoint, impostare
-@cindex punto d'interruzione (breakpoint), impostare
-@item @code{break} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
-@itemx @code{b} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
-Senza argomenti, imposta un punto d'interruzione alla prossima istruzione
-da eseguire nello @dfn{stack frame} selezionato.
-Gli argomenti possono essere uno dei seguenti:
-
-@c @asis for docbook
-@c nested table
-@table @asis
-@item @var{n}
-Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
-corrente.
-
-@item @var{nome-file}@code{:}@var{n}
-Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
-@var{nome-file}.
-
-@item @var{funzione}
-Imposta un punto d'interruzione all'ingresso (la prima istruzione eseguibile)
-della funzione @var{funzione}.
-@end table
-
-A ogni punto d'interruzione @`e assegnato un numero che pu@`o essere usato per
-cancellarlo dalla lista dei punti d'interruzione usando il comando
-@code{delete}.
-
-Specificando un punto d'interruzione, si pu@`o fornire anche una condizione.
-Questa @`e
-un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger
-valuta ogni volta che viene raggiunto quel punto d'interruzione. Se la
-condizione @`e vera, il debugger ferma l'esecuzione e rimane in attesa di un
-comando. Altrimenti, continua l'esecuzione del programma.
-
-@cindex comando del debugger, @code{clear}
-@cindex @code{clear}, comando del debugger
-@cindex cancellare punto d'interruzione da una determinata posizione
-@cindex punto d'interruzione in una determinata posizione, come cancellare
-@cindex breakpoint, come cancellare
-@item @code{clear} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Senza argomenti, cancella ogni eventuale punto d'interruzione all'istruzione
-successiva
-da eseguirsi nello @dfn{stack frame} selezionato. Se il programma si ferma in
-un punto d'interruzione, quel punto d'interruzione viene cancellato in modo
-che il programma non si fermi pi@`u in quel punto.
-Gli argomenti possono essere uno tra i seguenti:
-
-@c nested table
-@table @asis
-@item @var{n}
-Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
-file sorgente corrente.
-
-@item @var{nome-file}@code{:}@var{n}
-Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
-file sorgente @var{nome-file}.
-
-@item @var{funzione}
-Cancella il punto (o i punti) d'interruzione impostato/i all'ingresso della
-funzione @var{funzione}.
-@end table
-
-@cindex comando del debugger, @code{condition}
-@cindex @code{condition}, comando del debugger
-@cindex condizione dei punti d'interruzione
-@item @code{condition} @var{n} @code{"@var{espressione}"}
-Aggiunge una condizione al punto d'interruzione o al punto d'osservazione
-esistente @var{n}. La condizione @`e un'espressione @command{awk}
-@emph{racchiusa tra doppi apici} che il debugger valuta ogni volta che viene
-raggiunto il punto d'interruzione o il punto d'osservazione. Se la condizione @`e
-vera, il debugger ferma l'esecuzione e attende l'immissione di un comando.
-Altrimenti, il debugger continua l'esecuzione del programma. Se l'espressione
-della condizione non viene specificata, tutte le condizioni esistenti vengono
-rimosse (cio@`e, il punto d'interruzione o di osservazione viene considerato
-incondizionato).
-
-@cindex comando del debugger, @code{d} (alias per @code{delete})
-@cindex comando del debugger, @code{delete}
-@cindex @code{delete}, comando del debugger
-@cindex @code{d}, comando del debugger (alias per @code{delete})
-@cindex cancellare punto d'interruzione per numero
-@cindex punto d'interruzione, cancellare per numero
-@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-Cancella i punti d'interruzione specificati o un intervallo di punti
-d'interruzione. Se non vengono forniti argomenti, cancella tutti i
-punti d'interruzione esistenti.
-
-@cindex comando del debugger, @code{disable}
-@cindex @code{disable}, comando del debugger
-@cindex disabilitare punto d'interruzione
-@cindex punto d'interruzione, come disabilitare o abilitare
-@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}]
-Disabilita punti d'interruzione specificati o un intervallo di essi. Senza
-argomenti, disabilita tutti i punti d'interruzione.
-
-@cindex comando del debugger, @code{e} (alias per @code{enable})
-@cindex comando del debugger, @code{enable}
-@cindex @code{enable}, comando del debugger
-@cindex @code{e}, comando del debugger (alias per @code{enable})
-@cindex abilitare un punto d'interruzione
-@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-Abilita specifici punti d'interruzione o un intervallo di essi. Senza
-argomenti, abilita tutti i punti d'interruzione.
-Opzionalmente, si pu@`o specificare come abilitare i punti d'interruzione:
-
-@c nested table
-@table @code
-@item del
-Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
-programma si ferma in quel punto.
-
-@item once
-Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
-programma si ferma in quel punto.
-@end table
-
-@cindex comando del debugger, @code{ignore}
-@cindex @code{ignore}, comando del debugger
-@cindex ignorare un punto d'interruzione
-@item @code{ignore} @var{n} @var{contatore}
-Ignora il punto d'interruzione numero @var{n} le successive
-@var{contatore} volte in cui viene raggiunto.
-
-@cindex comando del debugger, @code{t} (alias per @code{tbreak})
-@cindex comando del debugger, @code{tbreak}
-@cindex @code{tbreak}, comando del debugger
-@cindex @code{t}, comando del debugger (alias per @code{tbreak})
-@cindex punto d'interruzione temporaneo
-@cindex temporaneo, punto d'interruzione
-@item @code{tbreak} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-@itemx @code{t} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Imposta un punto d'interruzione temporaneo (abilitato solo per la prima volta
-che viene raggiunto). Gli argomenti sono gli stessi di @code{break}.
-@end table
-
-@node Controllo esecuzione debugger
-@subsection Controllo di esecuzione
-
-Dopo che i punti d'interruzione sono pronti, si pu@`o iniziare l'esecuzione del
-programma, osservando il suo comportamento. Ci sono pi@`u comandi per
-controllare l'esecuzione del programma di quelli visti nei precedenti esempi:
-
-@table @asis
-@cindex comando del debugger, @code{commands}
-@cindex @code{commands}, comando del debugger
-@cindex comando del debugger, @code{silent}
-@cindex @code{silent}, comando del debugger
-@cindex comando del debugger, @code{end}
-@cindex @code{end}, comando del debugger
-@cindex punto d'interruzione, comandi
-@cindex comandi da eseguire al punto d'interruzione
-@item @code{commands} [@var{n}]
-@itemx @code{silent}
-@itemx @dots{}
-@itemx @code{end}
-Imposta una lista di comandi da eseguire subito dopo l'arresto del programma in
-un punto d'interruzione o di osservazione. @var{n} @`e il numero del punto
-d'interruzione o di osservazione. Se non si specifica un numero, viene usato
-l'ultimo numero che @`e stato specificato. I comandi veri e propri seguono,
-a cominciare dalla riga successiva, e hanno termine col comando @code{end}.
-Se il comando @code{silent} @`e nella lista, i consueti messaggi sull'arresto del
-programma a un punto d'interruzione e la riga sorgente non vengono stampati.
-Qualsiasi comando nella lista che riprende l'esecuzione (p.es.,
-@code{continue}) pone fine alla lista (un @code{end} implicito), e i comandi
-successivi vengono ignorati.
-Per esempio:
-
-@example
-gawk> @kbd{commands}
-> @kbd{silent}
-> @kbd{printf "Un punto d'interruzione silenzioso; i = %d\n", i}
-> @kbd{info locals}
-> @kbd{set i = 10}
-> @kbd{continue}
-> @kbd{end}
-gawk>
-@end example
-
-@cindex comando del debugger, @code{c} (alias per @code{continue})
-@cindex comando del debugger, @code{continue}
-@cindex @code{continue}, comando del debugger
-@item @code{continue} [@var{contatore}]
-@itemx @code{c} [@var{contatore}]
-Riprende l'esecuzione del programma. Se si riparte da un punto d'interruzione
-e viene specificato @var{contatore}, il punto d'interruzione in quella
-posizione viene ignorato per le prossime @var{contatore} volte prima di
-fermarsi nuovamente.
-
-@cindex comando del debugger, @code{finish}
-@cindex @code{finish}, comando del debugger
-@item @code{finish}
-Esegue fino a quando lo stack frame selezionato completa l'esecuzione.
-Stampa il valore restituito.
-
-@cindex comando del debugger, @code{n} (alias per @code{next})
-@cindex comando del debugger, @code{next}
-@cindex @code{next}, comando del debugger
-@cindex @code{n}, comando del debugger (alias per @code{next})
-@cindex esecuzione di un solo passo, nel debugger
-@item @code{next} [@var{contatore}]
-@itemx @code{n} [@var{contatore}]
-Continua l'esecuzione alla successiva riga sorgente, saltando le chiamate di
-funzione. L'argomento @var{contatore} controlla il numero di ripetizioni
-dell'azione, come in @code{step}.
-
-@cindex comando del debugger, @code{ni} (alias per @code{nexti})
-@cindex comando del debugger, @code{nexti}
-@cindex @code{nexti}, comando del debugger
-@cindex @code{ni}, comando del debugger (alias for @code{nexti})
-@item @code{nexti} [@var{contatore}]
-@itemx @code{ni} [@var{contatore}]
-Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
-
-@cindex comando del debugger, @code{return}
-@cindex @code{return}, comando del debugger
-@item @code{return} [@var{valore}]
-Cancella l'esecuzione di una chiamata di funzione. Se @var{valore} (una
-stringa o un numero) viene specificato, @`e usato come valore di ritorno della
-funzione. Se usato in un frame diverso da quello pi@`u interno (la funzione
-correntemente in esecuzione; cio@`e, il frame numero 0), ignora tutti i frame
-pi@`u interni di quello selezionato, e il chiamante del frame selezionato
-diventa il frame pi@`u interno.
-
-@cindex comando del debugger, @code{r} (alias per @code{run})
-@cindex comando del debugger, @code{run}
-@cindex @code{run}, comando del debugger
-@cindex @code{r}, comando del debugger (alias per @code{run})
-@item @code{run}
-@itemx @code{r}
-Avvia/riavvia l'esecuzione del programma. Quando il programma viene riavviato,
-il debugger mantiene i punti d'interruzione e di osservazione, la cronologia
-dei comandi, la visualizzazione automatica di variabili, e le opzioni del
-debugger.
-
-@cindex comando del debugger, @code{s} (alias per @code{step})
-@cindex comando del debugger, @code{step}
-@cindex @code{step}, comando del debugger
-@cindex @code{s}, comando del debugger (alias per @code{step})
-@item @code{step} [@var{contatore}]
-@itemx @code{s} [@var{contatore}]
-Continua l'esecuzione finch@'e il controllo non raggiunge una diversa riga del
-sorgente nello @dfn{stack frame} corrente, eseguendo ogni funzione chiamata
-all'interno della riga. Se viene fornito l'argomento @var{contatore},
-esegue il numero di istruzioni specificate prima di fermarsi, a meno che non
-s'imbatta in un punto d'interruzione o di osservazione.
-
-@cindex comando del debugger, @code{si} (alias per @code{stepi})
-@cindex comando del debugger, @code{stepi}
-@cindex @code{stepi}, comando del debugger
-@cindex @code{si}, comando del debugger (alias per @code{stepi})
-@item @code{stepi} [@var{contatore}]
-@itemx @code{si} [@var{contatore}]
-Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
-(Per una spiegazione su cosa s'intende per ``istruzione'' in @command{gawk},
-si veda l'output mostrato sotto @code{dump} nella
-@ref{Comandi vari del debugger}.)
-
-@cindex comando del debugger, @code{u} (alias per @code{until})
-@cindex comando del debugger, @code{until}
-@cindex @code{until}, comando del debugger
-@cindex @code{u}, comando del debugger (alias per @code{until})
-@item @code{until} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-@itemx @code{u} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Senza argomenti, prosegue l'esecuzione finch@'e non viene raggiunta una riga
-dopo la riga corrente nello @dfn{stack frame} corrente.
-Se viene specificato un argomento,
-prosegue l'esecuzione finch@'e non viene raggiunto il punto specificato, o
-lo @dfn{stack frame} corrente non termina l'esecuzione.
-@end table
-
-@node Vedere e modificare dati
-@subsection Vedere e modificare dati
-
-I comandi per vedere e modificare variabili all'interno di @command{gawk} sono:
-
-@table @asis
-@cindex comando del debugger, @code{display}
-@cindex @code{display}, comando del debugger
-@item @code{display} [@var{var} | @code{$}@var{n}]
-Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista di
-visualizzazione. Il valore della variabile o del campo @`e visualizzato ogni
-volta che il programma s'interrompe.
-Ogni variabile aggiunta alla lista @`e identificata da un numero univoco:
-
-@example
-gawk> @kbd{display x}
-@print{} 10: x = 1
-@end example
-
-@noindent
-La riga qui sopra mostra il numero di elemento assegnato, il nome della
-variabile e il suo
-valore corrente. Se la variabile di display fa riferimento a un parametro di
-funzione, @`e cancellata silenziosamente dalla lista non appena l'esecuzione
-raggiunge un contesto dove la variabile con quel nome non esiste pi@`u.
-Senza argomenti, @code{display} mostra i valori correnti degli elementi della
-lista.
-
-@cindex comando del debugger, @code{eval}
-@cindex @code{eval}, comando del debugger
-@cindex valutare espressioni, nel debugger
-@item @code{eval "@var{istruzioni awk}"}
-Valuta @var{istruzioni awk} nel contesto del programma in esecuzione.
-Si pu@`o fare qualsiasi cosa che un programma @command{awk} farebbe: assegnare
-valori a variabili, chiamare funzioni, e cos@`{@dotless{i}} via.
-
-@item @code{eval} @var{param}, @dots{}
-@itemx @var{istruzioni awk}
-@itemx @code{end}
-Questa forma di @code{eval} @`e simile alla precedente, solo che permette di
-definire
-``variabili locali'' che esistono nel contesto delle @var{istruzioni awk},
-invece di usare variabili o parametri di funzione gi@`a definiti nel programma.
-
-@cindex comando del debugger, @code{p} (alias per @code{print})
-@cindex comando del debugger, @code{print}
-@cindex @code{print}, comando del debugger
-@cindex @code{p}, comando del debugger (alias per @code{print})
-@cindex stampare variabili, nel debugger
-@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}]
-@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}]
-Stampa i valori di una o pi@`u variabili o campi di @command{gawk}.
-I campi devono essere indicizzati usando delle costanti:
-
-@example
-gawk> @kbd{print $3}
-@end example
-
-@noindent
-Questo stampa il terzo campo del record di input (se il campo specificato non
-esiste, stampa il @samp{campo nullo}). Una variabile pu@`o essere un elemento di
-un vettore, avente come indice una
-stringa di valore costante. Per stampare
-il contenuto di un vettore, si deve anteporre il simbolo @samp{@@} al nome del
-vettore:
-
-@example
-gawk> @kbd{print @@a}
-@end example
-
-@noindent
-L'esempio stampa gli indici e i corrispondenti valori di tutti gli elementi
-del vettore @code{a}.
-
-@cindex comando del debugger, @code{printf}
-@cindex @code{printf}, comando del debugger
-@item @code{printf} @var{formato} [@code{,} @var{arg} @dots{}]
-Stampa un testo formattato. Il @var{formato} pu@`o includere sequenze di
-protezione, come @samp{\n}
-(@pxref{Sequenze di protezione}).
-Non viene stampato nessun ritorno a capo che non sia stato specificato
-esplicitamente.
-
-@cindex comando del debugger, @code{set}
-@cindex @code{set}, comando del debugger
-@cindex assegnare valori a variabili, nel debugger
-@item @code{set} @var{var}@code{=}@var{valore}
-Assegna un valore costante (numero o stringa) a una variabile o a un campo di
-@command{awk}.
-I valori di stringa devono essere racchiusi tra doppi apici
-(@code{"}@dots{}@code{"}).
-
-Si possono impostare anche delle variabili speciali di @command{awk}, come
-@code{FS}, @code{NF}, @code{NR}, e cos@`{@dotless{i}} via.
-
-@cindex comando del debugger, @code{w} (alias per @code{watch})
-@cindex comando del debugger, @code{watch}
-@cindex @code{watch}, comando del debugger
-@cindex @code{w}, comando del debugger (alias per @code{watch})
-@cindex impostare un punto d'osservazione
-@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
-@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
-Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista dei
-punti d'osservazione. Il debugger quindi interrompe il programma ogni volta
-che il valore della variabile o del campo cambia. A ogni elemento osservato
-viene assegnato un numero che pu@`o essere usato per cancellarlo dalla lista
-usando il comando @code{unwatch} [non-osservare pi@`u].
-
-Definendo un punto d'osservazione, si pu@`o anche porre una condizione, che @`e
-un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger valuta
-ogni volta che viene raggiunto il punto d'osservazione. Se la condizione @`e
-vera, il debugger interrompe l'esecuzione e rimane in attesa di un comando.
-Altrimenti, @command{gawk} prosegue nell'esecuzione del programma.
-
-@cindex comando del debugger, @code{undisplay}
-@cindex @code{undisplay}, comando del debugger
-@cindex interruzione visualizzazioni automatiche, nel debugger
-@item @code{undisplay} [@var{n}]
-Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
-argomenti) dalla lista delle visualizzazioni automatiche.
-
-@cindex comando del debugger, @code{unwatch}
-@cindex @code{unwatch}, comando del debugger
-@cindex cancellare punto d'osservazione
-@item @code{unwatch} [@var{n}]
-Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
-argomenti) dalla lista dei punti d'osservazione.
-
-@end table
-
-@node Stack di esecuzione
-@subsection Lavorare con lo stack
-
-Ogni volta che si esegue un programma che contiene chiamate di funzione,
-@command{gawk} mantiene una pila contenente la lista delle chiamate di funzione
-che hanno portato al punto in cui il programma si trova in ogni momento. @`E
-possibile vedere a che punto si trova il programma, e anche muoversi
-all'interno della pila per vedere qual era lo stato delle cose nelle funzioni
-che hanno chiamato quella in cui ci si trova. I comandi per far questo sono:
-
-@table @asis
-@cindex comando del debugger, @code{bt} (alias per @code{backtrace})
-@cindex comando del debugger, @code{backtrace}
-@cindex comando del debugger, @code{where} (alias per @code{backtrace})
-@cindex @code{backtrace}, comando del debugger
-@cindex @code{bt}, comando del debugger (alias per @code{backtrace})
-@cindex @code{where}, comando del debugger
-@cindex @code{where}, comando del debugger (alias per @code{backtrace})
-@cindex chiamate, @dfn{stack} (pila) delle, mostrare nel debugger
-@cindex @dfn{stack} (pila) delle chiamate, mostrare nel debugger
-@cindex pila (@dfn{stack}) delle chiamate, mostrare nel debugger
-@cindex tracciatura a ritroso, mostrare nel debugger
-@item @code{backtrace} [@var{contatore}]
-@itemx @code{bt} [@var{contatore}]
-@itemx @code{where} [@var{contatore}]
-Stampa a ritroso una traccia di tutte le chiamate di funzione (stack frame), o
-i dei @var{contatore} frame pi@`u interni se @var{contatore} > 0. Stampa i
-@var{contatore} frame pi@`u esterni se @var{contatore} < 0. La tracciatura a
-ritroso mostra il nome e gli argomenti di ciascuna funzione, il sorgente
-@value{FN}, e il numero di riga. L'alias @code{where} per @code{backtrace}
-viene mantenuto per i vecchi utenti di GDB che potrebbero essere abituati a
-quel comando.
-
-@cindex comando del debugger, @code{down}
-@cindex @code{down}, comando del debugger
-@item @code{down} [@var{contatore}]
-Sposta @var{contatore} (default 1) frame sotto la pila verso il frame pi@`u interno.
-Poi seleziona e stampa il frame.
-
-@cindex comando del debugger, @code{f} (alias per @code{frame})
-@cindex comando del debugger, @code{frame}
-@cindex @code{frame}, comando del debugger
-@cindex @code{f}, comando del debugger (alias per @code{frame})
-@item @code{frame} [@var{n}]
-@itemx @code{f} [@var{n}]
-Seleziona e stampa lo @dfn{stack frame} @var{n}. Il frame 0 @`e quello
-correntemente in esecuzione, o il frame @dfn{pi@`u interno}, (chiamata di
-funzione); il frame 1 @`e il frame che ha chiamato quello pi@`u interno. Il frame
-col numero pi@`u alto @`e quello per il programma principale. Le informazioni
-stampate comprendono il numero di frame, i nomi delle funzioni e degli
-argomenti, i file sorgenti e le righe sorgenti.
-
-@cindex comando del debugger, @code{up}
-@cindex @code{up}, comando del debugger
-@item @code{up} [@var{contatore}]
-Sposta @var{contatore} (default 1) frame sopra la pila verso il frame pi@`u
-esterno. Poi seleziona e stampa il frame.
-@end table
-
-@node Informazioni sul debugger
-@subsection Ottenere informazioni sullo stato del programma e del debugger
-
-Oltre che vedere i valori delle variabili, spesso si ha necessit@`a di ottenere
-informazioni di altro tipo sullo stato del programma e dello stesso ambiente di
-debug. Il debugger di @command{gawk} ha un comando che fornisce
-quest'informazione, chiamato convenientemente @code{info}. @code{info}
-@`e usato con uno dei tanti argomenti che dicono esattamente quel che si vuol
-sapere:
-
-@table @asis
-@cindex comando del debugger, @code{i} (alias per @code{info})
-@cindex comando del debugger, @code{info}
-@cindex @code{info}, comando del debugger
-@cindex @code{i}, comando del debugger (alias per @code{info})
-@item @code{info} @var{cosa}
-@itemx @code{i} @var{cosa}
-Il valore di @var{cosa} dovrebbe essere uno dei seguenti:
-
-@c nested table
-@table @code
-@item args
-@cindex mostrare argomenti delle funzioni, nel debugger
-@cindex debugger, mostrare argomenti delle funzioni
-Elenca gli argomenti del frame selezionato.
-
-@item break
-@cindex mostrare punti d'interruzione, nel debugger
-@cindex debugger, mostrare punti d'interruzione
-Elenca tutti i punti d'interruzione attualmente impostati.
-
-@item display
-@cindex visualizzazioni automatiche, nel debugger
-@cindex debugger, visualizzazioni automatiche
-Elenca tutti gli elementi della lista delle visualizzazioni automatiche.
-
-@item frame
-@cindex descrizione degli @dfn{stack frame} delle chiamate, nel debugger
-@cindex debugger, descrizione degli @dfn{stack frame} delle chiamate
-D@`a una descrizione degli @dfn{stack frame} selezionati.
-
-@item functions
-@cindex elencare definizioni delle funzioni, nel debugger
-@cindex debugger, elencare definizioni delle funzioni
-Elenca tutte le definizioni delle funzioni compresi i @value{FNS} e
-i numeri di riga.
-
-@item locals
-@cindex mostrare variabili locali, nel debugger
-@cindex debugger, mostrare variabili locali
-Elenca le variabili locali dei frame selezionati.
-
-@item source
-@cindex mostrare il nome del file sorgente corrente, nel debugger
-@cindex debugger, mostrare il nome del file sorgente corrente
-Stampa il nome del file sorgente corrente. Ogni volta che il programma si
-interrompe, il file sorgente corrente @`e il file che contiene l'istruzione
-corrente. Quando il debugger viene avviato per la prima volta, il file
-sorgente corrente @`e il primo file incluso attraverso l'opzione @option{-f}.
-Il comando @samp{list @var{nome-file}:@var{numero-riga}} pu@`o essere usato in
-qualsiasi momento per cambiare il sorgente corrente.
-
-@item sources
-@cindex mostrare tutti i file sorgente, nel debugger
-@cindex debugger, mostrare tutti i file sorgenti
-Elenca tutti i sorgenti del programma.
-
-@item variables
-@cindex elencare tutte le variabili locali, nel debugger
-@cindex debugger, elencare tutte le variabili locali
-Elenca tutte le variabili locali.
-
-@item watch
-@cindex mostrare i punti d'osservazione, nel debugger
-@cindex debugger, mostrare i punti d'osservazione
-Elenca tutti gli elementi della lista dei punti d'osservazione.
-@end table
-@end table
-
-Ulteriori comandi permettono di avere il controllo sul debugger, la capacit@`a di
-salvare lo stato del debugger e la capacit@`a di eseguire comandi del debugger
-da un file. I comandi sono:
-
-@table @asis
-@cindex comando del debugger, @code{o} (alias per @code{option})
-@cindex comando del debugger, @code{option}
-@cindex @code{option}, comando del debugger
-@cindex @code{o}, comando del debugger (alias per @code{option})
-@cindex visualizzare le opzioni del debugger
-@cindex debugger, opzioni del
-@item @code{option} [@var{nome}[@code{=}@var{valore}]]
-@itemx @code{o} [@var{nome}[@code{=}@var{valore}]]
-Senza argomenti, visualizza le opzioni del debugger disponibili e i loro valori
-correnti. @samp{option @var{nome}} mostra il valore corrente dell'opzione
-cos@`{@dotless{i}} denominata. @samp{option @var{nome}=@var{valore}} assegna
-un nuovo valore all'opzione.
-Le opzioni disponibili sono:
-
-@c nested table
-@c asis for docbook
-@table @asis
-@item @code{history_size}
-@cindex debugger, dimensione della cronologia
-Imposta il numero massimo di righe da mantenere nel file della cronologia
-@file{./.gawk_history}. Il valore di default @`e 100.
-
-@item @code{listsize}
-@cindex debugger, numero di righe nella lista di default
-Specifica il numero di righe che @code{list} deve stampare. Il valore di
-default @`e 15.
-
-@item @code{outfile}
-@cindex ridirezionare l'output di @command{gawk}, nel debugger
-@cindex debugger, ridirezionare l'output di @command{gawk}
-Invia l'output di @command{gawk} in un file; l'output del debugger @`e
-visualizzato comunque anche
-nello standard output. Assegnare come valore stringa vuota (@code{""})
-reimposta l'output solo allo standard output.
-
-@item @code{prompt}
-@cindex debugger, prompt
-Cambia la riga per l'immissione dei comandi del debugger. Il valore di
-default @`e @samp{@w{gawk> }}.
-
-@item @code{save_history} [@code{on} | @code{off}]
-@cindex debugger, file della cronologia
-Salva la cronologia dei comandi nel file @file{./.gawk_history}.
-L'impostazione di default @`e @code{on}.
-
-@item @code{save_options} [@code{on} | @code{off}]
-@cindex salvataggio opzioni debugger
-@cindex debugger, salvataggio opzioni
-Salva le opzioni correnti nel file @file{./.gawkrc} all'uscita.
-L'impostazione di default @`e @code{on}.
-Le opzioni sono lette di nuovo all'avvio della sessione successiva.
-
-@item @code{trace} [@code{on} | @code{off}]
-@cindex istruzioni, tener traccia delle, nel debugger
-@cindex debugger, tener traccia delle istruzioni
-Attiva o disattiva il tracciamento delle istruzioni. L'impostazione di default
-@`e @code{off}.
-@end table
-
-@item @code{save} @var{nome-file}
-Salva i comandi eseguiti nella sessione corrente nel @value{FN} indicato,
-in modo da poterli ripetere in seguito usando il comando @command{source}.
-
-@item @code{source} @var{nome-file}
-@cindex debugger, leggere comandi da un file
-Esegue comandi contenuti in un file; un errore in un comando non impedisce
-l'esecuzione dei comandi successivi. In un file di comandi sono consentiti
-i commenti (righe che iniziano con @samp{#}).
-Le righe vuote vengono ignorate; esse @emph{non}
-ripetono l'ultimo comando.
-Non si pu@`o riavviare il programma mettendo pi@`u di un comando @code{run}
-nel file. Inoltre, la lista dei comandi pu@`o includere altri comandi
-@code{source}; in ogni caso, il debugger di @command{gawk} non richiama lo
-stesso file pi@`u di una volta per evitare ricorsioni infinite.
-
-Oltre al comando @code{source}, o al posto di esso, si possono usare le opzioni
-sulla riga di comando @option{-D @var{file}} o @option{--debug=@var{file}}
-per eseguire comandi da un file in maniera non interattiva
-(@pxref{Opzioni}).
-@end table
-
-@node Comandi vari del debugger
-@subsection Comandi vari del debugger
-
-Ci sono alcuni altri comandi che non rientrano nelle precedenti categorie,
-come i seguenti:
-
-@table @asis
-@cindex comando del debugger, @code{dump}
-@cindex @code{dump}, comando del debugger
-@item @code{dump} [@var{nome-file}]
-Riversa il @dfn{byte code} del programma nello standard output o nel file
-definito in @var{nome-file}. Questo stampa una rappresentazione delle
-istruzioni interne che @command{gawk} esegue per implementare i comandi
-@command{awk} in un programma. Ci@`o pu@`o essere molto istruttivo, come
-dimostra il seguente riversamento parziale del codice offuscato di
-Davide Brini (@pxref{Programma signature}):
-
-@c FIXME: This will need updating if num-handler branch is ever merged in.
-@smallexample
-gawk> @kbd{dump}
-@print{} # BEGIN
-@print{}
-@print{} [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk]
-@print{} [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc280] Op_match :
-@print{} [ 1:0xfcc1e0] Op_store_var : O
-@print{} [ 1:0xfcc2e0] Op_push_i : "==" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc340] Op_push_i : "==" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc320] Op_equal :
-@print{} [ 1:0xfcc200] Op_store_var : o
-@print{} [ 1:0xfcc380] Op_push : o
-@print{} [ 1:0xfcc360] Op_plus_i : 0 [MALLOC|NUMCUR|NUMBER]
-@print{} [ 1:0xfcc220] Op_push_lhs : o [do_reference = true]
-@print{} [ 1:0xfcc300] Op_assign_plus :
-@print{} [ :0xfcc2c0] Op_pop :
-@print{} [ 1:0xfcc400] Op_push : O
-@print{} [ 1:0xfcc420] Op_push_i : "" [MALLOC|STRING|STRCUR]
-@print{} [ :0xfcc4a0] Op_no_op :
-@print{} [ 1:0xfcc480] Op_push : O
-@print{} [ :0xfcc4c0] Op_concat : [expr_count = 3] [concat_flag = 0]
-@print{} [ 1:0xfcc3c0] Op_store_var : x
-@print{} [ 1:0xfcc440] Op_push_lhs : X [do_reference = true]
-@print{} [ 1:0xfcc3a0] Op_postincrement :
-@print{} [ 1:0xfcc4e0] Op_push : x
-@print{} [ 1:0xfcc540] Op_push : o
-@print{} [ 1:0xfcc500] Op_plus :
-@print{} [ 1:0xfcc580] Op_push : o
-@print{} [ 1:0xfcc560] Op_plus :
-@print{} [ 1:0xfcc460] Op_leq :
-@print{} [ :0xfcc5c0] Op_jmp_false : [target_jmp = 0xfcc5e0]
-@print{} [ 1:0xfcc600] Op_push_i : "%c" [MALLOC|STRING|STRCUR]
-@print{} [ :0xfcc660] Op_no_op :
-@print{} [ 1:0xfcc520] Op_assign_concat : c
-@print{} [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440]
-@print{}
-@dots{}
-@print{}
-@print{} [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""]
-@print{} [ :0xfcc140] Op_no_op :
-@print{} [ :0xfcc1c0] Op_atexit :
-@print{} [ :0xfcc640] Op_stop :
-@print{} [ :0xfcc180] Op_no_op :
-@print{} [ :0xfcd150] Op_after_beginfile :
-@print{} [ :0xfcc160] Op_no_op :
-@print{} [ :0xfcc1a0] Op_after_endfile :
-gawk>
-@end smallexample
-
-@cindex comando del debugger, @code{exit}
-@cindex @code{exit}, comando del debugger
-@cindex uscire dal debugger
-@cindex debugger, uscire dal
-@item @code{exit}
-Esce dal debugger.
-Si veda la voce @samp{quit}, pi@`u avanti in quest'elenco.
-
-@cindex comando del debugger, @code{h} (alias per @code{help})
-@cindex comando del debugger, @code{help}
-@cindex @code{help}, comando del debugger
-@cindex @code{h}, comando del debugger (alias per @code{help})
-@item @code{help}
-@itemx @code{h}
-Stampa una lista di tutti i comandi del debugger di @command{gawk} con un breve
-sommario su come usarli. @samp{help @var{comando}} stampa l'informazione sul
-comando @var{comando}.
-
-@cindex comando del debugger, @code{l} (alias per @code{list})
-@cindex comando del debugger, @code{list}
-@cindex @code{list}, comando del debugger
-@cindex @code{l}, comando del debugger (alias per @code{list})
-@item @code{list} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
-@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
-Stampa le righe specificate (per default 15) dal file sorgente corrente
-o il file chiamato @var{nome-file}. I possibili argomenti di @code{list}
-sono i seguenti:
-
-@c nested table
-@table @asis
-@item @code{-} (Meno)
-Stampa righe prima delle ultime righe stampate.
-
-@item @code{+}
-Stampa righe dopo le ultime righe stampate.
-@code{list} senza argomenti fa la stessa cosa.
-
-@item @var{n}
-Stampa righe centrate attorno alla riga numero @var{n}.
-
-@item @var{n}--@var{m}
-Stampa righe dalla numero @var{n} alla numero @var{m}.
-
-@item @var{nome-file}@code{:}@var{n}
-Stampa righe centrate attorno alla riga numero @var{n} nel file sorgente
-@var{nome-file}. Questo comando pu@`o cambiare il file sorgente corrente.
-
-@item @var{funzione}
-Stampa righe centrate attorno all'inizio della funzione @var{function}.
-Questo comando pu@`o cambiare il file sorgente corrente.
-@end table
-
-@cindex comando del debugger, @code{q} (alias per @code{quit})
-@cindex comando del debugger, @code{quit}
-@cindex @code{quit}, comando del debugger
-@cindex @code{q}, comando del debugger (alias per @code{quit})
-@cindex uscire dal debugger
-@cindex debugger, uscire dal
-@item @code{quit}
-@itemx @code{q}
-Esce dal debugger. Fare il debug @`e divertente, ma noi tutti a volte
-dobbiamo far fronte ad altri impegni nella vita, e talvolta troviamo il bug
-e possiamo tranquillamente passare a quello successivo! Come abbiamo visto
-prima, se si sta eseguendo un programma, il debugger avverte quando si batte
-@samp{q} o @samp{quit}, in modo da essere sicuri di voler realmente abbandonare
-il debug.
-
-@cindex comando del debugger, @code{trace}
-@cindex @code{trace}, comando del debugger
-@item @code{trace} [@code{on} | @code{off}]
-Abilita o disabilita la stampa continua delle istruzioni che si stanno per
-eseguire, assieme alle righe di @command{awk} che implementano.
-L'impostazione di default @`e @code{off}.
-
-@`E auspicabile che la maggior parte dei ``codici operativi'' (o ``opcode'')
-in queste istruzioni siano sufficientemente autoesplicativi, e l'uso di
-@code{stepi} e @code{nexti} mentre @code{trace} @`e abilitato li render@`a
-familiari.
-
-@end table
-
-@node Supporto per Readline
-@section Supporto per Readline
-@cindex completamento dei comandi nel debugger
-@cindex espansione della cronologia, nel debugger
-@cindex debugger, completamento dei comandi nel
-
-Se @command{gawk} @`e compilato con
-@uref{http://cnswww.cns.cwru.edu/php/chet/readline/readline.html, la libreria
-GNU Readline}, ci si pu@`o avvantaggiare delle sue funzionalit@`a riguardanti il
-completamento dei comandi della libreria e l'espansione della cronologia. Sono
-disponibili i seguenti tipi di completamento:
-
-@table @asis
-@item Completamentto dei comandi
-Nomi dei comandi.
-
-@item Completamento del @value{FN} del sorgente
-@value{FFNS} dei sorgenti. I relativi comandi sono
-@code{break},
-@code{clear},
-@code{list},
-@code{tbreak}
-e
-@code{until}.
-
-@item Completamento di argomento
-Argomenti di un comando non numerici.
-I relativi comandi sono @code{enable} e @code{info}.
-
-@item Completamento del nome di variabile
-Interessa i nomi delle variabili globali, e gli argomenti di funzione nel
-contesto corrente se
-il programma @`e in esecuzione. I relativi comandi sono
-@code{display},
-@code{print},
-@code{set}
-e
-@code{watch}.
-
-@end table
-
-@node Limitazioni
-@section Limitazioni
-
-Si spera che il lettore trovi il debugger di @command{gawk} utile e piacevole
-da usare, ma come accade per ogni programma, specialmente nelle sue prime
-versioni, ha ancora delle limitazioni. Quelle di cui @`e bene essere al corrente sono:
-
-@itemize @value{BULLET}
-@item
-Nella versione presente, il debugger non d@`a una spiegazione dettagliata
-dell'errore che
-si @`e commesso quando si immette qualcosa che il debugger ritiene sbagliato.
-La risposta invece @`e solamente @samp{syntax error}. Quando si arriva a capire
-l'errore commesso, tuttavia, ci si sentir@`a come un vero guru.
-
-@item
-@c NOTE: no comma after the ref{} on purpose, due to following
-@c parenthetical remark.
-Se si studiano i ``dump'' dei codici operativi
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Comandi vari del debugger}
-(o se si ha gi@`a familiarit@`a con i comandi interni di @command{gawk}),
-ci si render@`a conto che gran parte della manipolaziona interna di dati
-in @command{gawk}, cos@`{@dotless{i}} come in molti interpreti, @`e fatta su di una pila.
-@code{Op_push}, @code{Op_pop}, e simili sono il pane quotidiano di
-gran parte del codice di @command{gawk}.
-
-Sfortunatamente, al momento, il debugger di @command{gawk} non consente
-di esaminare i contenuti della pila.
-Cio@`e, i risultati intermedi della valutazione delle espressioni sono sulla
-pila, ma non @`e possibile stamparli. Invece, possono essere stampate solo
-quelle variabili che sono state definite nel programma. Naturalmente, un
-espediente per cercare di rimediare @`e di usare pi@`u variabili esplicite in
-fase di debug e
-poi cambiarle di nuovo per ottenere un codice forse pi@`u difficile da
-comprendere, ma pi@`u ottimizzato.
-
-@item
-Non c'@`e alcun modo per guardare ``dentro'' al processo della compilazione delle
-espressioni regolari per vedere se corrispondono a quel che si intendeva.
-Come programmatore
-di @command{awk}, ci si aspetta che chi legge conosca il significato di
-@code{/[^[:alnum:][:blank:]]/}.
-
-@item
-Il debugger di @command{gawk} @`e progettato per essere usato eseguendo un
-programma (con tutti i suoi parametri) dalla riga di comando, come descritto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Invocazione del debugger}. Non c'@`e alcun modo (al momento) di modificare
-o di ``entrare dentro'' l'esecuzione di un programma.
-Questo sembra ragionevole per un linguaggio che @`e usato principalmente per
-eseguire programmi piccoli e che non richiedono molto tempo di esecuzione.
-
-@item
-Il debugger di @command{gawk} accetta solo codice sorgente fornito con
-l'opzione @option{-f}.
-@end itemize
-
-@ignore
-@c 11/2016: This no longer applies after all the type cleanup work that's been done.
-C'@`e un altro punto che vale la pena di trattare. I debugger convenzionali
-vengono eseguiti in un processo (e quindi in una parte di memoria)
-separato dal programma su cui eseguono il debug (il @dfn{debuggato}, se
-si vuole).
-
-Il debugger di @command{gawk} @`e diverso; @`e parte integrante di @command{gawk}.
-Ci@`o rende possibile, in rari casi, che @command{gawk} diventi un eccellente
-dimostratore del principio d'indeterminazione di Heisenberg, secondo il quale
-il solo atto di osservare una cosa pu@`o modificarla. Si consideri il seguente
-esempio:@footnote{Grazie a Hermann Peifer per quest'esempio.}
-
-@example
-$ @kbd{cat test.awk}
-@print{} @{ print typeof($1), typeof($2) @}
-$ @kbd{cat test.data}
-@print{} abc 123
-$ @kbd{gawk -f test.awk test.data}
-@print{} strnum strnum
-@end example
-
-Questo @`e quel che ci si aspetta: il campo data ha l'attributo STRNUM
-(@pxref{Tipi di variabile}). Ora vediamo cosa accade quando questo programma
-viene eseguito sotto il debugger:
-
-@example
-$ @kbd{gawk -D -f test.awk test.data}
-gawk> @kbd{w $1} @ii{Imposta un punto d'osservazione su} $1
-@print{} Watchpoint 1: $1
-gawk> @kbd{w $2} @ii{Imposta il punto d'osservazione su} $2
-@print{} Watchpoint 2: $2
-gawk> @kbd{r} @ii{Avvia il programma}
-@print{} Partenza del programma:
-@print{} Mi fermo in Rule ...
-@print{} Watchpoint 1: $1 @ii{Scatta punto d'osservazione}
-@print{} Old value: ""
-@print{} New value: "abc"
-@print{} main() a `test.awk':1
-@print{} 1 @{ print typeof($1), typeof($2) @}
-gawk> @kbd{n} @ii{Prosegui @dots{}}
-@print{} Watchpoint 2: $2 @ii{Scatta punto d'osservazione}
-@print{} Old value: ""
-@print{} New value: "123"
-@print{} main() a `test.awk':1
-@print{} 1 @{ print typeof($1), typeof($2) @}
-gawk> @kbd{n} @ii{Prende il risultato da} typeof()
-@print{} strnum number @ii{Il risultato per} $2 @ii{non @`e corretto}
-@c "normally" o "abnormally" @`e in inglese senza possibilit@`a di modifiche.
-@print{} Programma completato normally, valore in uscita: 0
-gawk> @kbd{quit}
-@end example
-
-In questo caso, la richiesta di confrontare il nuovo valore di @code{$2}
-con quello vecchio ha richiesto che @command{gawk} lo valutasse e
-stabilisse che era proprio un numero, e questo @`e riflesso nel risultato di
-@code{typeof()}.
-
-Casi come questi in cui il debugger non @`e trasparente rispetto all'esecuzione
-del programma dovrebbero essere rari. Nel caso che se ne trovi uno, si
-prega di segnalarlo (@pxref{Bug}).
-@end ignore
-
-@ignore
-Look forward to a future release when these and other missing features may
-be added, and of course feel free to try to add them yourself!
-@end ignore
-
-@node Sommario sul debug
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Raramente i programmi funzionano bene al primo colpo. Trovare gli errori
-che contengono
-viene chiamato @dfn{debugging}, e un programma che aiuta a trovarli @`e un
-@dfn{debugger}. @command{gawk} ha un debugger incorporato che funziona in
-modo molto simile al debugger GNU, GDB.
-
-@item
-I debugger possono eseguire il programma un'istruzione per volta, esaminare e
-cambiare i
-valori delle variabili e dei vettori, e fanno tante altre cose per
-permettere di comprendere cosa sta facendo effettivamente il programma in un
-dato momento (a differenza del comportamento atteso).
-
-@item
-Come la maggior parte dei debugger, il debugger di @command{gawk} funziona in
-termini di stack frame, e si possono inserire sia punti d'interruzione
-(interruzioni a un certo punto del codice) sia punti d'osservazione
-(interruzioni quando il valore di un dato cambia).
-
-@item
-La serie di comandi del debugger @`e abbastanza completa, e permette di
-monitorare i
-punti d'interruzione, l'esecuzione, la visualizzazione e la
-modifica dei dati, di lavorare con le pile, ottenere informazioni, e di
-svolgere altri compiti.
-
-@item
-Se la libreria GNU Readline @`e disponibile al momento della compilazione di
-@command{gawk}, viene usata dal debugger per fornire la cronologia della riga
-di comando e delle modifiche apportate durante il debug.
-
-@item
-Normalmente, il debugger non influenza il programma che sta controllando,
-ma questo pu@`o succedere occasionalmente.
-
-@end itemize
-
-@node Calcolo con precisione arbitraria
-@chapter Calcolo con precisione arbitraria con @command{gawk}
-@cindex precisione arbitraria
-@cindex precisione multipla
-@cindex precisione infinita
-@cindex virgola mobile, numeri in@comma{} precisione arbitraria
-
-In questo @value{CHAPTER} si introducono alcuni concetti base su come i
-computer
-eseguono i calcoli e si definiscono alcuni termini importanti.
-Si continua poi descrivendo il calcolo in virgola mobile,
-che @`e quello che @command{awk} usa per tutte le sue operazioni aritmetiche,
-e si prosegue con
-una trattazione del calcolo in virgola mobile con precisione arbitraria,
-una funzionalit@`a disponibile solo in @command{gawk}. Si passa poi a
-illustrare i numeri interi a precisione arbitraria e si conclude con una
-descrizione di alcuni punti sui quali @command{gawk} e lo standard POSIX non
-sono esattamente in accordo.
-
-@quotation NOTA
-La maggior parte degli utenti di @command{gawk} pu@`o saltare senza patemi
-d'animo
-questo capitolo. Tuttavia, se si vogliono eseguire calcoli scientifici con
-@command{gawk}, questo @`e il luogo adatto per imparare a farlo.
-@end quotation
-
-@menu
-* Aritmetica del computer:: Una rapida introduzione alla matematica del
- computer.
-* Definizioni matematiche:: Definizione dei termini usati.
-* Funzionalit@`a MPFR:: Funzionalit@`a MPFR in @command{gawk}.
-* Cautela col calcolo in VM:: Cose da sapere.
-* Interi a precisione arbitraria:: Calcolo con numeri interi a precisione
- arbitraria con @command{gawk}.
-* Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente.
-* Sommario virgola mobile:: Sommario della trattazione della
- virgola mobile.
-@end menu
-
-@node Aritmetica del computer
-@section Una descrizione generale dell'aritmetica del computer
-
-Sinora, abbiamo avuto a che fare con dati come numeri o stringhe. Ultimamente,
-comunque, i computer rappresentano ogni cosa in termini di @dfn{cifre binarie},
-o @dfn{bit}. Una cifra decimale pu@`o assumere uno di 10 valori: da zero a
-nove. Una cifra binaria pu@`o assumere uno di due valori: zero o uno. Usando
-il sistema binario, i computer (e i programmi per computer) possono
-rappresentare e manipolare dati numerici e dati costituiti da caratteri. In
-generale, tanti pi@`u bit @`e possibile usare per rappresentare una determinata
-cosa, tanto maggiore sar@`a l'intervallo dei possibili valori che essa potr@`a
-assumere.
-
-I moderni calcolatori possono eseguire calcoli numerici in almeno due modi, e
-spesso anche di pi@`u. Ogni tipo di calcolo usa una diversa rappresentazione
-(organizzazione dei bit) dei numeri. Le modalit@`a di calcolo che ci interessano
-sono:
-
-@table @asis
-@item Calcolo decimale
-Questo @`e il tipo di calcolo che s'impara alle scuole elementari, usando
-carta e penna (o anche una calcolatrice). In teoria, i numeri possono avere un
-numero arbitrario di cifre su ambo i lati del separatore decimale, e il
-risultato di un'operazione @`e sempre esatto.
-
-Alcuni sistemi moderni possono eseguire calcoli decimali direttamente,
-tramite apposite istruzioni disponibili
-nell'hardware dell'elaboratore, ma normalmente si ha necessit@`a di una speciale
-libreria software che consenta di effettuare le operazioni desiderate.
-Ci sono anche librerie che svolgono i calcoli decimali interamente
-per via software.
-
-Anche se alcuni utenti si aspettano che @command{gawk} effettui delle
-operazioni usando numeri in base decimale,@footnote{Non sappiamo perch@'e se
-lo aspettino, ma @`e cos@`{@dotless{i}}.} non @`e questo quello che succede.
-
-@item La matematica coi numeri interi
-A scuola ci hanno insegnato che i valori interi erano quei numeri privi di una
-parte frazionaria, come 1, 42, o @minus{}17.
-Il vantaggio dei numeri interi @`e che essi rappresentano dei valori in maniera
-esatta. Lo svantaggio @`e che i numeri rappresentabili sono limitati.
-
-@cindex senza segno, interi
-@cindex segno, interi senza
-@cindex interi senza segno
-Nei calcolatori, i valori interi sono di due tipi: @dfn{con segno} e
-@dfn{senza segno}. I valori con segno possono essere negativi o positivi,
-mentre i valori senza segno sono sempre maggiori o uguali a zero.
-
-Nei sistemi informatici, il calcolo con valori interi @`e esatto, ma il possibile
-campo di variazione dei valori @`e limitato. L'elaborazione con numeri interi @`e
-pi@`u veloce di quella con numeri a virgola mobile.
-
-@item La matematica coi numeri a virgola mobile
-I numeri a virgola mobile rappresentano quelli che a scuola sono chiamati
-numeri ``reali'' (cio@`e, quelli che hanno una parte frazionaria, come
-3.1415927). Il vantaggio dei numeri a virgola mobile @`e che essi possono
-rappresentare uno spettro di valori molto pi@`u ampio di quello rappresentato dai
-numeri interi. Lo svantaggio @`e che ci sono numeri che essi non possono
-rappresentare in modo esatto.
-
-I computer moderni possono eseguire calcoli su valori a virgola mobile
-nell'hardware dell'elaboratore, entro un intervallo di valori limitato.
-Ci sono inoltre librerie di programmi che consentono calcoli, usando numeri a
-virgola mobile, di precisione arbitraria.
-
-POSIX @command{awk} usa numeri a virgola mobile a @dfn{doppia precisione},
-che possono gestire pi@`u cifre rispetto ai numeri a virgola mobile a
-@dfn{singola precisione}. @command{gawk} ha inoltre funzionalit@`a, descritte
-in dettaglio pi@`u sotto, che lo mettono in grado di eseguire
-calcoli con i numeri a virgola mobile con precisione arbitraria.
-@end table
-
-I calcolatori operano con valori interi e a virgola mobile su diversi
-intervalli. I valori interi normalmente hanno una dimensione di 32 bit o 64 bit.
-I valori a virgola mobile a singola precisione occupano 32 bit, mentre i
-valori a virgola mobile a doppia precisione occupano 64 bit. I valori a
-virgola mobile sono sempre con segno. Il possibile campo di variazione dei
-valori @`e mostrato in @ref{table-numeric-ranges}.
-
-@float Tabella,table-numeric-ranges
-@caption{Intervalli dei valori per diverse rappresentazioni numeriche}
-@multitable @columnfractions .34 .33 .33
-@headitem Rappresentazione numerica @tab Valore minimo @tab Valore massimo
-@item Interi con segno a 32-bit @tab @minus{}2.147.483.648 @tab 2.147.483.647
-@item Interi senza segno a 32-bit @tab 0 @tab 4.294.967.295
-@item Interi con segno a 64-bit @tab @minus{}9.223.372.036.854.775.808 @tab 9.223.372.036.854.775.807
-@item Interi senza segno a 64-bit @tab 0 @tab 18.446.744.073.709.551.615
-@iftex
-@item Virgola mobile, singola precisione (circa) @tab @math{1,175494^{-38}} @tab @math{3,402823^{38}}
-@item Virgola mobile, doppia precisione (circa) @tab @math{2,225074^{-308}} @tab @math{1,797693^{308}}
-@end iftex
-@ifinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494e-38 @tab 3,402823e38
-@item Virgola mobile, doppia precisione (circa) @tab 2,225074e-308 @tab 1,797693e308
-@end ifinfo
-@ifnottex
-@ifnotinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494@sup{-38} @tab 3,402823@sup{38}
-@item Virgola mobile, singola precisione (circa) @tab 2,225074@sup{-308} @tab 1,797693@sup{308}
-@end ifnotinfo
-@end ifnottex
-@end multitable
-@end float
-
-@node Definizioni matematiche
-@section Altre cose da sapere
-
-Il resto di questo @value{CHAPTER} usa un certo numero di termini. Di seguito
-vengono date alcune definizioni informali che dovrebbero essere utili
-per la lettura di questo documento:
-
-@table @dfn
-@item Accuratezza
-L'accuratezza del calcolo sui numeri a virgola mobile indica di quanto si
-avvicina il calcolo al valore reale (calcolato con carta e penna).
-
-@item Errore
-La differenza tra quello che il risultato di un calcolo ``dovrebbe dare''
-e quello che effettivamente d@`a. @`E meglio minimizzare l'errore quanto pi@`u
-possibile.
-
-@item Esponente
-L'ordine di grandezza di un valore;
-alcuni bit in un valore a virgola mobile contengono l'esponente.
-
-@item Inf
-Un valore speciale che rappresenta l'infinito. Le operazioni tra un qualsiasi
-numero e l'infinito danno infinito.
-
-@item Mantissa
-Un valore a virgola mobile @`e formato dalla mantissa moltiplicata per 10
-alla potenza dell'esponente. Per esempio, in @code{1,2345e67},
-la mantissa @`e @code{1,2345}.
-
-@item Modalit@`a di arrotondamento
-Come i numeri vanno arrotondati, per eccesso o per difetto, quando necessario.
-Maggiori dettagli verranno forniti in seguito.
-
-@item NaN
-``Not a number'' (Non un Numero).@footnote{Grazie a Michael
-Brennan per questa descrizione, che abbiamo parafrasato, e per gli esempi.} Un
-valore speciale che risulta da un calcolo che non ha risposta come numero
-reale. In tal caso, i programmi possono o ricevere un'eccezione di virgola
-mobile, o restituire @code{NaN} come risultato. Lo standard IEEE 754
-consiglia che i sistemi restituiscano @code{NaN}. Alcuni esempi:
-
-@table @code
-@item sqrt(-1)
-La radice quadrata di @minus{}1 ha senso nell'insieme dei numeri complessi,
-ma non nell'insieme dei numeri reali,
-per cui il risultato @`e @code{NaN}.
-
-@item log(-8)
-Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()},
-per cui il risultato @`e @code{NaN}.
-@end table
-
-@item Normalizzato (formato)
-Come la mantissa (vedi oltre in questa lista) @`e usualmente memorizzata. Il
-valore viene aggiustato in modo che il primo bit sia sempre uno,
-e in questo modo l'uno iniziale @`e supposto presente (per come viene
-generato il numero), ma non @`e memorizzato fisicamente.
-Questo fornisce un bit di precisione in pi@`u.
-
-@item Precisione
-Il numero di bit usati per rappresentare un numero a virgola mobile.
-Pi@`u sono i bit, e maggiore @`e l'intervallo di cifre che si possono
-rappresentare.
-Le precisioni binaria e decimale sono legate in modo approssimativo, secondo
-la formula:
-
-@display
-@iftex
-@math{prec = 3.322 @cdot dps}
-@end iftex
-@ifnottex
-@ifnotdocbook
-@var{prec} = 3.322 * @var{dps}
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>
-@end docbook
-@end display
-
-@noindent
-Qui, @emph{prec} indica la precisione binaria
-(misurata in bit) e @emph{dps} (abbreviazione di "decimal places")
-indica le cifre decimali.
-
-@item Stabilit@`a
-Dal@uref{http://en.wikipedia.org/wiki/Numerical_stability,
-l'articolo di Wikipedia sulla stabilit@`a numerica}:
-``I calcoli per i quali si pu@`o dimostrare che non amplificano gli errori di
-approssimazione sono chiamati @dfn{numericamente stabili}.''
-@end table
-
-Si veda @uref{http://en.wikipedia.org/wiki/Accuracy_and_precision,
-l'articolo di Wikipedia su accuratezza e precisione} per maggiori informazioni
-su questi due termini.
-
-Sui computer moderni, l'unit@`a di calcolo in virgola mobile usa la
-rappresentazione e le operazioni definite dallo standard IEEE 754.
-Tre dei tipi definiti nello standard IEEE 754 sono:
-32-bit singola precisione,
-64-bit doppia precisione e
-128-bit quadrupla precisione.
-Lo standard specifica anche formati a precisione estesa
-per consentire una maggiore precisione e campi di variazione degli esponenti
-pi@`u ampi. (@command{awk} usa solo il formato a 64-bit doppia precisione.)
-
-@ref{table-ieee-formats} elenca la precisione e i valori di campo
-dell'esponente per i principali formati binari IEEE 754.
-
-@float Tabella,table-ieee-formats
-@caption{Valori per i principali formati IEEE}
-@multitable @columnfractions .20 .20 .20 .20 .20
-@headitem Nome @tab Bit totali @tab Precisione @tab Esponente minimo @tab Esponente massimo
-@item Singola @tab 32 @tab 24 @tab @minus{}126 @tab +127
-@item Doppia @tab 64 @tab 53 @tab @minus{}1022 @tab +1023
-@item Quadrupla @tab 128 @tab 113 @tab @minus{}16382 @tab +16383
-@end multitable
-@end float
-
-@quotation NOTA
-I numeri che descrivono la precisione includono la cifra 1 iniziale
-implicita, il che equivale ad avere un bit in pi@`u nella mantissa.
-@end quotation
-
-@node Funzionalit@`a MPFR
-@section Funzionalit@`a per il calcolo a precisione arbitraria in @command{gawk}
-
-Per default, @command{gawk} usa i valori in virgola mobile a doppia precisione
-disponibili nell'hardware del sistema su cui viene eseguito.
-Tuttavia, se @`e stato compilato in modo da includere questa funzionalit@`a
-ed @`e stata specificata
-l'opzione da riga di comando @option{-M}, @command{gawk} usa le librerie
-@uref{http://www.mpfr.org, GNU MPFR} e @uref{http://gmplib.org, GNU MP} (GMP)
-per effettuare calcoli sui numeri con una precisione arbitraria.
-Si pu@`o verificare se il supporto a MPFR @`e disponibile in questo modo:
-
-@example
-$ @kbd{gawk --version}
-@print{} GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
-@print{} Copyright (C) 1989, 1991-2015 Free Software Foundation.
-@dots{}
-@end example
-
-@noindent
-(I numeri di versione visualizzati possono essere diversi. Non importa;
-l'importante @`e che siano presenti GNU MPFR e GNU MP
-nel testo restituito.)
-
-Inoltre, ci sono alcuni elementi disponibili nel vettore @code{PROCINFO}
-per fornire informazioni sulle librerie MPFR e GMP
-(@pxref{Variabili auto-assegnate}).
-
-La libreria MPFR d@`a un controllo accurato sulle precisioni e sulle modalit@`a di
-arrotondamento, e d@`a risultati correttamente arrotondati, riproducibili e
-indipendenti dalla piattaforma. Con l'opzione da riga di comando @option{-M},
-tutti gli operatori aritmetici e le funzioni in virgola mobile possono
-produrre risultati a ogni livello di precisione supportato da MPFR.
-
-Due variabili predefinite, @code{PREC} e @code{ROUNDMODE},
-danno il controllo sulla precisione di elaborazione e sulla modalit@`a di
-arrotondamento. La precisione e la modalit@`a di arrotondamento sono impostate
-a livello globale per ogni operazione da eseguire.
-@xref{Impostare la precisione} e
-@iftex
-la
-@end iftex
-@ref{Impostare modi di arrotondare}
-per maggiori informazioni.
-
-@node Cautela col calcolo in VM
-@section Calcolo in virgola mobile: @dfn{Caveat Emptor}!
-
-@quotation
-@i{L'ora di matematica @`e ostica!}
-@author Teen Talk Barbie, luglio 1992
-@end quotation
-
-Questa @value{SECTION} fornisce un quadro dettagliato dei problemi che
-si presentano quando si eseguono molti calcoli in virgola
-mobile.@footnote{C'@`e un saggio molto bello
-@uref{http://www.validlab.com/goldberg/paper.pdf, sul calcolo in
-virgola mobile} di David Goldberg, ``What Every Computer Scientist Should Know
-About Floating-Point Arithmetic,''
-@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03): 5-48. Vale la pena di
-leggerlo, se si @`e interessati a scendere nei dettagli, per@`o richiede delle
-conoscenze informatiche.}
-Le spiegazioni fornite valgono sia per il calcolo in virgola mobile
-effettuato direttamente dall'hardware del computer, sia per quello
-ottenuto tramite il software per la precisione arbitraria.
-
-@quotation ATTENZIONE
-Le informazioni fornite in questa sede sono deliberatamente di tipo generale.
-Se si devono eseguire calcoli complessi col computer, si dovrebbero prima
-ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto.
-@end quotation
-
-@menu
-* Inesattezza nei calcoli:: La matematica in virgola mobile non @`e
- esatta.
-* Ottenere la precisione:: Ottenere pi@`u precisione richiede qualche
- sforzo.
-* Tentare di arrotondare:: Aggiungere cifre di precisione e arrotondare.
-* Impostare la precisione:: Come impostare la precisione.
-* Impostare modi di arrotondare:: Impostare le modalit@`a di arrotondamento.
-@end menu
-
-@node Inesattezza nei calcoli
-@subsection La matematica in virgola mobile non @`e esatta
-
-Le rappresentazioni e i calcoli con numeri a virgola mobile binari sono
-inesatti. Semplici valori come 0,1 non possono essere rappresentati in modo
-preciso usando numeri a virgola mobile binari, e la limitata precisione dei
-numeri a virgola mobile significa che piccoli cambiamenti nell'ordine delle
-operazioni o la precisione di memorizzazione di operazioni
-intermedie pu@`o cambiare il
-risultato. Per rendere la situazione pi@`u difficile, nel calcolo in virgola
-mobile con precisione arbitraria, si pu@`o impostare la precisione prima di
-eseguire un calcolo, per@`o non si pu@`o sapere con certezza quale sar@`a
-il numero di cifre decimali esatte nel risultato finale.
-
-@menu
-* Rappresentazioni inesatte:: I numeri non sono rappresentati esattamente.
-* Confronti tra valori in VM:: Come confrontare valori in virgola mobile.
-* Gli errori si sommano:: Gli errori diventano sempre maggiori.
-@end menu
-
-@node Rappresentazioni inesatte
-@subsubsection Molti numeri non possono essere rappresentati esattamente
-
-Perci@`o, prima di iniziare a scrivere del codice, si dovrebbe pensare
-al risultato che si vuole effettivamente ottenere e a cosa realmente accade.
-Si considerino i due numeri nel seguente esempio:
-
-@example
-x = 0.875 # 1/2 + 1/4 + 1/8
-y = 0.425
-@end example
-
-Diversamente dal numero in @code{y}, il numero memorizzato in @code{x}
-@`e rappresentabile esattamente nel formato binario, perch@'e pu@`o essere
-scritto come somma finita di una o pi@`u frazioni i cui denominatori sono tutti
-multipli di due.
-Quando @command{gawk} legge un numero a virgola mobile dal sorgente di un
-programma, arrotonda automaticamente quel numero alla precisione, quale che
-sia, supportata dal computer in uso. Se si tenta di stampare il contenuto
-numerico di una variabile usando una stringa di formato in uscita di
-@code{"%.17g"}, il valore restituito pu@`o non essere lo stesso numero assegnato
-a quella variabile:
-
-@example
-$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425}
-> @kbd{ printf("%0.17g, %0.17g\n", x, y) @}'}
-@print{} 0.875, 0.42499999999999999
-@end example
-
-Spesso l'errore @`e talmente piccolo da non essere neppure notato, e se @`e stato
-notato, si pu@`o sempre specificare il grado di precisione si vuole nell'output.
-In genere questo @`e una stringa di formato come @code{"%.15g"} che, se usata
-nell'esempio precedente, d@`a luogo a un output identico all'input.
-
-@node Confronti tra valori in VM
-@subsubsection Fare attenzione quando si confrontano valori
-
-Poich@'e la rappresentazione interna del computer
-pu@`o discostarsi, sia pur di poco, dal valore
-esatto, confrontare dei valori a virgola mobile per vedere se sono esattamente
-uguali @`e generalmente una pessima idea. Questo @`e un esempio in cui tale
-confronto non funziona come dovrebbe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 0
-@end example
-
-Il metodo generalmente seguito per confrontare valori a virgola mobile
-consiste nel controllare se la differenza tra loro @`e minore di un certo valore
-(chiamato @dfn{delta}, o @dfn{tolleranza}). Quel che si deve decidere @`e qual
-@`e il valore minimo di delta
-adeguato. Il codice per far ci@`o @`e qualcosa del genere:
-
-@example
-delta = 0.00001 # per esempio
-differenza = abs(a) - abs(b) # sottrazione dei due valori
-if (differenza < delta)
- # va bene
-else
- # non va bene
-@end example
-
-@noindent
-(Si presuppone che sia stata definita in qualche parte del programma una
-semplice funzione che restituisce il valore assoluto di un numero,
-chiamata @code{abs()}.)
-
-@node Gli errori si sommano
-@subsubsection Gli errori diventano sempre maggiori
-
-La perdita di accuratezza in un singolo calcolo con numeri a virgola mobile
-generalmente non dovrebbe destare preoccupazione. Tuttavia, se si calcola un
-valore che @`e una sequenza di operazioni in virgola mobile, l'errore si pu@`o
-accumulare e influire sensibilmente sul risultato del calcolo stesso.
-Qui sotto vediamo un tentativo di calcolare il valore di @value{PI} usando
-una delle sue rappresentazioni
-come somma di una serie di numeri:
-
-@example
-BEGIN @{
- x = 1.0 / sqrt(3.0)
- n = 6
- for (i = 1; i < 30; i++) @{
- n = n * 2.0
- x = (sqrt(x * x + 1) - 1) / x
- printf("%.15f\n", n * x)
- @}
-@}
-@end example
-
-Quando viene eseguito, gli errori iniziali si propagano nei calcoli
-successivi, facendo terminare il ciclo prematuramente dopo un tentativo di
-divisione per zero:
-
-@example
-$ @kbd{gawk -f pi.awk}
-@print{} 3.215390309173475
-@print{} 3.159659942097510
-@print{} 3.146086215131467
-@print{} 3.142714599645573
-@dots{}
-@print{} 3.224515243534819
-@print{} 2.791117213058638
-@print{} 0.000000000000000
-@error{} gawk: pi.awk:6: fatale: tentativo di dividere per zero
-@end example
-
-Ecco un altro esempio in cui l'inaccuratezza nelle rappresentazioni interne
-porta a un risultato inatteso:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # esegue il ciclo cinque volte (?)}
-> @kbd{i++}
-> @kbd{print i}
-> @kbd{@}'}
-@print{} 4
-@end example
-
-@node Ottenere la precisione
-@subsection Ottenere la precisione voluta
-
-Pu@`o il calcolo con precisione arbitraria dare risultati esatti? Non ci sono
-risposte facili. Le regole standard dell'algebra spesso non valgono
-nei calcoli con precisione arbitraria.
-Tra le altre cose, le leggi distributiva e associativa non sono rispettate
-completamente, e l'ordine dell'operazione pu@`o essere importante per
-il calcolo.
-Errori di arrotondamento, perdite di precisione che si accumulano, e
-valori molto vicini allo zero sono spesso causa di problemi.
-
-Quando @command{gawk} verifica l'eguaglianza delle espressioni
-@samp{0.1 + 12.2} e @samp{12.3} usando l'aritmetica a doppia precisione della
-macchina, decide che non sono uguali! (@xref{Confronti tra valori in VM}.)
-Si pu@`o ottenere il risultato cercato aumentando la precisione; 56 bit in
-questo caso sono sufficienti:
-
-@example
-$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 1
-@end example
-
-Se aggiungere pi@`u bit @`e una buona cosa, aggiungerne ancora di pi@`u
-@`e meglio?
-Ecco cosa succede se si usa un valore di @code{PREC} ancora pi@`u alto:
-
-@example
-$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 0
-@end example
-
-Non @`e un bug di @command{gawk} o della libreria MPFR.
-@`E facile dimenticare che il numero finito di bit usato per memorizzare il
-valore spesso @`e solo un'approssimazione dopo un opportuno arrotondamento. Il
-test di uguaglianza riesce se e solo se @emph{tutti} i bit dei due operandi
-sono esattamente gli stessi. Poich@'e questo non @`e necessariamente vero dopo un
-calcolo in virgola mobile con una determinata precisione e con una modalit@`a di
-arrotondamento valida, un test di eguaglianza convenzionale potrebbe non
-riuscire. Invece, il test riesce confrontando i due numeri per vedere se la
-differenza tra di loro rientra in un delta accettabile.
-
-In applicazioni dove sono sufficienti fino a 15 cifre decimali,
-il calcolo in doppia precisione eseguito dall'hardware del computer
-pu@`o essere una buona soluzione,
-e in genere @`e pi@`u veloce. Per@`o bisogna tener presente che ogni operazione in
-virgola mobile pu@`o subire un nuovo errore di arrotondamento con conseguenze
-catastrofiche, come si @`e visto nel precedente tentativo di calcolare il valore
-di @value{PI}.
-In tali casi una precisione supplementare pu@`o aumentare la stabilit@`a e
-l'accuratezza del calcolo.
-
-Oltre a ci@`o, bisogna tenere conto del fatto che
-addizioni ripetute non sono necessariamente equivalenti a una moltiplicazione
-nell'aritmetica in virgola mobile. Nell'esempio visto in
-@ref{Gli errori si sommano}:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # ciclo eseguito cinque volte (?)}
-> @kbd{i++}
-> @kbd{print i}
-> @kbd{@}'}
-@print{} 4
-@end example
-
-@noindent
-non @`e detto che, scegliendo per @code{PREC} un valore arbitrariamente alto, si
-riesca a ottenere il risultato corretto. La riformulazione del problema in
-questione @`e spesso il modo corretto di comportari in tali situazioni.
-
-@node Tentare di arrotondare
-@subsection Tentare di aggiungere bit di precisione e arrotondare
-
-Invece dell'aritmetica in virgola mobile con precisione arbitraria,
-spesso tutto ci@`o di cui si ha bisogno @`e un aggiustamento della logica
-o di un diverso ordine delle operazioni nei calcoli.
-La stabilit@`a e l'accuratezza del calcolo di @value{PI}
-nel primo esempio possono essere migliorata usando la seguente semplice
-trasformazione algebrica:
-
-@example
-(sqrt(x * x + 1) - 1) / x @equiv{} x / (sqrt(x * x + 1) + 1)
-@end example
-
-@noindent
-Dopo aver fatto questo cambiamento, il programma converge verso
-@value{PI} in meno di 30 iterazioni:
-
-@example
-$ @kbd{gawk -f pi2.awk}
-@print{} 3.215390309173473
-@print{} 3.159659942097501
-@print{} 3.146086215131436
-@print{} 3.142714599645370
-@print{} 3.141873049979825
-@dots{}
-@print{} 3.141592653589797
-@print{} 3.141592653589797
-@end example
-
-@node Impostare la precisione
-@subsection Impostare la precisione
-
-@command{gawk} usa una precisione di lavoro a livello globale; non tiene
-traccia della precisione e accuratezza dei singoli numeri. Eseguendo
-un'operazione aritmetica o chiamando una funzione predefinita, il risultato
-viene arrotondato alla precisione di lavoro. La precisione di lavoro di default
-@`e di 53 bit, modificabile usando la variabile predefinita @code{PREC}. Si pu@`o
-anche impostare il valore a una delle stringhe predefinite (non importa se
-scritte in maiuscolo o minuscolo) elencate in
-@ref{table-predefined-precision-strings},
-per emulare un formato binario che segue lo standard IEEE 754.
-
-@float Tabella,table-predefined-precision-strings
-@caption{Stringhe di precisione predefinita per @code{PREC}}
-@multitable {@code{"double"}} {12345678901234567890123456789012345}
-@headitem @code{PREC} @tab formato binario IEEE 754
-@item @code{"half"} @tab 16-bit mezza precisione
-@item @code{"single"} @tab 32-bit singole precisione di base
-@item @code{"double"} @tab 64-bit doppia precisione di base
-@item @code{"quad"} @tab 128-bit quadrupla precisione di base
-@item @code{"oct"} @tab 256-bit ottupla precisione
-@end multitable
-@end float
-
-Il seguente esempio illustra gli effetti del cambiamento di precisione
-sulle operazioni aritmetiche:
-
-@example
-$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0}
-> @kbd{PREC = "double"; print x + 0 @}'}
-@print{} 1e-400
-@print{} 0
-@end example
-
-@quotation ATTENZIONE
-Diffidare delle costanti in virgola mobile! Quando si legge una costante in
-virgola mobile dal codice sorgente di un programma, @command{gawk} usa la
-precisione di default (quella del formato @code{double} di C), a meno che non
-venga richiesto, tramite la variabile speciale @code{PREC} fornita
-sulla riga di comando, di memorizzarla internamente come un numero MPFR.
-Cambiare la precisione tramite @code{PREC} nel testo del programma @emph{non}
-cambia la precisione di una costante.
-
-Se si deve rappresentare una costante in virgola mobile con una precisione
-maggiore di quella di default e non @`e possibile usare un assegnamento a
-@code{PREC} da riga di comando, si dovrebbe definire la costante o come
-stringa, o come numero razionale, ove possibile. L'esempio seguente illustra le
-differenze tra i diversi modi di stampare una costante in virgola mobile:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'}
-@print{} 0.1000000000000000055511151
-$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'}
-@print{} 0.1000000000000000000000000
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'}
-@print{} 0.1000000000000000000000000
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
-@print{} 0.1000000000000000000000000
-@end example
-@end quotation
-
-@node Impostare modi di arrotondare
-@subsection Impostare la modalit@`a di arrotondamento
-
-La variabile @code{ROUNDMODE} permette di controllare a livello di programma
-la modalit@`a di arrotondamento.
-La corrispondenza tra @code{ROUNDMODE} e le modalit@`a di arrotondamento IEEE
-@`e mostrata in @ref{table-gawk-rounding-modes}.
-
-@float Tabella,table-gawk-rounding-modes
-@caption{Modalit@`a di arrotondamento in @command{gawk} }
-@multitable @columnfractions .45 .30 .25
-@headitem Modalit@`a di arrotondamento @tab Nome IEEE @tab @code{ROUNDMODE}
-@item Arrotonda al pi@`u vicino, o a un numero pari @tab @code{roundTiesToEven} @tab @code{"N"} o @code{"n"}
-@item Arrotonda verso infinito @tab @code{roundTowardPositive} @tab @code{"U"} o @code{"u"}
-@item Arrotonda verso meno infinito @tab @code{roundTowardNegative} @tab @code{"D"} o @code{"d"}
-@item Arrotonda verso zero (troncamento) @tab @code{roundTowardZero} @tab @code{"Z"} o @code{"z"}
-@item Arrotonda al pi@`u vicino, o per eccesso @tab @code{roundTiesToAway} @tab @code{"A"} o @code{"a"}
-@end multitable
-@end float
-
-@code{ROUNDMODE} ha @code{"N"} come valore di default, ovvero si usa la
-modalit@`a di arrotondamento IEEE 754 @code{roundTiesToEven}.
-In @ref{table-gawk-rounding-modes}, il valore @code{"A"} seleziona
-@code{roundTiesToAway}. Questo @`e applicabile solo se la versione in uso
-della libreria MPFR lo supporta; altrimenti, l'impostazione di @code{ROUNDMODE}
-ad @code{"A"} non ha alcun effetto.
-
-La modalit@`a di default @code{roundTiesToEven} @`e la pi@`u preferita, ma allo
-stesso tempo
-la meno intuitiva. Questo metodo fa la cosa ovvia per la maggior parte dei
-valori, arrotondandoli per eccesso o per difetto alla cifra pi@`u prossima.
-Per esempio, arrotondando 1.132 alle due cifre decimali si ottiene 1.13,
-e 1.157 viene arrotondato a 1.16.
-
-Tuttavia, se si deve arrotondare un valore posto esattamente a met@`a strada,
-le cose non funzionano come probabilmente si insegna a scuola.
-In questo caso, il numero @`e arrotondato alla cifra @emph{pari} pi@`u prossima.
-Cos@`{@dotless{i}} arrotondando 0.125 alle due cifre si arrotonda per difetto a 0.12,
-ma arrotondando 0.6875 alle tre cifre si arrotonda per eccesso a 0.688.
-Probabilmente ci si @`e gi@`a imbattuti in questa modalit@`a di arrotondamento
-usando @code{printf} per formattare numeri a virgola mobile.
-Per esempio:
-
-@example
-BEGIN @{
- x = -4.5
- for (i = 1; i < 10; i++) @{
- x += 1.0
- printf("%4.1f => %2.0f\n", x, x)
- @}
-@}
-@end example
-
-@noindent
-produce il seguente output quando viene eseguito sul sistema
-dell'autore:@footnote{@`E possibile che l'output sia completamente diverso, se la
-libreria C presente nel sistema in uso non si conforma, per @code{printf},
-alla regola IEEE 754
-di arrotondamento al valore pari in caso di equidistanza.}
-
-@example
--3.5 => -4
--2.5 => -2
--1.5 => -2
--0.5 => 0
- 0.5 => 0
- 1.5 => 2
- 2.5 => 2
- 3.5 => 4
- 4.5 => 4
-@end example
-
-La teoria che sta dietro alla regola
-@code{roundTiesToEven} @`e che gli arrotondamenti di
-valori equidistanti in eccesso e in difetto si distribuiscono pi@`u o meno
-uniformemente, con la possibile conseguenza che errori di arrotondamento
-ripetuti tendono ad annullarsi a vicenda. Questa @`e la modalit@`a di
-arrotondamento di default per funzioni e operatori di calcolo secondo IEEE 754.
-
-Le altre modalit@`a di arrotondamento sono usate raramente. Gli arrotondamenti
-verso l'infinito (@code{roundTowardPositive}) e verso il meno infinito
-(@code{roundTowardNegative}) vengono spesso usati per eseguire calcoli su
-intervalli, dove si adotta questa modalit@`a di arrotondamento per calcolare
-i limiti superiore e inferiore per l'intervallo di valori in uscita.
-La modalit@`a
-@code{roundTowardZero} pu@`o essere usata per convertire numeri a virgola mobile
-in numeri interi. La modalit@`a di arrotondamento @code{roundTiesToAway}
-arrotonda il risultato al numero pi@`u vicino, e in caso di equidistanza
-arrotonda per eccesso.
-
-Qualche esperto di analisi numerica dir@`a che la scelta dello stile di
-arrotondamento ha un grandissimo impatto sul risultato finale, e consiglier@`a
-di attendere sino al risultato finale dopo ogni arrotondamento. Invece,
-spesso si possono evitare problemi legati a errori di arrotondamento
-impostando all'inizio la precisione a un valore sufficientemente maggiore
-della precisione desiderata, in modo che il cumulo degli errori di
-arrotondamento non influisca sul
-risultato finale. Se si ha il dubbio che i risultati del calcolo contengano
-un'accumulazione di errori di arrotondamento, occorre, per accertare la cosa,
-controllare se si verifica una differenza significativa nell'output
-cambiando la modalit@`a di arrotondamento.
-
-@node Interi a precisione arbitraria
-@section Aritmetica dei numeri interi a precisione arbitraria con @command{gawk}
-@cindex numeri interi a precisione arbitraria
-@cindex interi a precisione arbitraria
-@cindex precisione arbitraria, interi a
-
-Quando viene specificata l'opzione @option{-M},
-@command{gawk} esegue tutti i calcoli sui numeri interi usando gli interi a
-precisione arbitraria della libreria GMP. Qualsiasi numero che appaia come un
-intero in un sorgente o in un @value{DF} @`e memorizzato come intero a precisione
-arbitraria. La dimensione del numero intero ha come limite solo la memoria
-disponibile. Per esempio, il seguente programma calcola
-@iftex
-@math{5^{4^{3^{2}}}},
-@end iftex
-@ifinfo
-5^4^3^2,
-@end ifinfo
-@ifnottex
-@ifnotinfo
-5@sup{4@sup{3@sup{2}}},
-@end ifnotinfo
-@end ifnottex
-il cui risultato @`e oltre i limiti degli ordinari valori a virgola mobile a
-doppia precisione dei processori:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{}
-> @kbd{x = 5^4^3^2}
-> @kbd{print "numero di cifre =", length(x)}
-> @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)}
-> @kbd{@}'}
-@print{} numero di cifre = 183231
-@print{} 62060698786608744707 ... 92256259918212890625
-@end example
-
-Se invece si dovesse calcolare lo stesso valore usando valori a virgola mobile
-con precisione arbitraria, la precisione necessaria per il risultato corretto
-(usando
-la formula
-@iftex
-@math{prec = 3.322 @cdot dps})
-sarebbe @math{3.322 @cdot 183231},
-@end iftex
-@ifnottex
-@ifnotdocbook
-@samp{prec = 3.322 * dps})
-sarebbe 3.322 x 183231,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>)
-would be
-<emphasis>prec</emphasis> = 3.322 &sdot; 183231,
-@end docbook
-o 608693.
-
-Il risultato di un'operazione aritmetica tra un intero e un valore a virgola
-mobile @`e un valore a virgola mobile con precisione uguale alla precisione di
-lavoro. Il seguente programma calcola l'ottavo termine nella successione di
-Sylvester@footnote{Weisstein, Eric W.
-@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
-@w{(@url{http://mathworld.wolfram.com/SylvestersSequence.html}).}}
-usando una ricorrenza:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{}
-> @kbd{s = 2.0}
-> @kbd{for (i = 1; i <= 7; i++)}
-> @kbd{s = s * (s - 1) + 1}
-> @kbd{print s}
-> @kbd{@}'}
-@print{} 113423713055421845118910464
-@end example
-
-Il risultato mostrato differisce dal numero effettivo,
-113.423.713.055.421.844.361.000.443,
-perch@'e la precisione di default di 53 bit non @`e suffciente per rappresentare
-esattamente il risultato in virgola mobile. Si pu@`o o aumentare la precisione
-(in questo caso bastano 100 bit), o sostituire la costante in virgola mobile
-@samp{2.0} con un intero, per eseguire tutti i calcoli usando l'aritmetica con
-gli interi per ottenere l'output corretto.
-
-A volte @command{gawk} deve convertire implicitamente un intero con precisione
-arbitraria in un valore a virgola mobile con precisione arbitraria.
-Ci@`o si rende necessario
-principalmente perch@'e la libreria MPFR non sempre prevede l'interfaccia
-necessaria per elaborare interi a precisione arbitraria o numeri di tipo
-eterogeneo come richiesto da un'operazione o funzione. In tal caso, la
-precisione viene impostata al minimo valore necessario per una conversione
-esatta, e non viene usata la precisione di lavoro. Se
-questo non @`e quello di cui si ha bisogno o che si vuole, si pu@`o ricorrere a un
-sotterfugio e convertire preventivamente l'intero in un valore a virgola
-mobile, come qui di seguito:
-
-@example
-gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
-@end example
-
-Si pu@`o evitare completamente questo passaggio specificando il numero come
-valore a virgola mobile fin dall'inizio:
-
-@example
-gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
-@end example
-
-Si noti che, per questo specifico esempio, probabilmente @`e meglio
-semplicemente specificare:
-
-@example
-gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
-@end example
-
-Dividendo due interi a precisione arbitraria con @samp{/} o con @samp{%}, il
-risultato @`e tipicamente un valore a virgola mobile con precisione arbitraria
-(a meno che il risultato non sia un numero intero esatto).
-Per eseguire divisioni intere o calcolare moduli con interi a precisione
-arbitraria, usare la funzione predefinita
-@code{intdiv()} (@pxref{Funzioni numeriche}).
-
-Si pu@`o simulare la funzione @code{intdiv()} in @command{awk} standard
-usando questa funzione definita dall'utente:
-
-@example
-@c file eg/lib/intdiv.awk
-# intdiv --- fa una divisione intera
-
-@c endfile
-@ignore
-@c file eg/lib/intdiv.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# July, 2014
-#
-# Name changed from div() to intdiv()
-# April, 2015
-
-@c endfile
-
-@end ignore
-@c file eg/lib/intdiv.awk
-function intdiv(numerator, denominator, result)
-@{
- split("", result)
-
- numerator = int(numerator)
- denominator = int(denominator)
- result["quotient"] = int(numerator / denominator)
- result["remainder"] = int(numerator % denominator)
-
- return 0.0
-@}
-@c endfile
-@end example
-
-Il seguente programma d'esempio, proposto da Katie Wasserman,
-usa @code{intdiv()} per
-calcolare le cifre di @value{PI} al numero di cifre significative
-che si @`e scelto di impostare:
-
-@example
-@c file eg/prog/pi.awk
-# pi.awk --- calcola le cifre di pi
-@c endfile
-@c endfile
-@ignore
-@c file eg/prog/pi.awk
-#
-# Katie Wasserman, katie@@wass.net
-# August 2014
-@c endfile
-@end ignore
-@c file eg/prog/pi.awk
-
-BEGIN @{
- cifre = 100000
- due = 2 * 10 ^ cifre
- pi = due
- for (m = cifre * 4; m > 0; --m) @{
- d = m * 2 + 1
- x = pi * m
- intdiv(x, d, risultato)
- pi = risultato["quotient"]
- pi = pi + due
- @}
- print pi
-@}
-@c endfile
-@end example
-
-@ignore
-Date: Wed, 20 Aug 2014 10:19:11 -0400
-To: arnold@skeeve.com
-From: Katherine Wasserman <katie@wass.net>
-Subject: Re: computation of digits of pi?
-
-Arnold,
-
->The program that you sent to compute the digits of pi using div(). Is
->that some standard algorithm that every math student knows? If so,
->what's it called?
-
-It's not that well known but it's not that obscure either
-
-It's Euler's modification to Newton's method for calculating pi.
-
-Take a look at lines (23) - (25) here: http://mathworld.wolfram.com/PiFormulas.htm
-
-The algorithm I wrote simply expands the multiply by 2 and works from the innermost expression outwards. I used this to program HP calculators because it's quite easy to modify for tiny memory devices with smallish word sizes.
-
-http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
-
--Katie
-@end ignore
-
-Quando gli fu chiesto dell'algoritmo usato, Katie rispose:
-
-@quotation
-Non @`e quello pi@`u noto ma nemmeno quello pi@`u incomprensibile.
-@`E la variante di Eulero al metodo di Newton per il calcolo del Pi greco.
-Si vedano le righe (23) - (25) nel sito:
-@uref{http://mathworld.wolfram.com/PiFormulas.html}.
-
-L'algoritmo che ho scritto semplicemente espande il moltiplicare per 2 e
-lavora dall'espressione pi@`u interna verso l'esterno. Ho usato questo per
-programmare delle calcolatrici HP perch@'e @`e piuttosto facile da adattare ai
-dispositivi di scarsa memoria con dimensioni di parola piuttosto piccole.
-Si veda
-@uref{http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899}.
-@end quotation
-
-@node Problemi virgola mobile POSIX
-@section Confronto tra standard e uso corrente
-
-Per diverso tempo, @command{awk} ha convertito le stringhe dall'aspetto non
-numerico nel valore numerico zero, quando richiesto. Per di pi@`u, la
-definizione originaria del linguaggio e lo standard POSIX originale prevedevano
-che @command{awk} riconoscesse solo i numeri decimali (base 10), e non i numeri
-ottali (base 8) o esadecimali (base 16).
-
-Le modifiche nel linguaggio degli standard POSIX 2001 e 2004 possono essere
-interpretate nel senso che @command{awk} debba fornire delle funzionalit@`a
-aggiuntive. Queste sono:
-
-@itemize @value{BULLET}
-@item
-Interpretazione del valore dei dati a virgola mobile specificati in notazione
-esadecimale (p.es., @code{0xDEADBEEF}). (Da notare: valore dei dati letti,
-@emph{non} costanti facenti parte del codice sorgente.)
-
-@item
-Supporto per i valori a virgola mobile speciali IEEE 754 ``not a number''
-(NaN), pi@`u infinito (``inf'') e meno infinito (``@minus{}inf'').
-In particolare, il formato per questi valori @`e quello specificato dallo
-standard C ISO 1999, che non distingue maiuscole/minuscole e pu@`o consentire
-caratteri aggiuntivi dipendenti dall'implementazione dopo il @samp{nan}, e
-consentire o @samp{inf} o @samp{infinity}.
-@end itemize
-
-Il primo problema @`e che entrambe le modifiche sono deviazioni evidenti
-dalla prassi consolidata:
-
-@itemize @value{BULLET}
-@item
-Il manutentore di @command{gawk} crede che supportare i valori a virgola mobile
-esadecimali, nello specifico, sia sbagliato, e che non sia mai stata intenzione
-dell'autore originale di introdurlo nel linguaggio.
-
-@item
-Consentire che stringhe completamente alfabetiche abbiano valori numerici
-validi @`e anch'essa una deviazione molto marcata dalla prassi consolidata.
-@end itemize
-
-Il secondo problema @`e che il manutentore di @command{gawk} crede che questa
-interpretazione dello standard, che richiede una certa dimestichezza col
-linguaggio giuridico per essere compresa, non sempre @`e stata
-colta dai normali sviluppatori. In altre parole, ``Sappiamo come siete
-arrivati sin qui, ma non pensiamo che questo sia il posto dove volete essere.''
-
-Recependo queste argomentazioni, e cercando nel contempo di assicurare la
-compatibilit@`a con le versioni precedenti dello standard, lo standard POSIX 2008
-ha aggiunto delle formulazioni esplicite per consentire l'uso da parte di
-@command{awk}, solo a richiesta, dei valori a virgola mobile esadecimali e
-dei valori speciali
-``@dfn{not a number}'' e infinito.
-
-Sebbene il manutentore di @command{gawk} continui a credere che introdurre
-queste funzionalit@`a sia sconsigliabile, ci@`o nonostante, sui sistemi che
-supportano i valori in virgola mobile IEEE, sembra giusto fornire
-@emph{qualche}
-possibilit@`a di usare i valori NaN e infinito. La soluzione implementata
-in @command{gawk} @`e questa:
-
-@itemize @value{BULLET}
-@item
-Se @`e stata specificata l'opzione da riga di comando @option{--posix},
-@command{gawk} non
-interviene. I valori di stringa sono passati direttamente alla funzione
-@code{strtod()} della libreria di sistema, e se quest'ultima restituisce
-senza errori un valore numerico,
-esso viene usato.@footnote{L'avete voluto, tenetevelo.}
-Per definizione, i risultati non sono portabili su diversi sistemi;
-e sono anche piuttosto sorprendenti:
-
-@example
-$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'}
-@print{} nan
-$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'}
-@print{} 3735928559
-@end example
-
-@item
-Senza l'opzione @option{--posix}, @command{gawk} interpreta i quattro valori di stringa
-@samp{+inf},
-@samp{-inf},
-@samp{+nan}
-e
-@samp{-nan}
-in modo speciale, producendo i corrispondenti valori numerici speciali.
-Il segno iniziale serve per segnalare a @command{gawk} (e all'utente)
-che il valore @`e realmente numerico. I numeri a virgola mobile esadecimali
-non sono consentiti (a meno di non usare anche @option{--non-decimal-data},
-che @emph{non} @`e consigliabile). Per esempio:
-
-@example
-$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
-@print{} 0
-$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
-@print{} nan
-$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
-@print{} 0
-@end example
-
-@command{gawk} ignora la distinzione maiuscole/minuscole nei quattro valori
-speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa.
-@end itemize
-
-@node Sommario virgola mobile
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-La maggior parte dell'aritmetica al calcolatore @`e fatta usando numeri interi
-oppure
-valori a virgola mobile. L'@command{awk} standard usa valori a virgola mobile
-a doppia precisione.
-
-@item
-Nei primi anni '90 Barbie disse erroneamente, ``L'ora di matematica @`e
-ostica!'' Sebbene la matematica non sia ostica, l'aritmetica a virgola
-mobile non @`e proprio come la
-matematica ``carta e penna'', e bisogna prestare attenzione:
-
-@c nested list
-@itemize @value{MINUS}
-@item
-Non tutti i numeri possono essere rappresentati in modo esatto.
-
-@item
-Per confrontare dei valori bisognerebbe usare un delta, invece di farlo
-direttamente con @samp{==} e @samp{!=}.
-
-@item
-Gli errori si accumulano.
-
-@item
-Le operazioni non sempre sono esattamente associative o distributive.
-@end itemize
-
-@item
-Aumentare l'accuratezza pu@`o essere d'aiuto, ma non @`e una panacea.
-
-@item
-Spesso, aumentare la precisione e poi arrotondare al numero di cifre
-desiderato produce risultati soddisfacenti.
-
-@item
-Specificare l'opzione @option{-M} (o @option{--bignum}) per abilitare
-il calcolo MPFR.
-Usare @code{PREC} per impostare la precisione in bit, e
-@code{ROUNDMODE} per impostare la modalit@`a di arrotondamento tra quelle
-previste nello standard IEEE 754.
-
-@item
-Specificando l'opzione @option{-M}, @command{gawk} esegue calcoli su interi a precisione
-arbitraria usando la libreria GMP. In tal modo si ha una maggiore velocit@`a e
-una pi@`u efficiente allocazione dello spazio rispetto all'uso di MPFR per
-eseguire gli stessi calcoli.
-
-@item
-Ci sono diverse aree per quanto attiene ai numeri a virgola mobile in cui
-@command{gawk} @`e in disaccordo con lo standard POSIX.
-@`E importante averlo ben presente.
-
-@item
-In generale, non vi @`e alcun bisogno di essere eccessivamente diffidenti verso i
-risultati del calcolo in virgola mobile. La lezione da ricordare @`e che
-il calcolo in virgola mobile @`e sempre pi@`u complesso di quello che si fa con
-carta e penna. Per trarre vantaggio dalla potenza del calcolo in virgola
-mobile, bisogna conoscere i suoi limiti e stare all'interno di essi.
-Per la maggior parte degli usi occasionali del calcolo in virgola mobile, si
-possono ottenere i risultati attesi semplicemente arrotondando la
-visualizzazione dei risultati finali al giusto numero di cifre decimali
-significative.
-
-@item
-Come consiglio generale, evitare di rappresentare dati numerici in maniera
-tale da far sembrare che la precisione sia maggiore di quella effettivamente
-necessaria.
-
-@end itemize
-
-@node Estensioni dinamiche
-@chapter Scrivere estensioni per @command{gawk}
-@cindex estensioni caricate dinamicamente
-@cindex dinamiche, estensioni
-
-@`E possibile aggiungere nuove funzioni, scritte in C o C++, a @command{gawk}
-usando librerie caricate dinamicamente. Questa funzionalit@`a @`e disponibile
-su sistemi che supportano le funzioni C @code{dlopen()} e @code{dlsym()}.
-Questo @value{CHAPTER} descrive come creare estensioni usando codice scritto
-in C o C++.
-
-Chi @`e completamente digiuno di programmazione in C pu@`o tranquillamente
-saltare questo @value{CHAPTER}, ma potrebbe valer la pena di dare un'occhiata
-alla documentazione sulle estensioni che sono installate insieme a
-@command{gawk} (@pxref{Esempi di estensione}),
-e alle informazioni sul progetto @code{gawkextlib} (@pxref{gawkextlib}).
-Gli esempi di estensione sono automaticamente compilati e installati quando
-si installa @command{gawk}.
-
-@quotation NOTA
-Se si specifica l'opzione @option{--sandbox}, le estensioni non sono
-disponibili
-(@pxref{Opzioni}).
-@end quotation
-
-@menu
-* Introduzione alle estensioni:: Cos'@`e un'estensione.
-* Licenza delle estensioni:: Una nota riguardo al tipo di licenza.
-* Panoramica sul meccanismo delle estensioni:: Una panoramica sul meccanismo
- delle estensioni.
-* Descrizione dell'API delle estensioni:: Una descrizione completa dell'API.
-* Trovare le estensioni:: Come @command{gawk} trova le estensioni
- compilate.
-* Esempio di estensione:: Esempio di codice C di un'estensione.
-* Esempi di estensione:: Le estensioni di esempio incluse con
- @command{gawk}.
-* gawkextlib:: Il progetto @code{gawkextlib}.
-* Sommario delle estensioni:: Sommario delle estensioni.
-* Esercizi sulle estensioni:: Esercizi.
-@end menu
-
-@node Introduzione alle estensioni
-@section Cos'@`e un'estensione
-
-@cindex plug-in
-Un'@dfn{estensione} (talora chiamata @dfn{plug-in}) @`e un frammento di codice
-compilato esternamente che @command{gawk} pu@`o caricare in fase di esecuzione
-per ottenere funzionalit@`a ulteriori, che vanno ad aggiungersi a quelle di
-@command{gawk} descritte nel resto di questo @value{DOCUMENT}.
-
-Le estensioni sono utili perch@'e consentono (ovviamente) di estendere le
-funzionalit@`a di @command{gawk}. Per esempio, possono permettere l'uso di
-@dfn{chiamate di sistema} (come @code{chdir()} per cambiare directory)
-e di altre routine di libreria C potenzialmente utili. Come per la maggior
-parte del software, ``il cielo @`e il limite''; se si riesce a immaginare
-qualcosa che si vuol fare e che @`e possibile programmare in C o C++,
-si pu@`o scrivere un'estensione che lo faccia!
-
-Le estensioni sono scritte in C o C++, usando l'API (@dfn{Application
-Programming Interface}) definita per questo scopo dagli sviluppatori di
-@command{gawk}. Il resto di questo @value{CHAPTER} descrive
-le possibilit@`a offerte dall'API e come usarle,
-e illustra una piccola estensione di esempio. Inoltre, sono documentati
-gli esempi di estensione inclusi nella distribuzione di @command{gawk}
-e viene descritto il progetto @code{gawkextlib}.
-@ifclear FOR_PRINT
-@xref{Progetto delle estensioni}, per una disamina degli obiettivi e del
-progetto del meccanismo delle estensioni.
-@end ifclear
-@ifset FOR_PRINT
-Si veda @uref{http://www.gnu.org/software/gawk/manual/html_node/estensione-Design.html}
-per una disamina degli obiettivi e del
-progetto del meccanismo delle estensioni.
-@end ifset
-
-@node Licenza delle estensioni
-@section Tipo di licenza delle estensioni
-
-Ogni estensione dinamica dev'essere distribuita in base a una licenza che sia
-compatibile con la licenza GNU GPL (@pxref{Copia}).
-
-Per far sapere a @command{gawk} che la licenza @`e quella corretta,
-l'estensione deve definire il simbolo globale
-@code{plugin_is_GPL_compatibile}. Se tale simbolo non @`e stato definito,
-@command{gawk} termina con un messaggio di errore fatale al momento del
-caricamente dell'estensione.
-
-Il tipo dichiarato per il suddetto simbolo dev'essere @code{int}. Esso non
-deve tuttavia essere presente in ogni sezione allocata.
-Il controllo in essere si limita a constatare che quel simbolo esiste a
-livello globale.
-Qualcosa del genere pu@`o essere sufficiente:
-
-@example
-int plugin_is_GPL_compatible;
-@end example
-
-@node Panoramica sul meccanismo delle estensioni
-@section Una panoramica sul funzionamento ad alto livello
-
-La comunicazione tra
-@command{gawk} e un'estensione @`e bidirezionale. Dapprima, quando
-un'estensione @`e caricata, @command{gawk} le passa un puntatore a una struttura
-(@code{struct}) i cui campi sono dei puntatori di funzione.
-@ifnotdocbook
-Questo si pu@`o vedere in @ref{figura-carica-estensione}.
-@end ifnotdocbook
-@ifdocbook
-Questo si pu@`o vedere in @inlineraw{docbook, <xref linkend="figura-carica-estensione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-carica-estensione
-@caption{Caricamento dell'estensione}
-@ifclear SMALLPRINT
-@center @image{api-figura1, , , Caricamento dell'estensione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura1, 11cm, , Caricamento dell'estensione}
-@end ifset
-
-@end float
-@end ifnotdocbook
-
-@docbook
-<figure id="figura-carica-estensione" float="0">
-<title>Caricamento dell'estensione</title>
-<mediaobject>
-<imageobject role="web"><imagedata fileref="api-figura1.png" format="PNG"/></imageobject>
-</mediaobject>
-</figure>
-@end docbook
-
-L'estensione @`e in grado di chiamare funzioni all'interno di @command{gawk}
-utilizzando questi puntatori a funzione, in fase di esecuzione, senza aver
-bisogno di accedere (in fase di compilazione), ai simboli di @command{gawk}.
-Uno di questi puntatori a funzione punta a una funzione che serve per
-``registrare'' nuove funzioni.
-@ifnotdocbook
-Questo @`e mostrato in @ref{figura-registrare-una-nuova-funzione}.
-@end ifnotdocbook
-@ifdocbook
-Questo @`e shown in @inlineraw{docbook, <xref linkend="figura-registrare-una-nuova-funzione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-registrare-una-nuova-funzione
-@caption{Registrare una nuova funzione}
-@ifclear SMALLPRINT
-@center @image{api-figura2, , , Registrare una nuova funzione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura2, 11cm , , Registrare una nuova funzione}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-Nella direzione opposta, l'estensione registra le sue nuove funzioni
-con @command{gawk} passando dei puntatori che puntano alle funzioni che
-implementano la nuova funzionalit@`a, (p.es. @code{do_chdir()}). @command{gawk}
-associa il puntatore a funzione con un nome ed @`e in grado di chiamarlo in
-seguito, usando una convenzione di chiamata predefinita.
-@ifnotdocbook
-Questo @`e mostrato in @ref{figura-chiamata-nuova-funzione}.
-@end ifnotdocbook
-@ifdocbook
-Questo @`e mostrato in @inlineraw{docbook, <xref linkend="figura-chiamata-nuova-funzione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-chiamata-nuova-funzione
-@caption{Chiamata della nuova funzione}
-@ifclear SMALLPRINT
-@center @image{api-figura3, , , Chiamata della nuova funzione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura3,11cm , , Chiamata della nuova funzione}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-La funzione @code{do_@var{xxx}()}, a sua volta, utilizza i puntatori a
-funzione nella struttura (@code{struct}) API per svolgere il proprio compito,
-come aggiornare variabili o vettori, stampare messaggi, impostare la
-variabile @code{ERRNO}, e cos@`{@dotless{i}} via.
-
-Delle macro di servizio rendono la chiamata effettuata utilizzando
-i puntatori simile a quella delle funzioni normali, in modo che il codice
-sorgente delle estensioni rimanga sufficientemente leggibile e comprensibile.
-
-Sebbene tutto ci@`o possa sembrare piuttosto complesso, il risultato @`e che il
-codice sorgente dell'estensione @`e abbastanza intuitivo da scrivere e da
-leggere. Lo si pu@`o constatare nell'estensione di esempio
-@file{filefuncs.c}
-(@pxref{Esempio di estensione}), come pure nel codice @file{testext.c},
-che testa l'interfaccia di programmazione (API).
-
-Ecco alcuni ulteriori dettagli:
-
-@itemize @value{BULLET}
-@item
-L'API fornisce accesso ai valori delle variabili @command{gawk}
-@code{do_@var{xxx}}, che memorizzano opzioni della riga di comando come
-@code{do_lint}, @code{do_profiling}, e cos@`{@dotless{i}} via (@pxref{Variabili dell'estensione API}).
-Questi valori sono solo informativi: un'estensione non pu@`o modificarli
-all'interno di @command{gawk}. Oltre a ci@`o, il tentativo di assegnare loro
-dei valori produce un errore quando l'estensione viene compilata.
-
-@item
-L'API fornisce anche i numeri che identificano la specifica versione di
-@command{gawk}, in modo che un'estensione possa controllare se il
-comando @command{gawk} che l'ha caricata @`e in grado di supportare le
-funzionalit@`a utilizzate nell'estensione. (Discrepanze tra le versioni
-``non dovrebbero'' accadere, ma si sa come vanno @emph{queste} cose.)
-@xref{Versione dell'estensione} per ulteriori dettagli.
-@end itemize
-
-@node Descrizione dell'API delle estensioni
-@section Una descrizione completa dell'API
-@cindex estensioni, API delle
-@cindex API, delle estensioni
-
-Il codice sorgente scritto in C o C++ per un'estensione deve includere il
-file di intestazione
-@file{gawkapi.h}, che dichiara le funzioni e definisce i tipi di dati
-usati per comunicare con @command{gawk}.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-(non breve) @value{SECTION} descrive l'API in detttaglio.
-
-@menu
-* Intro funzioni API delle estensioni:: Introduzione alle funzioni dell'API.
-* Tipi di dati generali:: I tipi di dati.
-* Funzioni di allocazione memoria:: Funzioni per allocare memoria.
-* Funzioni di costruzione:: Funzioni per creare valori.
-* Funzioni di registrazione:: Funzioni per registrare cose con
- @command{gawk}.
-* Stampare messaggi:: Funzioni per stampare messaggi.
-* Aggiornare @code{ERRNO}:: Funzioni per aggiornare @code{ERRNO}.
-* Richiedere valori:: Come ottenere un valore.
-* Accedere ai parametri:: Funzioni per accedere ai parametri.
-* Accedere alla tabella simboli:: Funzioni per accedere alle variabili
- globali
-* Manipolazione di vettori:: Funzioni per lavorare coi vettori.
-* Ridirezione API:: Come accedere alla ridirezioni e
- modificarle.
-* Variabili dell'estensione API:: Variabili fornite dall'API.
-* Codice predefinito di un'estensione API:: Codice predefinito di
- interfaccia API.
-* Modifiche dalla versione API 1:: Modifiche dalla versione 1 dell'API.
-@end menu
-
-@node Intro funzioni API delle estensioni
-@subsection Introduzione alle funzioni dell'API
-
-L'accesso a funzionalit@`a interne a @command{gawk} @`e effettuato
-con una chiamata che usa i puntatori a funzione resi disponibili
-all'estensione.
-
-Puntatori a funzioni API sono previsti per i seguenti tipi di operazioni:
-
-@itemize @value{BULLET}
-@item
-Allocare, riallocare e liberare memoria.
-
-@item
-Registrare funzioni. Si possono registrare:
-
-@c nested list
-@itemize @value{MINUS}
-@item
-Funzioni di estensione
-@item
-Funzioni ausiliarie di pulizia (@dfn{callbacks})
-@item
-Una stringa di caratteri che identifica la versione
-@item
-Funzioni per analizzare l'input
-@item
-Funzioni per modificare l'output
-@item
-Processori bidirezionali
-@end itemize
-
-Tutti questi elementi sono spiegati dettagliatamente nel resto di questo @value{CHAPTER}.
-
-@item
-Stampare messaggi fatali, di avvertimento e quelli generati dall'opzione
-``lint''.
-
-@item
-Modificare @code{ERRNO} o annullarne il valore.
-
-@item
-Accedere a parametri, compresa la possibilit@`a di definire come vettore
-un parametro ancora indefinito.
-
-@item
-Accedere alla "tabella dei simboli": procurarsi il valore di una variabile
-globale, crearne una nuova o modificarne una gi@`a esistente.
-
-@item
-Creare ed eliminare valori nascosti; ci@`o rende possibile usare un
-particolare valore per pi@`u di una variabile, e pu@`o migliorare parecchio
-le prestazioni.
-
-@item
-Manipolare vettori:
-
-@itemize @value{MINUS}
-@item
-Ritrovare il valore di elementi del vettore, aggiungerne di nuovi,
-cancellare e modificare elementi esistenti.
-
-@item
-Ottenere il numero di elementi presenti in un vettore
-
-@item
-Creare un nuovo vettore
-
-@item
-Cancellare un intero vettore
-
-@item
-Appiattire un vettore per poter facilmente eseguire un ciclo, in stile C,
-su tutti i suoi indici ed elementi
-@end itemize
-
-@item
-Accedere a ridirezioni e manipolarle.
-
-@end itemize
-
-Alcune osservazioni riguardo all'uso dell'API:
-
-@itemize @value{BULLET}
-@item
-I seguenti tipi di variabili, macro e/o funzioni sono resi disponibili
-nel file @file{gawkapi.h}. Perch@'e siano utilizzabili, i rispettivi file di
-intestazione standard indicati devono essere stati specificati @emph{prima}
-di includere @file{gawkapi.h}:
-
-@c FIXME: Make this as a float at some point.
-@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}}
-@headitem Elemento C @tab File d'intestazione
-@item @code{EOF} @tab @code{<stdio.h>}
-@item valori di @code{errno} @tab @code{<errno.h>}
-@item @code{FILE} @tab @code{<stdio.h>}
-@item @code{NULL} @tab @code{<stddef.h>}
-@item @code{memcpy()} @tab @code{<string.h>}
-@item @code{memset()} @tab @code{<string.h>}
-@item @code{size_t} @tab @code{<sys/types.h>}
-@item @code{struct stat} @tab @code{<sys/stat.h>}
-@end multitable
-
-Per ragioni di portabilit@`a, specialmente per sistemi
-che non sono interamente aderenti agli standard, occorre assicurarsi di
-includere i file corretti nel modo corretto. Questa richiesta mira
-a mantenere il file @file{gawkapi.h} ordinato, invece che farlo diventare
-un'accozzaglia di problemi di portabilit@`a, quale si pu@`o vedere in alcune
-parti del codice sorgente di @command{gawk}.
-
-@item
-Il file @file{gawkapi.h} pu@`o essere incluso pi@`u volte, senza conseguenze
-negative. Tuttavia sarebbe meglio evitare di farlo, per uno
-stile di programmazione migliore.
-
-@item
-Sebbene l'API usi solo funzionalit@`a ISO C 90, c'@`e un'eccezione; le funzione
-``costruttrici'' usano la parola chiave @code{inline}. Se il compilatore in
-uso non supporta questa parola chiave, si dovrebbe specificare sulla
-riga di comando il parametro @samp{-Dinline=''} oppure usare gli strumenti
-Autotools GNU e includere un file
-@file{config.h} nel codice sorgente delle estensioni.
-
-@item
-Tutti i puntatori messi a disposizione da @command{gawk} puntano ad aree
-di memoria gestite da @command{gawk} e dovrebbero essere trattati
-dall'estensione come in sola lettura. Le aree di memoria che contengono @emph{tutte} le stringhe passate a
-@command{gawk} dall'estensione @emph{devono} provenire da una chiamata a
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()},
-e sono gestite da @command{gawk} da quel punto in avanti.
-
-@item
-L'API definisce parecchie semplici @code{struct} che mappano dei valori
-come sono visti da @command{awk}. Un valore pu@`o essere un numero @code{double}
-(a virgola mobile, in doppia precisione), una stringa o un
-vettore (come @`e il caso per i vettori multidimensionali o nella creazione di
-un nuovo vettore).
-
-I valori di tipo stringa sono costituiti da un puntatore e da una lunghezza,
-poich@'e nella stringa possono essere presenti dei caratteri @sc{nul}
-(zeri binari, che normalmente marcano la fine di una stringa).
-
-@quotation NOTA
-Di proposito, @command{gawk} immagazzina le stringhe usando la codifica
-multibyte correntemente in uso (come definita dalle variabili d'ambiente
-@env{LC_@var{xxx}}) e non usando dei caratteri larghi (ovvero due byte per
-ogni carattere). Ci@`o riflette il modo con cui @command{gawk} memorizza le
-stringhe internamente, e anche il modo in cui i caratteri sono
-verosimilmente letti dai file in input e scritti nei file in output.
-@end quotation
-
-@quotation NOTA
-I valori di una stringa passati a un'estensione da @command{gawk} hanno
-sempre un carattere @sc{nul} alla fine (come delimitatore). Quindi @`e
-possibile usare senza inconvenienti tali valori di stringa per chiamare
-funzioni di libreria standard e routine di sistema. Tuttavia, poich@'e
-@command{gawk} consente che all'interno di una stringa di dati possano
-essere presenti caratteri @sc{nul}, si dovrebbe controllare che la
-lunghezza di ogni stringa passata un'estensione coincida con il valore
-restituito dalla funzione @code{strlen()} per la stringa stessa.
-@end quotation
-
-@item
-Per ottenere un valore (p.es. quello di un parametro o quello di una
-variabile globale, oppure di un elemento di un vettore), l'estensione chiede
-un tipo specifico di variabile (numero, stringa,
-scalare, @dfn{value cookie} [si veda pi@`u avanti], vettore o ``undefined'').
-Quando la richiesta @`e
-``undefined,'' il valore restituito sar@`a quello originale della variabile in
-questione.
-
-In ogni caso, se la richiesta e il tipo effettivo della variabile non
-corrispondono, la funzione di accesso restituisce ``false'' e fornisce il
-tipo proprio della variabile, in modo che l'estensione possa, p.es.,
-stampare un messaggio di errore
-(del tipo ``ricevuto uno scalare, invece del vettore previsto'').
-
-@c This is documented in the header file and needs some expanding upon.
-@c The table there should be presented here
-@end itemize
-
-Si possono chiamare le funzioni dell'API usando i puntatori a funzione
-direttamente, ma l'interfaccia non @`e molto elegante. Per permettere al
-codice sorgente delle estensioni di assomigliare di pi@`u a un codice normale,
-il file di intestazione @file{gawkapi.h} definisce parecchie
-macro da usare nel codice sorgente dell'estensione.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} presenta le macro come se si trattasse di funzioni.
-
-@node Tipi di dati generali
-@subsection I tipi di dati di impiego generale
-
-@cindex Robbins, Arnold
-@cindex Ramey, Chet
-@quotation
-@i{Ho un vero rapporto di amore/odio con le @dfn{unioni}.}
-@author Arnold Robbins
-@end quotation
-
-@quotation
-@i{Questo @`e ci@`o che contraddistingue le @dfn{unioni}: il compilatore @`e
-in grado di accomodare le cose in modo da far coesistere amore e odio.}
-@author Chet Ramey
-@end quotation
-
-L'estensione API definisce un certo numero di semplici tipi di dato e
-strutture di uso generale. Ulteriori strutture di dati, pi@`u specializzate,
-saranno introdotte
-@ifnotinfo
-nelle successive
-@end ifnotinfo
-@ifinfo
-nei successivi
-@end ifinfo
-@value{SECTIONS}, insieme alle funzioni che ne fanno uso.
-
-I tipi di dati e le strutture di uso generale sono le seguenti:
-
-@table @code
-@item typedef void *awk_ext_id_t;
-Un valore di questo tipo @`e trasmesso da @command{gawk} a un'estensione nel
-momento in cui viene caricata. Tale valore dev'essere restituito
-a @command{gawk} come primo parametro di ogni funzione API.
-
-@item #define awk_const @dots{}
-Questa macro genera delle @samp{costanti} nel momento in cui si compila
-un'estensione, e non genera nulla quando si compila il comando @command{gawk}
-vero e proprio. Ci@`o rende alcuni
-campi nelle strutture dei dati dell'API non alterabili dal codice sorgente
-dell'estensione, ma consente al comando @command{gawk} di usarle secondo
-necessit@`a.
-
-@item typedef enum awk_bool @{
-@itemx @ @ @ @ awk_false = 0,
-@itemx @ @ @ @ awk_true
-@itemx @} awk_bool_t;
-Un semplice tipo di variabile booleana.
-
-@item typedef struct awk_string @{
-@itemx @ @ @ @ char *str;@ @ @ @ @ /* dati veri e propri */
-@itemx @ @ @ @ size_t len;@ @ @ @ /* lunghezza degli stessi, in caratteri */
-@itemx @} awk_string_t;
-Questo rappresenta una stringa modificabile. @command{gawk} @`e responsabile
-per la gestione della memoria utilizzata, se ha fornito il valore della
-stringa. Altrimenti, assume il possesso della memoria in questione.
-@emph{Questa memoria dev'essere resa disponibile chiamando una delle funzioni
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}!}
-
-Come gi@`a detto, la rappresentazione delle stringhe in memoria usa la codifica
-multibyte corrente.
-
-@item typedef enum @{
-@itemx @ @ @ @ AWK_UNDEFINED,
-@itemx @ @ @ @ AWK_NUMBER,
-@itemx @ @ @ @ AWK_STRING,
-@itemx @ @ @ @ AWK_REGEX,
-@itemx @ @ @ @ AWK_STRNUM,
-@itemx @ @ @ @ AWK_ARRAY,
-@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* accesso opaco a una variabile */
-@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* per aggiornare un valore
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ gi@`a creato */
-@itemx @} awk_valtype_t;
-L'elenco @code{enum} indica di che tipo @`e un certo valore.
-@`E usato nella seguente struttura @code{struct}.
-
-@item typedef struct awk_value @{
-@itemx @ @ @ @ awk_valtype_t val_type;
-@itemx @ @ @ @ union @{
-@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s;
-@itemx @ @ @ @ @ @ @ @ double@ @ @ @ @ @ @ @ @ @ @ @ @ d;
-@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a;
-@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl;
-@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc;
-@itemx @ @ @ @ @} u;
-@itemx @} awk_value_t;
-Un ``valore di @command{awk}''.
-Il campo @code{val_type} indica che tipo di valore @code{union} contiene,
-e ogni campo @`e del tipo appropriato.
-
-@item #define str_value@ @ @ @ @ @ u.s
-@itemx #define strnum_value@ @ @ str_value
-@itemx #define regex_value@ @ @ @ str_value
-@itemx #define num_value@ @ @ @ @ @ u.d
-@itemx #define array_cookie@ @ @ u.a
-@itemx #define scalar_cookie@ @ u.scl
-@itemx #define value_cookie@ @ @ u.vc
-L'uso di queste macro rende pi@`u facile da seguire l'accesso ai campi di
-@code{awk_value_t}.
-
-@item typedef void *awk_scalar_t;
-La variabili scalari possono essere rappresentate da un tipo opaco. Questi
-valori sono ottenuti da @command{gawk} e in seguito gli vengono restituiti.
-Questo argomento @`e discusso in maniera generale nel testo che segue questa
-lista, e pi@`u in dettaglio
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Tabella simboli tramite cookie}.
-
-@item typedef void *awk_value_cookie_t;
-Un ``@dfn{value cookie}'' @`e un tipo di variabile opaca, e
-rappresenta un valore nascosto.
-Anche questo argomento @`e discusso in maniera generale nel testo che segue
-questa lista, e pi@`u in dettaglio
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Valori nascosti}.
-
-@end table
-
-I valori di tipo scalare in @command{awk} sono numeri, stringhe, @dfn{strnum}
-o @dfn{regexp} fortemente tipizzate.
-La struttura @code{awk_value_t} rappresenta valori.
-Il campo @code{val_type} indica cosa contiene @code{union}.
-
-Rappresentare numeri @`e facile: l'API usa una variabile C di tipo
-@code{double}. Le stringhe richiedono
-uno sforzo maggiore. Poich@'e
-@command{gawk} consente che le stringhe contengano dei byte @sc{nul}
-(a zeri binari) nel valore di una stringa, una stringa dev'essere
-rappresentata da una coppia di campi che contengono il puntatore al dato vero
-e proprio e la lunghezza della stringa.
-@`E questo @`e il tipo @code{awk_string_t}.
-
-Un valore di tipo @dfn{strnum} (stringa numerica) @`e rappresentato come una
-stringa e consiste di dati in input forniti dall'utente che appaiono essere
-numerici.
-Quando una funzione di estensione crea un valore di tipo @dfn{strnum}, il
-risultato @`e una stringa che viene marcata come immessa dall'utente. La
-successiva analisi da parte di @command{gawk} servir@`a poi a determinare se
-la stringa appare essere un numero, e va quindi trattata come @dfn{strnum},
-invece che come una normale stringa di caratteri.
-
-Ci@`o @`e utile nei casi un cui una funzione di estensione desideri fare qualcosa
-di paragonabile alla funzione @code{split}, la quale imposta l'attributo
-di @dfn{strnum} agli elementi di vettore che crea.
-Per esempio, un'estensione che implementi la divisione di record CSV
-(Comma Separated Values, i cui elementi sono delimitati da virgole)
-potrebbe voler usare questa funzionalit@`a. Un'altra situazione in cui ci@`o
-@`e utile @`e quello di una funzione che richieda campi-dati ad una banca di
-dati. La funzione @code{PQgetvalue()} della banca dati PostgreSQ, per
-esempio, restituisce una stringa che pu@`o essere numerica o di tipo carattere,
-a seconda del contesto.
-
-I valori di @dfn{regexp} fortemente tipizzate
-(@pxref{Costanti @dfn{regexp} forti} non sono molto utili nelle funzioni di
-estensione. Le funzioni di estensione possono stabilire di averli ricevuti,
-e crearne, attribuendo valori di tipo scalare. In alternativa, @`e possibile
-esaminare il testo della @dfn{regexp} utilizzando campi @code{regex_value.str}
-e @code{regex_value.len}.
-
-Identificativi (cio@`e, nomi di variabili globali) possono essere
-associati sia a valori scalari che a vettori. Inoltre, @command{gawk}
-consente veri vettori di vettori, in cui ogni singolo elemento di un vettore
-pu@`o a sua volta essere un vettore. La spiegazione dei vettori @`e rinviata
-@iftex
-alla
-@end iftex
-@ifnottex
-a
-@end ifnottex
-@ref{Manipolazione di vettori}.
-
-La varie macro sopra elencate facilitano l'uso degli elementi delle
-@code{union} come se
-fossero campi in una @code{struct}; @`e questa una pratica comunemente adottata
-nella scrittura di programmi in C. Questo tipo di codice @`e pi@`u semplice da
-scrivere e da leggere, ma resta una responsabilit@`a @emph{del programmatore}
-assicurarsi che il campo @code{val_type} rifletta correttamente il tipo
-del valore contenuto nella struttura @code{awk_value_t}.
-
-Dal punti di vista concettuale, i primi tre campi dell'@code{union} (numero,
-stringa, e vettore) sono sufficienti per lavorare con i valori @command{awk}.
-Tuttavia, poich@'e l'API fornisce routine per ottenere e modificare
-il valore di una variabile scalare globale usando solo il nome della
-variabile, si ha qui una perdita di efficienza: @command{gawk} deve cercare
-la variabile ogni volta che questa @`e utilizzata e modificata. Questo
-@`e un probelma reale, non solo un problema teorico.
-
-Per questo motivo, se si sa che una certa estensione passer@`a molto tempo
-a leggere e/o modificare il valore di una o pi@`u variabili scalari, si pu@`o
-ottenere uno @dfn{scalar cookie}@footnote{Si veda
-@uref{http://catb.org/jargon/html/C/cookie.html, la voce ``cookie''
-nello Jargon file}
-per una definizione di @dfn{cookie}, e
-@uref{http://catb.org/jargon/html/M/magic-cookie.html, la voce ``magic cookie''
-sempre nello Jargon file} per un bell'esempio.
-@ifclear FOR_PRINT
-Si veda anche la voce ``Cookie'' nel @ref{Glossario}.
-@end ifclear
-[@uref{http://jhanc.altervista.org/jargon/Intro.html, @`E disponibile in rete
-anche una traduzione italiana dello Jargon file}]
-}
-per quella variabile, e poi usare
-il @dfn{cookie} per ottenere il valore della variabile o per modificarne il
-valore.
-Il tipo @code{awk_scalar_t} contiene uno @dfn{scalar cookie}, e la macro
-@code{scalar_cookie} fornisce accesso al valore di quel tipo
-nella struttura @code{awk_value_t}.
-Dato uno @dfn{scalar cookie}, @command{gawk} pu@`o trovare o modificare
-direttamente il valore, come richiesto, senza bisogno di andarlo
-a cercare ogni volta.
-
-Il tipo @code{awk_value_cookie_t} e la macro @code{value_cookie} sono simili.
-Se si pensa di dover usare
-lo stesso @emph{valore} numerico o la stessa @emph{stringa} per una o pi@`u
-variabili, si pu@`o creare il valore una volta per tutte, mettendo da parte un
-@dfn{@dfn{value cookie}} per quel valore, e in seguito specificare quel
-@dfn{value cookie} quando si desidera impostare il valore di una variabile.
-Ci@`o consente di risparmiare spazio in memoria all'interno del processo
-di @command{gawk} e riduce il tempo richiesto per creare il valore.
-
-@node Funzioni di allocazione memoria
-@subsection Funzioni per allocare memoria e macro di servizio
-@cindex allocare memoria per estensioni
-@cindex memoria, allocare per estensioni
-@cindex estensioni, allocare memoria per
-
-L'API fornisce alcune funzioni per effettuare @dfn{allocazioni di memoria}
-che possono essere passate a @command{gawk}, e anche un certo numero di
-macro che possono tornare utili.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} le presenta come prototipi di funzione, nel modo
-con cui il codice dell'estensione potrebbe usarle:
-
-@table @code
-@item void *gawk_malloc(size_t size);
-Chiama la versione corretta di @code{malloc()} per allocare memoria,
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void *gawk_calloc(size_t nmemb, size_t size);
-Chiama la versione corretta di @code{calloc()} per allocare memoria che
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void *gawk_realloc(void *ptr, size_t size);
-Chiama la versione corretta di @code{realloc()} per allocare memoria
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void gawk_free(void *ptr);
-Chiama la versione corretta di @code{free()} per liberare memoria che
-era stata allocata con
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-@end table
-
-L'API deve fornire queste funzioni perch@'e @`e possibile
-che un'estensione sia stata compilata e costruita usando una versione
-diversa della libreria C rispetto a quella usata per il programma eseguibile
-@command{gawk}.@footnote{Questo succede pi@`u spesso nei sistemi MS-Windows,
-ma pu@`o capitare anche in sistemi di tipo Unix.}
-Se @command{gawk} usasse la propria versione di @code{free()} per liberare
-della memoria acquisita tramite una differente versione di @code{malloc()},
-il risultato sarebbe molto probabilmente differente da quello atteso.
-
-Due macro di utilit@`a possono essere usate per allocare memoria
-tramite @code{gawk_malloc()} e
-@code{gawk_realloc()}. Se l'allocazione non riesce, @command{gawk}
-termina l'esecuzione con un messaggio di errore fatale.
-Queste macro dovrebbero essere usate come se fossero dei richiami a
-procedure che non restituiscono un codice di ritorno:
-
-@table @code
-@item #define emalloc(pointer, type, size, message) @dots{}
-Gli argomenti per questa macro sono i seguenti:
-
-@c nested table
-@table @code
-@item pointer
-La variabile di tipo puntatore che punter@`a alla memoria allocata.
-
-@item type
-Il tipo della variabile puntatore. Questo @`e usato per definire il tipo
-quando si chiama @code{gawk_malloc()}.
-
-@item size
-Il numero totale di byte da allocare.
-
-@item message
-Un messaggio da anteporre all'eventuale messaggio di errore fatale.
-Questo @`e solitamente il nome della funzione che sta usando la macro.
-@end table
-
-@noindent
-Per esempio, si potrebbe allocare il valore di una stringa cos@`{@dotless{i}}:
-
-@example
-awk_value_t risultato;
-char *message;
-const char greet[] = "non v'allarmate!";
-
-emalloc(message, char *, sizeof(greet), "myfunc");
-strcpy(message, greet);
-make_malloced_string(message, strlen(message), & risultato);
-@end example
-
-@item #define erealloc(pointer, type, size, message) @dots{}
-Questo @`e simile a @code{emalloc()}, ma chiama @code{gawk_realloc()}
-invece che @code{gawk_malloc()}.
-Gli argomenti sono gli stessi della macro @code{emalloc()}.
-@end table
-
-@node Funzioni di costruzione
-@subsection Funzioni per creare valori
-
-L'API fornisce varie funzioni di @dfn{costruzione} per creare
-valori di tipo stringa e di tipo numerico, e anche varie macro di utilit@`a.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} le presenta tutte come prototipi di funzione, nel
-modo in cui il codice sorgente di
-un'estensione le userebbe:
-
-@table @code
-@item static inline awk_value_t *
-@itemx make_const_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione mette il valore di una stringa nella variabile
-@code{awk_value_t} puntata da @code{risultato}. La funzione presuppone che
-@code{stringa} sia una costante stringa C
-(o altri dati che formano una stringa), e automaticamente crea una
-@emph{copia} dei dati che sar@`a immagazzinata in @code{risultato}.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_malloced_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione mette il valore di una stringa nella variabile
-@code{awk_value_t} puntata da @code{risultato}. Si presuppone che
-@code{stringa} sia un valore @samp{char *}
-che punta a dati ottenuti in precedenza per mezzo di
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-L'idea @`e che questi dati siano comunicati direttamente a @command{gawk},
-che se ne assume la responsabilit@`a.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_null_string(awk_value_t *risultato);
-Questa funzione specializzata crea una stringa nulla (il valore ``undefined'')
-nella variabile @code{awk_value_t} puntata da @code{risultato}.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_number(double num, awk_value_t *risultato);
-Questa funzione crea semplicemente un valore numerico nella variabile
-@code{awk_value_t}, puntata da @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_const_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione @`e identica a @code{make_const_string()}, ma la stringa @`e
-marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
-se il contenuto della stringa appare essere numerico.
-
-@item static inline awk_value_t *
-@itemx make_malloced_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione @`e identica a @code{make_malloced_string()}, ma la stringa @`e
-marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
-se il contenuto della stringa appare essere numerico.
-
-@item static inline awk_value_t *
-@itemx make_const_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata, allocando una
-copia della stringa.
-@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
-
-@item static inline awk_value_t *
-@itemx make_malloced_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata.
-@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
-Si aspetta che @code{stringa} sia un valore di tipo @samp{char *} che punta a
-dati ottenuti in precedenza tramite una chiamata a
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-
-@end table
-
-@node Funzioni di registrazione
-@subsection Funzioni di registrazione
-@cindex registrazione di estensione
-@cindex estensione, registrazione di
-
-Questa @value{SECTION} descrive le funzioni dell'API per
-registrare parti di un'estensione con @command{gawk}.
-
-@menu
-* Funzioni di estensione:: Registrare funzioni di estensione.
-* Funzioni di exit callback:: Registrare una exit di callback.
-* Stringa di versione Estensioni:: Registrare una stringa di versione.
-* Analizzatori di input:: Registrare un analizzatore di input.
-* Processori di output:: Registrare un processore di output.
-* Processori bidirezionali:: Registrare un processore bidirezionale.
-@end menu
-
-@node Funzioni di estensione
-@subsubsection Registrare funzioni di estensione
-
-Le funzioni di estensione sono descritte dal seguente tracciato record:
-
-@example
-typedef struct awk_ext_func @{
-@ @ @ @ const char *name;
-@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
-@ @ @ @ const size_t max_expected_args;
-@ @ @ @ const size_t min_required_args;
-@ @ @ @ awk_bool_t suppress_lint;
-@ @ @ @ void *data; /* puntatore di tipo opaco
-@ @ @ @ a ogni informazione ulteriore */
-@} awk_ext_func_t;
-@end example
-
-I campi sono:
-
-@table @code
-@item const char *name;
-Il nome della nuova funzione.
-Il codice sorgente a livello di @command{awk} richiama la funzione usando
-questo nome.
-Il nome @`e una normale stringa di caratteri del linguaggio C.
-
-I nomi di funzione devono rispettare le stesse regole che valgono per gli
-identificativi @command{awk}.
-Cio@`e, devono iniziare o con una lettera dell'alfabeto inglese o con un
-trattino basso, che possono essere seguiti da un numero qualsiasi di
-lettere, cifre o trattini bassi.
-L'uso di maiuscolo/minuscolo @`e significativo.
-
-@item awk_value_t *(*const function)(int num_actual_args,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
-Questo @`e un puntatore alla funzione C che fornisce la funzionalit@`a per cui
-@`e stata scritta l'estensione.
-La funzione deve riempire l'area di memoria puntata da @code{*risultato} con
-un numero, con una stringa, oppure con una @dfn{regexp}.
-@command{gawk} diventa il proprietario di tutte le stringhe di memoria.
-Come gi@`a detto sopra, la stringa di memoria @emph{deve} essere stata ottenuta
-usando @code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-
-L'argomento @code{num_actual_args} dice alla funzione scritta in C quanti
-parametri sono stati effettivamente passati dal codice chiamante all'interno
-di @command{awk}.
-
-La funzione deve restituire il valore di @code{risultato}.
-Questo @`e per utilit@`a del codice chiamante all'interno di
-@command{gawk}.
-
-@item size_t max_expected_args;
-Questo @`e il massimo numero di argomenti che la funzione si aspetta di
-ricevere.
-Se chiamata con un numero di argomenti maggiore di questo, e se @`e stato
-richiesto il controllo @dfn{lint}, @command{gawk} stampa un messaggio di
-avvertimento. Per ulteriori informazioni, si veda la descrizione di
-@code{suppress_lint}, pi@`u avanti in questa lista.
-
-@item const size_t min_required_args;
-Questo @`e il minimo numero di argomenti che la funzione si aspetta di
-ricevere.
-Se @`e chiamata con un numero inferiore di argomenti, @command{gawk}
-stampa un messaggio di errore fatale ed esce.
-
-@item awk_bool_t suppress_lint;
-Questo @dfn{flag} dice a @command{gawk} di non stampare un messaggio
-@dfn{lint} se @`e stato richiesto un controllo @dfn{lint} e se sono stati
-forniti pi@`u argomenti di quelli attesi. Una funzione di estensione pu@`o
-stabilire se @command{gawk} ha gi@`a stampato almeno uno di tali messaggi
-controllando se @samp{num_actual_args > finfo->max_expected_args}.
-In tal caso, se la funzione non desidera la stampa di ulteriori messaggi,
-dovrebbe impostare @code{finfo->suppress_lint} a @code{awk_true}.
-
-@item void *data;
-Questo @`e un puntatore di tipo opaco a tutti quei dati che una funzione
-di estensione desidera avere disponibili al momento della chiamata.
-Passando alla funzione di estensione la struttura @code{awk_ext_func_t}
-e avendo al suo interno questo puntatore disponibile, rende possibile
-scrivere un'unica funzione C o C++ che implementa pi@`u di una funzione
-di estensione a livello @command{awk}.
-@end table
-
-Una volta preparato un record che descrive l'estensione, la funzione di
-estensione va registrata con @command{gawk} usando questa funzione dell'API:
-
-@table @code
-@item awk_bool_t add_ext_func(const char *namespace, awk_ext_func_t *func);
-Questa funzione restituisce il valore @dfn{true} se ha successo,
-oppure @dfn{false} in caso contrario.
-Il parametro @code{namespace} non @`e usato per ora; dovrebbe puntare a una
-stringa vuota (@code{""}). Il puntatore @code{func} @`e l'indirizzo di una
-@code{struct} che rappresenta la funzione stessa, come descritto sopra.
-
-@command{gawk} non modifica ci@`o che @`e puntato da @code{func}, ma la
-funzione di estensione stessa riceve questo puntatore e pu@`o modificarlo
-e farlo puntare altrove, quindi il puntatore non @`e stato dichiarato
-di tipo costante (@code{const}).
-@end table
-
-La combinazione di @code{min_required_args}, @code{max_expected_args},
-e @code{suppress_lint} pu@`o ingenerare confusione. Ecco delle linee-guida
-sul da farsi.
-
-@table @asis
-@item Un numero qualsiasi di argomenti @`e valido
-Impostare @code{min_required_args} and @code{max_expected_args} a zero e
-impostare @code{suppress_lint} ad @code{awk_true}.
-
-@item Un numero minimo di argomenti @`e richiesto, ma non c'@`e un limite al numero massimo
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} a zero e
-impostare @code{suppress_lint} ad @code{awk_true}.
-
-@item Un numero minino di argomenti @`e richiesto, ma c'@`e un limite al numero massimo
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} al massimo atteso.
-Impostare @code{suppress_lint} ad @code{awk_false}.
-
-@item Un numero minino di argomenti @`e richiesto, ma c'@`e un numero massimo non superabile
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} al massimo atteso.
-Impostare @code{suppress_lint} ad @code{awk_false}.
-Nella funzione di estensione, controllare che @code{num_actual_args} non
-ecceda @code{f->max_expected_args}. Se il massimo @`e superato, stampare
-un messaggio di errore fatale.
-@end table
-
-@node Funzioni di exit callback
-@subsubsection Registrare una funzione @dfn{exit callback}
-
-Una funzione @dfn{exit callback} @`e una funzione che @command{gawk} invoca
-prima di completare l'esecuzione del programma.
-Siffatte funzioni sono utili se ci sono dei compiti generali di ``pulizia''
-che dovrebbero essere effettuati nell'estensione (come chiudere connessioni a
-un @dfn{database} o rilasciare altre risorse).
-Si pu@`o registrare una tale
-funzione con @command{gawk} per mezzo della seguente funzione:
-
-@table @code
-@item void awk_atexit(void (*funcp)(void *data, int exit_status),
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0);
-I parametri sono:
-
-@c nested table
-@table @code
-@item funcp
-Un puntatore alla funzione da chiamare prima che @command{gawk} completi
-l'esecuzione. Il parametro @code{data}
-sar@`a il valore originale di @code{arg0}.
-Il parametro @code{exit_status} @`e il valore del codice di ritorno che
-@command{gawk} intende passare alla chiamata di sistema @code{exit()}
-(che termina l'esecuzione del programma).
-
-@item arg0
-Un puntatore a un'area dati privata che @command{gawk} mantiene perch@'e
-sia poi passata alla funzione puntata da @code{funcp}.
-@end table
-@end table
-
-Le funzioni @dfn{exit callback} sono chiamate in ordine inverso rispetto
-a quello con cui @`e stata fatta la registrazione con @command{gawk}
-(LIFO: Last In, First Out).
-
-@node Stringa di versione Estensioni
-@subsubsection Registrare una stringa di versione per un'estensione
-
-Si pu@`o registrare una stringa di versione che indica il nome e la versione
-di una data estensione a @command{gawk}, come segue:
-
-@table @code
-@item void register_ext_version(const char *version);
-Registra la stringa puntata da @code{version} con @command{gawk}.
-Si noti che @command{gawk} @emph{non} copia la stringa @code{version}, e
-quindi questa stringa non dovrebbe essere modificata.
-@end table
-
-@command{gawk} stampa tutte le stringhe con le versioni di estensione
-registrate, quando viene invocato specificando l'opzione @option{--version}.
-
-@node Analizzatori di input
-@subsubsection Analizzatori di input personalizzati
-@cindex personalizzato, analizzatore di input
-@cindex analizzatore di input personalizzato
-@cindex input, analizzatore di, 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
-@iftex
-(@pxrefil{Leggere file}).
-@end iftex
-@ifnottex
-(@pxref{Leggere file}).
-@end ifnottex
-Viene inoltre impostato il valore di @code{RT}
-(@pxref{Variabili predefinite}).
-
-Se lo si desidera, @`e possibile fornire un analizzatore di input
-personalizzato. Il compito di un analizzatore di input @`e di restituire un
-record al codice di @command{gawk}, che poi lo elaborer@`a, accompagnato,
-se necessario, da indicatori del valore e della lunghezza dei dati da usare
-per @code{RT}.
-
-Per fornire un analizzatore personalizzato di input, occorre innanzitutto
-rendere disponibili due funzioni (dove @var{XXX} @`e un nome che fa da prefisso
-all'estensione intera):
-
-@table @code
-@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf);
-Questa funzione esamina l'informazione disponibile in @code{iobuf}
-(che vedremo tra poco). Basandosi su tale informazione,
-decide se l'analizzatore di input personalizzato andr@`a usato per questo file.
-Se questo @`e il caso, dovrebbe restituire @dfn{true}. Altrimenti, restituir@`a
-@dfn{false}. Nessuno stato (valori di variabili, etc.) dovrebbe venire
-modificato all'interno di @command{gawk}.
-
-@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf);
-Quando @command{gawk} decide di passare il controllo del file a questo
-analizzatore di input, richiamer@`a questa funzione.
-Questa funzione a sua volta deve assegnare un valore ad alcuni campi
-nella struttura @code{awk_input_buf_t} e assicurarsi che
-alcune condizioni siano verificate. Dovrebbe poi restituire @dfn{true}.
-Se si verifica un errore di qualche tipo, i campi in questione non dovrebbero
-venire riempiti, e la funzione dovrebbe restituire @dfn{false}; in questo caso
-@command{gawk} non utilizzer@`a pi@`u l'analizzatore personalizzato di input.
-I dettagli sono descritti pi@`u avanti.
-@end table
-
-L'estensione dovrebbe raccogliere queste funzioni all'interno di una
-struttura @code{awk_input_parser_t}, simile a questa:
-
-@example
-typedef struct awk_input_parser @{
- const char *name; /* nome dell'analizzatore */
- awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
- awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
- awk_const struct awk_input_parser *awk_const next; /* per uso
- di gawk */
-@} awk_input_parser_t;
-@end example
-
-I campi sono:
-
-@table @code
-@item const char *name;
-Il nome dell'analizzatore di input. Questa @`e una normale stringa di caratteri
-del linguaggio C.
-
-@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
-Un puntatore alla funzione @code{@var{XXX}_can_take_file()}.
-
-@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
-Un puntatore alla funzione @code{@var{XXX}_take_control_of()}.
-
-@item awk_const struct input_parser *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarla.
-@end table
-
-I passi da seguire sono i seguenti:
-
-@enumerate
-@item
-Creare una variabile @code{static awk_input_parser_t} e inizializzarla
-adeguatamente.
-
-@item
-Quando l'estensione @`e caricata, registrare l'analizzatore personalizzato di
-input con @command{gawk} usando la funzione API @code{register_input_parser()}
-(descritta pi@`u sotto).
-@end enumerate
-
-La definizione di una struttura @code{awk_input_buf_t} @`e simile a questa:
-
-@example
-typedef struct awk_input @{
- const char *name; /* nome file */
- int fd; /* descrittore di file */
-#define INVALID_HANDLE (-1)
- void *opaque; /* area dati privata
- per l'analizzatore di input */
- int (*get_record)(char **out, struct awk_input *iobuf,
- int *errcode, char **rt_start, size_t *rt_len);
- ssize_t (*read_func)();
- void (*close_func)(struct awk_input *iobuf);
- struct stat sbuf; /* buffer per stat */
-@} awk_input_buf_t;
-@end example
-
-I campi si possono dividere in due categorie: quelli che sono usati (almeno
-inizialmente) da @code{@var{XXX}_can_take_file()}, e quelli che sono usati da
-@code{@var{XXX}_take_control_of()}. Il primo gruppo di campi, e il loro uso,
-@`e cos@`{@dotless{i}} definito:
-
-@table @code
-@item const char *name;
-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.
-
-@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()}.
-@end table
-
-La funzione @code{@var{XXX}_can_take_file()} dovrebbe esaminare i campi di
-cui sopra e decidere se l'analizzatore di input vada usato per il file.
-La decisione pu@`o dipendere da uno stato di @command{gawk} (il valore
-di una variabile definita in precedenza dall'estensione e impostata dal
-codice @command{awk}), dal nome del
-file, dal fatto che il descrittore di file sia valido o no,
-dalle informazioni contenute in @code{struct stat} o da una qualsiasi
-combinazione di questi fattori.
-
-Una volta che @code{@var{XXX}_can_take_file()} restituisce @dfn{true}, e
-@command{gawk} ha deciso di usare l'analizzatore personalizzato, viene
-chiamata la funzione @code{@var{XXX}_take_control_of()}. Tale funzione
-si occupa di riempire il campo @code{get_record} oppure il campo
-@code{read_func} nella struttura @code{awk_input_buf_t}. La funzione si
-assicura inoltre che @code{fd} @emph{not} sia impostato al valore
-@code{INVALID_HANDLE}. L'elenco seguente descrive i campi che
-possono essere riempiti da @code{@var{XXX}_take_control_of()}:
-
-@table @code
-@item void *opaque;
-Questo campo @`e usato per contenere qualiasi informazione di stato sia
-necessaria per l'analizzatore di input
-riguardo a questo file. Il campo @`e ``opaco'' per @command{gawk}.
-L'analizzatore di input non @`e obbligato a usare questo puntatore.
-
-@item int@ (*get_record)(char@ **out,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len);
-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)();
-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
-@`e pure descritto nel testo che segue quest'elenco.
-
-@item void (*close_func)(struct awk_input *iobuf);
-Questo puntatore a funzione dovrebbe puntare a una funzione che fa
-la ``pulizia finale''. Dovrebbe liberare ogni risorsa allocata da
-@code{@var{XXX}_take_control_of()}. Pu@`o anche chiudere il file. Se lo fa,
-dovrebbe impostare il campo @code{fd} a @code{INVALID_HANDLE}.
-
-Se @code{fd} @`e ancora diverso da @code{INVALID_HANDLE} dopo la chiamata a
-questa funzione, @command{gawk} invoca la normale chiamata di sistema
-@code{close()}.
-
-Avere una funzione di ``pulizia'' @`e facoltativo. Se l'analizzatore di input
-non ne ha bisogno, basta non impostare questo campo. In questo caso,
-@command{gawk} invoca la normale chiamata di sistema @code{close()} per il
-descrittore di file, che, quindi, dovrebbe essere valido.
-@end table
-
-La funzione @code{@var{XXX}_get_record()} svolge il lavoro di creazione dei
-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.
-
-@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.
-
-@item int *errcode
-Se si verifica un errore, @code{*errcode} dovrebbe essere impostato a un
-valore appropriato tra quelli contenuti in @code{<errno.h>}.
-
-@item char **rt_start
-@itemx size_t *rt_len
-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.
-@end table
-
-Il codice di ritorno @`e la lunghezza del buffer puntato da
-@code{*out} oppure @code{EOF}, se @`e stata raggiunta la fine del file o se
-si @`e verificato un errore.
-
-Poich@'e @code{errcode} @`e sicuramente un puntatore valido, non c'@`e
-bisogno di controllare che il valore sia @code{NULL}. @command{gawk}
-imposta @code{*errcode} a zero, quindi non c'@`e bisogno di impostarlo, a meno
-che non si verifichi un errore.
-
-In presenza di un errore, la funzione dovrebbe restituire @code{EOF} e
-impostare @code{*errcode} a un valore maggiore di zero. In questo caso, se
-@code{*errcode} non @`e uguale a zero, @command{gawk} automaticamente aggiorna
-la variabile @code{ERRNO} usando il valore contenuto in @code{*errcode}.
-(In generale, impostare @samp{*errcode = errno} dovrebbe essere la
-cosa giusta da fare.)
-
-Invece di fornire una funzione che restituisce un record in input,
-@`e possibile fornirne una che semplicemente legge dei byte, e lascia
-che sia @command{gawk} ad analizzare i dati per farne dei record. In questo
-caso, i dati dovrebbero essere restituiti nella codifica multibyte propria
-della localizzazione corrente.
-Una siffatta funzione dovrebbe imitare il comportamento della chiamata di
-sistema @code{read()}, e riempire il puntatore @code{read_func} con
-il proprio indirizzo nella struttura @code{awk_input_buf_t}.
-
-Per default, @command{gawk} imposta il puntatore @code{read_func} in modo che
-punti alla chiamata di sistema @code{read()}. In questo modo l'estensione
-non deve preoccuparsi di impostare esplicitamente questo campo.
-
-@quotation NOTA
-Occorre decidere per l'uno o per l'altro metodo: o una funzione che
-restituisce un record o una che restituisce dei dati grezzi. Nel dettaglio,
-se si fornisce una funzione che prepara un record, @command{gawk} la
-invocher@`a, e non chiamer@`a mai la funzione che fa una lettura grezza.
-@end quotation
-
-@command{gawk} viene distribuito con un'estensione di esempio che legge
-delle directory, restituendo un record per ogni elemento contenuto nella
-directory (@pxref{Esempio di estensione Readdir}. Questo codice sorgente pu@`o
-essere usato come modello per scrivere un analizzatore di input
-personalizzato.
-
-Quando si scrive un analizzatore di input, si dovrebbe progettare (e
-documentare) il modo con cui si suppone che interagisca con il codice
-@command{awk}. Si pu@`o scegliere di utilizzarlo per tutte le letture, e
-intervenire solo quando @`e necessario, (come fa l'estensione di
-esempio @code{readdir}). Oppure lo si pu@`o utilizzare a seconda del
-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
-
-@node Processori di output
-@subsubsection Registrare un processore di output
-@cindex personalizzato, processore di output
-@cindex processore di output personalizzato
-@cindex output, processore di, personalizzato
-
-@cindex processore di output
-@cindex output, processore di
-Un @dfn{processore di output} @`e l'immagine riflessa di un
-analizzatore di input.
-Consente a un'estensione di prendere il controllo dell'output
-indirizzato verso un file
-che sia stato aperto con gli operatori di ridirezione di I/O
-@samp{>} o @samp{>>} (@pxref{Ridirezione}).
-
-Il processore di output @`e molto simile, come struttura,
-all'analizzatore di input:
-
-@example
-typedef struct awk_output_wrapper @{
- const char *name; /* nome del processore */
- awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
- awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
- awk_const struct awk_output_wrapper *awk_const next; /* per gawk */
-@} awk_output_wrapper_t;
-@end example
-
-I campi sono i seguenti:
-
-@table @code
-@item const char *name;
-Questo @`e il nome del processore di output.
-
-@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
-Questo @`e il puntatore a una funzione che esamina l'informazione contenuta
-nella struttura @code{awk_output_buf_t} puntata da @code{outbuf}.
-Dovrebbe restituire @dfn{true} se il processore di output vuole elaborare
-il file, e @dfn{false} in caso contrario.
-Nessuno stato (valori di variabili, etc.) dovrebbe essere modificato
-all'interno di @command{gawk}.
-
-@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
-La funzione puntata da questo campo viene chiamata quando @command{gawk}
-decide di consentire al processore di output di prendere il controllo del file.
-Dovrebbe riempire in maniera appropriata dei campi nella struttura
-@code{awk_output_buf_t}, come descritto sotto, e restituire @dfn{true} se
-ha successo, @dfn{false} in caso contrario.
-
-@item awk_const struct output_wrapper *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarlo.
-@end table
-
-La struttura @code{awk_output_buf_t} @`e simile a questa:
-
-@example
-typedef struct awk_output_buf @{
- const char *name; /* nome del file in output */
- const char *mode; /* argomento @dfn{mode} per fopen */
- FILE *fp; /* puntatore stdio file */
- awk_bool_t redirected; /* @dfn{true} se un processore @`e attivo */
- void *opaque; /* per uso del processore di output */
- size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
- FILE *fp, void *opaque);
- int (*gawk_fflush)(FILE *fp, void *opaque);
- int (*gawk_ferror)(FILE *fp, void *opaque);
- int (*gawk_fclose)(FILE *fp, void *opaque);
-@} awk_output_buf_t;
-@end example
-
-Anche qui, l'estensione definir@`a le funzioni @code{@var{XXX}_can_take_file()}
-e @code{@var{XXX}_take_control_of()} che esaminano e aggiornano
-campi dati in @code{awk_output_buf_t}.
-I campi dati sono i seguenti:
-
-@table @code
-@item const char *name;
-Il nome del file in output.
-
-@item const char *mode;
-La stringa @dfn{mode} (come sarebbe usata nel secondo argomento della
-chiamata di sistema @code{fopen()})
-con cui il file era stato aperto.
-
-@item FILE *fp;
-Il puntatore @code{FILE} da @code{<stdio.h>}. @command{gawk} apre il file
-prima di controllare se esiste un processore di output.
-
-@item awk_bool_t redirected;
-Questo campo dev'essere impostato a @dfn{true} dalla funzione
-@code{@var{XXX}_take_control_of()}.
-
-@item void *opaque;
-Questo puntatore @`e opaco per @command{gawk}. L'estensione dovrebbe usarlo
-per contenere un puntatore a qualsiasi dato privato associato al file.
-
-@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque);
-@itemx int (*gawk_fflush)(FILE *fp, void *opaque);
-@itemx int (*gawk_ferror)(FILE *fp, void *opaque);
-@itemx int (*gawk_fclose)(FILE *fp, void *opaque);
-Questi puntatori dovrebbero essere impostati per puntare a funzioni
-la cui azione sia equivalente a quella delle funzioni di @code{<stdio.h>},
-se questo @`e cio che si desidera.
-@command{gawk} usa questi puntatori a funzione per @emph{tutti} gli output.
-@command{gawk} inizializza i puntatori per puntare a funzioni interne
-``di passaggio'' che si limitano a chiamare le funzioni normali di
-@code{<stdio.h>}, e quindi un'estensione deve ridefinire solo le funzioni
-appropriate per fare il lavoro richiesto.
-@end table
-
-La funzione @code{@var{XXX}_can_take_file()} dovrebbe decidere in base ai
-campi @code{name} e @code{mode}, e a ogni altro ulteriore indicatore di stato
-(p.es., valori di variabili @command{awk}) adatto allo scopo.
-
-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.
-
-Il processore di output va registrato usando la seguente funzione:
-
-@table @code
-@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper);
-Registra il processore di output puntato da @code{output_wrapper} con
-@command{gawk}.
-@end table
-
-@node Processori bidirezionali
-@subsubsection Registrare un processore bidirezionale
-@cindex personalizzato, processore bidirezionale
-@cindex processore bidirezionale personalizzato
-@cindex bidirezionale, processore personalizzato
-
-Un @dfn{processore bidirezionale} combina un analizzatore di input e
-un processore di output per un I/O
-bidirezionale usando l'operatore @samp{|&} (@pxref{Ridirezione}).
-Le strutture @code{awk_input_parser_t} e @code{awk_output_buf_t}
-sono usate nella maniera gi@`a descritta precedentemente.
-
-Un processore bidirezionale @`e rappresentato dalla struttura seguente:
-
-@example
-typedef struct awk_two_way_processor @{
- const char *name; /* nome del processore bidirezionale */
- awk_bool_t (*can_take_two_way)(const char *name);
- awk_bool_t (*take_control_of)(const char *name,
- awk_input_buf_t *inbuf,
- awk_output_buf_t *outbuf);
- awk_const struct awk_two_way_processor *awk_const next; /* per gawk */
-@} awk_two_way_processor_t;
-@end example
-
-I campi sono i seguenti:
-
-@table @code
-@item const char *name;
-Il nome del processore bidirezionale.
-
-@item awk_bool_t (*can_take_two_way)(const char *name);
-La funzione puntata da questo campo dovrebbe restituire @dfn{true} se
-vuole gestire l'I/O bidirezionale per questo @value{FN}.
-La funzione non dovrebbe modificare alcuno stato (valori di variabili, etc.)
-all'interno di @command{gawk}.
-
-@item awk_bool_t (*take_control_of)(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf);
-La funzione puntata da questo campo dovrebbe riempire le strutture
-@code{awk_input_buf_t} e @code{awk_output_buf_t} puntate da @code{inbuf} e
-@code{outbuf}, rispettivamente. Queste strutture sono gi@`a state descritte
-in precedenza.
-
-@item awk_const struct two_way_processor *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarla.
-@end table
-
-Come per l'analizzatore di input e il processore di output, vanno fornite le
-funzione ``s@`{@dotless{i}}, ci penso io'' e ``per questo, fai tu'',
-@code{@var{XXX}_can_take_two_way()} e @code{@var{XXX}_take_control_of()}.
-
-Il processore bidirezionale va registrato usando la seguente funzione:
-
-@table @code
-@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
-Registra il processore bidirezionale puntato da @code{two_way_processor} con
-@command{gawk}.
-@end table
-
-@node Stampare messaggi
-@subsection Stampare messaggi dalle estensioni
-@cindex stampare messaggi dalle estensioni
-@cindex messaggi, stampare dalle estensioni
-@cindex estensioni, stampare messaggi dalle
-
-@`E possibile stampare diversi tipi di messaggi di avvertimento da
-un'estensione, come qui spiegato. Si noti che, per queste funzioni,
-si deve fornire l'ID di estensione ricevuto da @command{gawk}
-al momento in cui l'estensione @`e stata caricata:@footnote{Poich@'e l'API usa solo
-funzionalit@`a previste dal
-compilatore ISO C 90, non @`e possibile usare le macro di tipo variadico
-(che accettano un numero variabile di argomenti) disponibili nel compilatore
-ISO C 99, che nasconderebbero quel parametro. Un vero peccato!}
-
-@table @code
-@item void fatal(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio e poi @command{gawk} termina immediatamente l'esecuzione.
-
-@item void nonfatal(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di errore non-fatale.
-
-@item void warning(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di avvertimento.
-
-@item void lintwarn(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di avvertimento ``lint''. Normalmente questo equivale a
-stampare un messaggio di avvertimento, ma se @command{gawk} era stato
-invocato specificando l'opzione @samp{--lint=fatal},
-gli avvertimenti di @dfn{lint} diventano messaggi di errore fatali.
-@end table
-
-Tutte queste funzioni sono per il resto simili alla famiglia di funzioni
-@code{printf()} del linguaggio C, dove il parametro @code{format} @`e una
-stringa contenente dei caratteri normali e delle istruzioni di formattazione,
-mischiati tra loro.
-
-@node Aggiornare @code{ERRNO}
-@subsection Funzioni per aggiornare @code{ERRNO}
-
-Le seguenti funzioni consentono l'aggiornamento della variabile
-@code{ERRNO}:
-
-@table @code
-@item void update_ERRNO_int(int errno_val);
-Imposta @code{ERRNO} alla stringa equivalente del codice di errore
-in @code{errno_val}. Il valore dovrebbe essere uno dei codici di errore
-definiti in @code{<errno.h>}, e @command{gawk} lo trasforma in una stringa
-(qualora possibile, tradotta) usando la funzione C @code{strerror()}.
-
-@item void update_ERRNO_string(const char *string);
-Imposta @code{ERRNO} direttamente usando il valore della stringa specificata.
-@command{gawk} fa una copia del valore di @code{stringa}.
-
-@item void unset_ERRNO(void);
-Annulla il valore di @code{ERRNO}.
-@end table
-
-@node Richiedere valori
-@subsection Richiedere valori
-
-Tutte le funzioni che restituiscono valori da @command{gawk}
-funzionano allo stesso modo. Si fornisce un campo @code{awk_valtype_t}
-per indicare il tipo di valore che ci si aspetta. Se il valore disponibile
-corrisponde a quello richiesto, la funzione restituisce @dfn{true} e riempie
-il campo del risultato @code{awk_value_t}.
-Altrimenti, la funzione restituisce @dfn{false}, e il campo @code{val_type}
-indica il tipo di valore disponibile.
-A quel punto si pu@`o, a seconda di quel che richiede la situazione,
-stampare un messaggio di errore oppure ripetere la
-richiesta specificando il tipo di valore che risulta disponibile. Questo
-comportamento @`e riassunto nella
-@ref{table-value-types-returned}.
-
-@float Tabella,table-value-types-returned
-@caption{Tipi di valori restituiti dall'API}
-@docbook
-<informaltable>
-<tgroup cols="8">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <colspec colname="c3"/>
- <colspec colname="c4"/>
- <colspec colname="c5"/>
- <colspec colname="c6"/>
- <colspec colname="c7"/>
- <colspec colname="c8"/>
- <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/>
- <thead>
- <row><entry></entry><entry spanname="hspan"><para>Tipo di valore reale</para></entry></row>
- <row>
- <entry></entry>
- <entry></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>Indefinito</para></entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Stringa</emphasis></para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Strnum</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Numero</emphasis></para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry><para><emphasis role="bold">Tipo</emphasis></para></entry>
- <entry><para><emphasis role="bold">Regexp</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry><para><emphasis role="bold">Richiesto</emphasis></para></entry>
- <entry><para><emphasis role="bold">Vettore</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Scalare</emphasis></para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Indefinito</emphasis></para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>Indefinito</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">@dfn{Value cookie}</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- </tbody>
-</tgroup>
-</informaltable>
-@end docbook
-
-@ifnotplaintext
-@ifnotdocbook
-@multitable @columnfractions .50 .50
-@headitem @tab Tipo di valore reale
-@end multitable
-@c 10/2014: Thanks to Karl Berry for this bit to reduce the space:
-@tex
-\vglue-1.1\baselineskip
-@end tex
-@c @multitable @columnfractions .166 .166 .198 .15 .15 .166
-@ifclear SMALLPRINT
-@multitable {Richiesto} {Indefinito} {Numero} {Numero} {Scalar} {Regexp} {Vettore} {Indefinito}
-@headitem @tab @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
-@item @tab @b{Stringa} @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab false @tab false
-@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false
-@item @tab @b{Numero} @tab Numero @tab Numero @tab Numero @tab false @tab false @tab false
-@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
-@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vettore @tab false
-@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false
-@item @tab @b{Indefinito} @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
-@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
-@end multitable
-@end ifclear
-
-@ifset SMALLPRINT
-@smallformat
-@multitable {Richiesto} {Value cookie} {Num.} {Num.} {Scal.} {Regexp} {Vett.} {Indef.}
-@headitem @tab @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
-@item @tab @b{Stringa} @tab String @tab String @tab String @tab String @tab false @tab false
-@item @tab @b{Strnum} @tab false @tab Strn. @tab Strn. @tab false @tab false @tab false
-@item @tab @b{Numero} @tab Num. @tab Num. @tab Num. @tab false @tab false @tab false
-@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
-@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vett. @tab false
-@item @tab @b{Scalar} @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab false @tab false
-@item @tab @b{Indefinito} @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
-@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
-@end multitable
-@end smallformat
-@end ifset
-@end ifnotdocbook
-@end ifnotplaintext
-@ifplaintext
-@verbatim
- +-------------------------------------------------------+
- | Tipo di valore reale: |
- +--------+--------+--------+--------+-------+-----------+
- | Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
-+-----------+-----------+--------+--------+--------+--------+-------+-----------+
-| | Stringa | Stringa| Stringa| Stringa| Stringa| false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Strnum | false | Strnum | Strnum | false | false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Numero | Numero | Numero | Numero | false | false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Regexp | false | false | false | Regexp | false | false |
-| Tipo +-----------+--------+--------+--------+--------+-------+-----------+
-|Richiesto: | Vettore | false | false | false | false |Vettore| false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Scalare | Scalare| Scalare| Scalare| Scalare| false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Indefinito| Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Value- | false | false | false | false | false | false |
-| | Cookie | | | | | | |
-+-----------+-----------+--------+--------+--------+--------+-------+-----------+
-@end verbatim
-@end ifplaintext
-@end float
-
-@node Accedere ai parametri
-@subsection Accedere ai parametri e aggiornarli
-
-Due funzioni consentono di accedere agli argomenti (parametri)
-passati all'estensione. Esse sono:
-
-@table @code
-@item awk_bool_t get_argument(size_t count,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
-con l'argomento numero @code{count}. Restituisce @dfn{true} se il tipo
-dell'argomento corrisponde
-a quello specificato in @code{wanted}, e @dfn{false} in caso contrario.
-In quest'ultimo caso,
-@code{risultato@w{->}val_type} indica il tipo effettivo dell'argomento
-(@pxref{table-value-types-returned}). La numerazione degli argomenti parte
-da zero: il primo
-argomento @`e il numero zero, il secondo @`e il numero uno, e cos@`{@dotless{i}} via.
-@code{wanted} indica il tipo di valore atteso.
-
-@item awk_bool_t set_argument(size_t count, awk_array_t array);
-Converte un parametro di tipo indefinito in un vettore; ci@`o permette la
-chiamata per riferimento per i vettori. Restituisce @dfn{false} se @code{count} @`e troppo elevato,
-o se il tipo di argomento @`e diverso da @dfn{undefined}.
-@xref{Manipolazione di vettori}
-per ulteriori informazioni riguardo alla creazione di vettori.
-@end table
-
-@node Accedere alla tabella simboli
-@subsection Accedere alla Tabella dei simboli
-@cindex accedere alle variabili globali dalle estensioni
-@cindex variabili globali, accesso dalle estensioni
-@cindex estensioni, accesso alle variabili globali
-
-Due insiemi di routine permettono di accedere alle variabili globali,
-e un insieme consente di creare e rilasciare dei valori nascosti.
-
-@menu
-* Tabella simboli per nome:: Accedere alle variabili per nome.
-* Tabella simboli tramite cookie:: Accedere alle variabili per ``cookie''.
-* Valori nascosti:: Creare e usare valori nascosti.
-@end menu
-
-@node Tabella simboli per nome
-@subsubsection Accedere alle variabili per nome e aggiornarle
-
-Le routine che seguono permettono di raggiungere e aggiornare
-le variabili globali a livello di @command{awk} per nome. Nel gergo dei
-compilatori, gli identificativi di vario tipo sono noti come @dfn{simboli},
-da cui il prefisso ``sym'' nei nomi delle routine. La struttura di dati che
-contiene informazioni sui simboli @`e chiamata @dfn{Tabella dei simboli}
-(@dfn{Symbol table}).
-Le funzioni sono le seguenti:
-
-@table @code
-@item awk_bool_t sym_lookup(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
-con il valore della variabile il cui nome @`e nella stringa @code{name},
-che @`e una normale stringa di caratteri C.
-@code{wanted} indica il tipo di valore atteso.
-La funzione restituisce @dfn{true} se il tipo effettivo della variabile @`e quello
-specificato in @code{wanted}, e @dfn{false} in caso contrario.
-In quest'ultimo caso, @code{risultato>val_type} indica il tipo effettivo
-della variabile
-(@pxref{table-value-types-returned}).
-
-@item awk_bool_t sym_update(const char *name, awk_value_t *valore);
-Aggiorna la variabile il cui nome @`e contenuto nella stringa @code{name},
-che @`e una normale stringa di caratteri C.
-La variabile @`e aggiunta alla Tabella dei simboli di @command{gawk},
-se non @`e gi@`a presente. Restituisce @dfn{true} se tutto @`e andato bene, e
-@dfn{false} in caso contrario.
-
-La modifica del tipo (da scalare a vettoriale o viceversa) di una variabile
-gi@`a esistente @emph{non} @`e consentito, e questa routine non pu@`o neppure
-essere usata per aggiornare un vettore.
-Questa routine non pu@`o essere usata per modificare nessuna delle variabili
-predefinite (come @code{ARGC} o @code{NF}).
-@end table
-
-Un'estensione pu@`o andare a cercare il valore delle variabili speciali di
-@command{gawk}.
-Tuttavia, con l'eccezione del vettore @code{PROCINFO}, un'estensione
-non pu@`o cambiare alcuna di queste variabili.
-
-@node Tabella simboli tramite cookie
-@subsubsection Accedere alle variabili per ``cookie'' e aggiornarle
-
-Uno @dfn{scalar cookie} @`e un puntatore nascosto (@dfn{opaque handle}) che
-fornisce accesso a una
-variabile globale o a un vettore. Si tratta di un'ottimizzazione, per evitare
-di ricercare variabili nella Tabella dei simboli di @command{gawk} ogni volta
-che un accesso @`e necessario. Questo
-argomento @`e gi@`a stato trattato in precedenza, nella
-@ref{Tipi di dati generali}.
-
-Le funzioni seguenti servono per gestire gli @dfn{scalar cookie}:
-
-@table @code
-@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Ottiene il valore corrente di uno @dfn{scalar cookie}.
-Una volta ottenuto lo @dfn{scalar cookie} usando @code{sym_lookup()}, si
-pu@`o usare questa funzione per accedere al valore della variabile in modo
-pi@`u efficiente.
-Restituisce @dfn{false} se il valore non @`e disponibile.
-
-@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *valore);
-Aggiorna il valore associato con uno @dfn{scalar cookie}.
-Restituisce @dfn{false} se il nuovo valore non @`e del tipo
-@code{AWK_STRING}, @code{AWK_STRNUM}, @code{AWK_REGEX} o @code{AWK_NUMBER}.
-Anche in questo caso, le variabili predefinite non possono essere aggiornate.
-@end table
-
-Non @`e immediatamente evidente come si lavora con gli @dfn{scalar cookie} o
-quale sia la loro vera @i{ragion d'essere}. In teoria, le routine
-@code{sym_lookup()} e @code{sym_update()} sono tutto ci@`o che occorre per
-lavorare con le variabili. Per esempio, ci potrebbe essere un codice che
-ricerca il valore di una variabile, valuta una condizione, e potrebbe
-poi cambiare il valore della variabile a seconda dei risultati della
-valutazione in modo simile a questo:
-
-@example
-/* do_magic --- fai qualcosa di veramente grande */
-
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore;
-
- if ( sym_lookup("MAGIC_VAR", AWK_NUMBER, & valore)
- && qualche_condizione(valore.num_valore)) @{
- valore.num_valore += 42;
- sym_update("MAGIC_VAR", & valore);
- @}
-
- return make_number(0.0, risultato);
-@}
-@end example
-
-@noindent
-Questo codice sembra (ed @`e) semplice e immediato. Qual @`e il problema?
-
-Beh, si consideri cosa succede se un qualche codice a livello di @command{awk}
-associato con l'estensione richiama la funzione @code{magic()}
-(implementata in linguaggio C da @code{do_magic()}), una volta per ogni
-record, mentre si stanno elaborando
-file contenenti migliaia o milioni di record.
-La variabile @code{MAGIC_VAR} viene ricercata nella Tabella dei simboli una o due
-volte per ogni richiamo della funzione!
-
-La ricerca all'interno della Tabella dei simboli @`e in realt@`a una pura perdita
-di tempo; @`e molto pi@`u efficiente
-ottenere un @dfn{value cookie} che rappresenta la variabile, e usarlo per
-ottenere il valore della variabile e aggiornarlo a seconda della
-necessit@`a.@footnote{La differenza @`e misurabile e indubbiamente reale.
-Fidatevi.}
-
-Quindi, la maniera per usare i valori-cookie @`e la seguente. Per prima
-cosa, la variabile di estensione va messa nella Tabella dei simboli di
-@command{gawk} usando @code{sym_update()}, come al solito. Poi si deve ottenere
-uno @dfn{scalar cookie} per la
-variabile usando @code{sym_lookup()}:
-
-@example
-static awk_scalar_t magic_var_cookie; /* cookie per MAGIC_VAR */
-
-static void
-inizializza_estensione()
-@{
- awk_value_t valore;
-
- /* immettere il valore iniziale */
- sym_update("MAGIC_VAR", make_number(42.0, & valore));
-
- /* ottenere il @dfn{value cookie} */
- sym_lookup("MAGIC_VAR", AWK_SCALAR, & valore);
-
- /* salvarlo per dopo */
- magic_var_cookie = valore.scalar_cookie;
- @dots{}
-@}
-@end example
-
-Dopo aver fatto questo, si usino le routine descritte in questa @value{SECTION}
-per ottenere e modificare
-il valore usando il @dfn{value cookie}. Quindi, @code{do_magic()} diviene ora
-qualcosa del tipo:
-
-@example
-/* do_magic --- fai qualcosa di veramente grande */
-
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore;
-
- if ( sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & valore)
- && qualche_condizione(valore.num_valore)) @{
- valore.num_valore += 42;
- sym_update_scalar(magic_var_cookie, & valore);
- @}
- @dots{}
-
- return make_number(0.0, risultato);
-@}
-@end example
-
-@quotation NOTA
-Il codice appena visto omette il controllo di eventuali errori, per
-amor di semplicit@`a. Il codice dell'estensione dovrebbe essere pi@`u complesso
-e controllare attentamente i valori
-restituiti dalle funzioni dell'API.
-@end quotation
-
-@node Valori nascosti
-@subsubsection Creare e usare valori nascosti
-
-Le routine in questa @value{SECTION} permettono di creare e rilasciare
-valori nascosti. Come gli @dfn{scalar cookie}, in teoria i valori nascosti
-non sono necessari. Si possono creare numeri e stringhe usando
-le funzioni descritte
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di costruzione}. Si possono poi assegnare
-quei valori a delle variabili usando @code{sym_update()}
-o @code{sym_update_scalar()}, come si preferisce.
-
-Tuttavia, si pu@`o comprendere l'utilit@`a di avere dei valori nascosti
-se si pone mente al fatto che la memoria di @emph{ogni} valore di stringa
-@emph{deve} essere ottenuta tramite @code{gawk_malloc()},
-@code{gawk_calloc()} o @code{gawk_realloc()}.
-Se ci sono 20 variabili, e tutte hanno per valore la stessa stringa,
-si devono creare 20 copie identiche della stringa.@footnote{I valori
-numerici creano molti meno problemi, in quanto richiedono solo una variabile
-C @code{double} (8 byte) per contenerli.}
-
-Chiaramente @`e pi@`u efficiente, se possibile, creare il valore una sola volta,
-e fare in modo che @command{gawk} utilizzi quell'unico valore per molte
-variabili. Questo @`e ci@`o che la routine in
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION} permette
-di fare. Le funzioni sono le seguenti:
-
-@table @code
-@item awk_bool_t create_value(awk_value_t *valore, awk_value_cookie_t *risultato);
-Crea una stringa o un valore numerico nascosti, da @code{valore}, in
-vista di un successivo assegnamento di valore. Sono consentiti solo valori di
-tipo @code{AWK_NUMBER}, @code{AWK_REGEX} ed @code{AWK_STRING}.
-Ogni altro tipo @`e rifiutato.
-Il tipo @code{AWK_UNDEFINED} potrebbe essere consentito, ma in questo caso
-l'efficienza del programma ne soffrirebbe.
-
-@item awk_bool_t release_value(awk_value_cookie_t vc);
-Libera la memoria associata con un @dfn{value cookie} ottenuto mediante
-@code{create_value()}.
-@end table
-
-Si usano i @dfn{value cookie} in modo dimile a quello con cui si usano gli
-@dfn{scalar cookie}.
-Nella routine di inizializzazione dell'estensione, si crea il
-@dfn{value cookie}:
-
-@example
-static awk_value_cookie_t answer_cookie; /* static @dfn{value cookie} */
-
-static void
-inizializza_estensione()
-@{
- awk_value_t value;
- char *long_string;
- size_t long_string_len;
-
- /* codice precedente */
- @dots{}
- /* @dots{} riempire long_string e long_string_len @dots{} */
- make_malloced_string(long_string, long_string_len, & value);
- create_value(& value, & answer_cookie); /* creare cookie */
- @dots{}
-@}
-@end example
-
-Una volta che il valore @`e creato, si pu@`o usare come valore per un numero
-qualsiasi di variabili:
-
-@example
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t new_value;
-
- @dots{} /* come in precedenza */
-
- value.val_type = AWK_VALUE_COOKIE;
- value.value_cookie = answer_cookie;
- sym_update("VAR1", & value);
- sym_update("VAR2", & value);
- @dots{}
- sym_update("VAR100", & value);
- @dots{}
-@}
-@end example
-
-@noindent
-Usare @dfn{value cookie} in questo modo permette di risparmiare parecchia
-memoria, poich@'e tutte le variabili da @code{VAR1} a @code{VAR100} condividono
-lo stesso valore.
-
-Ci si potrebbe chiedere, ``Questa condivisione crea problemi?
-Cosa succede se il codice @command{awk} assegna un nuovo valore a @code{VAR1};
-sono modificate anche tutte le altre variabili?''
-
-Buona domanda! La risposta @`e che no, non @`e un problema.
-Internamente, @command{gawk} usa
-@dfn{un contatore dei riferimenti alle stringhe}. Questo significa
-che molte variabili possono condividere lo stesso valore di tipo stringa,
-e @command{gawk} mantiene traccia del loro uso. Quando il valore di
-una variabile viene modificato, @command{gawk} semplicemente diminuisce di
-uno il contatore dei riferimenti del vecchio valore, e aggiorna la variabile
-perch@'e usi il nuovo valore.
-
-Infine, come parte della pulizia al termine del programma
-(@pxref{Funzioni di exit callback})
-si deve liberare ogni valore nascosto che era stato creato, usando
-la funzione @code{release_value()}.
-
-@node Manipolazione di vettori
-@subsection Manipolazione di vettori
-@cindex vettori, manipolazione nelle estensioni
-@cindex estensioni, manipolazione di vettori
-
-La struttura di dati primaria@footnote{D'accordo, l'unica struttura di dati.}
-in @command{awk} @`e il vettore associativo
-@iftex
-(@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-(@pxref{Vettori}).
-@end ifnottex
-Le estensioni devono essere in grado di manipolare vettori @command{awk}.
-L'API fornisce varie strutture di dati per lavorare con vettori,
-funzioni per lavorare con singoli elementi di un vettore, e funzioni per
-lavorare con interi vettori. @`E prevista anche la possibilit@`a di
-``appiattire'' un vettore in modo da rendere facile a un programma scritto in
-C la ``visita'' di tutti gli elementi del vettore.
-Le strutture dati per i vettori sono facilmente integrabili con le
-strutture dati per variabili scalari, per facilitare sia l'elaborazione, sia
-la creazione di @dfn{veri} vettori di vettori (@pxref{Tipi di dati generali}).
-
-@menu
-* Tipi di dati per i vettori:: Tipi dati per lavorare coi vettori.
-* Funzioni per i vettori:: Funzioni per lavorare coi vettori.
-* Appiattimento di vettori:: Come appiattire i vettori.
-* Creazione di vettori:: Come creare e popolare vettori.
-@end menu
-
-@node Tipi di dati per i vettori
-@subsubsection Tipi di dati per i vettori
-
-I tipi di dato associati con i vettori sono i seguenti:
-
-@table @code
-@item typedef void *awk_array_t;
-Se si richiede il valore di una variabile contenuta in un vettore, si ottiene
-un valore del tipo @code{awk_array_t}. Questo valore @`e
-@dfn{opaco}@footnote{@`E anche un
-``cookie,'' ma gli sviluppatori di @command{gawk} hanno preferito non abusare
-di questo termine.} per l'estensione; identifica in maniera univoca il
-vettore ma pu@`o solo essere usato come parametro di una funzione dell'API,
-o essere ricevuto da una funzione dell'API. Questo @`e molto simile al modo
-in cui i valori @samp{FILE *} sono usati con le routine di libreria di
-@code{<stdio.h>}.
-
-@item typedef struct awk_element @{
-@itemx @ @ @ @ /* puntatore di servizio
-@itemx @ @ @ @ a lista collegata, non usato da gawk */
-@itemx @ @ @ @ struct awk_element *next;
-@itemx @ @ @ @ enum @{
-@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* impostato da gawk */
-@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* impostato dall'estensione */
-@itemx @ @ @ @ @} flags;
-@itemx @ @ @ @ awk_value_t index;
-@itemx @ @ @ @ awk_value_t value;
-@itemx @} awk_element_t;
-@code{awk_element_t} @`e un elemento di vettore ``appiattito''.
-@command{awk} produce un vettore di questo tipo all'interno della struttura
-@code{awk_flat_array_t} (si veda poco pi@`u avanti).
-Singoli elementi di vettore possono essere marcati per essere cancellati.
-Nuovi elementi del vettore devono essere aggiunti individualmente, uno per
-volta, usando una funzione API apposita. I campi sono i seguenti:
-
-@c nested table
-@table @code
-@item struct awk_element *next;
-Questo puntatore @`e presente come ausilio a chi scrive un'estensione.
-Permette a un'estensione di creare una lista collegata (@dfn{linked list}) di
-nuovi elementi che possono essere aggiunti a un vettore con un
-singolo ciclo che percorre tutta la lista.
-
-@item enum @{ @dots{} @} flags;
-Un insieme di valori di flag che passano informazione tra l'estensione
-e @command{gawk}. Per ora c'@`e solo un flag disponibile:
-@code{AWK_ELEMENT_DELETE}.
-Se lo si imposta, @command{gawk} elimina l'elemento in questione dal vettore
-originale, dopo che il vettore ``appiattito'' @`e stato rilasciato.
-
-@item index
-@itemx value
-L'indice e il valore di un elemento, rispettivamente.
-@emph{Tutta} la memoria puntata da @code{index} e @code{valore} appartiene
-a @command{gawk}.
-@end table
-
-@item typedef struct awk_flat_array @{
-@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* per uso di gawk */
-@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* per uso di gawk */
-@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* quanti elementi nel vettore */
-@itemx @ @ @ @ awk_element_t elements[1];@ @ /* saranno ``appiattiti'' */
-@itemx @} awk_flat_array_t;
-Questo @`e un vettore appiattito. Quando un'estensione ottiene da
-@command{gawk} questa struttura, il vettore @code{elements} ha una dimensione
-reale di @code{count} elementi.
-I puntatori @code{opaque1} e @code{opaque2} sono per uso di @command{gawk};
-come tali, sono marcati come @code{awk_const} in modo che l'estensione non
-possa modificarli.
-@end table
-
-@node Funzioni per i vettori
-@subsubsection Funzioni per lavorare coi vettori
-
-Le funzioni seguenti permettono di gestire singoli elementi di un vettore:
-
-@table @code
-@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count);
-Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*count}
-il numero di elementi in esso contenuti. Ogni sottovettore @`e conteggiato come
-se fosse un solo elemento.
-Restituisce @dfn{false} se si verifica un errore.
-
-@item awk_bool_t get_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*risultato}
-il valore dell'elemento il cui indice @`e @code{index}.
-@code{wanted} specifica il tipo di valore che si vuole ritrovare.
-Restituisce @dfn{false} se @code{wanted} non coincide con il tipo di dato o
-se @code{index} non @`e nel vettore (@pxref{table-value-types-returned}).
-
-Il valore per @code{index} pu@`o essere numerico, nel qual caso @command{gawk}
-lo converte in una stringa. Usare valori non interi @`e possibile, ma
-richiede di comprendere il modo con cui tali valori sono convertiti in stringhe
-(@pxref{Conversione}); per questo motivo, @`e meglio usare numeri interi.
-
-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{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}, e
-@command{gawk} rilascer@`a (al momento opportuno) la relativa memoria.
-
-@item awk_bool_t set_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value);
-Nel vettore rappresentato da @code{a_cookie}, crea o modifica
-l'elemento il cui indice @`e contenuto in @code{index}.
-I vettori @code{ARGV} ed @code{ENVIRON} non possono essere modificati,
-mentre il vettore @code{PROCINFO} @`e modificabile.
-
-@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element);
-Come @code{set_array_element()}, ma prende l'indice @code{index} e
-il valore @code{value} da @code{element}. Questa @`e una macro di utilit@`a.
-
-@item awk_bool_t del_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index);
-Elimina dal vettore, rappresentato da @code{a_cookie}, l'elemento con
-l'indice specificato.
-Restituisce @dfn{true} se l'elemento @`e stato rimosso o @dfn{false} se
-l'elemento non era presente nel vettore.
-@end table
-
-Le seguenti funzioni operano sull'intero vettore:
-
-@table @code
-@item awk_array_t create_array(void);
-Crea un nuovo vettore a cui si possono aggiungere elementi.
-@xref{Creazione di vettori} per una trattazione su come
-creare un nuovo vettore e aggiungervi elementi.
-
-@item awk_bool_t clear_array(awk_array_t a_cookie);
-Svuota il vettore rappresentato da @code{a_cookie}.
-Restituisce @dfn{false} in presenza di qualche tipo di problema, @dfn{true}
-in caso contrario. Il vettore non viene eliminato ma, dopo aver chiamato
-questa funzione, resta privo di elementi. Questo @`e equivalente a usare
-l'istruzione @code{delete} (@pxref{Cancellazione}).
-
-@item awk_bool_t flatten_array_typed(awk_array_t a_cookie, awk_flat_array_t **data, awk_valtype_t index_type, awk_valtype_t value_type);
-Per il vettore rappresentato da @code{a_cookie}, crea una struttura
-@code{awk_flat_array_t} e la riempie con indici e valori del tipo richiesto.
-Imposta il puntatore il cui indirizzo @`e passato in @code{data} per puntare a
-questa struttura.
-Restituisce @dfn{true} se tutto va bene o @dfn{false} in caso contrario.
-@ifset FOR_PRINT
-Si veda la prossima @value{SECTION}
-@end ifset
-@ifclear FOR_PRINT
-@xref{Appiattimento di vettori},
-@end ifclear
-per una trattazione su come appiattire un vettore per poterci lavorare.
-
-@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data);
-Per il vettore rappresentato da @code{a_cookie}, crea una struttura
-@code{awk_flat_array_t} e la riempie con indici di tipo @code{AWK_STRING} e
-valori @code{AWK_UNDEFINED}.
-Questa funzione @`e resa obsoleta da @code{flatten_array_typed()}.
-@`E fornita come macro, e mantenuta per convenienza e per compatibilit@`a a
-livello di codice sorgente con la precedente versione dell'API.
-
-@item awk_bool_t release_flattened_array(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data);
-Quando si @`e finito di lavorare con un vettore appiattito, si liberi la
-memoria usando questa funzione. Occorre fornire sia il cookie del vettore
-originale, sia l'indirizzo della struttura da liberare,
-@code{awk_flat_array_t}.
-La funzione restituisce @dfn{true} se tutto va bene, @dfn{false} in caso contrario.
-@end table
-
-@node Appiattimento di vettori
-@subsubsection Lavorare con tutti gli elementi di un vettore
-
-@dfn{Appiattire} un vettore vuol dire creare una struttura che
-rappresenta l'intero vettore in modo da facilitare la visita
-dell'intero vettore da parte del codice in C . Parte del codice in
-@file{extension/testext.c} fa questo, ed @`e anche un bell'esempio
-di come utilizzare l'API.
-
-Questa parte del codice sorgente sar@`a descritta un po' per volta.
-Ecco, per iniziare, lo script @command{gawk} che richiama l'estensione di test:
-
-@example
-@@load "testext"
-BEGIN @{
- n = split("blacky rusty sophie raincloud lucky", pets)
- printf("pets ha %d elementi\n", length(pets))
- ret = dump_array_and_delete("pets", "3")
- printf("dump_array_and_delete(pets) ha restituito %d\n", ret)
- if ("3" in pets)
- printf("dump_array_and_delete() NON ha rimosso l'indice \"3\"!\n")
- else
- printf("dump_array_and_delete() ha rimosso l'indice \"3\"!\n")
- print ""
-@}
-@end example
-
-@noindent
-Questo codice crea un vettore usando la funzione @code{split()}
-(@pxref{Funzioni per stringhe})
-e poi chiama @code{dump_array_and_delete()}. Questa funzione ricerca
-il vettore il cui nome @`e passato come primo argomento, ed
-elimina l'elemento il cui indice @`e passato come secondo argomento.
-Il codice @command{awk} stampa poi il valore restituito e controlla che
-l'elemento sia stato effettivamente cancellato. Ecco il codice C che
-costituisce la funzione
-@code{dump_array_and_delete()}. @`E stato leggermente modificato per facilitare
-l'esposizione.
-
-La prima parte dichiara variabili, imposta il valore di ritorno di default
-in @code{risultato}, e controlla che la funzione
-sia stata chiamata con il numero corretto di argomenti:
-
-@example
-static awk_value_t *
-dump_array_and_delete(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore, valore2, valore3;
- awk_flat_array_t *flat_array;
- size_t count;
- char *name;
- int i;
-
- assert(risultato != NULL);
- make_number(0.0, risultato);
-
- if (nargs != 2) @{
- printf("dump_array_and_delete: nargs errato "
- "(%d dovrebbe essere 2)\n", nargs);
- goto out;
- @}
-@end example
-
-La funzione poi prosegue un passo per volta, come segue. Il primo passo @`e
-ricuperare il nome del vettore, passato come primo argomento, seguito dal
-vettore stesso. Se una di queste operazioni non riesce, viene stampato un
-messaggio di errore e si ritorna al chiamante:
-
-@example
- /* trasforma in un vettore piatto il vettore
- passato come argomento e lo stampa */
- if (get_argument(0, AWK_STRING, & value)) @{
- name = valore.str_value.str;
- if (sym_lookup(name, AWK_array, & value2))
- printf("dump_array_and_delete: sym_lookup di %s effettuato\n",
- name);
- else @{
- printf("dump_array_and_delete: sym_lookup di %s non riuscito\n",
- name);
- goto out;
- @}
- @} else @{
- printf("dump_array_and_delete: get_argument(0) non riuscito\n");
- goto out;
- @}
-@end example
-
-Per controllo, e per assicurarsi che il codice C veda
-lo stesso numero di elementi del codice @command{awk},
-il secondo passo @`e quello di ottenere il numero di elementi nel vettore
-e stamparlo:
-
-@example
- if (! get_element_count(valore2.array_cookie, & count)) @{
- printf("dump_array_and_delete: get_element_count non riuscito\n");
- goto out;
- @}
-
- printf("dump_array_and_delete: il vettore in input ha %lu elementi\n",
- (unsigned long) count);
-@end example
-
-Il terzo passo @`e quello di appiattire il vettore, e quindi
-controllare che il numero di elementi nella struttura @code{awk_flat_array_t}
-sia uguale a quello appena trovato:
-
-@example
- if (! flatten_array_typed(valore2.array_cookie, & flat_array,
- AWK_STRING, AWK_UNDEFINED)) @{
- printf("dump_array_and_delete: non sono riuscito ad appiattire \
-il vettore\n");
- goto out;
- @}
-
- if (flat_array->count != count) @{
- printf("dump_array_and_delete: flat_array->count (%lu)"
- " != count (%lu)\n",
- (unsigned long) flat_array->count,
- (unsigned long) count);
- goto out;
- @}
-@end example
-
-Il quarto passo @`e ritrovare l'indice dell'elemento
-da eliminare, che era stato passato come secondo argomento.
-Va tenuto presente che i contatori di argomenti passati a @code{get_argument()}
-partono da zero, e che quindi il secondo argomento @`e quello numero uno:
-
-@example
- if (! get_argument(1, AWK_STRING, & value3)) @{
- printf("dump_array_and_delete: get_argument(1) non riuscito\n");
- goto out;
- @}
-@end example
-
-Il quinto passo @`e quello in cui si fa il ``vero lavoro''. La funzione esegue
-un ciclo su ogni elemento nel vettore, stampando i valori degli indici e
-degli elementi. Inoltre, dopo aver trovato, tramite l'indice, l'elemento
-che si vorrebbe eliminare, la funzione imposta il @dfn{bit}
-@code{AWK_ELEMENT_DELETE} nel campo @code{flags}
-dell'elemento. Quando il vettore @`e stato interamente percorso, @command{gawk}
-visita il vettore appiattito, ed elimina ogni elemento in cui il relativo
-@dfn{bit} della flag sia impostato:
-
-@example
- for (i = 0; i < flat_array->count; i++) @{
- printf("\t%s[\"%.*s\"] = %s\n",
- name,
- (int) flat_array->elements[i].index.str_value.len,
- flat_array->elements[i].index.str_value.str,
- valrep2str(& flat_array->elements[i].valore));
-
- if (strcmp(valore3.str_value.str,
- flat_array->elements[i].index.str_value.str) == 0) @{
- flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
- printf("dump_array_and_delete: ho marcato l'elemento \"%s\" "
- "per eliminazione\n",
- flat_array->elements[i].index.str_value.str);
- @}
- @}
-@end example
-
-Il sesto passo @`e liberare il vettore appiattito. Questo segnala a
-@command{gawk} che l'estensione non sta pi@`u usando il vettore,
-e che dovrebbe eliminare gli elementi marcati per l'eliminazione.
-@command{gawk} libera anche ogni area di memoria che era stata allocata,
-e quindi non si dovrebbe pi@`u usare il puntatore (@code{flat_array} in
-questo codice) dopo aver chiamato @code{release_flattened_array()}:
-
-@example
- if (! release_flattened_array(valore2.array_cookie, flat_array)) @{
- printf("dump_array_and_delete: non riesco a liberare \
-il vettore appiattito\n");
- goto out;
- @}
-@end example
-
-Infine, poich@'e tutto @`e andato bene, la funzione imposta il codice di ritorno
-a "successo", e lo restituisce quando esce:
-
-@example
- make_number(1.0, risultato);
-out:
- return risultato;
-@}
-@end example
-
-Ecco l'output ottenuto eseguendo questa parte del test:
-
-@example
-pets ha 5 elementi
-dump_array_and_delete: sym_lookup di pets effettuato
-dump_array_and_delete: il vettore in input ha 5 elementi
- pets["1"] = "blacky"
- pets["2"] = "rusty"
- pets["3"] = "sophie"
-dump_array_and_delete: ho marcato l'elemento "3" per eliminazione
- pets["4"] = "raincloud"
- pets["5"] = "lucky"
-dump_array_and_delete(pets) ha restituito 1
-dump_array_and_delete() ha rimosso l'indice "3"!
-@end example
-
-@node Creazione di vettori
-@subsubsection Come creare e popolare vettori
-
-Oltre a lavorare con vettori creati da codice @command{awk}, si possono
-creare vettori a cui aggiungere elementi secondo le esigenze, che poi
-il codice @command{awk} pu@`o utilizzare e manipolare.
-
-Ci sono due punti importanti da tener presente quando di creano vettori dal
-codice di un'estensione:
-
-@itemize @value{BULLET}
-@item
-Il vettore appena creato deve essere subito messo nella Tabella dei simboli di
-@command{gawk}. Solo dopo aver fatto questo @`e possibile aggiungere elementi
-al vettore.
-
-@ignore
-Strictly speaking, this is required only
-for arrays that will have subarrays as elements; however it is
-a good idea to always do this. This restriction may be relaxed
-in a subsequent revision of the API.
-@end ignore
-
-Analogamente, se si installa un nuovo vettore come sottovettore di
-un vettore gi@`a esistente,
-occorre prima aggiungere il nuovo vettore al suo "genitore" per poter poi
-aggiungere degli elementi allo stesso.
-
-Quindi, il modo giusto per costruire un vettore @`e di lavorare ``dall'alto
-verso il basso''. Creare il vettore, e subito aggiungerlo alla Tabella dei
-simboli di @command{gawk} usando @code{sym_update()}, o installarlo come
-elemento in un vettore gi@`a esistente usando @code{set_array_element()}.
-Un esempio di codice @`e fornito pi@`u sotto.
-
-@item
-Per come funziona internamente @command{gawk}, dopo aver usato
-@code{sym_update()} per definire un vettore
-in @command{gawk}, si deve innanzitutto ricuperare il @dfn{cookie}
-del vettore dal valore passato a @command{sym_update()}, in questo modo:
-
-@example
-awk_value_t val;
-awk_array_t new_array;
-
-new_array = create_array();
-val.val_type = AWK_ARRAY;
-val.array_cookie = new_array;
-
-/* aggiunge il vettore alla Tabella dei simboli */
-sym_update("array", & val);
-
-new_array = val.array_cookie; /* QUESTO @`E OBBLIGATORIO */
-@end example
-
-Se si sta installando un vettore come sottovettore, occorre anche
-ricuperare il @dfn{cookie} del vettore dopo aver chiamato @code{set_element()}.
-@end itemize
-
-Il seguente codice C @`e una semplice estensione di test per creare un vettore
-con due elementi normali e con un sottovettore. Le direttive iniziali
-@code{#include} e le solite dichiarazione di variabili sono state omesse per
-amor di brevit@`a
-(@pxref{Codice predefinito di un'estensione API}).
-Il primo passo @`e creare un nuovo vettore e poi aggiungerlo alla
-Tabella dei simboli:
-
-@example
-@ignore
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "gawkapi.h"
-
-static const gawk_api_t *api; /* per far funzionare le macro di utilit@`a */
-static awk_ext_id_t *ext_id;
-static const char *ext_version = "testarray extension: version 1.0";
-
-int plugin_is_GPL_compatible;
-
-@end ignore
-/* create_new_array --- creare un vettore denominato */
-
-static void
-create_new_array()
-@{
- awk_array_t a_cookie;
- awk_array_t sottovettore;
- awk_value_t index, valore;
-
- a_cookie = create_array();
- valore.val_type = AWK_array;
- valore.array_cookie = a_cookie;
-
- if (! sym_update("new_array", & value))
- printf("create_new_array: sym_update(\"nuovo_vettore\") \
-non riuscito!\n");
- a_cookie = valore.array_cookie;
-@end example
-
-@noindent
-Si noti come @code{a_cookie} @`e reimpostato dal campo @code{array_cookie}
-nella struttura @code{valore}.
-
-Il secondo passo aggiunge due elementi normali a @code{nuovo_vettore}:
-
-@example
- (void) make_const_string("salve", 5, & index);
- (void) make_const_string("mondo", 5, & value);
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-
- (void) make_const_string("risposta", 8, & index);
- (void) make_number(42.0, & value);
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-@end example
-
-Il terzo passo @`e creare il sottovettore e aggiungerlo al vettore:
-
-@example
- (void) make_const_string("sottovettore", 12, & index);
- sottovettore = create_array();
- valore.val_type = AWK_array;
- valore.array_cookie = subarray;
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
- sottovettore = valore.array_cookie;
-@end example
-
-Il passo finale @`e di aggiungere al sottovettore un suo proprio elemento:
-
-@example
- (void) make_const_string("pippo", 5, & index);
- (void) make_const_string("pluto", 5, & value);
- if (! set_array_element(sottovettore, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-@}
-@ignore
-static awk_ext_func_t func_table[] = @{
- @{ NULL, NULL, 0 @}
-@};
-
-/* init_testarray --- funzione ulteriore di inizializzazione */
-
-static awk_bool_t init_testarray(void)
-@{
- create_new_array();
-
- return awk_true;
-@}
-
-static awk_bool_t (*init_func)(void) = init_testarray;
-
-dl_load_func(func_table, testarray, "")
-@end ignore
-@end example
-
-Ecco uno script di esempio che carica l'estensione
-e quindi stampa il valore di tutti gli elementi del vettore,
-invocando nuovamente se stessa nel caso che un particolare
-elemento sia a sua volta un vettore:
-
-@example
-@@load "subarray"
-
-function dumparray(name, vettore, i)
-@{
- for (i in vettore)
- if (isarray(vettore[i]))
- dumparray(name "[\"" i "\"]", vettore[i])
- else
- printf("%s[\"%s\"] = %s\n", name, i, vettore[i])
-@}
-
-BEGIN @{
- dumparray("new_array", new_array);
-@}
-@end example
-
-Ecco il risultato dell'esecuzione dello script:
-
-@example
-$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk}
-@print{} new_array["sottovettore"]["pippo"] = pluto
-@print{} new_array["salve"] = mondo
-@print{} new_array["risposta"] = 42
-@end example
-
-@noindent
-(@xref{Trovare le estensioni} per ulteriori dettagli sulla
-variabile d'ambiente @env{AWKLIBPATH}.)
-
-@node Ridirezione API
-@subsection Accedere alle ridirezioni e modificarle
-
-La seguente funzione consente alle estensioni di accedere e di manipolare
-delle ridirezioni.
-
-@table @code
-@item awk_bool_t get_file(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t name_len,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *tipofile,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int fd,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_input_buf_t **ibufp,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_output_buf_t **obufp);
-Ricerca il file @code{name} nella tabella interna di ridirezione di
-@command{gawk}.
-Se @code{name} @`e @code{NULL} o @code{name_len} @`e zero, restituisce
-i dati del file in input correntemente aperto il cui nome @`e memorizzato in
-@code{FILENAME}.
-(Questa chiamata non usa l'argomento @code{filetype}, che, quindi, pu@`o essere
-lasciato indefinito).
-Se il file non @`e gi@`a aperto, tenta di aprirlo.
-L'argomento @code{filetype} deve terminare con uno zero binario, e dovrebbe
-dovrebbe avere uno di questi valori:
-
-@table @code
-@item ">"
-Un file aperto in output.
-
-@item ">>"
-Un file aperto in output, record aggiunti a fine file,
-dopo quelli gi@`a esistenti [@dfn{append}].
-
-@item "<"
-Un file aperto in input.
-
-@item "|>"
-Una @dfn{pipe} aperta in output.
-
-@item "|<"
-Una @dfn{pipe} aperta in input.
-
-@item "|&"
-Un coprocesso bidirezionale.
-@end table
-
-In caso di errore, restituisce il valore @code{@dfn{awk_false}}.
-Altrimenti, restituisce
-@code{@dfn{awk_true}}, insieme a ulteriori informazioni sulla ridirezione
-nei puntatori @code{ibufp} e @code{obufp}.
-Per ridirezioni di input il valore @code{*ibufp} non dovrebbe essere
-@code{NULL}, mentre @code{*obufp} dovrebbe essere @code{NULL}.
-Per ridirezioni di output,
-il valore di @code{*obufp} non dovrebbe essere @code{NULL}, e @code{*ibufp}
-dovrebbe essere @code{NULL}. Per coprocessi bidirezionali, nessuno dei due
-valori dovrebbe essere @code{NULL}.
-
-Normalmente, l'estensione @`e interessata a @code{(*ibufp)->fd}
-e/o @code{fileno((*obufp)->fp)}. Se il file non @`e gi@`a
-aperto, e l'argomento @code{fd} non @`e negativo, @command{gawk}
-user@`a quel descrittore di file invece di aprire il file nella
-maniera solita. Se l'@code{fd} non @`e negativo, ma il file esiste gi@`a,
-@command{gawk} ignora l'@code{fd} e restituisce il file esistente. @`E
-responsabilit@`a del chiamante notare che n@'e l'@code{fd} nella struttura
-restituita @code{awk_input_buf_t}, n@'e l'@code{fd} nella struttura restituita
-@code{awk_output_buf_t} contiene il valore richiesto.
-
-Si noti che fornire un descrittore di file @emph{non} @`e al momento supportato
-per le @dfn{pipe}. Tuttavia, l'utilizzo di un descrittore di file
-dovrebbe essere possibile per @dfn{socket} in input, output,
-aggiunta-a-fine-file (append), e bidirezionale (coprocessi).
-Se @code{filetype} @`e bidirezionale, @command{gawk} presuppone che sia un
-@dfn{socket}! Si noti che nel caso
-bidirezionale i descrittori di file in input e output possono essere
-differenti.
-Per essere sicuri che tutto sia andato bene, si deve controllare che uno dei due
-corrisponda alla richiesta.
-@end table
-
-Si prevede che questa funzione API verr@`a usata per parallelizzare l'I/O
-e rendere disponibile una libreria per i @dfn{socket}.
-
-@node Variabili dell'estensione API
-@subsection Variabili fornite dall'API
-
-L'API fornisce due insiemi di variabili. Il primo insieme contiene
-informazioni sulla versione dell'API (sia la versione dell'estensione
-compilata, che quella di @command{gawk}). Il secondo
-insieme contiene informazioni su come @command{gawk} @`e stato invocato.
-
-@menu
-* Versione dell'estensione:: Informazioni sulla versione API.
-* Variabili informative di estens. API:: Variabili che forniscono informationi
- sull'invocazione di @command{gawk}.
-@end menu
-
-@node Versione dell'estensione
-@subsubsection Costanti e variabili della versione dell'API
-@cindex API, versione
-@cindex versione dell'estensione API @command{gawk}
-@cindex estensione @command{gawk}, versione API
-
-L'API fornisce sia un numero di versione ``principale'' che uno ``secondario''.
-Le versioni dell'API sono disponibili al momento della compilazione, come
-definizioni per il preprocessore C, a supporto della compilazione
-condizionale, e come elencazione di costanti per facilitare il debug:
-
-@float Tabella,gawk-api-version
-@caption{Costanti delle versioni API gawk}
-@multitable {@b{API Version}} {@code{gawk_api_major_version}} {@code{GAWK_API_MAJOR_VERSION}}
-@headitem versione API @tab Definiz. Preprocessore C @tab Costante di elenco
-@item Major @tab @code{gawk_api_major_version} @tab @code{GAWK_API_MAJOR_VERSION}
-@item Minor @tab @code{gawk_api_minor_version} @tab @code{GAWK_API_MINOR_VERSION}
-@end multitable
-@end float
-
-La versione secondaria aumenta quando nuove funzioni sono aggiunte all'API.
-Tali nuove funzioni sono sempre aggiunte alla fine della @code{struct} dell'API.
-
-La versione principale aumenta (e la versione secondaria torna a zero) se
-qualche tipo di dati cambia dimensione o si modifica l'ordine dei campi, o se
-qualcuna delle funzioni esistenti cambia il livello di versione.
-
-Pu@`o capitare che un'estensione sia stata compilata con una versione
-dell'API ma caricata da una versione di @command{gawk} che ne usa una
-differente. Per questo motivo, la versione principale e quella secondaria
-dell'API della versione in uso di @command{gawk} sono incluse nella
-@code{struct} dell'API come costanti intere in sola lettura:
-
-@table @code
-@item api->major_version
-La versione principale di @command{gawk} in esecuzione.
-
-@item api->minor_version
-La versione secondaria di @command{gawk} in esecuzione.
-@end table
-
-Dipende dall'estensione decidere se ci sono incompatibilit@`a con l'API.
-Tipicamente, basta un controllo di questo tipo:
-
-@example
-if (api->major_version != GAWK_API_MAJOR_VERSION
- || api->minor_version < GAWK_API_MINOR_VERSION) @{
- fprintf(stderr, "estensione_pippo: discordanza di versione \
-con gawk!\n");
- fprintf(stderr, "\tLa mia versione (%d, %d), versione gawk \
-(%d, %d)\n",
- GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
- api->major_version, api->minor_version);
- exit(1);
-@}
-@end example
-
-Questo codice @`e incluso nella macro generica @code{dl_load_func()}
-presente in @file{gawkapi.h} (trattata
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Codice predefinito di un'estensione API}).
-
-@node Variabili informative di estens. API
-@subsubsection Variabili informative
-@cindex API, variabili informative dell'estensione
-@cindex variabili informative dell'API
-@cindex estensione API, variabili informative
-
-L'API fornisce accesso a parecchie variabili che descrivono
-se le opzioni della riga di comando corrispondenti sono state specificate
-quando @command{gawk} @`e stato chiamato. Le variabili sono:
-
-@table @code
-@item do_debug
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--debug}.
-
-@item do_lint
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--lint}.
-
-@item do_mpfr
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--bignum}.
-
-@item do_profile
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--profile}.
-
-@item do_sandbox
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--sandbox}.
-
-@item do_traditional
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--traditional}.
-@end table
-
-Il valore di @code{do_lint} pu@`o cambiare se il codice @command{awk}
-modifica la variabile predefinita @code{LINT} (@pxref{Variabili predefinite}).
-Gli altri valori non dovrebbero cambiare durante l'esecuzione.
-
-@node Codice predefinito di un'estensione API
-@subsection Codice predefinito di interfaccia API
-
-Come gi@`a detto (@pxref{Panoramica sul meccanismo delle estensioni}),
-le definizioni di funzioni qui presentate sono in realt@`a delle macro.
-Per usare queste macro, l'estensione deve fornire una piccola quantit@`a di
-codice predefinito (variabili e
-funzioni) nella parte iniziale del file sorgente, usando dei nomi
-standard, come descritto qui sotto. Il codice predefinito in questione @`e
-anche descritto nel file di intestazione @file{gawkapi.h}:
-
-@example
-/* Codice predefinito: */
-int plugin_is_GPL_compatible;
-
-static gawk_api_t *const api;
-static awk_ext_id_t ext_id;
-static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
-
-static awk_ext_func_t func_table[] = @{
- @{ "name", do_name, 1, 0, awk_false, NULL @},
- /* @dots{} */
-@};
-
-/* O: */
-
-static awk_bool_t (*init_func)(void) = NULL;
-
-/* OPPURE: */
-
-static awk_bool_t
-init_mia_estensione(void)
-@{
- @dots{}
-@}
-
-static awk_bool_t (*init_func)(void) = init_mia_estensione;
-
-dl_load_func(func_table, qualche_nome, "name_space_in_quotes")
-@end example
-
-Queste variabili e funzioni sono:
-
-@table @code
-@item int plugin_is_GPL_compatible;
-Qui si dichiara che l'estensione @`e compatibile con
-@ifclear FOR_PRINT
-la licenza GNU GPL (@pxref{Copia}).
-
-@end ifclear
-@ifset FOR_PRINT
-la licenza GNU GPL.
-@end ifset
-Se l'estensione non ha questa variabile, non verr@`a caricata da @command{gawk}
-(@pxref{Licenza delle estensioni}).
-
-@item static gawk_api_t *const api;
-Questa variabile globale @code{static} dovrebbe essere impostata per
-puntare al puntatore
-@code{gawk_api_t} che @command{gawk} passa alla funzione (dell'estensione)
-@code{dl_load()}. Questa variabile @`e usata da tutte le macro.
-
-@item static awk_ext_id_t ext_id;
-Questa variabile globale @code{static} dovrebbe essere impostata al valore
-@code{awk_ext_id_t} che @command{gawk} passa alla funzione @code{dl_load()}.
-Questa variabile @`e usata da tutte le macro.
-
-@item static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
-Questa variabile globale @code{static} dovrebbe essere impostata
-a @code{NULL} oppure puntare a una stringa che contiene il nome e la
-versione dell'estensione.
-
-@item static awk_ext_func_t func_table[] = @{ @dots{} @};
-Questo @`e un vettore di una o pi@`u strutture @code{awk_ext_func_t},
-come descritto in precedenza (@pxref{Funzioni di estensione}).
-Pu@`o essere usato in seguito per pi@`u chiamate a
-@code{add_ext_func()}.
-
-@c Use @var{OR} for docbook
-@item static awk_bool_t (*init_func)(void) = NULL;
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @var{OR}
-@itemx static awk_bool_t init_mia_estensione(void) @{ @dots{} @}
-@itemx static awk_bool_t (*init_func)(void) = init_mia_estensione;
-Se qualche lavoro di inizializzazione @`e necessario, si dovrebbe definire una
-funzione all'uopo (crea variabili, apre file, etc.)
-e poi definire il puntatore @code{init_func} che punti alla funzione
-stessa.
-La funzione dovrebbe restituire @code{awk_@dfn{false}} se non va a buon fine
-o @code{awktrue} se tutto va bene.
-
-Se un'inizializzazione non @`e necessaria, si definisca il puntatore e
-lo si inizializzi a @code{NULL}.
-
-@item dl_load_func(func_table, qualche_nome, "nome_spazio_tra_doppi_apici")
-Questa macro genera una funzione @code{dl_load()} che far@`a
-tutte le inizializzazioni necessarie.
-@end table
-
-Lo scopo di tutte le variabili e dei vettori @`e di far s@`{@dotless{i}} che la
-funzione @code{dl_load()} (richiamata dalla macro @code{dl_load_func()})
-faccia tutto il lavoro standard necessario, qui descritto:
-
-@enumerate 1
-@item
-Controlla le versioni dell'API. Se la versione principale dell'estensione
-non corrisponde a quella di @command{gawk} o se la versione secondaria
-dell'estensione @`e maggiore di quella di @command{gawk}, stampa un messaggio
-di errore fatale ed esce.
-
-@item
-Carica le funzioni definite in @code{func_table}.
-Se qualche caricamento non riesce, stampa un messaggio di
-avvertimento ma continua l'esecuzione.
-
-@item
-Se il puntatore @code{init_func} non @`e @code{NULL}, chiama la
-funzione da esso puntata. Se questa restituisce @code{awk_false}, stampa un
-messaggio di avvertimento.
-
-@item
-Se @code{ext_version} non @`e @code{NULL}, registra la
-stringa di versione con @command{gawk}.
-@end enumerate
-
-@node Modifiche dalla versione API 1
-@subsection Modifiche dalla versione 1 dell'API
-
-La versione API corrente @emph{non} @`e compatibile a livello binario con la
-versione 1 dell'API.
-Le funzioni di estensione vanno ricompilate per poterle usare con la versione
-corrente di @command{gawk}.
-
-Fortunatamente, fatti salvi alcuni possibili avvertimenti a livello di
-compilazione, l'API rimane compatibile a livello di codice sorgente con la
-precedente versione API. Le differenze pi@`u rilevanti sono gli ulteriori
-campi nella struttura @code{awk_ext_func_t}, e l'aggiunta del terzo argomento
-nella funzione di implementazione in linguaggio C.
-
-@node Trovare le estensioni
-@section Come @command{gawk} trova le estensioni compilate
-@cindex estensioni, percorso di ricerca per
-@cindex estensioni, come trovarle
-@cindex trovare le estensioni
-@cindex percorso di ricerca per estensioni
-
-Le estensioni compilate vanno installate in una directory dove
-@command{gawk} possa trovarle. Se @command{gawk} @`e configurato e
-installato nella maniera di default, la directory dove trovare le
-estensioni @`e @file{/usr/local/lib/gawk}. Si pu@`o anche specificare un
-percorso di ricerca contenente una lista di directory da esaminare per la
-ricerca di estensioni compilate.
-@xref{AWKLIBPATH (Variabile)} per ulteriori dettagli.
-
-@node Esempio di estensione
-@section Esempio: alcune funzioni per i file
-@cindex estensione, esempio
-@cindex esempio di estensione
-
-@quotation
-@i{In qualunque posto vai, l@`a tu sei.}
-@author Buckaroo Banzai
-@end quotation
-
-@c It's enough to show chdir and stat, no need for fts
-
-Due utili funzioni che non sono in @command{awk} sono @code{chdir()} (per
-permettere a un programma @command{awk} di cambiare directory di lavoro) e
-@code{stat()}
-(per far s@`{@dotless{i}} che un programma @command{awk} possa raccogliere informazioni
-su un dato file).
-Per illustrare l'azione dell'API, questa @value{SECTION} fornisce
-queste funzioni a @command{gawk} in un'estensione.
-
-@menu
-* Descrizione interna file:: Quello che le nuove funzioni faranno
-* Operazioni interne file:: Codice per gestire file all'interno
-* Usare operazioni interne file:: Come usare un'estensione esterna
-@end menu
-
-@node Descrizione interna file
-@subsection Usare @code{chdir()} e @code{stat()}
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} mostra come usare le nuove funzioni a
-livello di @command{awk} una volta che siano state integrate nell'interprete
-del programma @command{gawk} in esecuzione. Usare @code{chdir()} @`e molto
-semplice. Richiede un solo argomento, la nuova directory su cui
-posizionarsi:
-
-@example
-@@load "filefuncs"
-@dots{}
-newdir = "/home/arnold/funstuff"
-ret = chdir(newdir)
-if (ret < 0) @{
- printf("non riesco a passare a %s: %s\n", newdir, ERRNO) > "/dev/stderr"
- exit 1
-@}
-@dots{}
-@end example
-
-Il valore restituito @`e negativo se la chiamata a @code{chdir()} non @`e riuscita,
-ed @code{ERRNO} (@pxref{Variabili predefinite}) @`e impostato a una stringa
-che descrive l'errore.
-
-Usare @code{stat()} @`e un po' pi@`u complicato. La funzione scritta in C
-@code{stat()} riempie una struttura che ha una certa quantit@`a di informazioni.
-La maniera corretta per immagazzinarle in @command{awk} @`e quella di riempire
-un vettore associativo con le informazioni appropriate:
-
-@c broke printf for page breaking
-@example
-file = "/home/arnold/.profile"
-ret = stat(file, fdata)
-if (ret < 0) @{
- printf("non @`e stato possibile eseguire @command{stat} per %s: %s\n",
- file, ERRNO) > "/dev/stderr"
- exit 1
-@}
-printf("dimensione di %s @`e %d byte\n", file, fdata["size"])
-@end example
-
-La funzione @code{stat()} svuota sempre il vettore che contiene i dati,
-anche nel caso che la chiamata a @code{stat()} non riesca. I seguenti
-elementi vengono restituiti dalla funzione:
-
-@table @code
-@item "name"
-Il nome del file oggetto della chiamata a @code{stat()}.
-
-@item "dev"
-@itemx "ino"
-I numeri di @dfn{device} e di @dfn{inode}, rispettivamente.
-
-@item "mode"
-Il modo del file, in formato numerico. Questo include sia il tipo di file che
-i suoi permessi di accesso.
-
-@item "nlink"
-Il numero di collegamenti fisici del file (stesso file con diversi nomi).
-
-@item "uid"
-@itemx "gid"
-Gli identificativi di utente e di gruppo del possessore del file.
-
-@item "size"
-La dimensione in byte del file.
-
-@item "blocks"
-Il numero di blocchi su disco realmente occupati dal file. Questo pu@`o non
-essere
-proporzionale alla dimensione del file se il file ha delle lacune
-[ossia se solo alcune parti del file esistono veramente, il resto
-non @`e ancora stato riempito].
-
-@item "atime"
-@itemx "mtime"
-@itemx "ctime"
-La data e ora dell'ultimo accesso, modifica, e aggiornamento dell'@dfn{inode},
-rispettivamente. Questi sono delle marcature temporali numeriche
-(misurate in secondi dal
-01 gennaio 1970), che possono essere formattate dalla funzione
-@code{strftime()}
-(@pxref{Funzioni di tempo}).
-
-@item "pmode"
-La modalit@`a stampabile (``printable mode'') del file.
-Questo @`e una stringa che rappresenta
-il tipo del file e i permessi di accesso, come sono visualizzati da
-@samp{ls -l}---per esempio, @code{"drwxr-xr-x"}.
-
-@item "type"
-Una stringa stampabile che descrive il tipo di file. Il valore @`e uno dei
-seguenti:
-
-@table @code
-@item "blockdev"
-@itemx "chardev"
-Il file @`e un dispositico a blocchi o a caratteri (``file speciale'').
-
-@ignore
-@item "door"
-The file is a Solaris ``door'' (special file used for
-interprocess communications).
-@end ignore
-
-@item "directory"
-Il file @`e una directory.
-
-@item "fifo"
-Il file @`e una @dfn{pipe} denominata (nota anche come FIFO [First In First
-Out]).
-
-@item "file"
-Il file @`e un file normale.
-
-@item "@dfn{socket}"
-Il file @`e un @dfn{socket} @code{AF_UNIX} (``Unix domain'') nel
-filesystem.
-
-@item "symlink"
-Il file @`e un collegamento simbolico.
-@end table
-
-@c 5/2013: Thanks to Corinna Vinschen for this information.
-@item "devbsize"
-La dimensione di un blocco per l'elemento indicizzato da @code{"blocks"}.
-Questa informazione @`e derivata dalla costante @code{DEV_BSIZE}
-definita in @code{<sys/param.h>} nella maggior parte dei sistemi,
-o dalla costante @code{S_BLKSIZE} in @code{<sys/stat.h>} nei sistemi BSD.
-Per alcuni altri sistemi il valore si basa su una conoscenza @dfn{a priori}
-delle caratteristiche di un particolare sistema.
-Se non si riesce a determinare il valore, viene
-restituito quello di default, che @`e 512.
-@end table
-
-Possono essere presenti diversi altri elementi, a seconda del
-sistema operativo e del tipo di file.
-Si pu@`o controllarne la presenza dal programma @command{awk} per mezzo
-dell'operatore @code{in}
-(@pxref{Visitare elementi}):
-
-@table @code
-@item "blksize"
-La dimensione preferita di un blocco per effettuare operazioni di I/O sul file.
-Questo campo non @`e presente nella struttura C @code{stat} di tutti i sistemi
-che rispettano lo standard POSIX.
-
-@item "linkval"
-Se il file @`e un collegamento simbolico, questo elemento @`e il nome del
-file puntato dal collegamento simbolico (cio@`e, il valore del collegamento).
-
-@item "rdev"
-@itemx "major"
-@itemx "minor"
-Se il file @`e un dispositivo a blocchi o a caratteri, questi valori
-rappresentano il numero del dispositivo e, rispettivamente, le componenti
-principale e secondaria di quel numero.
-@end table
-
-@node Operazioni interne file
-@subsection Codice C per eseguire @code{chdir()} e @code{stat()}
-
-Questo @`e il codice C per queste estensioni.@footnote{La versione qui
-presentata @`e
-lievemente modificata per amor di semplicit@`a. Si veda @file{extension/filefuncs.c}
-nella distribuzione @command{gawk} per la versione completa.}
-
-Il file include alcuni file di intestazione standard, e poi il file di
-intestazione @file{gawkapi.h}, che fornisce le definizioni dell'API.
-A queste seguono le dichiarazioni di variabili, necessarie
-per usare le macro dell'API e il codice predefinito
-(@pxref{Codice predefinito di un'estensione API}):
-
-@example
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "gawkapi.h"
-
-#include "gettext.h"
-#define _(msgid) gettext(msgid)
-#define N_(msgid) msgid
-
-#include "gawkfts.h"
-#include "stack.h"
-
-static const gawk_api_t *api; /* per consentire il funzionamento
- delle macro di utilit@`a */
-static awk_ext_id_t *ext_id;
-static awk_bool_t init_filefuncs(void);
-static awk_bool_t (*init_func)(void) = init_filefuncs;
-static const char *ext_version = "filefuncs extension: version 1.0";
-
-int plugin_is_GPL_compatible;
-@end example
-
-@cindex programmazione, convenzioni di, estensioni @command{gawk}
-@cindex estensioni @command{gawk}, convenzioni di programmazione
-Per convenzione, per una funzione @command{awk} di nome @code{pippo()},
-la funzione C che la implementa @`e chiamata @code{do_pippo()}. La funzione
-dovrebbe avere due argomenti. Il primo @`e un numero @code{int}, chiamato
-@code{nargs}, che rappresenta il numero di argomenti passato alla funzione.
-Il secondo @`e un puntatore a una struttura @code{awk_value_t}, normalmente
-chiamata @code{risultato}:
-
-@example
-/* do_chdir --- fornisce funzione chdir()
- caricata dinamicamente per gawk */
-
-static awk_value_t *
-do_chdir(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
-@{
- awk_value_t newdir;
- int ret = -1;
-
- assert(risultato != NULL);
-@end example
-
-La variabile @code{newdir}
-rappresenta la nuova directory nella quale cambiare, che @`e ottenuta
-tramite la funzione @code{get_argument()}. Si noti che il primo argomento @`e
-quello numero zero.
-
-Se l'argomento @`e stato trovato con successo, la funzione invoca la chiamata di
-sistema @code{chdir()}. In caso contrario, se la @code{chdir()} non riesce,
-viene aggiornata la variabile @code{ERRNO}:
-
-@example
- if (get_argument(0, AWK_STRING, & newdir)) @{
- ret = chdir(newdir.str_value.str);
- if (ret < 0)
- update_ERRNO_int(errno);
- @}
-@end example
-
-Infine, la funzione restituisce il codice di ritorno da @code{chdir} a
-livello di @command{awk}:
-
-@example
- return make_number(ret, risultato);
-@}
-@end example
-
-L'estensione @code{stat()} @`e pi@`u impegnativa. Dapprima abbiamo
-una funzione che trasforma la stringa di autorizzazione numerica
-(@dfn{mode}) in una rappresentazione stampabile
-(p.es., il codice ottale @code{0644} diviene @samp{-rw-r--r--}). Questa
-parte @`e qui omessa per brevit@`a.
-
-@example
-/* format_mode --- trasforma il campo @dfn{mode} di @dfn{stat}
- in qualcosa di leggibile */
-
-static char *
-format_mode(unsigned long fmode)
-@{
- @dots{}
-@}
-@end example
-
-Viene poi una funzione per leggere dei collegamenti simbolici, anche questa
-omessa per brevit@`a:
-
-@example
-/* read_symlink --- legge un collegamento simbolico in un buffer
- allocato.
- @dots{} */
-
-static char *
-read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
-@{
- @dots{}
-@}
-@end example
-
-Due funzioni ausiliarie semplificano l'immissione di valori nel
-vettore che conterr@`a il risultato della chiamata a @code{stat()}:
-
-@example
-/* array_set --- imposta un elemento di un vettore */
-
-static void
-array_set(awk_array_t vettore, const char *sub, awk_value_t *valore)
-@{
- awk_value_t index;
-
- set_array_element(vettore,
- make_const_string(sub, strlen(sub), & index),
- valore);
-
-@}
-
-/* array_set_numeric --- imposta un elemento di un vettore con un
- numero */
-
-static void
-array_set_numeric(awk_array_t vettore, const char *sub, double num)
-@{
- awk_value_t tmp;
-
- array_set(vettore, sub, make_number(num, & tmp));
-@}
-@end example
-
-La seguente funzione fa il grosso del lavoro per riempire il vettore dei
-risultati @code{awk_array_t} con valori ottenuti
-da una @code{struct stat} valida. Questo lavoro @`e fatto in una funzione
-separata per supportare sia la funzione
-@code{stat()} per @command{gawk}, che l'estensione @code{fts()},
-che @`e inclusa nello stesso file, ma non
- @`e mostrata qui
-(@pxref{Esempio di estensione funzioni file}).
-
-La prima parte della funzione @`e la dichiarazione delle variabili,
-compresa una tabella per tradurre i tipi di file in stringhe:
-
-@example
-/* fill_stat_array --- fa il lavoro di riempire un
- vettore con informazioni da stat */
-
-static int
-fill_stat_array(const char *name, awk_array_t vettore, struct stat *sbuf)
-@{
- char *pmode; /* @dfn{mode} stampabile */
- const char *type = "unknown";
- awk_value_t tmp;
- static struct ftype_map @{
- unsigned int mask;
- const char *type;
- @} ftype_map[] = @{
- @{ S_IFREG, "file" @},
- @{ S_IFBLK, "blockdev" @},
- @{ S_IFCHR, "chardev" @},
- @{ S_IFDIR, "directory" @},
-#ifdef S_IFSOCK
- @{ S_IFSOCK, "socket" @},
-#endif
-#ifdef S_IFIFO
- @{ S_IFIFO, "fifo" @},
-#endif
-#ifdef S_IFLNK
- @{ S_IFLNK, "symlink" @},
-#endif
-#ifdef S_IFDOOR /* Stranezza Solaris */
- @{ S_IFDOOR, "door" @},
-#endif /* S_IFDOOR */
- @};
- int j, k;
-@end example
-
-Il vettore di destinazione @`e svuotato di elementi, e poi il codice riempie
-i vari elementi prendendoli dai valori presenti in @code{struct stat}:
-@example
- /* svuota il vettore */
- clear_array(vettore);
-
- /* riempie il vettore */
- array_set(vettore, "name", make_const_string(name, strlen(name),
- & tmp));
- array_set_numeric(vettore, "dev", sbuf->st_dev);
- array_set_numeric(vettore, "ino", sbuf->st_ino);
- array_set_numeric(vettore, "mode", sbuf->st_mode);
- array_set_numeric(vettore, "nlink", sbuf->st_nlink);
- array_set_numeric(vettore, "uid", sbuf->st_uid);
- array_set_numeric(vettore, "gid", sbuf->st_gid);
- array_set_numeric(vettore, "size", sbuf->st_size);
- array_set_numeric(vettore, "blocks", sbuf->st_blocks);
- array_set_numeric(vettore, "atime", sbuf->st_atime);
- array_set_numeric(vettore, "mtime", sbuf->st_mtime);
- array_set_numeric(vettore, "ctime", sbuf->st_ctime);
-
- /* per dispositivi a blocchi o carattere, aggiunge rdev,
- e il numero principale e secondario */
- if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{
- array_set_numeric(vettore, "rdev", sbuf->st_rdev);
- array_set_numeric(vettore, "major", major(sbuf->st_rdev));
- array_set_numeric(vettore, "minor", minor(sbuf->st_rdev));
- @}
-@end example
-
-@noindent
-L'ultima parte della funzione fa alcune aggiunte selettive
-al vettore di destinazione, a seconda che siano disponibili o no
-certi campi e/o il tipo del file. Viene poi restituito zero, per indicare che
-tutto @`e andato bene:
-
-@example
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
- array_set_numeric(vettore, "blksize", sbuf->st_blksize);
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
-
- pmode = format_mode(sbuf->st_mode);
- array_set(vettore, "pmode", make_const_string(pmode, strlen(pmode),
- & tmp));
-
- /* per collegamenti simbolici, si aggiunge un campo linkval */
- if (S_ISLNK(sbuf->st_mode)) @{
- char *buf;
- ssize_t linksize;
-
- if ((buf = read_symlink(name, sbuf->st_size,
- & linksize)) != NULL)
- array_set(vettore, "linkval",
- make_malloced_string(buf, linksize, & tmp));
- else
- warning(ext_id, _("stat: non riesco a leggere il \
-collegamento simbolico `%s'"),
- name);
- @}
-
- /* aggiunge il tipo di campo */
- type = "unknown"; /* non dovrebbe succedere */
- for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{
- if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{
- type = ftype_map[j].type;
- break;
- @}
- @}
-
- array_set(vettore, "type", make_const_string(type, strlen(type), & tmp));
-
- return 0;
-@}
-@end example
-
-Del terzo argomento passato a @code{stat()} non si era ancora parlato.
-Questo argomento @`e facoltativo. Se presente, dice a @code{do_stat()} di
-usare la chiamata di sistema @code{stat()} invece della chiamata di sistema
-@code{lstat()}. Questo avviene attraverso un puntatore a funzione:
-@code{statfunc}.
-@code{statfunc} @`e inizializzato per puntare a @code{lstat()} (invece che a
-@code{stat()}) per ottenere le informazioni relative al file, nel caso che
-il file in questione sia un
-collegamento simbolico. Tuttavia, se il terzo argomento @`e specificato,
-@code{statfunc} viene modificato in modo da puntare a @code{stat()}.
-
-Ecco la funzione @code{do_stat()}, che inizia con la dichiarazione delle
-variabili e un controllo degli argomenti passati dal chiamante:
-
-@example
-/* do_stat --- fornisce una funzione stat() per gawk */
-
-static awk_value_t *
-do_stat(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
-@{
- awk_value_t file_param, array_param;
- char *name;
- awk_array_t vettore;
- int ret;
- struct stat sbuf;
- /* per default si usa lstat() */
- int (*statfunc)(const char *path, struct stat *sbuf) = lstat;
-
- assert(risultato != NULL);
-@end example
-
-A questo punto inizia l'elaborazione vera e propria. Per prima cosa, la
-funzione esamina gli argomenti.
-Poi, ottiene le informazioni relative al file. Se la funzione chiamata
-(@code{lstat()} o @code{stat()}) restituisce un errore, il codice imposta
-@code{ERRNO} e torna al chiamante:
-
-@example
- /* file @`e il primo argomento,
- il vettore per contenere i risultati @`e il secondo */
- if ( ! get_argument(0, AWK_STRING, & file_param)
- || ! get_argument(1, AWK_ARRAY, & array_param)) @{
- warning(ext_id, _("stat: parametri errati"));
- return make_number(-1, risultato);
- @}
-
- if (nargs == 3) @{
- statfunc = stat;
- @}
-
- name = file_param.str_value.str;
- vettore = array_param.array_cookie;
-
- /* svuota sempre il vettore all'inizio */
- clear_array(vettore);
-
- /* chiama stat per il file;
- in caso di errore,
- imposta ERRNO e ritorna */
- ret = statfunc(name, & sbuf);
- if (ret < 0) @{
- update_ERRNO_int(errno);
- return make_number(ret, risultato);
- @}
-@end example
-
-Il lavoro noioso @`e svolto da @code{fill_stat_array()}, visto in
-precedenza. Alla fine, la funzione restituisce il codice di ritorno
-impostato da @code{fill_stat_array()}:
-
-@example
- ret = fill_stat_array(name, vettore, & sbuf);
-
- return make_number(ret, risultato);
-@}
-@end example
-
-Infine, @`e necessario fornire la ``colla'' che aggrega
-le nuove funzioni a @command{gawk}.
-
-L'estensione @code{filefuncs} comprende anche una funzione
-@code{fts()}, qui omessa
-(@pxref{Esempio di estensione funzioni file}).
-@`E anche prevista una funzione di
-inizializzazione:
-
-@example
-/* init_filefuncs --- routine di initializazione */
-
-static awk_bool_t
-init_filefuncs(void)
-@{
- @dots{}
-@}
-@end example
-
-Siamo quasi alla fine. Serve un vettore di strutture @code{awk_ext_func_t}
-per caricare ogni funzione in @command{gawk}:
-
-@example
-static awk_ext_func_t func_table[] = @{
- @{ "chdir", do_chdir, 1, 1, awk_false, NULL @},
- @{ "stat", do_stat, 3, 2, awk_false, NULL @},
- @dots{}
-@};
-@end example
-
-Ogni estensione deve avere una routine di nome @code{dl_load()} per caricare
-tutto ci@`o che occorre caricare. La cosa pi@`u semplice @`e di usare la macro
-@code{dl_load_func()} in @code{gawkapi.h}:
-
-@example
-/* definizione della funzione dl_load()
- usando la macro standard */
-
-dl_load_func(func_table, filefuncs, "")
-@end example
-
-Abbiamo finito!
-
-@node Usare operazioni interne file
-@subsection Integrare le estensioni
-
-@cindex @command{gawk}, aggiungere funzionalit@`a a
-@cindex funzionalit@`a, aggiungere a @command{gawk}
-@cindex aggiungere funzionalit@`a a @command{gawk}
-Dopo aver scritto il codice, dev'essere possibile aggiungerlo in fase
-di esecuzione all'interprete @command{gawk}. Per prima cosa, il codice
-va compilato. Supponendo che le funzioni siano in
-un file di nome @file{filefuncs.c}, e che @var{idir} sia la posizione
-del file di intestazione @file{gawkapi.h},
-i seguenti passi@footnote{In pratica, si potrebbe decidere di usare
-i comandi GNU Autotools (Automake, Autoconf, Libtool, e @command{gettext})
-per configurare e costruire le librerie necessarie. L'esposizione di come
-ci@`o pu@`o essere fatto esula dal tema di questo @value{DOCUMENT}.
-@xref{gawkextlib} per i puntatori a siti Internet che permettono di accedere
-a questi strumenti.} creano una libreria condivisa GNU/Linux:
-
-@example
-$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c}
-$ @kbd{gcc -o filefuncs.so -shared filefuncs.o}
-@end example
-
-Una volta creata la libreria, questa viene caricata usando la parola
-chiave @code{@@load}:
-
-@example
-# file testff.awk
-@@load "filefuncs"
-
-BEGIN @{
- "pwd" | getline curdir # salva la directory corrente
- close("pwd")
-
- chdir("/tmp")
- system("pwd") # verifica l'avvenuto cambio di directory
- chdir(curdir) # torna indietro
-
- print "Info per testff.awk"
- ret = stat("testff.awk", data)
- print "ret =", ret
- for (i in data)
- printf "data[\"%s\"] = %s\n", i, data[i]
- print "testff.awk modified:",
- strftime("%m %d %Y %H:%M:%S", data["mtime"])
-
- print "\nInfo per JUNK"
- ret = stat("JUNK", data)
- print "ret =", ret
- for (i in data)
- printf "data[\"%s\"] = %s\n", i, data[i]
- print "JUNK modified:", strftime("%m %d %Y %H:%M:%S", data["mtime"])
-@}
-@end example
-
-La variabile d'ambiente @env{AWKLIBPATH} dice a
-@command{gawk} dove @`e possibile trovare le estensioni (@pxref{Trovare le estensioni}).
-La variabile viene impostata alla directory corrente, e quindi viene eseguito
-il programma:
-
-@example
-$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
-@print{} /tmp
-@print{} Info per testff.awk
-@print{} ret = 0
-@print{} data["blksize"] = 4096
-@print{} data["devbsize"] = 512
-@print{} data["mtime"] = 1412004710
-@print{} data["mode"] = 33204
-@print{} data["type"] = file
-@print{} data["dev"] = 2053
-@print{} data["gid"] = 1000
-@print{} data["ino"] = 10358899
-@print{} data["ctime"] = 1412004710
-@print{} data["blocks"] = 8
-@print{} data["nlink"] = 1
-@print{} data["name"] = testff.awk
-@print{} data["atime"] = 1412004716
-@print{} data["pmode"] = -rw-rw-r--
-@print{} data["size"] = 666
-@print{} data["uid"] = 1000
-@print{} testff.awk modified: 09 29 2014 18:31:50
-@print{}
-@print{} Info per JUNK
-@print{} ret = -1
-@print{} JUNK modified: 01 01 1970 02:00:00
-@end example
-
-@node Esempi di estensione
-@section Le estensioni di esempio incluse nella distribuzione @command{gawk}
-@cindex estensioni distribuite con @command{gawk}
-
-Questa @value{SECTION} fornisce una breve panoramica degli esempi di
-estensione inclusi nella distribuzione di @command{gawk}. Alcune di esse
-sono destinate per l'uso in produzione (p.es., le estensioni
-@code{filefuncs}, @code{readdir}, e
-@code{inplace}). Altre sono state scritte principalmente per mostrare come
-si usa l'estensione API.
-
-@menu
-* Esempio di estensione funzioni file:: L'esempio che usa funzioni file.
-* Esempio di estensione Fnmatch:: Un'interfaccia a @code{fnmatch()}.
-* Esempio di estensione Fork:: Un'interfaccia a @code{fork()} e
- altre funzioni di processo.
-* Esempio di estensione Inplace:: Consentire modifica diretta dei file.
-* Esempio di estensione Ord:: Conversioni a valore e a stringa di
- caratteri.
-* Esempio di estensione Readdir:: Un'interfaccia a @code{readdir()}.
-* Esempio di estensione Revout:: Semplice post-processore per
- invertire la stringa in output.
-* Esempio di estensione Rev2way:: Processore bidirezionale per
- invertire la stringa in output.
-* Esempio di estensione Rwarray:: Serializzare il vettore in un
- file.
-* Esempio di estensione Readfile:: Leggere un intero file in una stringa.
-* Esempio di estensione Time:: Un'interfaccia a @code{gettimeofday()}
- e @code{sleep()}.
-* Esempio di estensione API Test:: Test per la API.
-@end menu
-
-@node Esempio di estensione funzioni file
-@subsection Funzioni relative ai file
-
-L'estensione @code{filefuncs} include tre funzioni diverse, come descritto sotto.
-L'uso @`e il seguente:
-
-@table @asis
-@item @code{@@load "filefuncs"}
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{chdir()}, estensione
-@cindex estensione @code{chdir()}
-@item @code{risultato = chdir("/qualche/directory")}
-La funzione @code{chdir()} invoca a sua volta la chiamata di sistema
-@code{chdir()} per cambiare la directory corrente. Restituisce zero
-se tutto va bene o un valore minore di zero in caso di errore.
-In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
-
-@cindex @code{stat()}, estensione
-@cindex estensione @code{stat()}
-@item @code{risultato = stat("/qualche/percorso", statdata} [@code{, follow}]@code{)}
-La funzione @code{stat()} invoca a sua volta la chiamata di sistema
-@code{stat()}.
-Restituisce zero se tutto va bene o un valore minore di zero in caso di
-errore.
-In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
-
-Per default, viene usata la chiamata di sistema @code{lstat()}.
-Tuttavia, se alla funzione viene passato un terzo argomento, questa invoca
-invece @code{stat()}.
-
-In tutti i casi, il vettore @code{statdata} viene preventivamente svuotato.
-Quando la chiamata a @code{stat()} riesce, viene riempito il vettore
-@code{statdata} con le informazioni ottenute dal fileystem, come segue:
-
-@multitable @columnfractions .15 .50 .20
-@headitem Indice @tab Campo in @code{struct stat} @tab Tipo file
-@item @code{"name"} @tab Il @value{FN} @tab Tutti
-@item @code{"dev"} @tab @code{st_dev} @tab Tutti
-@item @code{"ino"} @tab @code{st_ino} @tab Tutti
-@item @code{"mode"} @tab @code{st_mode} @tab Tutti
-@item @code{"nlink"} @tab @code{st_nlink} @tab Tutti
-@item @code{"uid"} @tab @code{st_uid} @tab Tutti
-@item @code{"gid"} @tab @code{st_gid} @tab Tutti
-@item @code{"size"} @tab @code{st_size} @tab Tutti
-@item @code{"atime"} @tab @code{st_atime} @tab Tutti
-@item @code{"mtime"} @tab @code{st_mtime} @tab Tutti
-@item @code{"ctime"} @tab @code{st_ctime} @tab Tutti
-@item @code{"rdev"} @tab @code{st_rdev} @tab Dispositivi
-@item @code{"major"} @tab @code{st_major} @tab Dispositivi
-@item @code{"minor"} @tab @code{st_minor} @tab Dispositivi
-@item @code{"blksize"} @tab @code{st_blksize} @tab Tutti
-@item @code{"pmode"} @tab Una versione leggibile del valore dell'autorizzazione,
-come quello stampato dal comando
-@command{ls} (per esempio, @code{"-rwxr-xr-x"}) @tab Tutti
-@item @code{"linkval"} @tab Il valore del collegamento simbolico @tab
-Collegamenti simbolici
-@item @code{"type"} @tab Il tipo del file in formato stringa---pu@`o essere
-@code{"file"},
-@code{"blockdev"},
-@code{"chardev"},
-@code{"directory"},
-@code{"socket"},
-@code{"fifo"},
-@code{"symlink"},
-@code{"door"}
-o
-@code{"unknown"}
-(non tutti i sistemi supportano tutti i tipi file) @tab Tutti
-@end multitable
-
-@cindex @code{fts()}, estensione
-@cindex estensione @code{fts()}
-@item @code{flags = or(FTS_PHYSICAL, ...)}
-@itemx @code{risultato = fts(pathlist, flags, filedata)}
-Percorre gli alberi di file elencati in @code{pathlist} e riempie il vettore
-@code{filedata}, come descritto qui di seguito. @code{flags} @`e l'operazione
-@dfn{OR} @dfn{bit} a @dfn{bit} di parecchi valori predefiniti, pure descritti
-pi@`u sotto.
-Restituisce zero in assenza di errori, in caso contrario restituisce @minus{}1.
-@end table
-
-La funzione @code{fts()} invoca a sua volta la routine di libreria C
-@code{fts()} per percorrere gerarchie di file. Invece di restituire i dati
-relativi ai file uno per volta in sequenza,
-riempie un vettore multidimensionale con i dati di ogni file e directory
-che risiedono nelle gerarchie richieste.
-
-Gli argomenti sono i seguenti:
-
-@table @code
-@item pathlist
-Un vettore di @value{FNS}. Sono usati i valori dei singoli elementi;
-gli indici che puntano a tali valori vengono ignorati.
-
-@item flags
-Questo dovrebbe essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u dei
-seguenti valori dei flag costanti predefiniti.
-Almeno uno dei due flag @code{FTS_LOGICAL}
-o @code{FTS_PHYSICAL} dev'essere impostato; in caso contrario
-@code{fts()} restituisce una segnalazione di errore e imposta @code{ERRNO}.
-I flag sono:
-
-@c nested table
-@table @code
-@item FTS_LOGICAL
-Passa in rassegna i file in modo ``logico'', e quindi l'informazione restituita
-per un collegamento simbolico @`e quella relativa al file puntato, e non al
-collegamento simbolico stesso. Questo flag @`e mutuamente esclusivo con
-@code{FTS_PHYSICAL}.
-
-@item FTS_PHYSICAL
-Passa in rassegna i file in modo ``fisico'', e quindi l'informazione restituita
-per un collegamento simbolico @`e quella relativa al collegamento simbolico
-stesso. Questo flag @`e mutuamente esclusivo con @code{FTS_LOGICAL}.
-
-@item FTS_NOCHDIR
-Per migliorare le prestazioni, la routine di libreria C @code{fts()}
-cambia directory mentre percorre una gerarchia di file. Questo flag
-disabilita quell'ottimizzazione.
-
-@item FTS_COMFOLLOW
-Si accede al file puntato da un collegamento simbolico esistente in @code{pathlist},
-anche se @code{FTS_LOGICAL} non @`e stato impostato.
-
-@item FTS_SEEDOT
-Per default, la routine di libreria C @code{fts()} non restituisce
-informazioni per i file
-@file{"."} (punto) e @file{".."} (punto-punto). Quest'opzione richiede
-l'informazione anche per @file{".."}. (L'estensione ritorna sempre
-l'informazione per @file{"."}; maggiori dettagli pi@`u sotto.)
-
-@item FTS_XDEV
-Mentre si percorre un filesystem, non passare mai a un filesystem montato
-diverso da quello in cui si opera.
-@c Pu@`o succedere nel caso di collegamenti simbolici, che contengono un nome di file
-@c che si trova da tutt'altra parte
-@c lrwxrwxrwx 1 root root 6 ago 6 2015 /aca -> /d/aca
-@c /d/aca:
-@c /dev/sda6 115234344 15648380 93709280 15% /d
-@c / (e il collegamento simbolico /aca)
-@c /dev/sda1 37308224 13573368 21816644 39% /
-@end table
-
-@item filedata
-Il vettore @code{filedata} contiene i risultati.
-La funzione @code{fts()} lo svuota all'inizio. In seguito viene creato
-un elemento in @code{filedata} per ogni elemento in @code{pathlist}.
-L'indice @`e il nome della directory o del file specificato in @code{pathlist}.
-L'elemento puntato da questo indice @`e a sua volta un vettore. Ci sono due
-casi:
-
-@c nested table
-@table @emph
-@item Il percorso @`e un file
-In questo caso, il vettore contiene due o tre elementi:
-
-@c doubly nested table
-@table @code
-@item "path"
-Il percorso completo di questo file, a partire dalla directory radice (``root'')
-indicata nel vettore @code{pathlist}.
-
-@item "stat"
-Questo elemento @`e esso stesso un vettore, contenente le stesse informazioni
-fornite dalla funzione @code{stat()} vista in precedenza a proposito del suo
-argomento
-@code{statdata}. L'elemento pu@`o non essere presente se la chiamata
-di sistema @code{stat()} per il file non @`e riuscita.
-
-@item "error"
-Se qualche tipo di errore si verifica durante l'elaborazione, il vettore
-conterr@`a anche un elemento con chiave @code{"error"}, che @`e una stringa
-che descrive l'errore.
-@end table
-
-@item Il percorso @`e una directory
-In questo caso, nel vettore viene creato un elemento per ogni elemento
-contenuto nella directory. Se un elemento della directory @`e un
-file, l'azione del programma @`e la stessa descritta sopra per un file.
-Se invece la directory contiene delle sottodirectory, l'elemento creato
-nel vettore @`e (ricorsivamente) a sua volta un vettore che descrive la
-sottodirectory. Se fra i flag @`e stato
-specificato il flag @code{FTS_SEEDOT},
-ci sar@`a anche un elemento di nome
-@code{".."}. Questo elemento sar@`a un vettore contenente i dati restituiti
-da un'invocazione di @code{stat()}.
-
-Inoltre, ci sar@`a un elemento il cui indice @`e @code{"."}.
-Questo elemento @`e un vettore contenente gli stessi due o tre elementi che
-sono messi a disposizione per un file: @code{"path"}, @code{"stat"},
-ed @code{"error"}.
-@end table
-@end table
-
-La funzione @code{fts()} restituisce zero in assenza di errori.
-in caso contrario, restituisce @minus{}1.
-
-@quotation NOTA
-L'estensione @code{fts()} non imita esattamente l'interfaccia fornita dalla
-routine di libreria C @code{fts()}, ma sceglie di fornire un'interfaccia
-basata sui vettori associativi, che @`e pi@`u adeguata per l'uso da parte di un
-programma @command{awk}. Questo
-implica la mancanza di una funzione di
-confronto, poich@'e @command{gawk} gi@`a
-prevede la possibilit@`a di mettere facilmente nell'ordine desiderato gli
-elementi di un vettore.
-Anche se un'interfaccia modellata su @code{fts_read()} avrebbe potuto essere
-fornita, @`e sembrato pi@`u naturale mettere a disposizione un vettore
-multidimensionale, che rappresenta la gerarchia dei file e le informazioni
-relative a ognuno di essi.
-@end quotation
-
-Si veda il file @file{test/fts.awk} nella distribuzione di @command{gawk}
-per un esempio di uso dell'estensione @code{fts()}.
-
-@node Esempio di estensione Fnmatch
-@subsection Un'interfaccia a @code{fnmatch()}
-
-Quest'estensione fornisce un'interfaccia per utilizzare la funzione di
-libreria C @code{fnmatch()}. Si usa cos@`{@dotless{i}}:
-
-@table @code
-@item @@load "fnmatch"
-@`E questo il modo per caricare l'estensione.
-
-@cindex @code{fnmatch()}, estensione
-@cindex estensione @code{fnmatch()}
-@item risultato = fnmatch(pattern, stringa, flags)
-Il valore restituito @`e zero se tutto va bene, oppure @code{FNM_NOMATCH}
-se la funzione non ha trovato alcuna corrispondenza, o
-un valore differente, diverso da zero, se si @`e verificato un errore.
-@end table
-
-Oltre a rendere disponibile la funzione @code{fnmatch()}, l'estensione
-di @code{fnmatch} definisce una costante (@code{FNM_NOMATCH}), e un vettore
-con dei valori di flag, di nome @code{FNM}.
-
-Gli argomenti per @code{fnmatch()} sono:
-
-@table @code
-@item pattern
-L'espressione regolare con cui confrontare @value{FN}
-
-@item stringa
-La stringa @value{FN}
-
-@item flags
-Pu@`o valere zero o essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u flag
-nel vettore @code{FNM}
-@end table
-
-I flag sono i seguenti:
-
-@multitable @columnfractions .40 .60
-@headitem Elemento del vettore @tab Flag corrispondente definito da @code{fnmatch()}
-@item @code{FNM["CASEFOLD"]} @tab @code{FNM_CASEFOLD}
-@item @code{FNM["FILE_NAME"]} @tab @code{FNM_FILE_NAME}
-@item @code{FNM["LEADING_DIR"]} @tab @code{FNM_LEADING_DIR}
-@item @code{FNM["NOESCAPE"]} @tab @code{FNM_NOESCAPE}
-@item @code{FNM["PATHNAME"]} @tab @code{FNM_PATHNAME}
-@item @code{FNM["PERIOD"]} @tab @code{FNM_PERIOD}
-@end multitable
-
-Ecco un esempio:
-
-@example
-@@load "fnmatch"
-@dots{}
-flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
-if (fnmatch("*.a", "pippo.c", flags) == FNM_NOMATCH)
- print "nessuna corrispondenza"
-@end example
-
-@node Esempio di estensione Fork
-@subsection Un'interfaccia a @code{fork()}, @code{wait()}, e @code{waitpid()}
-
-L'estensione @code{fork} mette a disposizione tre funzioni, come segue:
-
-@table @code
-@item @@load "fork"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{fork()}, estensione
-@cindex estensione @code{fork()}
-@item pid = fork()
-Questa funzione crea un nuovo processo. Il valore restituito @`e zero nel
-processo ``figlio'' e il numero che identifica il nuovo processo
-(@dfn{pid}) nel processo ``padre'', o @minus{}1
-in caso di errore. In quest'ultimo caso, @code{ERRNO} indica il problema.
-Nel processo figlio, gli elementi @code{PROCINFO["pid"]} e
-@code{PROCINFO["ppid"]} vengono aggiornati per riflettere i valori corretti.
-
-@cindex @code{waitpid()}, estensione
-@cindex estensione @code{waitpid()}
-@item ret = waitpid(pid)
-Questa funzione ha un unico argomento numerico, l'identificativo del processo
-di cui aspettare l'esito. Il valore di ritorno @`e quello restituito dalla
-chiamata di sistema @code{waitpid()}.
-
-@cindex @code{wait()}, estensione
-@cindex estensione @code{wait()}
-@item ret = wait()
-Questa funzione attende che il primo processo ``figlio'' termini.
-Il valore restituito @`e quello della chiamata di sistema @code{wait()}.
-@end table
-
-Non c'@`e una funzione corrispondente alla chiamata di sistema @code{exec()}.
-
-Ecco un esempio:
-
-@example
-@@load "fork"
-@dots{}
-if ((pid = fork()) == 0)
- print "salve dal processo figlio"
-else
- print "salve dal processo padre"
-@end example
-
-@node Esempio di estensione Inplace
-@subsection Consentire la modifica in loco dei file
-
-@cindex @code{inplace}, estensione
-@cindex estensione @code{inplace}
-L'estensione @code{inplace} svolge un lavoro simile a quello
-dell'opzione @option{-i} nel programma di utilit@`a GNU @command{sed},
-che svolge delle funzioni di modifica ``al volo'' su ogni file in input.
-Viene usato il file @file{inplace.awk}, caricato dinamicamente, per richiamare
-l'estensione in maniera corretta:
-
-@example
-@c file eg/lib/inplace.awk
-@group
-# inplace --- carica e richiama l'estensione inplace.
-
-@@load "inplace"
-
-# @`E buona cosa impostare INPLACE_SUFFIX in modo da fare
-# una copia di backup.
-# Per esempio, si potrebbe impostare INPLACE_SUFFIX a .bak
-# sulla riga di comando, o in una regola BEGIN.
-
-# Per default, ogni file specificato sulla riga di comando
-# verr@`a modificato sovrascrivendo il file originale.
-# Ma @`e possibile evitarlo specificando l'argomento inplace=0
-# davanti al nome del file che non si desidera elaborare in questo modo.
-# Si pu@`o poi abilitare di nuovo l'aggiornamento diretto del file
-# sulla riga di comando, specificando inplace=1 prima del file
-# che si vuole modificare direttamente.
-
-# N.B. La funzione inplace_end() @`e invocata nelle regole
-# BEGINFILE ed END, in modo che ogni eventuale azione
-# in una regola ENDFILE sar@`a ridiretta come previsto.
-
-BEGIN @{
- inplace = 1 # abilitato per default
-@}
-
-BEGINFILE @{
- if (_inplace_filename != "")
- inplace_end(_inplace_filename, INPLACE_SUFFIX)
- if (inplace)
- inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
- else
- _inplace_filename = ""
-@}
-
-END @{
- if (_inplace_filename != "")
- inplace_end(_inplace_filename, INPLACE_SUFFIX)
-@}
-@end group
-@c endfile
-@end example
-
-Per ogni file elaborato, l'estensione ridirige lo
-standard output verso un file temporaneo definito in modo da avere lo stesso
-proprietario e le stesse autorizzazioni del file originale. Dopo che il file
-@`e stato elaborato, l'estensione riporta lo standard output alla sua
-destinazione originale.
-Se @code{INPLACE_SUFFIX} non @`e una stringa vuota, il file originale @`e
-collegato a un @value{FN} di backup, creato aggiungendo il
-suffisso al nome originale.
-Infine, il file temporaneo @`e rinominato in modo da essere lo stesso del
-@value{FN} originario.
-
-Si noti che l'uso di questa funzionalit@`a pu@`o essere controllato
-specificando @samp{inplace=0} sulla riga di comando, prima del nome del file
-che non dovrebbe essere elaborato come appena descritto. Si pu@`o richiedere
-ancora l'aggiornamento diretto di un file, specificando l'argomento
-@samp{inplace=1} davanti al nome del file da elaborare in maniera diretta.
-
-La variabile @code{_inplace_filename} serve per tener traccia del nome del
-file corrente, in modo da non eseguire la funzione @code{inplace_end()} prima
-di aver elaborato il primo file.
-
-Se si verifica un errore, l'estensione emette un messaggio di errore fatale
-per terminare l'elaborazione immediatamente, senza danneggiare il
-file originale.
-
-Ecco alcuni semplici esempi:
-
-@example
-$ @kbd{gawk -i inplace '@{ gsub(/pippo/, "pluto") @}; @{ print @}' file1 file2 file3}
-@end example
-
-Per mantenere una copia di backup del file originale, si provi a fare cos@`{@dotless{i}}:
-
-@example
-$ @kbd{gawk -i inplace -v INPLACE_SUFFIX=.bak '@{ gsub(/pippo/, "pluto") @}}
-> @kbd{@{ print @}' file1 file2 file3}
-@end example
-
-Si noti che, anche se l'estensione tenta di mantenere il proprietario e i
-permessi di accesso del file originario, non viene tentata la copia degli
-ulteriori permessi di accesso
-(@dfn{ACL - Access Control Lists}) del file originale.
-
-Se il programma termina prima del previsto, come potrebbe succedere se riceve
-dal sistema un segnale non gestito, pu@`o lasciare come residuo un file
-temporaneo.
-
-@node Esempio di estensione Ord
-@subsection Caratteri e valori numerici: @code{ord()} e @code{chr()}
-
-L'estensione @code{ordchr} aggiunge due funzioni, di nome
-@code{ord()} e @code{chr()}, come segue:
-
-@table @code
-@item @@load "ordchr"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{ord()}, estensione
-@cindex estensione @code{Ord}
-@item numero = ord(stringa)
-Restituisce il valore numerico del primo carattere in @code{stringa}.
-
-@cindex @code{Chr}, estensione
-@cindex estensione @code{Chr}
-@item char = chr(number)
-Restituisce una stringa il cui primo carattere @`e quello rappresentato
-da @code{number}.
-@end table
-
-Queste funzioni sono ispirate alle funzioni del linguaggio Pascal
-dallo stesso nome. Ecco un esempio:
-
-@example
-@@load "ordchr"
-@dots{}
-printf("Il valore numerico di 'A' @`e %d\n", ord("A"))
-printf("Il valore come stringa di 65 @`e %s\n", chr(65))
-@end example
-
-@node Esempio di estensione Readdir
-@subsection Leggere directory
-
-L'estensione @code{readdir} aggiunge un analizzatore di input
-per esaminare directory.
-L'uso @`e il seguente:
-
-@cindex @code{readdir}, estensione
-@cindex estensione @code{readdir}
-@example
-@@load "readdir"
-@end example
-
-Quando quest'estensione @`e in uso, invece che saltare le
-directory presenti sulla riga di comando, (o accedute tramite @code{getline}),
-queste sono lette, e ogni elemento della directory @`e restituito come
-un record.
-
-Il record consiste di tre campi. I primi due sono il numero di @dfn{inode} e
-il @value{FN}, separati fra loro da una barra.
-Nei sistemi in cui l'elemento di directory contiene il tipo del file,
-il record ha un terzo campo (pure separato da una barra), composto da una
-sola lettera, che indica il tipo del file. Le lettere e i tipi di file a cui
-corrispondono sono mostrate in @ref{table-readdir-file-types}.
-
-@float Tabella,table-readdir-file-types
-@caption{Tipi file restituiti dall'estensione @code{readdir}}
-@multitable @columnfractions .1 .9
-@headitem Lettera @tab Tipo di file
-@item @code{b} @tab Dispositivo a blocchi
-@item @code{c} @tab Dispositivo a caratteri
-@item @code{d} @tab Directory
-@item @code{f} @tab File normale
-@item @code{l} @tab Collegamento simbolico
-@item @code{p} @tab @dfn{pipe} con nome (FIFO)
-@item @code{s} @tab @dfn{socket}
-@item @code{u} @tab Tutto il resto (sconosciuto)
-@end multitable
-@end float
-
-Nei sistemi che non contengono l'informazione sul tipo del file, il terzo
-campo @`e sempre @samp{u}.
-
-@quotation NOTA
-Nei sistemi GNU/Linux, ci sono fileystem che non supportano il campo
-@code{d_type} (si veda la pagina di manuale @i{readdir}(3)), e in questo caso
-il tipo di file @`e sempre @samp{u}. Si pu@`o usare l'estensione
-@code{filefuncs} per chiamare @code{stat()} e ottenere l'informazione
-corretta sul tipo di file.
-@end quotation
-
-Ecco un esempio:
-
-@example
-@@load "readdir"
-@dots{}
-BEGIN @{ FS = "/" @}
-@{ print "@value{FN} @`e", $2 @}
-@end example
-
-@node Esempio di estensione Revout
-@subsection Invertire la stringa in output
-
-L'estensione @code{revoutput} aggiunge un semplice processore
-di output che inverte i caratteri di ogni riga in output. Serve a dimostrare
-come @`e possibile scrivere un processore di output, anche se pu@`o essere
-a prima vista vagamente divertente.
-Ecco un esempio:
-
-@cindex @code{revoutput}, estensione
-@cindex estensione @code{revoutput}
-@example
-@@load "revoutput"
-
-BEGIN @{
- REVOUT = 1
- print "non v'allarmate" > "/dev/stdout"
-@}
-@end example
-
-L'output di questo programma @`e @samp{etamralla'v non}.
-
-@node Esempio di estensione Rev2way
-@subsection Esempio di I/O bidirezionale
-
-L'estensione @code{revtwoway} aggiunge un semplice processore
-bidirezionale che inverte i caratteri di ogni riga che riceve, per farla
-poi rileggere dal programma @command{awk}. Il motivo per cui @`e stata scritta
-@`e quello di mostrare come si scrive un processore bidirezionale, anche se pu@`o
-sembrare un programma vagamente divertente.
-Il seguente esempio mostra come usarlo:
-
-@cindex @code{revtwoway}, estensione
-@cindex estensione @code{revtwoway}
-@example
-@@load "revtwoway"
-
-BEGIN @{
- cmd = "/specchio/magico"
- print "non v'allarmate" |& cmd
- cmd |& getline risultato
- print risultato
- close(cmd)
-@}
-@end example
-
-L'output di questo programma
-@ifnotinfo
-anche in questo caso @`e:
-@end ifnotinfo
-@ifinfo
-@`e:
-@end ifinfo
-@samp{etamralla'v non}.
-
-@node Esempio di estensione Rwarray
-@subsection Scaricare e ricaricare un vettore
-
-L'estensione @code{rwarray} aggiunge due funzioni,
-di nome @code{writea()} e @code{reada()}, come segue:
-
-@table @code
-@item @@load "rwarray"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{writea()}, estensione
-@cindex estensione @code{writea()}
-@item ret = writea(file, vettore)
-Questa funzione ha come argomento una stringa, che @`e il nome del file
-sul quale scaricare il vettore, e il vettore stesso @`e il secondo argomento.
-@code{writea()} @`e in grado di gestire vettori di vettori. Restituisce il
-valore uno se completa il lavoro o zero se non va a buon fine.
-
-@cindex @code{reada()}, estensione
-@cindex estensione @code{reada()}
-@item ret = reada(file, vettore)
-@code{reada()} @`e la funzione inversa di @code{writea()};
-legge il file il cui nome @`e fornito come primo argomento, riempiendo il
-vettore il cui nome @`e il secondo argomento. Il vettore viene preventivamente
-svuotato.
-Anche in questo caso, il valore restituito @`e uno se tutto va bene o zero se
-la funzione non va a buon fine.
-@end table
-
-Il vettore creato da @code{reada()} @`e identico a quello scritto da
-@code{writea()} nel senso che i contenuti sono gli stessi. Tuttavia,
-per come @`e strutturata la funzione, l'ordine di attraversamento del vettore
-ricreato @`e quasi certamente differente da quello del vettore originale.
-Poich@'e l'ordine di attraversamento di un vettore @`e, per default, indefinito
-in @command{awk}, questo non @`e (tecnicamente) un problema. Se serve che
-l'attraversamento del vettore avvenga in un ordine preciso, si possono usare
-le funzionalit@`a di ordinamento di un vettore disponibili in @command{gawk}
-(@pxref{Ordinamento di vettori}).
-
-Il file contiene dati in formato binario. Tutti i valori interi sono scritti
-in @dfn{network byte order}@footnote{Cio@`e, nella maniera con cui sarebbero
-normalmente scritti in un testo, con le cifre pi@`u significative del
-numero contenute nella parte sinistra, e quelle meno significative
-nella parte destra della rappresentazione binaria del numero.}.
-Tuttavia, i valori in virgola mobile a doppia precisione sono scritti come
-dati binari nativi. Quindi, vettori che contengono solo dati in formato
-stringa possono essere scaricati da un sistema con un certo ordine di byte
-e ripristinati su un sistema con un ordine di byte differente, anche se
-un test al riguardo non @`e mai stato fatto.
-
-Ecco un esempio:
-
-@example
-@@load "rwarray"
-@dots{}
-ret = writea("scaricato.bin", vettore)
-@dots{}
-ret = reada("scaricato.bin", vettore)
-@end example
-
-@node Esempio di estensione Readfile
-@subsection Leggere un intero file in una stringa
-
-L'estensione @code{readfile} aggiunge una sola funzione
-di nome @code{readfile()}, e un analizzatore di input:
-
-@table @code
-@item @@load "readfile"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{readfile()}, estensione
-@cindex estensione @code{readfile()}
-@item risultato = readfile("/qualche/persorso")
-L'argomento @`e il nome del file da leggere. Il valore restituito @`e una
-stringa contenente l'intero contenuto del file richiesto. In caso di errore,
-la funzione restituisce la stringa vuota e imposta @code{ERRNO}.
-
-@item BEGIN @{ PROCINFO["readfile"] = 1 @}
-Inoltre, l'estensione aggiunge un analizzatore di input che @`e attivato se
-l'elemento @code{PROCINFO["readfile"]} esiste.
-Quando l'analizzatore @`e attivato, ogni file in input @`e restituito interamente
-come @code{$0}.
-La variabile @code{RT} @`e impostata alla stringa nulla.
-@end table
-
-Ecco un esempio:
-
-@example
-@@load "readfile"
-@dots{}
-contents = readfile("/percorso/del/file");
-if (contents == "" && ERRNO != "") @{
- print("problema in lettura file", ERRNO) > "/dev/stderr"
- ...
-@}
-@end example
-
-@node Esempio di estensione Time
-@subsection Funzioni dell'estensione time
-
-L'estensione @code{time} aggiunge due funzioni, di nome
-@code{gettimeofday()} e @code{sleep()}, come segue:
-
-@table @code
-@item @@load "time"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{gettimeofday()}, estensione
-@cindex estensione @code{gettimeofday()}
-@item ora_corrente = gettimeofday()
-Restituisce il numero di secondi trascorsi dalle ore 00:00 del giorno
-01/01/1970 UTC come valore a virgola mobile.
-Se questa informazione non @`e disponibile nella piattaforma in uso,
-restituisce @minus{}1 e imposta @code{ERRNO}. Il valore fornito dovrebbe
-avere la precisione di una frazione di
-secondo, ma la precisione effettiva pu@`o variare a seconda della
-piattaforma.
-Se la chiamata di sistema standard C @code{gettimeofday()} @`e disponibile
-nella piattaforma in uso, questo @`e il valore restituito. In caso contrario,
-se si sta lavorando con MS-Windows, la chiamata di sistema @`e fatta a
-@code{GetSystemTimeAsFileTime()}.
-
-@cindex @code{sleep()}, estensione
-@cindex estensione @code{sleep()}
-@item risultato = sleep(@var{secondi})
-Il programma @command{gawk} resta inattivo (dorme) per i @var{secondi}
-specificati. Se @var{secondi} ha un valore negativo,
-o la chiamata di sistema non riesce, restituisce @minus{}1 e imposta @code{ERRNO}.
-In caso contrario, restituisce zero dopo aver lasciato trascorrere
-la quantit@`a di tempo indicata.
-Si noti che @var{secondi} pu@`o essere un numero a virgola mobile (non solo un
-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.
-@end table
-
-@node Esempio di estensione API Test
-@subsection Test per la API
-@cindex @code{testext}, estensione
-@cindex estensione @code{testext}
-
-L'estensione @code{testext} controlla la funzionalit@`a di
-parti dell'API delle estensioni che non sono utilizzate negli altri esempi.
-Il file @file{extension/testext.c}
-contiene sia il codice C per l'estensione che il codice @command{awk}
-(tra i commenti del codice C) per eseguire i test. L'ambiente di test
-estrae il codice sorgente @command{awk} ed esegue i test. Si veda il file
-sorgente per maggiori informazioni.
-
-@node gawkextlib
-@section Il progetto @code{gawkextlib}
-@cindex @code{gawkextlib}, estensioni
-@cindex estensioni, @code{gawkextlib}
-@cindex estensioni, dove trovarle
-
-@cindex @code{gawkextlib}, progetto
-@cindex progetto @code{gawkextlib}
-Il progetto @uref{http://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}}
-fornisce varie estensioni per @command{gawk}, compresa una per
-l'elaborazione dei file XML. Questa @`e un'evoluzione del progetto noto come
-@command{xgawk} (XML @command{gawk}).
-
-Al momento della stesura di questo testo, ci sono otto estensioni:
-
-@itemize @value{BULLET}
-@item
-Estensione @code{errno}
-
-@item
-Estensione GD graphics library
-
-@item
-Estensione libreria MPFR
-(fornisce l'accesso a varie funzioni MPFR non previste dal supporto nativo
-di MPFR disponibile in @command{gawk})
-
-@item
-Estensione PDF
-
-@item
-Estensione PostgreSQL
-
-@item
-Estensione Redis
-
-@item
-Estensione Select
-
-@item
-Estensione analizzatore XML, usando la libreria di analisi XML
-@uref{http://expat.sourceforge.net, Expat}
-@end itemize
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-Si pu@`o scaricare il codice del progetto @code{gawkextlib}
-usando il codice sorgente mantenuto tramite
-@uref{http://git-scm.com, Git}.
-Il comando per farlo @`e il seguente:
-
-@example
-git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
-@end example
-
-@cindex Expat, libreria per analizzare XML
-@cindex XML, Expat, libreria per analizzare
-Per poter compilare e usare l'estensione XML, @`e necessario installare
-la libreria di analisi XML @uref{http://expat.sourceforge.net, Expat}.
-
-Inoltre, @`e necessario installare gli strumenti GNU Autotools
-(@uref{http://www.gnu.org/software/autoconf, Autoconf},
-@uref{http://www.gnu.org/software/automake, Automake},
-@uref{http://www.gnu.org/software/libtool, Libtool}
-e
-@uref{http://www.gnu.org/software/gettext, GNU @command{gettext}}).
-
-La semplice procedura per compilare e testare @code{gawkextlib} @`e la seguente.
-Dapprima, occorre compilare e installare @command{gawk}:
-
-@example
-cd .../percorso/del/sorgente/gawk
-./configure --prefix=/tmp/newgawk @ii{Installa in /tmp/newgawk per ora}
-make && make check @ii{Compila e controlla che tutto sia a posto}
-make install @ii{Installa gawk}
-@end example
-
-Poi, dal sito @url{http://sourceforge.net/projects/gawkextlib/files} si deve
-scaricare @code{gawkextlib} e le estensioni che si vogliono installare.
-Il file @file{README} del sito spiega come compilare il codice. Se si @`e
-installato @command{gawk} in una posizione non-standard, occorre
-specificare @code{./configure --with-gawk=@var{/percorso/del/programma/gawk}}
-per far s@`{@dotless{i}} che venga trovato.
-Pu@`o essere necessario usare il programma di utilit@`a @command{sudo}
-per installare sia @command{gawk} che @code{gawkextlib}, a seconda di come
-funziona il sistema su cui si lavora.
-
-Chi scrive un'estensione e desidera condividerla con altri utenti
-@command{gawk}, pu@`o prendere in considerazione l'idea di farlo attraverso
-il progetto @code{gawkextlib}.
-Si veda il sito web del progetto per maggiori informazioni.
-
-@node Sommario delle estensioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Si possono scrivere estensioni (dette anche @dfn{plug-in})
-per @command{gawk}
-nel linguaggio C o C++ usando l'interfaccia di programmazione applicativa
-(API) definita dagli sviluppatori di
-@command{gawk}.
-
-@item
-Le estensioni devono avere una licenza compatibile con la
-GNU General Public License (GPL), e devono dichiararlo definendo un'apposita
-variabile di nome
-@code{plugin_is_GPL_compatibile}.
-
-@item
-La comunicazione tra @command{gawk} e un'estensione @`e bidirezionale.
-@command{gawk} passa all'estensione una struttura (@code{struct}) che contiene
-vari campi di dati e puntatori a funzione. L'estensione pu@`o poi chiamare
-funzioni all'interno di @command{gawk} tramite dei puntatori a funzioni
-per svolgere alcuni compiti.
-
-@item
-Uno di questi compiti @`e di ``registrare'' il nome e l'implementazione di
-nuove funzioni a livello di @command{awk} con @command{gawk}.
-L'implementazione ha la forma di un puntatore del linguaggio C,
-cui @`e associato un dato livello di versione.
-Per convenzione, le funzioni di implementazione hanno nome
-@code{do_@var{XXXX}()} per una funzione a livello di @command{awk} di nome
-@code{@var{XXXX}()}.
-
-@item
-L'API @`e definita in un file di intestazione di nome @file{gawkapi.h}.
-Occorre includere alcuni file di intestazione standard @emph{prima} di
-includere tale intestazione nel codice sorgente.
-
-@item
-Vengono forniti dei puntatori a funzioni dell'API per i seguenti tipi di
-operazioni:
-
-@itemize @value{BULLET}
-@item
-Allocare, riallocare, e liberare memoria
-
-@item
-Registrare funzioni (si possono registrare
-funzioni di estensione,
-funzioni ausiliarie di pulizia (@dfn{callbacks}),
-una stringa di versione,
-degli analizzatori di input,
-dei processori di output,
-e dei processori bidirezionali)
-
-@item
-Stampare messaggi fatali, non fatali, di avvertimento, e avvertimenti ``lint''
-
-@item
-Aggiornare @code{ERRNO} o annullarlo
-
-@item
-Accedere a parametri, come pure convertire un parametro di tipo non definito
-in un vettore
-
-@item
-Accedere alla tabella dei simboli (ricuperare il valore di una
-variabile globale, crearne una nuova o modificarne una esistente)
-
-@item
-Creare e rilasciare valori nascosti; questo consente di usare in modo
-efficiente lo stesso valore per pi@`u variabili e pu@`o migliorare di molto le
-prestazioni del programma
-
-@item
-Manipolare vettori
-(ricuperare, aggiungere, cancellare e modificare elementi;
-ottenere il numero di elementi in un vettore;
-creare un nuovo vettore;
-svuotare un vettore;
-e
-appiattire un vettore per poterlo percorrere facilmente con un ciclo in
-stile C, visitando tutti i suoi indici ed elementi)
-@end itemize
-
-@item
-L'API definisce diversi tipi di dati standard per rappresentare
-valori di variabili, elementi di vettore e vettori presenti in @command{awk}.
-
-@item
-L'API fornisce funzioni di servizio per definire dei valori.
-Sono anche disponibili funzioni di gestione della memoria, per assicurare
-la compatibilit@`a fra memoria allocata da @command{gawk} e memoria allocata da
-un'estensione.
-
-@item
-@emph{Tutta} la memoria passata da @command{gawk} a un'estensione dev'essere
-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
-dall'API. @command{gawk} @`e responsabile per la gestione di quella memoria e
-la libera quando @`e il momento per farlo.
-
-@item
-L'API fornisce informazioni sulla versione di @command{gawk} in
-esecuzione, in modo che un'estensione possa verificare la propria compatibilit@`a
-con la versione di @command{gawk} da cui @`e stata caricata.
-
-@item
-@`E pi@`u facile iniziare a programmare una nuova estensione usando il
-codice predefinito descritto in questo @value{CHAPTER}. Alcune macro nel
-file di intestazione @file{gawkapi.h} rendono la cosa pi@`u agevole.
-
-@item
-La distribuzione di @command{gawk} comprende un numero di piccoli ma utili
-esempi di estensione. Il progetto @code{gawkextlib} include diverse altre
-estensioni, di maggiori dimensioni.
-Per chi desideri scrivere un'estensione e metterla a disposizione della
-comunit@`a degli utenti di @command{gawk}, il progetto @code{gawkextlib}
-@`e il posto adatto per farlo.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi sulle estensioni
-@section Esercizi
-
-@enumerate
-@item
-Aggiungere funzioni per rendere disponibili chiamate di sistema come
-@code{chown()}, @code{chmod()} e @code{umask()} nelle estensioni che
-operano con i file viste
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Operazioni interne file}.
-
-@c Idea from comp.lang.awk, February 2015
-@item
-Scrivere un analizzatore di input che stampi un prompt se l'input proviene
-da un dispositivo che sia un ``terminale''. Si pu@`o usare la funzione
-@code{isatty()} per sapere se il file in input @`e un terminale.
-(Suggerimento: questa funzione
-normalmente usa parecchie risorse quando @`e richiamata; si tenti di chiamarla
-una volta sola.)
-Il contenuto del prompt dovrebbe provenire da una variabile che sia possibile
-impostare a livello di codice @command{awk}.
-Si pu@`o inviare il prompt allo standard error. Tuttavia,
-per ottenere risultati migliori, @`e meglio aprire un nuovo descrittore di file
-(o puntatore a un file)
-sul file @file{/dev/tty} e stampare il prompt su quel file, nel caso
-in cui lo standard error sia stato ridiretto.
-
-Perch@'e lo standard error @`e una scelta migliore dello
-standard output per scrivere il prompt?
-Quale meccanismo di lettura andrebbe sostituito, quello che legge un record
-o quello che legge dei semplici byte?
-
-@item
-(Difficile.)
-Come si potrebbero gestire degli insiemi di nomi (@dfn{namespaces})
-in @command{gawk}, in modo
-che i nomi di funzione presenti in estensioni differenti non siano in conflitto
-tra loro?
-Chi riesce a trovare uno schema di buona qualit@`a @`e pregato di contattare il
-manutentore di @command{gawk}, per metterlo al corrente.
-
-@item
-Si scriva uno script di shell che funga da interfaccia per
-l'estensione ``inplace'', vista
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Esempio di estensione Inplace},
-in modo che il comportamento sia simile a quello del comando @samp{sed -i}.
-
-@end enumerate
-@c EXCLUDE END
-
-@ifnotinfo
-@part @value{PART4}Appendici
-@end ifnotinfo
-
-@ifdocbook
-
-@ifclear FOR_PRINT
-La Parte IV contiene le appendici (come pure le due licenze che proteggono
-il codice sorgente di @command{gawk} e questo @value{DOCUMENT},
-rispettivamente) e inoltre il Glossario:
-@end ifclear
-
-@ifset FOR_PRINT
-La Parte IV contiene tre appendici, l'ultima delle quali @`e la licenza
-che protegge il codice sorgente di @command{gawk}:
-@end ifset
-
-@itemize @value{BULLET}
-@item
-@ref{Storia del linguaggio}
-
-@item
-@ref{Installazione}
-
-@ifclear FOR_PRINT
-@item
-@ref{Note}
-
-@item
-@ref{Concetti fondamentali}
-
-@item
-@ref{Glossario}
-@end ifclear
-
-@item
-@ref{Copia}
-
-@ifclear FOR_PRINT
-@item
-@ref{Licenza per Documentazione Libera GNU (FDL)}
-@end ifclear
-@end itemize
-@end ifdocbook
-
-@node Storia del linguaggio
-@appendix L'evoluzione del linguaggio @command{awk}
-
-Questo @value{DOCUMENT} descrive l'implementazione GNU di @command{awk}
-conforme alle specifiche POSIX. Molti degli utenti di lunga data di
-@command{awk} hanno imparato a programmare in @command{awk} usando
-l'implementazione originale di @command{awk} presente nella versione 7 di
-Unix. (Questa versione @`e servita da base per la versione Berkeley Unix di
-@command{awk}, attraverso la versione 4.3BSD-Reno. Successive versioni di
-Berkeley Unix e, per un certo periodo, alcuni sistemi derivati da
-4.4BSD-Lite, hanno usato varie versioni di @command{gawk} come loro
-@command{awk}.) Questo @value{CHAPTER} descrive in breve l'evoluzione
-del linguaggio @command{awk}, facendo riferimento ad altre parti del
-@value{DOCUMENT} dove si possono trovare ulteriori informazioni.
-
-@ifset FOR_PRINT
-Per amor di brevit@`a, sono state omesse in questa edizione informazioni
-sulla storia delle funzionalit@`a di @command{gawk}. Si possono trovare nella
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Feature-History.html,
-documentazione online}.
-@end ifset
-
-@menu
-* V7/SVR3.1:: Le principali differenze tra V7 e System V
- Release 3.1.
-* SVR4:: Differenze minori tra System V
- Release 3.1 e 4.
-* POSIX:: Nuove funzionalit@`a per lo standard POSIX.
-* BTL:: Nuove funzionalit@`a dalla versione
- di @command{awk} di Brian Kernighan.
-* POSIX/GNU:: Le estensioni in @command{gawk} non
- previste in @command{awk} POSIX.
-* Storia delle funzionalit@`a:: La storia delle funzionalit@`a di
- @command{gawk}.
-* Estensioni comuni:: Sommario Estensioni comuni.
-* Intervalli e localizzazione:: Come le localizzazioni influiscono sugli
- intervalli delle espressioni regolari.
-* Contributori:: I maggiori contributori a @command{gawk}.
-* Sommario della storia:: Sommario della storia.
-@end menu
-
-@node V7/SVR3.1
-@appendixsec Differenze importanti tra V7 e System V Release 3.1
-@cindex @command{awk}, versioni di
-@cindex @command{awk}, versioni di, differenze tra V7 e SVR3.1
-
-Il liguaggio @command{awk} si @`e evoluto considerevolmente tra Unix versione
-7 (1978) e la nuova implementazione disponibile a partire da Unix System V
-Release 3.1 (1987). Questa @value{SECTION} riassume le differenze e indica
-dove @`e possibile trovare ulteriori dettagli:
-
-@itemize @value{BULLET}
-@item
-La necessit@`a di inserire @samp{;} per separare pi@`u regole su una riga
-(@pxref{Istruzioni/Righe})
-
-@item
-Funzioni definite dall'utente e istruzione @code{return}
-(@pxref{Funzioni definite dall'utente})
-
-@item
-L'istruzione @code{delete} (@pxref{Cancellazione})
-
-@item
-L'istruzione @code{do}-@code{while}
-(@pxref{Istruzione do})
-
-@item
-Le funzioni predefinite @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()} e
-@code{srand()} (@pxref{Funzioni numeriche})
-
-@item
-Le funzioni predefinite @code{gsub()}, @code{sub()} e @code{match()}
-(@pxref{Funzioni per stringhe})
-
-@item
-Le funzioni predefinite @code{close()} e @code{system()}
-(@pxref{Funzioni di I/O})
-
-@item
-Le variabili predefinite @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH},
-@code{RSTART} e @code{SUBSEP} (@pxref{Variabili predefinite})
-
-@item
-Possibilit@`a di modificare @code{$0} (@pxref{Cambiare i campi})
-
-@item
-L'espressione condizionale che fa uso dell'operatore ternario @samp{?:}
-(@pxref{Espressioni condizionali})
-
-@item
-L'espressione @samp{@var{indice} in @var{vettore}} esterna alle istruzioni
-@code{for} (@pxref{Visitare elementi})
-
-@item
-L'operatore esponenziale @samp{^}
-(@pxref{Operatori aritmetici}) e il relativo operatore di assegnamento
-@samp{^=} (@pxref{Operatori di assegnamento})
-
-@item
-Precedenze tra operatori compatibili con quelle del linguaggio C, che
-rendono non funzionanti alcuni vecchi programmi @command{awk} (@pxref{Precedenza})
-
-@item
-La possibilit@`a di usare @dfn{regexp} come valori di @code{FS}
-(@pxref{Separatori di campo}) e come
-terzo argomento per la funzione @code{split()}
-(@pxref{Funzioni per stringhe}), invece di usare solo il primo carattere
-di @code{FS}
-
-@item
-@dfn{Regexp} dinamiche come operandi degli operatori @samp{~} e @samp{!~}
-(@pxref{Espressioni regolari calcolate})
-
-@item
-Le sequenze di protezione @samp{\b}, @samp{\f} e @samp{\r}
-(@pxref{Sequenze di protezione})
-
-@item
-La ridirezione dell'input per la funzione @code{getline}
-(@pxref{Getline})
-
-@item
-La possibilit@`a di avere pi@`u regole @code{BEGIN} ed @code{END}
-(@pxref{BEGIN/END})
-
-@item
-Vettori multidimensionali
-(@pxref{Vettori multidimensionali})
-@end itemize
-
-@node SVR4
-@appendixsec Differenze tra le versioni System V Release 3.1 e SVR4
-
-@cindex @command{awk}, versioni di, differenze tra SVR3.1 e SVR4
-La versione per Unix System V Release 4 (1989) di @command{awk} ha aggiunto
-queste funzionalit@`a (alcune delle quali introdotte da @command{gawk}):
-
-@itemize @value{BULLET}
-@item
-Il vettore @code{ENVIRON} (@pxref{Variabili predefinite})
-@c gawk and MKS awk
-
-@item
-La possibilit@`a di specificare pi@`u opzioni @option{-f} sulla riga di comando
-(@pxref{Opzioni})
-@c MKS awk
-@c Mortice Kern Systems, ditta produttrice di una versione commerciale di awk
-
-@item
-L'opzione @option{-v} per assegnare variabili prima di iniziare
-l'esecuzione del programma
-(@pxref{Opzioni})
-@c GNU, Bell Laboratories & MKS together
-
-@item
-La notazione @option{--} per indicare la fine delle opzioni sulla riga di
-comando
-
-@item
-Le sequenze di protezione @samp{\a}, @samp{\v} e @samp{\x}
-(@pxref{Sequenze di protezione})
-@c GNU, for ANSI C compat
-
-@item
-Un valore di ritorno definito per la funzione predefinita @code{srand()}
-(@pxref{Funzioni numeriche})
-
-@item
-Le funzioni predefinite per stringhe @code{toupper()} e @code{tolower()}
-per la conversione maiuscolo/minuscolo
-(@pxref{Funzioni per stringhe})
-
-@item
-Una specificazione pi@`u accurata per la lettera @samp{%c} di controllo del
-formato nella funzione @code{printf}
-(@pxref{Lettere di controllo})
-
-@item
-La capacit@`a di decidere dinamicamente la larghezza di un campo e la
-precisione da usare (@code{"%*.*d"}) nella lista degli argomenti passati a
-@code{printf} e @code{sprintf()}
-(@pxref{Lettere di controllo})
-
-@item
-L'uso di costanti @dfn{regexp}, p.es. @code{/pippo/}, come espressioni,
-che equivalgono a usare l'operatore di ricerca di una
-corrispondenza, p.es. @samp{$0 ~ /pippo/}
-(@pxref{Usare le costanti @dfn{regexp}})
-
-@item
-Gestione di sequenze di protezione nell'assegnamento di variabili
-effettuato tramite la riga di comando
-(@pxref{Opzioni di assegnamento})
-@end itemize
-
-@node POSIX
-@appendixsec Differenze tra versione SVR4 e POSIX di @command{awk}
-@cindex @command{awk}, versioni di, differenze tra SVR4 e POSIX @command{awk}
-@cindex POSIX @command{awk}, differenze tra versioni @command{awk}
-
-Lo standard POSIX Command Language and Utilities per @command{awk} (1992)
-ha introdotto le seguenti modifiche al linguaggio:
-
-@itemize @value{BULLET}
-@item
-L'uso dell'opzione @option{-W} per opzioni specifiche a una data
-implementazione
-(@pxref{Opzioni})
-
-@item
-L'uso di @code{CONVFMT} per controllare la conversione di numeri
-in stringhe (@pxref{Conversione})
-
-@item
-Il concetto di stringa numerica e regole di confronto pi@`u precise da seguire
-al riguardo (@pxref{Tipi di variabile e confronti})
-
-@item
-L'uso di variabili predefinite come nomi di parametri delle funzioni @`e vietato
-(@pxref{Sintassi delle definizioni})
-
-@item
-Una documentazione pi@`u completa di molte tra le funzionalit@`a del linguaggio
-precedentemente non documentate
-@end itemize
-
-Nel 2012, un certo numero di estensioni che erano gi@`a comunemente
-disponibili da parecchi anni sono state finalmente aggiunte allo standard
-POSIX. Ecco l'elenco:
-
-@itemize @value{BULLET}
-@item
-La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
-in output
-(@pxref{Funzioni di I/O})
-
-@item
-L'istruzione @code{nextfile}
-(@pxref{Istruzione nextfile})
-
-@item
-La possibilit@`a di eliminare completamente un vettore con l'istruzione
-@samp{delete @var{vettore}}
-(@pxref{Cancellazione})
-
-@end itemize
-
-@xref{Estensioni comuni} per una lista delle estensioni comuni
-non previste nello standard POSIX.
-
-Lo standard POSIX 2008 @`e reperibile online a:
-@url{http://www.opengroup.org/onlinepubs/9699919799/}.
-
-
-@node BTL
-@appendixsec Estensioni nell'@command{awk} di Brian Kernighan
-
-@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
-@cindex estensioni, Brian Kernighan @command{awk}
-@cindex Brian Kernighan, @command{awk} di, estensioni
-@cindex Kernighan, Brian
-Brian Kernighan
-ha reso disponibile la sua versione nel suo sito.
-(@pxref{Altre versioni}).
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive estensioni comuni disponibili per la
-prima volta nella sua versione di @command{awk}:
-
-@itemize @value{BULLET}
-@item
-Gli operatori @samp{**} e @samp{**=}
-(@pxref{Operatori aritmetici}
-e
-@ref{Operatori di assegnamento})
-
-@item
-L'uso di @code{func} come abbreviazione di @code{function}
-(@pxref{Sintassi delle definizioni})
-
-@item
-La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
-in output
-(@pxref{Funzioni di I/O})
-
-@ignore
-@item
-The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol
-table. This feature was never documented for his @command{awk}, largely because
-it is somewhat shakily implemented. For instance, you cannot access arrays
-or array elements through it
-@end ignore
-@end itemize
-
-@xref{Estensioni comuni} per una lista completa delle estensioni
-disponibile nel suo @command{awk}.
-
-@node POSIX/GNU
-@appendixsec Estensioni di @command{gawk} non in POSIX @command{awk}
-
-@cindex modalit@`a compatibile di (@command{gawk}), estensioni nella
-@cindex estensioni nella modalit@`a compatibile di (@command{gawk})
-@cindex estensioni, in @command{gawk}, non in POSIX @command{awk}
-@cindex POSIX, estensioni @command{gawk} non incluse in
-L'implementazione GNU di @command{gawk} aggiunge molte funzionalit@`a.
-Queste possono essere disabilitate completamente sia con l'opzione
-@option{--traditional} che con l'opzione
-@option{--posix}
-(@pxref{Opzioni}).
-
-Alcune funzionalit@`a sono state introdotte e successivamente tolte
-con il passare del tempo.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION}
-sintetizza le ulteriori funzionalit@`a rispetto a POSIX @command{awk} che sono
-presenti nella versione corrente di @command{gawk}.
-
-@itemize @value{BULLET}
-
-@item
-Ulteriori variabili predefinite:
-
-@itemize @value{MINUS}
-@item
-Le variabili
-@code{ARGIND},
-@code{BINMODE},
-@code{ERRNO},
-@code{FIELDWIDTHS},
-@code{FPAT},
-@code{IGNORECASE},
-@code{LINT},
-@code{PROCINFO},
-@code{RT}
-e
-@code{TEXTDOMAIN}
-(@pxref{Variabili predefinite})
-@end itemize
-
-@item
-File speciali verso cui ridirigere l'I/O:
-
-@itemize @value{MINUS}
-@item
-I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
-@value{FNS} speciali @file{/dev/fd/@var{N}}
-(@pxref{File speciali})
-
-@item
-I file speciali @file{/inet}, @file{/inet4} e @file{/inet6} per
-interagire con la rete TCP/IP usando @samp{|&} per specificare quale
-versione usare del protocollo IP
-(@pxref{Reti TCP/IP})
-@end itemize
-
-@item
-Differenze e/o aggiunte al linguaggio:
-
-@itemize @value{MINUS}
-@item
-La sequenza di protezione @samp{\x}
-(@pxref{Sequenze di protezione})
-
-@item
-Supporto completo per @dfn{regexp} sia POSIX che GNU
-@iftex
-(@pxrefil{Espressioni regolari})
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari})
-@end ifnottex
-
-@item
-La possibilit@`a che @code{FS} e il terzo
-argomento di @code{split()} siano la stringa nulla
-(@pxref{Campi di un solo carattere})
-
-@item
-La possibilit@`a che @code{RS} sia una @dfn{regexp}
-(@pxref{Record})
-
-@item
-La possibilit@`a di usare costanti ottali ed esadecimali nei programmi
-scritti in @command{awk}
-(@pxref{Numeri non-decimali})
-
-@item
-L'operatore @samp{|&} per poter effettuare I/O bidirezionale verso un
-coprocesso
-(@pxref{I/O bidirezionale})
-
-@item
-Chiamate indirette di funzione
-(@pxref{Chiamate indirette})
-
-@item
-La possibilit@`a di ignorare directory specificate sulla riga di comando,
-emettendo un messaggio di avvertimento
-(@pxref{Directory su riga di comando})
-
-@item
-Errori in output usando @code{print} e @code{printf} non provocano
-necessariamente la fine del programma
-(@pxref{Continuazione dopo errori})
-@end itemize
-
-@item
-Nuove parole chiave:
-
-@itemize @value{MINUS}
-@item
-I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE})
-
-@item
-L'istruzione @code{switch}
-(@pxref{Istruzione switch})
-@end itemize
-
-@item
-Differenze in funzioni standard di @command{awk}:
-
-@itemize @value{MINUS}
-@item
-Il secondo argomento opzionale di @code{close()} che consente di chiudere
-un solo lato dell'I/O di una @dfn{pipe} bidirezionale aperta verso un
-coprocesso (@pxref{I/O bidirezionale})
-
-@item
-Aderenza allo standard POSIX per le funzioni @code{gsub()} e @code{sub()}
-se @`e stata specificata l'opzione @option{--posix}
-
-@item
-La funzione @code{length()} accetta come argomento il nome di un vettore
-e restituisce il numero di elementi nel vettore
-(@pxref{Funzioni per stringhe})
-
-@item
-Il terzo argomento opzionale della funzione @code{match()}
-per contenere eventuali sottoespressioni individuate all'interno di una
-@dfn{regexp}
-(@pxref{Funzioni per stringhe})
-
-@item
-Specificatori posizionali nei formati di @code{printf} per facilitare
-le traduzioni di messaggi
-(@pxref{Ordinamento di printf})
-
-@item
-L'aggiunta di un quarto argomento opzionale alla funzione @code{split()},
-per designare un vettore che contenga il testo dei separatori di campo
-(@pxref{Funzioni per stringhe})
-@end itemize
-
-@item
-Ulteriori funzioni presenti solo in @command{gawk}:
-
-@itemize @value{MINUS}
-@item
-Le funzioni @code{gensub()}, @code{patsplit()} e @code{strtonum()}
-per una gestione di testi pi@`u potente
-(@pxref{Funzioni per stringhe})
-
-@item
-Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
-(@pxref{Ordinamento di vettori})
-
-@item
-Le funzioni @code{mktime()}, @code{systime()} e @code{strftime()}
-per lavorare con date e ore
-(@pxref{Funzioni di tempo})
-
-@item
-Le funzioni
-@code{and()},
-@code{compl()},
-@code{lshift()},
-@code{or()},
-@code{rshift()}
-e
-@code{xor()}
-per la manipolazione a livello di bit
-(@pxref{Funzioni a livello di bit})
-@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments
-
-@item
-La funzione @code{isarray()} per controllare se una variabile @`e un vettore
-oppure no
-(@pxref{Funzioni per i tipi})
-
-@item
-Le funzioni @code{bindtextdomain()}, @code{dcgettext()}
-e @code{dcngettext()} per l'internazionalizzazione
-(@pxref{I18N per programmatore})
-
-@item
-La funzione @code{intdiv()} per effettuare divisioni a numeri interi e
-ottenere il resto della divisione
-(@pxref{Funzioni numeriche})
-@end itemize
-
-@item
-Modifiche e/o aggiunte alle opzioni della riga di comando:
-
-@itemize @value{MINUS}
-@item
-La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
-per l'opzione @option{-f} della riga di comando
-(@pxref{Opzioni})
-
-@item
-La variabile d'ambiente @env{AWKLIBPATH} per specificare un percorso di ricerca
-per l'opzione @option{-l} della riga di comando
-(@pxref{Opzioni})
-
-@item
-Le opzioni brevi
-@option{-b},
-@option{-c},
-@option{-C},
-@option{-d},
-@option{-D},
-@option{-e},
-@option{-E},
-@option{-g},
-@option{-h},
-@option{-i},
-@option{-l},
-@option{-L},
-@option{-M},
-@option{-n},
-@option{-N},
-@option{-o},
-@option{-O},
-@option{-p},
-@option{-P},
-@option{-r},
-@option{-s},
-@option{-S},
-@option{-t}
-e
-@option{-V}
-. Inoltre, la
-possibilit@`a di usare opzioni in formato lungo (stile GNU) che iniziano
-con @option{--}
-e le opzioni lunghe
-@option{--assign},
-@option{--bignum},
-@option{--characters-as-bytes},
-@option{--copyright},
-@option{--debug},
-@option{--dump-variables},
-@option{--exec},
-@option{--field-separator},
-@option{--file},
-@option{--gen-pot},
-@option{--help},
-@option{--include},
-@option{--lint},
-@option{--lint-old},
-@option{--load},
-@option{--non-decimal-data},
-@option{--optimize},
-@option{--no-optimize},
-@option{--posix},
-@option{--pretty-print},
-@option{--profile},
-@option{--re-interval},
-@option{--sandbox},
-@option{--source},
-@option{--traditional},
-@option{--use-lc-numeric},
-and
-@option{--version}
-(@pxref{Opzioni}).
-@end itemize
-
-@c new ports
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-sorgente e dalla documentazione di @command{gawk} @value{PVERSION} 4.0:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-Amiga
-
-@item
-Atari
-
-@item
-BeOS
-
-@item
-Cray
-
-@item
-MIPS RiscOS
-
-@item
-MS-DOS con il compilatore Microsoft
-
-@item
-MS-Windows con il compilatore Microsoft
-
-@item
-NeXT
-
-@item
-SunOS 3.x, Sun 386 (Road Runner)
-
-@item
-Tandem (non-POSIX)
-
-@item
-Compilatore pre-standard VAX C per VAX/VMS
-
-@item
-GCC per VAX e Alpha non @`e stato verificato da parecchio tempo.
-
-@end itemize
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-di @command{gawk} @value{PVERSION} 4.1:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-Ultrix
-@end itemize
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-sorgente e dalla documentazione di
-@command{gawk} @value{PVERSION} 4.2:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-MirBSD
-
-@item
-GNU/Linux su Alpha
-@end itemize
-
-@end itemize
-
-@c XXX ADD MORE STUFF HERE
-
-
-@c This does not need to be in the formal book.
-@ifclear FOR_PRINT
-@node Storia delle funzionalit@`a
-@appendixsec Storia delle funzionalit@`a di @command{gawk}
-
-@ignore
-See the thread:
-https://groups.google.com/forum/#!topic/comp.lang.awk/SAUiRuff30c
-This motivated me to add this section.
-@end ignore
-
-@ignore
-I've tried to follow this general order, esp.@: for the 3.0 and 3.1 sections:
- variables
- special files
- language changes (e.g., hex constants)
- differences in standard awk functions
- new gawk functions
- new keywords
- new command-line options
- behavioral changes
- new ports
-Within each category, be alphabetical.
-@end ignore
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive le funzionalit@`a in @command{gawk}
-in aggiunta a quelle di POSIX @command{awk},
-nell'ordine in cui sono state rese disponibili in @command{gawk}.
-
-La versione 2.10 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
-per l'opzione @option{-f} della riga di comando
-(@pxref{Opzioni})
-
-@item
-La variabile @code{IGNORECASE} e i suoi effetti
-(@pxref{Maiuscolo-Minuscolo}).
-
-@item
-I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
-@value{FNS} speciali @file{/dev/fd/@var{N}}
-(@pxref{File speciali})
-@end itemize
-
-La versione 2.13 di @command{gawk} ha ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-La variabile @code{FIELDWIDTHS} e i suoi effetti
-(@pxref{Dimensione costante}).
-
-@item
-Le funzioni predefinite @code{systime()} e @code{strftime()} per ottenere
-e stampare data e ora
-(@pxref{Funzioni di tempo}).
-
-@item
-Ulteriori opzioni dalla riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{-W lint} per fornire controlli su possibili errori e per
-la portabilit@`a, sia a livello di codice sorgente che in fase di esecuzione.
-
-@item
-L'opzione @option{-W compat} per inibire le estensioni GNU.
-
-@item
-L'opzione @option{-W posix} per richiedere una stretta aderenza allo
-standard POSIX.
-@end itemize
-@end itemize
-
-La versione 2.14 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-L'istruzione @code{next file} per passare immediatamente al successivo
-@value{DF} (@pxref{Istruzione nextfile}).
-@end itemize
-
-La versione 2.15 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Nuove variabili (@pxref{Variabili predefinite}):
-
-@itemize @value{MINUS}
-@item
-@code{ARGIND}, che permette di controllare la posizione di @code{FILENAME}
-nel vettore @code{ARGV}.
-
-@item
-@code{ERRNO}, che contiene il messaggio di errore del sistema quando
-@code{getline} restituisce @minus{}1 o @code{close()} non termina con successo.
-@end itemize
-
-@item
-I @value{FNS} speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
-e @file{/dev/user}. Questo supporto @`e stato rimosso in seguito.
-
-@item
-La possibilit@`a di cancellare un intero vettore in una sola istruzione
-con @samp{delete @var{vettore}}
-(@pxref{Cancellazione}).
-
-@item
-Modifiche nelle opzioni della riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-La possibilit@`a di usare opzioni in formato lungo (in stile GNU) che iniziano
-con @option{--}.
-
-@item
-L'opzione @option{--source} per combinare codice sorgente immesso nella riga
-di comando e codice sorgente proveniente da file di libreria.
-@end itemize
-@end itemize
-
-La versione 3.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Variabili nuove o modificate:
-
-@itemize @value{MINUS}
-@item
-@code{IGNORECASE} modificato, diventa applicabile al confronto tra stringhe,
-come pure alle operazioni su @dfn{regexp}
-(@pxref{Maiuscolo-Minuscolo}).
-
-@item
-@code{RT}, che contiene il testo in input che @`e stato individuato da @code{RS}
-(@pxref{Record}).
-@end itemize
-
-@item
-Supporto completo sia per le @dfn{regexp} POSIX sia per quelle GNU
-@iftex
-(@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}).
-@end ifnottex
-
-@item
-La funzione @code{gensub()} per migliorare la manipolazione di testi
-(@pxref{Funzioni per stringhe}).
-
-@item
-La funzione @code{strftime()} prevede un formato di data e ora di default,
-in modo da poter essere chiamata senza alcun argomento.
-(@pxref{Funzioni di tempo}).
-
-@item
-La possibilit@`a che @code{FS} e il terzo argomento della funzione
-@code{split()} siano delle stringhe nulle
-(@pxref{Campi di un solo carattere}).
-
-@item
-La possibilit@`a che @code{RS} sia una @dfn{regexp}
-(@pxref{Record}).
-
-@item
-L'istruzione @code{next file} @`e diventata @code{nextfile}
-(@pxref{Istruzione nextfile}).
-
-@item
-La funzione @code{fflush()} di
-BWK @command{awk}
-(BWK allora lavorava ai Bell Laboratories;
-@pxref{Funzioni di I/O}).
-
-@item
-Nuove opzioni della riga di comando:
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{--lint-old} per
-ottenere messaggi relativi a costrutti non disponibili
-nell'implementazione di @command{awk} per Unix Version 7
-(@pxref{V7/SVR3.1}).
-
-@item
-L'opzione @option{-m} da BWK @command{awk}. (Brian lavorava
-ancora ai Bell Laboratories all'epoca.) Quest'opzione @`e stata in seguito
-rimossa, sia dal suo @command{awk} che da @command{gawk}.
-
-@item
-L'opzione @option{--re-interval} per consentire di specificare
-espressioni di intervallo nelle @dfn{regexp}
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-L'opzione @option{--traditional} aggiunta come maniera pi@`u intuitiva
-per richiedere l'opzione
-@option{--compat} (@pxref{Opzioni}).
-@end itemize
-
-@item
-L'uso di GNU Autoconf per controllare il processo di configurazione
-(@pxref{Installazione veloce}).
-
-@item
-Supporto per Amiga.
-Questo supporto @`e stato rimosso in seguito.
-
-@end itemize
-
-La versione 3.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Nuove variabili
-(@pxref{Variabili predefinite}):
-
-@itemize @value{MINUS}
-@item
-@code{BINMODE}, per sistemi non aderenti allo standard POSIX,
-che consente I/O binario per file in input e/o output
-(@pxref{Uso su PC}).
-
-@item
-@code{LINT}, che controlla dinamicamente gli avvertimenti emessi da @dfn{lint}.
-
-@item
-@code{PROCINFO}, un vettore che fornisce informazioni correlate con il
-processo in esecuzione.
-
-@item
-@code{TEXTDOMAIN}, per impostare il dominio testuale in cui internazionalizzare
-un'applicazione (@pxref{Internazionalizzazione}).
-@end itemize
-
-@item
-La possibilit@`a di usare costanti ottali ed esadecimali nel codice
-sorgente di programmi @command{awk}.
-(@pxref{Numeri non-decimali}).
-
-@item
-L'operatore @samp{|&} per effettuare I/O bidirezionale verso un
-coprocesso
-(@pxref{I/O bidirezionale}).
-
-@item
-I file speciali @file{/inet} per interagire con reti TCP/IP usando @samp{|&}
-(@pxref{Reti TCP/IP}).
-
-@item
-Il secondo argomento opzionale della funzione @code{close()} per permettere di
-chiudere uno dei lati di una @dfn{pipe} bidirezionale aperta con un coprocesso
-(@pxref{I/O bidirezionale}).
-
-@item
-Il terzo argomento opzionale della funzione @code{match()} per
-avere a disposizione le diverse sottoespressioni individuate all'interno
-di una @dfn{regexp}
-(@pxref{Funzioni per stringhe}).
-
-@item
-Specificatori posizionali nelle stringhe di formato di @code{printf} per
-facilitare la traduzione di messaggi
-(@pxref{Ordinamento di printf}).
-
-@item
-Alcune nuove funzioni predefinite:
-
-@itemize @value{MINUS}
-@item
-Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
-(@pxref{Ordinamento di vettori}).
-
-@item
-Le funzioni @code{bindtextdomain()}, @code{dcgettext()} e @code{dcngettext()}
-per l'internationalizzazione
-(@pxref{I18N per programmatore}).
-
-@item
-La funzione @code{extension()} e la possibilit@`a di aggiungere
-nuove funzioni predefinite dinamicamente
-@iftex
-(@pxrefil{Estensioni dinamiche}).
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}).
-@end ifnottex
-
-@item
-La funzione @code{mktime()} per generare date e ore
-(@pxref{Funzioni di tempo}).
-
-@item
-Le funzioni @code{and()}, @code{or()}, @code{xor()}, @code{compl()},
-@code{lshift()}, @code{rshift()} e @code{strtonum()}
-(@pxref{Funzioni a livello di bit}).
-@end itemize
-
-@item
-@cindex @code{next file} statement
-Il supporto per @samp{next file} scritto come due parole @`e stato rimosso
-completamente
-(@pxref{Istruzione nextfile}).
-
-@item
-Ulteriori opzioni sulla riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{--dump-variables} per stampare una lista di tutte le
-variabili globali.
-
-@item
-L'opzione @option{--exec}, da usare in script CGI [Common Gateway Interface].
-
-@item
-L'opzione della riga di comando @option{--gen-po} e l'uso di un trattino
-basso a inizio stringa, per segnalare stringhe che dovrebbero essere tradotte
-(@pxref{Estrazione di stringhe}).
-
-@item
-L'opzione @option{--non-decimal-data} per consentire di avere dati in input
-di tipo non decimale
-(@pxref{Dati non decimali}).
-
-@item
-L'opzione @option{--profile} e @command{pgawk}, la
-versione profilatrice di @command{gawk}, per produrre profili di esecuzione
-di programmi @command{awk}
-(@pxref{Profilare}).
-
-@item
-L'opzione @option{--use-lc-numeric} per richiedere a @command{gawk}
-di usare il carattere di separazione decimale proprio della localizzazione
-nell'elaborazione dei dati in input
-(@pxref{Conversione}).
-@end itemize
-
-@item
-L'uso di GNU Automake a supporto della standardizzazione del processo
-di configurazione
-(@pxref{Installazione veloce}).
-
-@item
-L'uso di GNU @command{gettext} per i messaggi emessi da @command{gawk}
-(@pxref{Gawk internazionalizzato}).
-
-@item
-Supporto per BeOS. Rimosso in seguito.
-
-@item
-Supporto per Tandem. Rimosso in seguito.
-
-@item
-La versione per Atari ufficialmente non @`e pi@`u supportata e in seguito
-@`e stata completamente rimossa.
-
-@item
-Modifiche al codice sorgente per usare definizioni di funzione secondo lo
-stile di codifica dello standard ISO C.
-
-@item
-Aderenza alla specifica POSIX per le funzioni @code{sub()} e @code{gsub()}
-(@pxref{Dettagli ostici}).
-
-@item
-La funzione @code{length()} @`e stata estesa per accettare un vettore come
-argomento, e restituire in tal caso il numero di elementi nel vettore
-(@pxref{Funzioni per stringhe}).
-
-@item
-La funzione @code{strftime()} accetta un terzo argomento per
-dare la possibilit@`a di stampare data e ora nel formato UTC
-(@pxref{Funzioni di tempo}).
-@end itemize
-
-La versione 4.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-
-@item
-Aggiunta di variabili:
-
-@itemize @value{MINUS}
-@item
-@code{FPAT}, che permette di specificare una @dfn{regexp} che individua
-i campi, invece che individuare il separatore tra i campi
-(@pxref{Separazione in base al contenuto}).
-
-@item
-Se esiste l'elemento di vettore @code{PROCINFO["sorted_in"]}, il ciclo
-@samp{for(indice in pippo)} ordina
-gli indici, prima di iniziare il ciclo. Il valore di questo elemento
-permette di controllare l'ordinamento degli indici prima di iniziare il
-ciclo che li visita tutti
-(@pxref{Controllare visita}).
-
-@item
-@code{PROCINFO["strftime"]}, che contiene la stringa di formato
-di default per @code{strftime()}
-(@pxref{Funzioni di tempo}).
-@end itemize
-
-@item
-I file speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
-e @file{/dev/user} sono stati rimossi.
-
-@item
-Il supporto per IPv6 @`e stato aggiunto attraverso il file speciale
-@file{/inet6}.
-Il file speciale @file{/inet4} consente di operare con IPv4 e @file{/inet}
-opera con il default di sistema, che probabilmente @`e IPv4
-(@pxref{Reti TCP/IP}).
-
-@item
-L'uso delle sequenze di protezione @samp{\s} e @samp{\S} nelle espressioni
-regolari
-(@pxref{Operatori di @dfn{regexp} GNU}).
-
-@item
-Le espressioni di intervallo sono consentite per default nelle espressioni
-regolari
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-La classi di caratteri POSIX sono consentite anche se si @`e specificata
-l'opzione @option{--traditional}
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-@code{break} e @code{continue} non sono pi@`u consentiti fuori da un ciclo,
-anche se si @`e specificata l'opzione @option{--traditional}
-(@pxref{Istruzione break} e anche la
-@ref{Istruzione continue}).
-
-@item
-@code{fflush()}, @code{nextfile} e @samp{delete @var{array}}
-sono consentite anche se @`e stata specificata l'opzione @option{--posix} o
-@option{--traditional}, poich@'e questi costrutti sono ora inclusi
-nello standard POSIX.
-
-@item
-Un terzo argomento facoltativo per le funzioni @code{asort()} e @code{asorti()}
-permette di specificare il tipo di ordinamento desiderato
-(@pxref{Funzioni per stringhe}).
-
-@item
-Il comportamento di @code{fflush()} @`e stato modificato per corrispondere
-a quello di BWK @command{awk}
-e per lo standard POSIX; ora sia @samp{fflush()} che @samp{fflush("")}
-forzano la scrittura di tutte le ridirezioni in output aperte
-(@pxref{Funzioni di I/O}).
-
-@item
-La funzione @code{isarray()}
-determina se un elemento @`e un vettore oppure no
-per rendere possibile la visita di vettori di vettori
-(@pxref{Funzioni per i tipi}).
-
-@item
-La funzione @code{patsplit()} che
-fornisce le stesse funzionalit@`a di @code{FPAT}, per suddividere delle stringhe
-(@pxref{Funzioni per stringhe}).
-
-@item
-Un quarto argomento opzionale per la funzione @code{split()},
-che indica un vettore destinato a contenere i valori dei separatori
-(@pxref{Funzioni per stringhe}).
-
-@item
-Vettori di vettori
-(@pxref{Vettori di vettori}).
-
-@item
-I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-@item
-Chiamate indirette di funzioni
-(@pxref{Chiamate indirette}).
-
-@item
-Le istruzioni @code{switch} / @code{case} sono disponibili per default
-(@pxref{Istruzione switch}).
-
-@item
-Modifiche nelle opzioni della riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-Le opzioni @option{-b} e @option{--characters-as-bytes},
-che impediscono che @command{gawk} tratti l'input come composto da una
-stringa di caratteri multibyte.
-
-@item
-Rimozione delle opzioni ridondanti (in notazione lunga) @option{--compat},
-@option{--copyleft} e @option{--usage}.
-
-@item
-L'opzione @option{--gen-po} @`e stata finalmente rinominata
-@option{--gen-pot} per correttezza.
-
-@item
-L'opzione @option{--sandbox} che disabilita alcune funzionalit@`a [per operare
-in un ambiente "protetto"].
-
-@item
-Tutte le opzioni in notazione lunga hanno acquisito opzioni corrispondenti
-in notazione breve, per poter essere usate negli script di shell @samp{#!}.
-@end itemize
-
-@item
-I nomi di directory che appaiono sulla riga di comando generano adesso
-un messaggio di errore, ma non interrompono l'elaborazione, a meno che non
-siano state specificate le opzioni @option{--posix} o @option{--traditional}
-(@pxref{Directory su riga di comando}).
-
-@item
-Il codice interno di @command{gawk} @`e stato riscritto, aggiungendo la
-versione per il debug @command{dgawk},
-con un possibile miglioramento nei tempi di esecuzione
-@iftex
-(@pxrefil{Debugger}).
-@end iftex
-@ifnottex
-(@pxref{Debugger}).
-@end ifnottex
-
-@item
-In aderenza agli standard di codifica GNU, le estensioni dinamiche devono
-definire un simbolo globale che indica che sono compatibili con la
-licenza GPL
-(@pxref{Licenza delle estensioni}).
-
-@item
-In modalit@`a POSIX, i confronti tra stringhe usano le funzioni di
-libreria @code{strcoll()} / @code{wcscoll()}
-(@pxref{Confronto POSIX di stringhe}).
-
-@item
-L'opzione per usare @dfn{socket} in maniera @dfn{raw} (nativa) @`e stata
-rimossa, perch@'e non era mai stata implementata
-(@pxref{Reti TCP/IP}).
-
-@item
-Intervalli nella forma @samp{[d-h]} sono elaborati come se fossero scritti
-nella localizzazione C, a prescindere da che tipo di @dfn{regexp} @`e usata,
-anche se era stata specificata l'opzione
-@option{--posix}
-(@pxref{Intervalli e localizzazione}).
-
-@item
-@`E stato rimosso il supporto per i seguenti sistemi:
-
-@itemize @value{MINUS}
-@item
-Atari
-
-@item
-Amiga
-
-@item
-BeOS
-
-@item
-Cray
-
-@item
-MIPS RiscOS
-
-@item
-MS-DOS con Compilatore Microsoft
-
-@item
-MS-Windows con Compilatore Microsoft
-
-@item
-NeXT
-
-@item
-SunOS 3.x, Sun 386 (Road Runner)
-
-@item
-Tandem (non-POSIX)
-
-@item
-Compilatore pre-standard VAX C per VAX/VMS
-@end itemize
-@end itemize
-
-La versione 4.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-
-@item
-Tre nuovi vettori:
-@code{SYMTAB}, @code{FUNCTAB} e @code{PROCINFO["identifiers"]}
-(@pxref{Variabili auto-assegnate}).
-
-@item
-I tre comandi eseguibili @command{gawk}, @command{pgawk} e @command{dgawk},
-sono diventati uno solo, con il solo nome @command{gawk}. Di conseguenza
-le opzioni sulla riga di comando sono state modificate.
-
-@item
-Modifiche delle opzioni da riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{-D} attiva il debugger.
-
-@item
-Le opzioni @option{-i} e @option{--include}
-caricano dei file di libreria @command{awk}.
-
-@item
-Le opzioni @option{-l} e @option{--load} caricano estensioni dinamiche
-compilate.
-
-@item
-Le opzioni @option{-M} e @option{--bignum} abilitano la libreria MPFR per
-il calcolo con un numero arbitrario di cifre significative.
-
-@item
-L'opzione @option{-o} serve solo a ottenere in output una stampa formattata
-elegantemente del programma da eseguire.
-
-@item
-L'opzione @option{-p} @`e usata per "profilare" l'esecuzione del programma.
-
-@item
-L'opzione @option{-R} @`e stata rimossa.
-@end itemize
-
-@item
-Supporto per il calcolo ad alta precisione con MPFR
-(@pxref{Calcolo con precisione arbitraria}).
-
-@item
-Le funzioni @code{and()}, @code{or()} e @code{xor()} sono state modificate
-per ammettere un numero qualsiasi di argomenti, con un minimo di due
-(@pxref{Funzioni a livello di bit}).
-
-
-@item
-L'interfaccia che rende possibile l'estensione dinamica @`e stata rifatta
-completamente
-@iftex
-(@pxrefil{Estensioni dinamiche}).
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}).
-@end ifnottex
-
-@item
-La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di
-@code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-@item
-Il comando @code{where} @`e stato aggiunto al debugger
-(@pxref{Stack di esecuzione}).
-
-@item
-Il supporto per Ultrix @`e stato rimosso.
-
-@end itemize
-
-La versione 4.2 ha introdotto le seguenti funzionalit@`a:
-
-@itemize @bullet
-@item
-Differenze apportate alle variabili di ambiente (@code{ENVIRON}) sono riflesse in quelle
-rese disponibili a @command{gawk} e in quelle di programmi che siano da esso richiamati.
-@xref{Variabili auto-assegnate}.
-
-@item
-L'opzione @option{--pretty-print} non esegue pi@`u, dopo averlo stampato,
-il programma @command{awk}.
-@xref{Opzioni}.
-
-@item
-Il programma @command{igawk} e le relative pagine di manuale non sono
-pi@`u installati come parte dell'installazione di @command{gawk}.
-@xref{Programma igawk}.
-
-@item
-La funzione @code{intdiv()}.
-@xref{Funzioni numeriche}.
-
-@item
-Il massimo numero di cifre esadecimali permesse nelle sequenze di
-protezione @samp{\x} @`e ora limitato a due.
-@xref{Sequenze di protezione}.
-
-@item
-@code{print} e @code{printf} non terminano il programma dopo alcuni
-errori di output.
-@xref{Continuazione dopo errori}.
-
-@item
-Per molti anni, lo standard POSIX richiedeva che la separazione dei campi
-di un record fosse fatta per default
-quando si incontrano spazi e TAB, e questo @`e il comportamento di
-@command{gawk} se si specifica l'opzione @option{--posix}. Dal 2013
-il comportamento originario @`e stato ripristinato, e ora
-il default per separare i campi con l'opzione @option{--posix} ammette
-anche il ritorno a capo come separatore di campi.
-
-@item
-Il supporto per MirBSD @`e stato rimosso.
-
-@item
-Il supporto per GNU/Linux sull'architettura Alpha @`e stato rimosso.
-@end itemize
-
-@c XXX ADD MORE STUFF HERE
-@end ifclear
-
-@node Estensioni comuni
-@appendixsec Sommario Estensioni Comuni
-
-@cindex estensioni, Brian Kernighan @command{awk}
-@cindex estensioni, @command{mawk}
-La tabella seguente dettaglia le estensioni comuni supportate
-da @command{gawk}, da Brian Kernighan @command{awk} e da @command{mawk},
-le tre versioni liberamente disponibili pi@`u usate di @command{awk}
-(@pxref{Altre versioni}).
-
-@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 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 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 @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 @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 @tab X @tab X @tab
-@item Funzioni gestione data/ora @tab @tab X @tab X @tab
-@end multitable
-
-@node Intervalli e localizzazione
-@appendixsec Intervalli @dfn{regexp} e localizzazione: una lunga e triste storia
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive la storia confusionaria degli intervalli
-all'interno di espressioni regolari, le loro relazioni con la localizzazione,
-e l'effetto da ci@`o determinato su diverse versioni di @command{gawk}.
-
-Gli strumenti originali Unix aventi a che fare con espressioni regolari
-stabilivano che intervalli di caratteri (come @samp{[a-z]}) individuavano
-un carattere qualsiasi tra il primo carattere dell'intervallo e l'ultimo
-carattere dello stesso, entrambi inclusi. L'ordinamento era basato sul
-valore numerico di ogni carattere come era rappresentato all'interno
-del computer, nell'insieme di caratteri proprio di ogni macchina.
-Quindi, su sistemi che adottano la codifica ASCII, @samp{[a-z]} individua
-tutte le lettere minuscole, e solo
-quelle, in quanto i valori numerici che rappresentano le lettere dalla
-@samp{a} fino alla @samp{z} sono contigui. (In un sistema che adotta la
-codifica EBCDIC, l'intervallo @samp{[a-z]} comprende anche ulteriori
-caratteri non alfabetici.)
-
-Quasi tutti i testi di introduzione allo Unix spiegavano che le espressioni
-di intervallo funzionavano in questo modo, e in particolare insegnavano che
-la maniera ``corretta'' per individuare le lettere minuscole era con
-@samp{[a-z]} e che @samp{[A-Z]} era il modo ``corretto'' per individuare le
-lettere maiuscole.
-E, in effetti, era proprio cos@`{@dotless{i}}.@footnote{E la vita era semplice.}
-
-Lo standard POSIX 1992 introduceva l'idea di localizzazione
-(@pxref{Localizzazioni}).
-Poich@'e molte localizzazioni comprendono altre lettere, oltre alle 26
-lettere dell'alfabeto inglese, lo standard POSIX introduceva le classi
-di carattere (@pxref{Espressioni tra parentesi quadre}) per permettere
-l'individuazione di differenti insiemi di caratteri, in aggiunta a quelli
-tradizionali presenti nell'insieme di caratteri ASCII.
-
-Tuttavia, lo standard @emph{ha modificato} l'interpretazione delle
-espressioni di intervallo.
-Nelle localizzazioni @code{"C"} e @code{"POSIX"},
-un'espressione di intervallo come
-@samp{[a-dx-z]} @`e ancora equivalente a @samp{[abcdxyz]}, secondo l'ordine
-della codifica ASCII.
-Ma in tutte le altre localizzazioni l'ordinamento @`e basato su quel che
-si chiama @dfn{ordine di collazione}.
-
-Cosa vuol dire?
-In molte localizzazioni, le lettere @samp{A} e @samp{a} vengono entrambe
-prima di @samp{B}.
-In altre parole, queste localizzazioni ordinano i caratteri nel modo in cui
-sono ordinati in un dizionario,
-e @samp{[a-dx-z]} non @`e detto che equivalga a @samp{[abcdxyz]};
-invece, potrebbe essere equivalente a @samp{[ABCXYabcdxyz]}, per fare un
-esempio.
-
-Su questo punto @`e opportuno insistere: molta documentazione afferma che
-si dovrebbe usare @samp{[a-z]} per identificare un carattere minuscolo.
-Ma su sistemi con localizzazioni
-non-ASCII, un tale intervallo potrebbe includere tutti i caratteri maiuscoli
-tranne @samp{A} o @samp{Z}! Questo ha continuato a essere una fonte di
-equivoci perfino nel ventunesimo secolo.
-
-Per dare un'idea del tipo di problemi, l'esempio seguente usa la funzione
-@code{sub()}, che effettua una sostituzione di testo all'interno di una
-stringa (@pxref{Funzioni per stringhe}). Qui, l'idea @`e quella di rimuovere
-i caratteri maiuscoli a fine stringa:
-
-@example
-$ @kbd{echo qualcosa1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'}
-@print{} qualcosa1234a
-@end example
-
-@noindent
-Questo non @`e l'output che ci si aspettava, perch@'e, il @samp{bc} alla fine di
-@samp{qualcosa1234abc} non dovrebbe essere individuato da @samp{[A-Z]*}.
-Un tale risultato dipende dalle impostazioni di localizzazione (e quindi
-potrebbe non succedere sul sistema che si sta usando).
-
-@cindex Unicode
-Considerazioni simili valgono per altri intervalli. Per esempio, @samp{["-/]}
-@`e perfettamente valido in ASCII, ma non @`e valido in molte localizzazioni
-Unicode, p.es. in @code{en_US.UTF-8}.
-
-Il codice delle prime versioni di @command{gawk} per individuare le
-@dfn{regexp} non teneva conto della localizzazione, e quindi gli
-intervalli potevano essere interpretati in maniera tradizionale.
-
-Quando @command{gawk} ha iniziato a usare metodi di ricerca di @dfn{regexp}
-che tengono conto della localizzazione, sono iniziati i problemi;
-a maggior ragione in quanto sia GNU/Linux che i venditori di versioni
-commerciali di Unix
-avevano iniziato a implementare localizzazioni non-ASCII,
-@emph{adottandole per default}. La domanda che forse si udiva pi@`u spesso
-era del tipo: ``Perch@'e @samp{[A-Z]} individua lettere minuscole?!?''
-
-@cindex Berry, Karl
-Questa situazione @`e in essere da circa 10 anni, se non di pi@`u, e
-il manutentore di @command{gawk} si @`e stufato di continuare a spiegare che
-@command{gawk} stava semplicemente implementando quelli che sono gli
-standard, e che il problema stava nella localizzazione dell'utente. Nella
-fase di sviluppo della @value{PVERSION} 4.0, @command{gawk} @`e stato modificato
-in modo da trattare sempre gli
-intervalli "come si faceva prima di POSIX", a meno che non si specifichi
-l'opzione @option{--posix} (@pxref{Opzioni}).@footnote{Ed
-@`e cos@`{@dotless{i}} che @`e nata la Campagna per l'Interpretazione Razionale degli
-Intervalli (in inglese, RRI [@dfn{Rational Range Interpretation}]).
-Un certo
-numero di strumenti GNU hanno gi@`a implementato questa modifica, o
-lo faranno presto. Grazie a Karl Berry per aver coniato la frase
-``Rational Range Interpretation''.}
-
-Fortunatamente, un po' prima del rilascio definitivo della versione 4.0 di
-@command{gawk}, il manutentore ha appreso che lo standard 2008 aveva
-modificato la definizione di intervallo, e che, al di fuori delle
-localizzazioni @code{"C"} e @code{"POSIX"}, il significato di espressione
-di intervallo era ora
-@emph{indefinito}.@footnote{Si veda
-@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, lo standard}
-e
-@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, le motivazioni}.}
-
-Adottando questo simpatico termine tecnico, lo standard permette agli
-implementatori di implementare gli intervalli nella maniera che preferiscono.
-Il manutentore di @command{gawk} ha deciso di implementare la regola pre-POSIX
-sia per l'individuazione di default delle @dfn{regexp} sia quando si
-specificano le opzioni @option{--traditional} o @option{--posix}.
-In ogni caso @command{gawk} aderisce allo standard POSIX.
-
-@node Contributori
-@appendixsec I principali contributori a @command{gawk}
-@cindex @command{gawk}, lista di contributori a
-@quotation
-@i{Riconoscere sempre il merito, se un merito va riconosciuto.}
-@author Anonimo
-@end quotation
-
-Questa @value{SECTION} elenca le persone che hanno maggiormente contribuito
-allo sviluppo di @command{gawk} e/o alla stesura di questo @value{DOCUMENT},
-in ordine approssimativamente cronologico:
-
-@itemize @value{BULLET}
-@item
-@cindex Aho, Alfred
-@cindex Weinberger, Peter
-@cindex Kernighan, Brian
-Il Dr.@: Alfred V.@: Aho,
-il Dr.@: Peter J.@: Weinberger, e
-il Dr.@: Brian W.@: Kernighan, tutti dei Bell Laboratories,
-hanno progettato e implementato @command{awk} per Unix,
-da cui @command{gawk} trae la maggioranza delle sue funzionalit@`a.
-
-@item
-@cindex Rubin, Paul
-Paul Rubin,
-autore del progetto e dell'implementazione iniziale del 1986, ha
-scritto la prima bozza (di circa 40 pagine) di questo @value{DOCUMENT}.
-
-@item
-@cindex Fenlason, Jay
-Jay Fenlason
-ha completato l'implementazione iniziale.
-
-@item
-@cindex Close, Diane
-Diane Close
-ha rivisto la prima bozza di questo @value{DOCUMENT}, portandolo alla
-lunghezza di circa 90 pagine.
-
-@item
-@cindex Stallman, Richard
-Richard Stallman
-ha aiutato a completare l'implementazione e la bozza iniziale di questo
-@value{DOCUMENT}.
-@`E anche il fondatore della FSF e del progetto GNU.
-
-@item
-@cindex Woods, John
-John Woods
-ha scritto porzioni di codice (volti principalmente alla correzione di
-errori) nella versione iniziale di @command{gawk}.
-
-@item
-@cindex Trueman, David
-Nel 1988,
-David Trueman
-si @`e fatto carico della manutenzione principale di @command{gawk},
-rendendolo compatibile col ``nuovo'' @command{awk} e
-migliorandone parecchio la velocit@`a di esecuzione.
-
-@item
-@cindex Kwok, Conrad
-@cindex Garfinkle, Scott
-@cindex Williams, Kent
-Conrad Kwok,
-Scott Garfinkle
-e
-Kent Williams
-hanno per primi portato il programma all'ambiente MS-DOS, usando varie
-versioni del compilatore MSC.
-
-@item
-@cindex Rankin, Pat
-Pat Rankin
-ha portato il programma all'ambiente VMS, preparando anche la relativa
-documentazione.
-
-@item
-@cindex Peterson, Hal
-Hal Peterson
-@`e stato di aiuto nel portare @command{gawk} nei sistemy Cray.
-(L'ambiente Cray non @`e pi@`u supportato.)
-
-@item
-@cindex Rommel, Kai Uwe
-Kai Uwe Rommel
-ha portato per primo il programma all'ambiente OS/2, preparando anche
-la relativa documentazione.
-
-@item
-@cindex Jaegermann, Michal
-Michal Jaegermann
-ha portato il programma all'ambiente Atari, preparando anche la relativa
-documentazione.
-(L'ambiente Atari non @`e pi@`u supportato.)
-Michal continua a effettuare controlli di portabilit@`a,
-e ha molto contribuito a consentire a @command{gawk}
-di funzionare su sistemi diversi da quelli a 32 bit.
-
-@item
-@cindex Fish, Fred
-Fred Fish
-ha portato il programma all'ambiente Amiga, preparando anche la relativa
-documentazione.
-(Purtroppo Fred non @`e pi@`u tra noi, e questo ambiente non @`e pi@`u supportato.)
-
-@item
-@cindex Deifik, Scott
-Scott Deifik
-si @`e occupato della manutenzione per MS-DOS usando il compilatore DJGPP.
-
-@item
-@cindex Zaretskii, Eli
-Eli Zaretskii
-si occupa della manutenzione della versione per MS-Windows, nell'ambiente
-MinGW.
-
-@item
-@cindex Grigera, Juan
-Juan Grigera
-@`e autore di una versione di @command{gawk} per sistemi Windows32.
-(Questa versione non @`e pi@`u supportata.)
-
-@item
-@cindex Hankerson, Darrel
-Per molti anni, il
-Dr.@: Darrel Hankerson
-ha fatto da coordinatore per le varie versioni che giravano su diverse
-piattaforme PC e ha creato distribuzioni binarie per vari sistemi operativi
-che girano sui PC.
-Il suo aiuto @`e stato importante per mantenere aggiornata la documentazione
-per le diverse piattaforme PC.
-
-@item
-@cindex Zoulas, Christos
-Christos Zoulas
-ha scritto la funzione predefinita @code{extension()} per aggiungere
-dinamicamente nuove funzioni.
-(Questa funzionalit@`a @`e divenuta obsoleta a partire da @command{gawk} 4.1.)
-
-@item
-@cindex Kahrs, J@"urgen
-J@"urgen Kahrs
-ha scritto la prima versione del codice per interagire con la rete
-TCP/IP, con la relativa documentazione, e fornito le ragioni per l'aggiunta
-dell'operatore @samp{|&}.
-
-@item
-@cindex Davies, Stephen
-Stephen Davies
-ha portato per la prima volta il programma all'ambiente Tandem, preparando
-anche la relativa documentazione.
-(Tuttavia, questa versione non @`e pi@`u supportata.)
-Stephen @`e anche stato determinante nel lavoro iniziale per integrare il codice
-interno di gestione dei byte nel
-complesso del codice di @command{gawk}.
-
-@item
-@cindex Woehlke, Matthew
-Matthew Woehlke
-ha migliorato l'aderenza allo standard POSIX nei sistemi Tandem che
-implementano lo standard.
-
-@item
-@cindex Brown, Martin
-Martin Brown
-ha portato il programma all'ambiente BeOS, preparando anche la relativa
-documentazione.
-(L'ambiente BeOS non @`e pi@`u supportato.)
-
-@item
-@cindex Peters, Arno
-Arno Peters
-ha fatto il lavoro iniziale necessario per consentire alla configurazione
-di @command{gawk} di usare GNU Automake e GNU @command{gettext}.
-
-@item
-@cindex Broder, Alan J.@:
-Alan J.@: Broder
-ha scritto la prima versione della funzione @code{asort()} e anche
-il codice per gestire il terzo argomento opzionale della funzione
-@code{match()}.
-
-@item
-@cindex Buening, Andreas
-Andreas Buening
-ha aggiornato la versione di @command{gawk} per OS/2.
-
-@item
-@cindex Hasegawa, Isamu
-Isamu Hasegawa,
-dell'IBM in Giappone, ha contribuito con il supporto per i caratteri multibyte.
-
-@item
-@cindex Benzinger, Michael
-Michael Benzinger ha sviluppato il codice iniziale per l'istruzione
-@code{switch}.
-
-@item
-@cindex McPhee, Patrick
-Patrick T.J.@: McPhee ha sviluppato il codice per il caricamento
-dinamico negli ambienti Windows32.
-(Questa funzionalit@`a non @`e pi@`u supportata.)
-
-@item
-@cindex Wallin, Anders
-Anders Wallin ha aiutato a continuare il supporto della versione VMS
-di @command{gawk} per parecchi anni.
-
-@item
-@cindex Gordon, Assaf
-Assaf Gordon ha scritto il codice per implementare
-l'opzione @option{--sandbox}.
-
-@item
-@cindex Haque, John
-John Haque @`e autore dei seguenti contributi:
-
-@itemize @value{MINUS}
-@item
-Le modifiche per convertire @command{gawk}
-in un interprete di codice a livello di byte, compreso il debugger
-
-@item
-L'aggiunta di veri vettori di vettori
-
-@item
-Le modifiche ulteriori per il supporto del calcolo a precisione
-arbitraria
-
-@item
-Il testo iniziale di
-@ref{Calcolo con precisione arbitraria}
-
-@item
-Il lavoro per unificare le tre varianti del programma @command{gawk},
-in vista della versione 4.1
-
-@item
-I miglioramenti alla gestione interna dei vettori per i vettori i cui
-indici sono dei numeri interi
-
-@item
-A John, insieme a Pat Rankin, si devono i miglioramenti alla funzionalit@`a
-di ordinamento dei vettori.
-@end itemize
-
-@cindex Papadopoulos, Panos
-@item
-Panos Papadopoulos ha scritto il testo originale per
-@ref{Includere file}.
-
-@item
-@cindex Yawitz, Efraim
-Efraim Yawitz ha scritto il testo originale per il @ref{Debugger}.
-
-@item
-@cindex Schorr, Andrew
-Lo sviluppo dell'estensione API rilasciata per la prima volta con
-@command{gawk} 4.1 @`e stata principalmente guidata da
-Arnold Robbins e Andrew Schorr, con notevoli contributi dal
-resto del team di sviluppo.
-
-@cindex Malmberg, John E.
-@item
-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.
-
-@item
-@cindex Robbins, Arnold
-Arnold Robbins
-ha lavorato su @command{gawk} dal 1988, dapprima
-aiutando David Trueman e in seguito, dal 1994 circa, come
-manutentore principale.
-@end itemize
-
-@node Sommario della storia
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-Il linguaggio @command{awk} si @`e evoluto col passare degli anni. La prima
-versione risale a Unix V7, circa 1978. Nel 1987, per la versione Unix
-System V Release 3.1, sono state fatte al linguaggio delle modifiche
-importanti, inclusa la possibilit@`a di avere funzioni definite dall'utente.
-Ulteriori modifiche sono state fatte per la versione System V Release 4, nel
-1989.
-Dopo di allora, sono state apportate ulteriori modifiche minori,
-per implementare lo standard POSIX.
-
-@item
-L'@command{awk} di Brian Kernighan prevede un piccolo numero di estensioni
-implementate di comune accordo con altre versioni di @command{awk}.
-
-@item
-@command{gawk} prevede un elevato numero di estensioni rispetto
-a POSIX @command{awk}.
-Queste estensioni possono essere disabilitate specificando l'opzione
-@option{--traditional} o @option{--posix}.
-
-@item
-L'interazione tra localizzazioni POSIX e individuazione di @dfn{regexp}
-in @command{gawk} @`e stata causa di malintesi nel corso degli anni. Oggi
-@command{gawk} implementa l'Interpretazione Razionale degli Intervalli
-(@dfn{Rational Range Interpretation}), dove
-intervalli nella forma @samp{[a-z]} individuano @emph{solo} i caratteri
-numericamente compresi tra
-@samp{a} e @samp{z} nella rappresentazione nativa dei caratteri in quella
-particolare macchina. Normalmente quella in uso @`e quella ASCII,
-ma pu@`o essere EBCDIC sui sistemi IBM S/390.
-
-@item
-Molte persone hanno contribuito allo sviluppo di @command{gawk} nel corso
-degli anni. Spero che l'elenco fornito in questo @value{CHAPTER} sia
-esauriente e attribuisca il giusto riconoscimento quando questo @`e dovuto.
-
-@end itemize
-
-@node Installazione
-@appendix Installare @command{gawk}
-
-@c last two commas are part of see also
-@cindex sistemi operativi, si veda anche GNU/Linux@comma{} sistemi operativi per PC@comma{} Unix
-@cindex @command{gawk}, installare
-@cindex installare @command{gawk}
-Quest'appendice contiene istruzioni per installare @command{gawk} sulle
-varie piattaforme supportate dagli sviluppatori. Lo sviluppatore
-principale supporta GNU/Linux (e Unix), mentre le altre piattaforme sono
-sono curate da altri sviluppatori.
-@xref{Bug}
-per gli indirizzi di posta elettronica di chi effettua la manutenzione
-della versione specifica di una particolare piattaforma.
-
-@menu
-* Distribuzione di Gawk:: Contenuto della distribuzione di @command{gawk}.
-* Installazione Unix:: Installare @command{gawk} su varie versioni
- di Unix.
-* Installazione non-Unix:: Installazioni su altri Sistemi Operativi.
-* Bug:: Notificare problemi e bug.
-* Altre versioni:: Altre implementazioni di @command{awk}
- liberamente disponibili.
-* Sommario dell'installazione:: Sommario dell'installazione.
-@end menu
-
-@node Distribuzione di Gawk
-@appendixsec La distribuzione di @command{gawk}
-@cindex codice sorgente di @command{gawk}
-@cindex sorgente, codice, @command{gawk}
-
-Questa @value{SECTION} spiega come ottenere la distribuzione
-di @command{gawk}, come scompattarla, e cosa @`e contenuto nei vari file
-e nelle sottodirectory risultanti.
-
-@menu
-* Scaricare:: Come ottenere la distribuzione.
-* Scompattazione:: Come estrarre la distribuzione.
-* Contenuti della distribuzione:: Cosa c'@`e nella distribuzione.
-@end menu
-
-@node Scaricare
-@appendixsubsec Ottenere la distribuzione di @command{gawk}
-@cindex @command{gawk}, codice sorgente@comma{} ottenere il
-@cindex codice sorgente di @command{gawk}, ottenere il
-Ci sono due modi per ottenere del software GNU:
-
-@itemize @value{BULLET}
-@item
-Copiarlo da qualcuno che ce l'abbia gi@`a.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@item
-Ottenere @command{gawk}
-dal sito Internet
-@code{ftp.gnu.org}, nella directory @file{/gnu/gawk}.
-@`E possibile accedere al sito sia via @command{ftp} anonimo che via @code{http}.
-Se si dispone del programma @command{wget}, si pu@`o utilizzarlo digitando un
-comando simile a questo:
-
-@example
-wget http://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-@end example
-@end itemize
-
-L'archivio che contiene il software GNU @`e disponibile in vari cloni
-(@dfn{mirror}) in tutto il mondo.
-La lista aggiornata dei siti clone @`e disponibile nel
-@uref{http://www.gnu.org/order/ftp.html, sito web principale della FSF}.
-Si tenti di usare uno dei siti-clone; dovrebbero essere meno trafficati, ed @`e
-possibile che ce ne sia uno pi@`u vicino.
-
-Si pu@`o anche scaricare la distribuzione del sorgente di @command{gawk}
-dal deposito Git ufficiale; per maggiori informazioni, si veda
-@ref{Accedere ai sorgenti}.
-
-@node Scompattazione
-@appendixsubsec Scompattare la distribuzione
-@command{gawk} @`e distribuito sotto forma di parecchi file @code{tar}
-compressi con differenti programmi di compressione: @command{gzip},
-@command{bzip2}
-e @command{xz}. Per amor di semplicit@`a, il resto di queste istruzioni
-presuppone che si stia usando quella compressa col programma GNU Gzip
-(@command{gzip}).
-
-Una volta che si ha a disposizione la distribuzione (p.es.,
-@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}),
-va usato @code{gzip} per scompattare il file e quindi @code{tar} per estrarne i
-file. Si pu@`o usare la seguente @dfn{pipe} per produrre la distribuzione
-@command{gawk}:
-
-@example
-gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf -
-@end example
-
-In un sistema che abbia la versione GNU di @command{tar}, si
-pu@`o far effettuare la scompattazione direttamente a @command{tar}:
-
-@example
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-@end example
-
-@noindent
-L'estrazione dei file dall'archivio
-crea una directory di nome @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}
-nella directory corrente.
-
-Il @value{FN} della distribuzione @`e nella forma
-@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}.
-La @var{V} rappresenta la versione maggiore di @command{gawk},
-la @var{R} rappresenta il rilascio corrente della versione @var{V}, e
-la @var{P} rappresenta un @dfn{patch level}, che sta a indicare che
-correzioni a errori minori sono state incluse nel rilascio.
-Il @dfn{patch level} corrente @`e @value{PATCHLEVEL}, ma quando ci si procura
-una distribuzione, andr@`a ottenuta quella con il livello pi@`u alto di
-versione, rilascio e @dfn{patch}.
-(Si noti, comunque, che livelli di @dfn{patch} maggiori o uguali a 70
-denotano versioni ``beta'', ossia versioni non destinate a essere usate
-in produzione; non si dovrebbero utilizzare tali versioni, se non si @`e
-disposti a sperimentare.)
-Se non si sta usando un sistema Unix o GNU/Linux, i modi per ottenere
-e scompattare la distribuzione di @command{gawk} sono differenti.
-Si dovrebbe sentire un esperto di quel sistema.
-
-@node Contenuti della distribuzione
-@appendixsubsec Contenuti della distribuzione @command{gawk}
-@cindex @command{gawk}, distribuzione di
-@cindex distribuzione di @command{gawk}
-
-La distribuzione di @command{gawk} contiene un certo numero di file
-sorgente in C, di file di documentazione, di sottodirectory, e di file
-utilizzati durante il processo di configurazione
-(@pxref{Installazione Unix}),
-come pure parecchie sottodirectory relative a diversi sistemi operativi
-non-Unix:
-
-@table @asis
-@item Vari file @samp{.c}, @samp{.y} e @samp{.h}
-Questi file contengono il codice sorgente vero e proprio di @command{gawk}.
-@end table
-
-@table @file
-@item support/*
-Intestazioni C e file sorgente per routine che @command{gawk}
-usa, ma che non sono parte della sua funzionalit@`a
-fondamentale. Per esempio, analisi di argomenti, controlli
-di corrispondenze di espressioni regolari, e routine per
-generare numeri casuali sono tutti mantenuti qui.
-
-@item ABOUT-NLS
-Un file contenente informazioni sul comando GNU @command{gettext} e
-sulle traduzioni.
-
-@item AUTHORS
-Un file con alcune informazioni su chi ha scritto @command{gawk}.
-Esiste solo per placare i pedanti della Free Software Foundation.
-
-@item README
-@itemx README_d/README.*
-File descrittivi: vari @file{README} ("leggimi") per @command{gawk} sotto Unix e per
-tutte le varie altre combinazioni hardware e software.
-
-@item INSTALL
-Un file che fornisce una panoramica sul processo di configurazione e installazione.
-
-@item ChangeLog
-Una lista dettagliata delle modifiche apportate al codice sorgente,
-ai problemi risolti e ai miglioramenti introdotti.
-
-@item ChangeLog.0
-Una lista meno recente di modifiche al codice sorgente.
-
-@item NEWS
-Una lista di modifiche a @command{gawk} a partire dall'ultimo rilascio
-o @dfn{patch}.
-
-@item NEWS.0
-Una lista meno recente di modifiche a @command{gawk}.
-
-@item COPYING
-La @dfn{GNU General Public License}.
-
-@item POSIX.STD
-Una descrizione di comportamenti nello standard POSIX per @command{awk} che
-sono lasciati indefiniti, o ai quali @command{gawk} non pu@`o conformarsi
-pienamente, come pure una lista di specifiche che lo standard POSIX dovrebbe
-contenere, ma che non sono presenti.
-
-@cindex intelligenza artificiale, @command{gawk} e
-@cindex @command{gawk} e l'intelligenza artificiale
-@item doc/awkforai.txt
-Puntatori alla bozza originale di un breve articolo
-che spiega perch@'e @command{gawk} @`e un linguaggio adatto alla
-programmazione nel campo dell'intelligenza artificiale (AI).
-
-@item doc/bc_notes
-Una breve descrizione della struttura interna a livello di byte di
-@command{gawk} [``byte code''].
-
-@item doc/README.card
-@itemx doc/ad.block
-@itemx doc/awkcard.in
-@itemx doc/cardfonts
-@itemx doc/colors
-@itemx doc/macros
-@itemx doc/no.colors
-@itemx doc/setter.outline
-Il sorgente @command{troff} per una scheda di riferimento a cinque colori
-di @command{awk}.
-Per ottenere la versione a colori @`e richiesta una versione recente di
-@command{troff}, come la versione GNU di @command{troff} (@command{groff}).
-Si veda il file @file{README.card} per istruzioni su come comportarsi se @`e
-disponibile solo una versione pi@`u vecchia di @command{troff}.
-
-@item doc/gawk.1
-Il sorgente @command{troff} di una pagina di manuale [@dfn{man}]
-che descrive @command{gawk}.
-Questa pagina @`e distribuita a beneficio degli utenti Unix.
-
-@cindex Texinfo
-@item doc/gawktexi.in
-@itemx doc/sidebar.awk
-Il file sorgente Texinfo di questo @value{DOCUMENT}.
-Dovrebbe venire elaborato da @file{doc/sidebar.awk}
-prima di essere elaborato con @command{texi2dvi} o @command{texi2pdf}
-per produrre un documento stampato, o
-con @command{makeinfo} per produrre un file Info o HTML.
-Il @file{Makefile} si occupa di questa elaborazione e produce
-la versione stampabile tramite i comandi
-@command{texi2dvi} o @command{texi2pdf}.
-
-@item doc/gawk.texi
-Il file prodotto elaborando @file{gawktexi.in}
-tramite @file{sidebar.awk}.
-
-@item doc/gawk.info
-Il file Info generato per questo @value{DOCUMENT}.
-
-@item doc/gawkinet.texi
-Il file sorgente Texinfo per
-@ifinfo
-@inforef{Top, , Introduzione generale, gawkinet, @value{GAWKINETTITLE}}.
-@end ifinfo
-@ifnotinfo
-@cite{@value{GAWKINETTITLE}}.
-@end ifnotinfo
-Dovrebbe venire elaborato con @TeX{}
-(tramite @command{texi2dvi} o @command{texi2pdf})
-per produrre un documento stampato o
-con @command{makeinfo} per produrre un file Info o HTML.
-
-@item doc/gawkinet.info
-Il file Info generato per
-@cite{@value{GAWKINETTITLE}}.
-
-@item doc/igawk.1
-Il sorgente @command{troff} per una pagina di manuale relativa al
-programma @command{igawk} descritto
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Programma igawk}.
-(Poich@'e @command{gawk} prevede ora internamente l'uso della direttiva
-@code{@@include},
-n@'e @command{igawk} n@'e @file{igawk.1} sono effettivamente installati.)
-
-@item doc/Makefile.in
-Il file in input usato durante la procedura di configurazione per
-generare l'effettivo @file{Makefile} da usare per creare la documentazione.
-
-@item Makefile.am
-@itemx */Makefile.am
-File usati dal software GNU Automake per generare
-il file @file{Makefile.in} usato da Autoconf e dallo script
-@command{configure}.
-
-@item Makefile.in
-@itemx aclocal.m4
-@itemx bisonfix.awk
-@itemx config.guess
-@itemx configh.in
-@itemx configure.ac
-@itemx configure
-@itemx custom.h
-@itemx depcomp
-@itemx install-sh
-@itemx missing_d/*
-@itemx mkinstalldirs
-@itemx m4/*
-Questi file e sottodirectory sono usati per configurare e compilare
-@command{gawk} per vari sistemi Unix. L'uso di molti tra questi file @`e spiegato
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Installazione Unix}. I rimanenti hanno una funzione di supporto
-per l'infrastruttura.
-
-@item po/*
-La directory @file{po} contiene la traduzione in varie lingue
-dei messaggi emessi da @command{gawk}.
-
-@item awklib/extract.awk
-@itemx awklib/Makefile.am
-@itemx awklib/Makefile.in
-@itemx awklib/eg/*
-La directory @file{awklib} contiene una copia di @file{extract.awk}
-(@pxref{Programma extract}),
-che pu@`o essere usato per estrarre i programmi di esempio dal file sorgente
-Texinfo di questo @value{DOCUMENT}. Contiene anche un file
-@file{Makefile.in}, che
-@command{configure} usa per generare un @file{Makefile}.
-@file{Makefile.am} @`e usato da GNU Automake per creare @file{Makefile.in}.
-Le funzioni di libreria descritte
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria},
-sono incluse come file pronti per l'uso nella distribuzione @command{gawk}.
-Essi sono installati come parte della procedura di installazione.
-I rimanenti programmi contenuti in questo @value{DOCUMENT} sono disponibili
-nelle appropriate sottodirectory di @file{awklib/eg}.
-
-@item extension/*
-Il codice sorgente, le pagine di manuale, e i file di infrastruttura per
-gli esempi di estensione incluse con @command{gawk}.
-@xref{Estensioni dinamiche}, per ulteriori dettagli.
-
-@item extras/*
-Ulteriori file, non-essenziali. Al momento, questa directory contiene
-alcuni file da eseguire al momento di iniziare una sessione,
-da installare nella directory @file{/etc/profile.d}
-per essere di aiuto nella gestione delle variabili di ambiente
-@env{AWKPATH} e @env{AWKLIBPATH}.
-@xref{File da usare a inizio sessione}, per ulteriori informazioni.
-
-@item posix/*
-File necessari per compilare @command{gawk} su sistemi conformi allo
-standard POSIX.
-
-@item pc/*
-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).
-
-@item test/*
-Una serie di test per
-@command{gawk}. Si pu@`o usare @samp{make check} dalla directory principale
-di @command{gawk} per provare se la serie di test funziona con la
-versione in uso di @command{gawk}.
-Se @command{gawk} supera senza errori @samp{make check}, si pu@`o essere
-sicuri che sia stato installato e configurato correttamente su un dato
-sistema.
-@end table
-
-@node Installazione Unix
-@appendixsec Compilare e installare @command{gawk} su sistemi di tipo Unix
-
-Normalmente, si pu@`o compilare e installare @command{gawk} immettendo
-solo un paio di comandi. Comunque, se si ci si trova in un sistema
-insolito, pu@`o essere necessario
-dover configurare @command{gawk} per quel dato sistema.
-
-@menu
-* Installazione veloce:: Compilare @command{gawk} sotto Unix.
-* File da usare a inizio sessione:: Funzioni di personalizzazione della
- shell.
-* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase di
- compilazione.
-* Filosofia della configurazione:: Come si suppone che tutto funzioni.
-@end menu
-
-@node Installazione veloce
-@appendixsubsec Compilare @command{gawk} per sistemi di tipo Unix
-
-Questi normali passi di installazione dovrebbero essere sufficienti in
-tutti i moderni sistemi in commercio derivati da Unix, ossia
-GNU/Linux, sistemi basati su BSD, e l'ambiente Cygwin sotto MS-Windows.
-
-Dopo aver estratto la distribuzione di @command{gawk}, posizionarsi con
-@command{cd} nella directory
-@file{gawk-@value{VERSION}.@value{PATCHLEVEL}}. Come per la maggior parte dei
-programmi GNU, occorre configurare @command{gawk} per il sistema in uso,
-eseguendo il programma @command{configure}. Questo programma @`e
-uno script della shell Bourne, che @`e stato generato automaticamente
-usando il comando GNU Autoconf.
-@ifnotinfo
-(Il software Autoconf @`e
-descritto in dettaglio in
-@cite{Autoconf---Generating Automatic Configuration Scripts},
-che pu@`o essere trovato in rete sul sito
-@uref{http://www.gnu.org/software/autoconf/manual/index.html,
-della Free Software Foundation}.)
-@end ifnotinfo
-@ifinfo
-(Il software Autoconf @`e descritto in dettaglio a partire da
-@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.)
-@end ifinfo
-
-Per configurare @command{gawk} basta eseguire @command{configure}:
-
-@example
-sh ./configure
-@end example
-
-Questo produce i file @file{Makefile} e @file{config.h} adatti al sistema
-in uso.
-Il file @file{config.h} descrive varie situazioni relative al sistema in uso.
-@`E possibile modificare il @file{Makefile} per
-cambiare la variabile @code{CFLAGS}, che controlla
-le opzioni di riga di comando da passare al compilatore C (come i livelli
-di ottimizzazione o la richiesta di generare informazioni per il @dfn{debug}).
-
-In alternativa, si possono specificare dei valori a piacere per
-molte delle variabili di @command{make} sulla riga di comando,
-come @code{CC} e @code{CFLAGS}, quando
- si chiama il programma
-@command{configure}:
-
-@example
-CC=cc CFLAGS=-g sh ./configure
-@end example
-
-@noindent
-Si veda il file @file{INSTALL} nella distribuzione di @command{gawk} per
-tutti i dettagli.
-
-Dopo aver eseguito @command{configure} ed eventualmente modificato
-@file{Makefile},
-va dato il comando:
-
-@example
-make
-@end example
-
-@noindent
-Poco dopo, si dovrebbe avere a disposizione una versione eseguibile
-di @command{gawk}.
-Questo @`e tutto!
-Per verificare se @command{gawk} funziona correttamente,
-va dato il comando @samp{make check}. Tutti i test dovrebbero terminare con
-successo.
-Se questi passi non producono il risultato desiderato, o se qualche
-test fallisce, controllare i file nella directory @file{README_d}
-per determinare se quello che @`e capitato @`e un problema noto.
-Se il problema capitato non @`e descritto l@`{@dotless{i}},
-inviare una segnalazione di @dfn{bug} (@pxref{Bug}).
-
-Naturalmente, dopo aver compilato @command{gawk}, verosimilmente
-andr@`a installato. Per fare ci@`o, occorre eseguire il comando
-@samp{make install}, disponendo delle autorizzazioni necessarie.
-Come acquisirle varia da sistema a sistema, ma su molti sistemi si pu@`o
-usare il comando @command{sudo} per ottenerle. Il comando da immettere
-diventa in questo caso @samp{sudo make install}. @`E probabile che sia
-necessario fornire una password, ed essere stati messi nella lista degli
-utenti che possono utilizzare il comando @command{sudo}.
-
-@node File da usare a inizio sessione
-@appendixsubsec File di inizializzazione della shell
-
-La distribuzione contiene i file da usare a inizio sessione
-@file{gawk.sh} e
-@file{gawk.csh}, che contengono funzioni che possono essere di aiuto
-nel gestire le variabili di ambiente
-@env{AWKPATH} e @env{AWKLIBPATH}.
-Su un sistema Fedora GNU/Linux, questi file dovrebbero essere installati
-nella directory @file{/etc/profile.d};
-su altre piattaforme, la posizione corretta pu@`o essere differente.
-
-@table @command
-
-@cindex @command{gawkpath_default}, funzione della shell
-@cindex funzione della shell @command{gawkpath_default}
-@item gawkpath_default
-Ripristina la variabile d'ambiente @env{AWKPATH} al suo valore di default.
-
-@cindex @command{gawkpath_prepend}, funzione della shell
-@cindex funzione della shell @command{gawkpath_prepend}
-@item gawkpath_prepend
-Aggiunge l'argomento all'inizio della variabile d'ambiente @env{AWKPATH}.
-
-@cindex @command{gawkpath_append}, funzione della shell
-@cindex funzione della shell @command{gawkpath_append}
-@item gawkpath_append
-Aggiunge l'argomento alla fine della variabile d'ambiente @env{AWKPATH}.
-
-@cindex @command{gawklibpath_default}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_default}
-@item gawklibpath_default
-Reimposta la variabile d'ambiente @env{AWKLIBPATH} al suo valore di default.
-
-@cindex @command{gawklibpath_prepend}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_prepend}
-@item gawklibpath_prepend
-Aggiunge l'argomento all'inizio della variabile d'ambiente
-@env{AWKLIBPATH}.
-
-@cindex @command{gawklibpath_append}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_append}
-@item gawklibpath_append
-Aggiunge l'argomento alla fine della variabile d'ambiente
-@env{AWKLIBPATH}.
-
-@end table
-
-
-@node Ulteriori opzioni di configurazione
-@appendixsubsec Ulteriori opzioni di configurazione
-@cindex @command{gawk}, configurazione, opzioni di
-@cindex configurazione di @command{gawk}, opzioni di
-
-Ci sono parecchie altre opzioni che si possono utilizzare sulla riga
-di comando di @command{configure}
-quando si compila @command{gawk} a partire dai sorgenti, tra cui:
-
-@table @code
-
-@cindex @option{--disable-extensions}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-extensions}
-@item --disable-extensions
-Richiede di non configurare e generare le estensioni di esempio nella
-directory @file{extension}. Questo @`e utile quando si genera
-@command{gawk} per essere eseguito su un'altra piattaforma.
-L'azione di default @`e di controllare dinamicamente se le estensioni
-possono essere configurate e compilate.
-
-@cindex @option{--disable-lint}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-lint}
-@item --disable-lint
-Disabilita i controlli @dfn{lint} all'interno di @command{gawk}. Le opzioni
-@option{--lint} e @option{--lint-old}
-(@pxref{Opzioni})
-sono accettate, ma non fanno nulla, e non emettono alcun messaggio di
-avvertimento.
-Analogamente, se si imposta la variabile @code{LINT}
-(@pxref{Variabili modificabili dall'utente})
-questa non ha alcun effetto sul programma @command{awk} in esecuzione.
-
-Se si specifica l'opzione del compilatore GNU Compiler Collection (GCC) che
-elimina il codice non eseguito, quest'opzione riduce di quasi
-23K byte la dimensione del programma eseguibile @command{gawk}
-su sistemi GNU/Linux x86_64. I risultati su altri sistemi e con
-altri compilatori sono probabilmente diversi.
-L'uso di questa opzione pu@`o apportare qualche piccolo miglioramento nei
-tempi di esecuzione di un programma.
-
-@quotation ATTENZIONE
-Se si usa quest'opzione alcuni dei test di funzionalit@`a non avranno successo.
-Quest'opzione potr@`a essere rimossa in futuro.
-@end quotation
-
-@cindex @option{--disable-nls}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-nls}
-@item --disable-nls
-Non attiva la traduzione automatica dei messaggi.
-Ci@`o normalmente non @`e consigliabile, ma pu@`o apportare qualche lieve
-miglioramento nei tempi di esecuzione di un programma.
-
-@cindex @option{--with-whiny-user-strftime}, opzione di configurazione
-@cindex opzione di configurazione @code{--with-whiny-user-strftime}
-@item --with-whiny-user-strftime
-Forza l'uso della versione della funzione C @code{strftime()} inclusa nella
-distribuzione di @command{gawk}, per i sistemi in cui la funzione stessa
-non sia disponibile.
-@end table
-
-Si usi il comando @samp{./configure --help} per ottenere la lista completa
-delle opzioni disponibili in @command{configure}.
-
-@node Filosofia della configurazione
-@appendixsubsec Il processo di configurazione
-
-@cindex @command{gawk}, configurazione di
-@cindex configurazione di @command{gawk}
-Questa @value{SECTION} interessa solo a chi abbia un minimo di familiarit@`a con
-il linguaggio C e con i sistemi operativi di tipo Unix.
-
-Il codice sorgente di @command{gawk}, in generale, cerca di aderire, nei limiti
-del possibile, a degli standard formali. Ci@`o significa che @command{gawk} usa
-routine di libreria che sono specificate nello standard ISO C e nello standard
-POSIX per le interfacce dei sistemi operativi. Il codice sorgente di
-@command{gawk} richiede l'uso di un compilatore ISO C (standard 1990).
-
-Molti sistemi Unix non aderiscono completamente n@'e allo standard ISO n@'e a
-quello POSIX. La sottodirectory @file{missing_d} nella distribuzione di
-@command{gawk} contiene delle versioni sostitutive per quelle funzioni che pi@`u
-frequentemente risultano essere non disponibili.
-
-Il file @file{config.h} creato da @command{configure} contiene definizioni che
-elencano funzionalit@`a del particolare sistema operativo nel quale si tenta di
-compilare @command{gawk}. Le tre cose descritte da questo file sono: quali
-file di intestazione sono disponibili, in modo da poterli includere correttamente,
-quali funzioni (presumibilmente) standard sono realmente disponibili nelle
-librerie C, e varie informazioni assortite riguardo al sistema operativo
-corrente. Per esempio, pu@`o non esserci l'elemento @code{st_blksize} nella
-struttura @code{stat}. In questo caso, @samp{HAVE_STRUCT_STAT_ST_BLKSIZE} @`e
-indefinito.
-
-@cindex @code{custom.h}, file
-@`E possible che il compilatore C del sistema in uso "tragga in inganno"
-@command{configure}. Pu@`o succedere nel caso in cui non viene restituito
-un errore se una funzione di libreria non @`e disponibile. Per superare questo
-problema, si pu@`o modificare il file @file{custom.h}. Basta usare una direttiva
-@samp{#ifdef} appropriata per il sistema corrente, e definire, tramite
-@code{#define}, tutte le costanti che @command{configure} avrebbe dovuto
-definire, ma non @`e riuscito a farlo, oppure, usando @code{#undef} annullare le
-costanti che @command{configure} ha definito, ma non avrebbe dovuto farlo. Il
-file @file{custom.h} @`e automaticamente incluso dal file @file{config.h}.
-
-@`E anche possibile che il programma @command{configure} generato da Autoconf non
-funzioni in un dato sistema per una ragione differente. Se c'@`e un problema, si
-tenga presente che il file @file{configure.ac} @`e quello preso in input da
-Autoconf. @`E possibile modificare questo file e generare una nuova versione di
-@command{configure} che funzioni sul sistema corrente (@pxref{Bug} per
-informazioni su come segnalare problemi nella configurazione di
-@command{gawk}). Lo stesso meccanismo si pu@`o usare per inviare aggiornamenti
-al file @file{configure.ac} e/o a @file{custom.h}.
-
-@node Installazione non-Unix
-@appendixsec Installazione su altri Sistemi Operativi
-
-Questa @value{SECTION} descrive come installare @command{gawk} su
-vari sistemi non-Unix.
-
-@menu
-* Installazione su PC:: Installare e compilare @command{gawk}
- su Microsoft Windows.
-* Installazione su VMS:: Installare @command{gawk} su VMS.
-@end menu
-
-@node Installazione su PC
-@appendixsubsec Installazione su MS-Windows
-
-@cindex PC, @command{gawk} su sistemi operativi
-@cindex sistemi operativi per PC, @command{gawk} su
-@cindex installare @command{gawk} su sistemi operativi per PC
-Questa @value{SECTION} tratta dell'installazione e uso di @command{gawk}
-su macchine con architettura Intel che eseguono qualsiasi versione di
-MS-Windows.
-In questa @value{SECTION}, il termine ``Windows32''
-si riferisce a una qualsiasi versione di Microsoft Windows
-95/98/ME/NT/2000/XP/Vista/7/8/10.
-
-Si veda anche il file @file{README_d/README.pc} nella distribuzione.
-
-@menu
-* Installazione binaria su PC:: Installare una distribuzione pronta
- all'uso.
-* Compilazione su PC:: Compilare @command{gawk} per Windows32.
-* Uso su PC:: Eseguire @command{gawk} su Windows32.
-* Cygwin:: Compilare ed eseguire @command{gawk}
- per Cygwin.
-* MSYS:: Usare @command{gawk} nell'ambiente MSYS.
-@end menu
-
-@node Installazione binaria su PC
-@appendixsubsubsec Installare una distribuzione predisposta per sistemi MS-Windows
-
-La sola distribuzione binaria predisposta supportata per i sistem MS-Windows
-@`e quella messa a disposizione da Eli Zaretskii
-@uref{https://sourceforge.net/projects/ezwinports/, progetto ``ezwinports''}.
-Si parta da l@`{@dotless{i}} per installare il comando @command{gawk} precompilato.
-
-@node Compilazione su PC
-@appendixsubsubsec Compilare @command{gawk} per sistemi operativi di PC
-
-@command{gawk} pu@`o essere compilato per Windows32, usando MinGW
-(per Windows32).
-Il file @file{README_d/README.pc} nella distribuzione @command{gawk}
-contiene ulteriori annotazioni, e il file @file{pc/Makefile} contiene
-informazioni importanti sulle opzioni di compilazione.
-
-@cindex compilare @command{gawk} per MS-Windows
-Per compilare @command{gawk} per Windows32, occorre copiare i file
-dalla directory @file{pc} (@emph{tranne} il file @file{ChangeLog}) alla
-directory che contiene il resto dei sorgenti di @command{gawk}, e quindi
-chiamare @command{make}, specificando il nome appropriato di obiettivo come
-argomento, per generare @command{gawk}. Il @file{Makefile} copiato dalla
-directory @file{pc} contiene una sezione di configurazione con commenti, e pu@`o
-essere necessario modificarlo perch@'e funzioni con il programma di utilit@`a
-@command{make} corrente.
-
-Il @file{Makefile} contiene un certo numero di alternative, che permettono di
-generare @command{gawk} per diverse
-versioni MS-DOS e Windows32. Se il comando @command{make} @`e richiamato senza
-specificare alcun argomento viene stampata una lista delle alternative
-disponibili. Per esempio,
-per generare un codice binario di @command{gawk} nativo per MS-Windows
-usando gli strumenti MinGW, scrivere @samp{make mingw32}.
-
-@node Uso su PC
-@appendixsubsubsec Usare @command{gawk} su sistemi operativi PC
-@cindex PC, @command{gawk} su sistemi operativi
-@cindex sistemi operativi PC, @command{gawk} su
-
-Sotto MS-Windows, gli ambienti Cygwin e MinGW consentono di usare
-sia l'operatore @samp{|&} che le operazioni su rete TCP/IP
-(@pxref{Reti TCP/IP}).
-
-@cindex percorso di ricerca
-@cindex percorso di ricerca per file sorgente
-@cindex @command{gawk}, versione MS-Windows di
-@cindex @code{;} (punto e virgola), @env{AWKPATH} variabile e
-@cindex punto e virgola (@code{;}), @env{AWKPATH} variabile e
-@cindex @env{AWKPATH}, variabile d'ambiente
-@cindex variabile d'ambiente @env{AWKPATH}
-Le versioni MS-Windows di @command{gawk} ricercano i file di
-programma come descritto in @ref{AWKPATH (Variabile)}. Comunque, gli elementi
-della variabile @env{AWKPATH} sono separati tra di loro da un punto e virgola
-(anzich@'e da due punti (@code{:})).
-Se @env{AWKPATH} @`e non impostata o ha per valore la stringa nulla, il percorso
-di ricerca di default @`e @samp{@w{.;c:/lib/awk;c:/gnu/lib/awk}}.
-
-@cindex estensioni comuni, variabile @code{BINMODE}
-@c @cindex extensions, common@comma{} @code{BINMODE} variable
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
-@cindex @code{BINMODE}, variabile
-@cindex variabile @code{BINMODE}
-Sotto MS-Windows,
-@command{gawk} (come molti altri programmi di trattamento testi) converte
-automaticamente la stringa di fine riga @samp{\r\n} in @samp{\n} leggendo dall'input
-e @samp{\n} in @samp{\r\n} scrivendo sull'output.
-La variabile speciale @code{BINMODE} @value{COMMONEXT} permette di controllare
-come avvengono queste conversioni, ed @`e interpretata come segue:
-
-@itemize @value{BULLET}
-@item
-Se @code{BINMODE} @`e @code{"r"} o uno,
-la modalit@`a binaria @`e impostata
-in lettura (cio@`e, nessuna conversione in lettura).
-
-@item
-Se @code{BINMODE} @`e @code{"w"} o due,
-la modalit@`a binaria @`e impostata
-in scrittura (cio@`e, nessuna conversione in scrittura).
-
-@item
-Se @code{BINMODE} @`e @code{"rw"} o @code{"wr"} o tre,
-la modalit@`a binaria @`e impostata sia in lettura che in scrittura.
-
-@item
-@code{BINMODE=@var{stringa-non-nulla}} equivale a specificare
-@samp{BINMODE=3} (cio@`e, nessuna conversione in
-lettura e scrittura). Tuttavia, @command{gawk} emette un messaggio di
-avviso se la stringa non @`e @code{"rw"} o @code{"wr"}.
-@end itemize
-
-@noindent
-La modalit@`a di trattamento dello standard input e standard output sono
-impostate una volta sola
-(dopo aver letto la riga di comando, ma prima di iniziare a elaborare
-qualsiasi programma @command{awk}).
-L'impostazione di @code{BINMODE} per standard input o
-standard output va fatta usando
-un'appropriata opzione @samp{-v BINMODE=@var{N}} sulla riga di comando.
-@code{BINMODE} @`e impostato nel momento in cui un file o @dfn{pipe} @`e aperto
-e non pu@`o essere cambiato in corso di elaborazione.
-
-Il nome @code{BINMODE} @`e stato scelto in analogia con @command{mawk}
-(@pxref{Altre versioni}).
-@command{mawk} e @command{gawk} gestiscono @code{BINMODE} in maniera simile;
-tuttavia, @command{mawk} prevede un'opzione @samp{-W BINMODE=@var{N}} e una
-variabile d'ambiente che pu@`o impostare @code{BINMODE}, @code{RS}, e @code{ORS}.
-I file @file{binmode[1-3].awk} (nella directory @file{gnu/lib/awk} in alcune
-delle distribuzioni binarie gi@`a predisposte) sono stati inclusi per rendere
-disponibile l'opzione di @command{mawk} @samp{-W BINMODE=@var{N}}. Questi
-possono essere modificati o ignorati; in particolare, quale sia l'impostazione
-di @code{RS} che d@`a meno ``sorprese'' rimane una questione aperta.
-@command{mawk} usa @samp{RS = "\r\n"} se si imposta la modalit@`a binaria in
-lettura, il che @`e appropriato per file che abbiano i caratteri di fine riga in
-stile MS-DOS.
-
-Per chiarire, gli esempi seguenti impostano la modalit@`a binaria in
-scrittura per lo standard output e altri file, e impostano @code{ORS} in modo
-da ottenere la fine riga ``normale'' in stile MS-DOS:
-
-@example
-gawk -v BINMODE=2 -v ORS="\r\n" @dots{}
-@end example
-
-@noindent
-o:
-
-@example
-gawk -v BINMODE=w -f binmode2.awk @dots{}
-@end example
-
-@noindent
-Questi comandi danno lo stesso risultato dell'opzione
-@samp{-W BINMODE=2} in @command{mawk}.
-Quanto segue modifica il separatore di record a @code{"\r\n"} e imposta
-la modalit@`a binaria in lettura, senza modificare le letture da standard input:
-
-@example
-gawk -v RS="\r\n" -e "BEGIN @{ BINMODE = 1 @}" @dots{}
-@end example
-
-@noindent
-o:
-
-@example
-gawk -f binmode1.awk @dots{}
-@end example
-
-@noindent
-Usando i caratteri di protezione appropriati, nel primo
-esempio l'impostazione di @code{RS} pu@`o essere spostata in una regola
-@code{BEGIN}.
-
-@node Cygwin
-@appendixsubsubsec Usare @command{gawk} in ambiente Cygwin
-@cindex compilare @command{gawk} per Cygwin
-@cindex Cygwin, compilare @command{gawk} per
-
-@command{gawk} pu@`o essere compilato e usato ``cos@`{@dotless{i}} com'@`e'' sotto MS-Windows se
-si opera all'interno dell'ambiente @uref{http://www.cygwin.com, Cygwin}.
-Questo ambiente consente un'eccellente simulazione di GNU/Linux, con l'uso di
-Bash, GCC, GNU Make, e altri programmi GNU. La compilazione e l'installazione
-per Cygwin @`e la stessa usata nei sistemi di tipo Unix:
-
-@example
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-cd gawk-@value{VERSION}.@value{PATCHLEVEL}
-./configure
-make && make check
-@end example
-
-In confronto a un sistema GNU/Linux sulla stessa macchina, l'esecuzione
-del passo di @samp{configure} sotto Cygwin richiede molto pi@`u tempo. Tuttavia
-si conclude regolarmente, e poi @samp{make} funziona come ci si aspetta.
-
-@node MSYS
-@appendixsubsubsec Usare @command{gawk} in ambiente MSYS
-
-Nell'ambiente MSYS sotto MS-Windows, @command{gawk} automaticamente usa la
-modalit@`a binaria per leggere e scrivere file. Non @`e quindi necessario usare la
-variabile @code{BINMODE}.
-
-Questo pu@`o causare problemi con altri componenti di tipo Unix che sono stati
-resi disponibile in MS-Windows, che si aspettano che @command{gawk} faccia
-automaticamente la conversione di @code{"\r\n"}, mentre cos@`{@dotless{i}} non @`e.
-
-@node Installazione su VMS
-@appendixsubsec Compilare e installare @command{gawk} su Vax/VMS e 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}, versione VMS di
-@cindex installare @command{gawk} su VMS
-@cindex VMS, installare @command{gawk} su
-Questa @value{SUBSECTION} descrive come compilare e installare @command{gawk}
-sotto VMS. Il termine classico ``VMS'' @`e usato qui anche 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.
-* Vecchio Gawk su VMS:: Una versione non aggiornata arriva
- con alcune versioni di VMS.
-@end menu
-
-@node Compilazione su VMS
-@appendixsubsubsec Compilare @command{gawk} su VMS
-@cindex compilare @command{gawk} per VMS
-@cindex VMS, compilare @command{gawk} per
-
-Per compilare @command{gawk} sotto VMS, 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}. A partire della directory che contiene i file sorgente, si usi:
-
-@example
-$ @kbd{@@[.vms]vmsbuild.com}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
-@end example
-
-Il comando @command{MMK} @`e un quasi-clone, a codice aperto e gratuito, di
-@command{MMS}, che gestisce in maniera migliore i volumi ODS-5 con @value{FNS}
-a caratteri maiuscoli e minuscoli. @command{MMK} @`e disponibile da
-@uref{https://github.com/endlesssoftware/mmk}.
-
-Avendo a che fare con volumi ODS-5 e con l'analisi sintattica estesa abilitata,
-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 sotto VAX/VMS 7.3 e Alpha/VMS 7.3-1 usando il
-compilatore Compaq C V6.4, e sotto Alpha/VMS 7.3, Alpha/VMS 7.3-2, e IA64/VMS
-8.3. Le compilazioni pi@`u recenti hanno usato il compilatore HP C V7.3 su Alpha
-VMS 8.3 e su VMS 8.4, sia Alpha che IA64, hanno usato il compilatore HP C
-7.3.@footnote{L'architettura IA64 @`e anche nota come ``Itanium''.}
-
-@xref{GNV su VMS} 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
-
-Le estensioni che sono state rese disponibile su VMS possono essere
-costruite dando uno dei comandi seguenti:
-
-@example
-$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms extensions}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms extensions}
-@end example
-
-@command{gawk} usa @code{AWKLIBPATH} come una variabile d'ambiente
-oppure come un nome logico per trovare le estensioni dinamiche.
-
-Le estensioni dinamiche devono essere compilate con le stesse opzioni del
-compilatore usate per compilare @command{gawk} riguardanti numeri in virgola
-mobile, dimensione dei puntatori e trattamento dei nomi simbolici. I computer
-con architettura Alpha e Itanium dovrebbero usare i numeri in virgola mobile
-col formato IEEE. La dimensione dei puntatori @`e 32 bit, e il trattamento dei nomi
-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
-/name=(as_is,short)
-/float=ieee/ieee_mode=denorm_results
-@end example
-
-Per VAX:
-
-@example
-/name=(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:
-
-@example
-#if (__CRTL_VER >= 70200000) && !defined (__VAX)
-#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.
-
-@node Dettagli installazione su VMS
-@appendixsubsubsec Installare @command{gawk} su VMS
-
-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.
-Per esempio:
-
-@example
-$ @kbd{GAWK :== $disk1:[gnubin]gawk}
-@end example
-
-@noindent
-Si sostituisca la posizione corrente di @command{gawk.exe} a
-@samp{$disk1:[gnubin]}. Il simbolo dovrebbe essere posto nel file
-@file{login.com} di ogni utente che desideri eseguire @command{gawk},
-in modo che sia definito ogni volta che l'utente inizia una sessione.
-Alternativamente, il simbolo pu@`o essere messo nella procedura di sistema
-@file{sylogin.com},
-in modo da permettere a tutti gli utenti di eseguire @command{gawk}.
-
-Se @command{gawk} @`e stato installato da un kit PCSI nell'albero di
-directory @file{GNV$GNU:}, il programma avr@`a come nome
-@file{GNV$GNU:[bin]gnv$gawk.exe}, e il file di aiuto sar@`a chiamato
-@file{GNV$GNU:[vms_help]gawk.hlp}.
-
-Il kit PCSI installa anche un file @file{GNV$GNU:[vms_bin]gawk_verb.cld}
-che pu@`o essere usato per aggiungere @command{gawk} e @command{awk}
-alla lista dei comandi DCL.
-
-Per farlo solo nella sessione corrente si pu@`o usare:
-
-@example
-$ @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
-aggiungere @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:
-
-@example
-$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
-@end example
-
-@noindent
-(Una libreria specifica dell'installazione potrebbe venir usata invece
-della libreria standard VMS library @samp{HELPLIB}.) Dopo aver installato
-il testo di aiuto, il comando:
-
-@example
-$ @kbd{HELP GAWK}
-@end example
-
-@noindent
-fornisce informazioni sia sull'implementazione di @command{gawk}
-sia sul linguaggio di programmazione @command{awk}.
-
-Il nome logico @samp{AWK_LIBRARY} pu@`o designare una posizione di default per i
-file di programma @command{awk}. Riguardo all'opzione @option{-f}, se il
-@value{FN} specificato non contiene un dispositivo o un percorso di directory,
-@command{gawk} cerca dapprima nella directory corrente, poi nella directory
-specificata dalla traduzione di @samp{AWK_LIBRARY} se il file non @`e stato
-trovato. Se, dopo aver cercato in entrambe queste directory, il file non @`e
-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
-
-L'elaborazione della riga di comando e le convenzioni per proteggere i
-caratteri sono significativamente differenti in VMS, 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.
-
-Ecco un paio di semplici test:
-
-@example
-$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"}
-$ @kbd{gawk -"W" version}
-! ma anche -"W version" o "-W version"
-@end example
-
-@noindent
-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,
-e l'opzione @option{--} pu@`o essere omessa.
-
-@cindex exit, codice di ritorno, in VMS
-Il valore di @code{exit} @`e un valore in stile Unix e viene trasformato in
-una condizione VMS 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
-@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
-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:
-
-@example
-unix_status = (vms_status .and. %x7f8) / 8
-@end example
-
-@noindent
-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 in virgola mobile, VAX/VMS
-@cindex VAX/VMS, 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.
-
-@c @cindex directory search
-@c @cindex path, search
-@cindex percorso di ricerca
-@cindex percorso di ricerca per file sorgente
-Il percorso di ricerca di default, nella ricerca dei file di programma per
-@command{awk} specificati dall'opzione @option{-f}, @`e
-@code{"SYS$DISK:[],AWK_LIBRARY:"}. Il nome logico @env{AWKPATH} pu@`o essere
-usato per sostituire questo di default. Il formato di @env{AWKPATH} @`e una lista
-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
-
-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
-esegua un file di comandi, prima di invocare @command{gawk}.
-(Questa restrizione potrebbe essere rimossa in una futura versione di
-@command{gawk} per VMS.)
-
-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
-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}.
-
-@example
-$ sort = "@@device:[dir]vms_gawk_sort.com"
-@end example
-
-Il file di comandi deve avere il formato dell'esempio seguente.
-
-La prima riga serve a evitare che i dati in input siano presenti anche
-nell'output. Dev'essere nel formato mostrato nell'esempio.
-
-La riga seguente crea un comando esterno che prevale sul comando esterno
-superiore, che serve a prevenire una ricorsione infinita di file di comandi.
-
-Il penultimo comando ridirige @code{sys$input} su @code{sys$command},
-per poter ottenere i dati che sono ridiretti verso il comando.
-
-L'ultima riga esegue il comando vero e proprio. Dev'essere l'ultimo
-comando, perch@'e i dati ridiretti da @command{gawk} saranno letti
-quando il file di comandi finisce di essere eseguito.
-
-@example
-$!'f$verify(0,0)'
-$ sort := sort
-$ define/user sys$input sys$command:
-$ sort sys$input: sys$output:
-@end example
-
-
-@node GNV su VMS
-@appendixsubsubsec Il progetto VMS GNV
-
-Il pacchetto VMS 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
-di offrire pacchetti PCSI separati per ogni componente.
-Si veda @w{@uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.}
-
-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.
-
-@ignore
-@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
-@c and building gawk for it has not been tested in many years, but these
-@c old instructions might still work if anyone is still using it.
-
-@node VMS POSIX
-@appendixsubsubsec Compilare e usare @command{gawk} su VMS POSIX
-
-Le istruzioni appena viste vanno ignorate, sebbene @file{vms/gawk.hlp}
-dovrebbe ancora essere reso disponibile in una libreria di aiuto.
-L'albero del codice sorgente dovrebbe essere scompattato in un sottosistema
-contenitore di file, e non nel normale @dfn{filesystem} VMS.
-Occorre accertarsi che i due script, @file{configure} e
-@file{vms/posix-cc.sh}, siano eseguibile; si usi @samp{chmod +x} per farlo,
-se necessario. Poi vanno eseguiti i seguenti due comandi:
-
-@example
-psx> @kbd{CC=vms/posix-cc.sh configure}
-psx> @kbd{make CC=c89 gawk}
-@end example
-
-@noindent
-Il primo comando costruisce i file @file{config.h} e @file{Makefile},
-a partire da dei modelli, usando uno script per fare s@`{@dotless{i}} che il
-compilatore C soddisfi le aspettative di @command{configure}. Il secondo
-comando compila e collega @command{gawk} chiamando direttamente il
-compilatore C; gli eventuali messaggi di @command{make} che dicono di non
-riuscire a ridefinire @code{CC} vanno ignorati. @command{configure}
-impiega molto tempo a completarsi, ma in compenso continua a fornire
-messaggi che permettono di seguirne l'avanzamento.
-
-Questo @`e stato testato con VAX/VMS V6.2, VMS POSIX V2.0, e DEC C V5.2.
-
-Una volta installato, @command{gawk} funziona come ogni altro programma
-di utilit@`a della shell. A differenza della normale versione VMS di
-@command{gawk}, neesuna manipolazione speciale della riga di comando @`e
-necessaria nell'ambiente VMS POSIX.
-@end ignore
-
-@node Vecchio Gawk su VMS
-@appendixsubsubsec Vecchia versione di @command{gawk} su sistemi VMS
-
-
-@c Thanks to "gerard labadie" <gerard.labadie@gmail.com>
-
-Alcune versioni di VMS includono una vecchia versione di @command{gawk}.
-Per utilizzarla, occorre definire un simbolo, come segue:
-
-@example
-$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe}
-@end example
-
-La versione appare essere la @value{PVERSION} 2.15.6, che @`e molto vecchia.
-Si raccomanda di compilare e usare la versione corrente.
-
-@node Bug
-@appendixsec Segnalazione di problemi e bug
-@cindex archeologi
-@quotation
-@i{Non c'@`e niente di pi@`u pericoloso di un archeologo annoiato.}
-@author Douglas Adams, @cite{Guida galattica per autostoppisti}
-@end quotation
-@c the radio show, not the book. :-)
-
-@cindex debug, @command{gawk}, segnalare bug
-@cindex risoluzione problemi @command{gawk}, segnalare bug
-Se si incontrano problemi con @command{gawk} o se si ritiene di aver trovato un
-bug, si raccomanda di segnalarlo agli sviluppatori;
-non c'@`e un impegno preciso a intervenire, ma c'@`e una buona possibilit@`a che ci
-si sforzi di risolverlo.
-
-@menu
-* Indirizzo Bug:: Dove inviare le segnalazioni.
-* Usenet:: Dove non inviare le segnalazioni.
-* Manutentori:: Manutentori di version non-*nix.
-@end menu
-
-@node Indirizzo Bug
-@appendixsubsec Segnalare Bug
-
-Prima di segnalare un bug, occorre assicurarsi che sia davvero un bug. La
-documentazione va riletta attentamente, per controllare se dice che @`e possibile
-fare quel che si sta tentando di fare. Se non @`e chiaro se sia possibile
-fare quella particolare cosa o no, occorre segnalarlo; in questo caso si tratta
-di un bug nella documentazione!
-
-Prima di segnalare un bug o di tentare di risolverlo personalmente, si tenti
-di isolarlo preparando un programma @command{awk} il pi@`u piccolo possibile, con
-un @value{DF} in input che possa riprodurre il problema. Dopo averlo fatto, si
-spedisca il programma e il @value{DF}, insieme a informazioni sul tipo di
-sistema Unix in uso, il compilatore usato per compilare @command{gawk}, e i
-risultati esatti che @command{gawk} ha prodotto. Inoltre andrebbe specificato
-cosa ci si aspettava che il programma facesse; questo @`e di aiuto per decidere
-se il problema @`e un problema di documentazione.
-
-@`E importante includere il numero di versione di @command{gawk} in uso.
-Questa informazione si pu@`o ottenere con il comando @samp{gawk --version}.
-
-@cindex @code{bug-gawk@@gnu.org} indirizzo per la segnalazione dei bug
-@cindex email, indirizzo per segnalare bug, @code{bug-gawk@@gnu.org}
-@cindex indirizzo email per segnalare bug, @code{bug-gawk@@gnu.org}
-@cindex bug, segnalare, indirizzo email, @code{bug-gawk@@gnu.org}
-@cindex segnalare bug, indirizzo email, @code{bug-gawk@@gnu.org}
-Una volta pronta la descrizione precisa del problema, si spedisca un messaggio
-di posta elettronica a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-I manutentori di @command{gawk} sono i destinatari, e riceveranno la
-segnalazione di errore. Sebbene sia possibile spedire messaggi direttamente ai
-manutentori, @`e preferibile usare l'indirizzo sopra fornito perch@'e quella
-mailing list rimane in archivio presso il Progetto GNU. @emph{Tutti i messaggi
-devono essere in inglese. @`E questo il solo linguaggio che tutti i manutentori
-conoscono.} Inoltre, occorre accertarsi di spedire tutti i messaggi in formato
-@emph{testo}, e non (o non soltanto) in formato HTML.
-
-@quotation NOTA
-Molte distribuzioni di GNU/Linux e i vari sistemi operativi basati su
-BSD hanno un loro proprio canale per segnalare i bug. Se si segnala un
-bug usando il canale della distribuzione, una copia del messaggio andrebbe
-inviata anche a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-Questo per due ragioni. La prima @`e che, sebbene alcune distribuzioni inoltrino
-i messaggi sui problemi ``verso l'alto'' alla mailing list GNU, molte non lo
-fanno, e quindi c'@`e una buona probabilit@`a che i manutentori di @command{gawk}
-non vedano affatto il messaggio relativo al bug! La seconda ragione @`e che la
-posta diretta alla mailing list GNU @`e archiviata, e il poter disporre di ogni
-cosa all'interno del progetto GNU consente di avere a disposizione tutte le
-informazioni rilevanti senza dover dipendere da altre organizzazioni.
-@end quotation
-
-Suggerimenti non correlati a bug sono pure sempre benvenuti. Se si hanno
-domande riguardo a qualcosa di non chiaro nella documentazione o a proposito
-di funzionalit@`a oscure, si scriva alla mailing list dei bug; si prover@`a
-a essere di aiuto nei limiti del possibile.
-
-@node Usenet
-@appendixsubsec Non segnalare bug a USENET!
-
-@quotation
-@c Date: Sun, 17 May 2015 19:50:14 -0400
-@c From: Chet Ramey <chet.ramey@case.edu>
-@c Reply-To: chet.ramey@case.edu
-@c Organization: ITS, Case Western Reserve University
-@c To: Aharon Robbins <arnold@skeeve.com>
-@c CC: chet.ramey@case.edu
-Ho iniziato a ignorare Usenet un paio di anni fa, e non me ne sono mai
-pentito. @`E come quando si parla di sport alla radio---ci si sente
-pi@`u intelligenti per aver lasciato perdere.
-@author Chet Ramey
-@end quotation
-
-@cindex @code{comp.lang.awk} gruppo di discussione
-@cindex newsgroup @code{comp.lang.awk}
-@cindex gruppo di discussione @code{comp.lang.awk}
-Siete pregati di @emph{non} provare a notificare bug di @command{gawk}
-scrivendo al gruppo di discussione Usenet/Internet @code{comp.lang.awk}.
-Sebbene alcuni degli sviluppatori di @command{gawk} leggano talora i
-messaggi di questo gruppo di discussione, il manutentore principale di
-@command{gawk} non lo fa pi@`u. Quindi @`e praticamente certo che un
-messaggio inviato l@`a @emph{non} sia da lui letto.
-La procedura qui descritta @`e la sola maniera ufficialmente riconosciuta
-per notificare problemi. Davvero!
-
-@ignore
-And another one:
-
-Date: Thu, 11 Jun 2015 09:00:56 -0400
-From: Chet Ramey <chet.ramey@case.edu>
-
-My memory was imperfect. Back in June 2009, I wrote:
-
-"That's the nice thing about open source, right? You can take your ball
-and run to another section of the playground. Then, if you like mixing
-metaphors, you can throw rocks from there."
-@end ignore
-
-@node Manutentori
-@appendixsubsec Notificare problemi per versioni non-Unix
-
-Se si riscontrano bug in una delle versioni non-Unix di @command{gawk}, una
-copia del messaggio inviato alla mailing list dei bug andrebbe spedita alla
-persona che si occupa di quella versione. I manutentori sono elencati nella
-lista seguente, come pure nel file @file{README} nella distribuzione
-@command{gawk}. Le informazioni nel file @file{README} dovrebbero essere
-considerate come le pi@`u aggiornate, se risultano in conflitto con questo
-@value{DOCUMENT}.
-
-Le persone che si occupano delle varie versioni di @command{gawk} sono:
-
-@c put the index entries outside the table, for docbook
-@cindex Buening, Andreas
-@cindex Deifik, Scott
-@cindex Malmberg, John E.
-@cindex Pitts, Dave
-@cindex G., Daniel Richard
-@cindex Robbins, Arnold
-@cindex Zaretskii, Eli
-@ifset SMALLPRINT
-@multitable {MS-Windows} {123456789012345678901234567890123456789001234567890}
-@end ifset
-@ifclear SMALLPRINT
-@multitable {MS-Windows con MinGW} {123456789012345678901234567890123456789001234567890}
-@end ifclear
-@item Unix e sistemi POSIX @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}
-
-@c @item MS-DOS con DJGPP @tab Scott Deifik, @EMAIL{scottd.mail@@sbcglobal.net,scottd dot mail at sbcglobal dot net}
-
-@item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}
-
-@c Leave this in the document on purpose.
-@c OS/2 is not mentioned anywhere else though.
-@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}
-
-@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net}
-
-@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG}
-@item @tab Dave Pitts (Maintainer Emeritus), @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}
-@end multitable
-
-Se il problema riscontrato @`e riproducibile anche sotto Unix,
-si dovrebbe spedire una copia del messaggio anche alla mailing list
-@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-La versione generata usando gli strumenti DJGPP non @`e pi@`u supportata;
-il codice relativo rester@`a nella distribuzione ancora per qualche tempo,
-nel caso che qualche volontario desideri prenderla in carico.
-Se questo non dovesse succedere, la parte di codice relativa questa
-versione sar@`a rimossa dalla distribuzione.
-
-@node Altre versioni
-@appendixsec Altre implementazioni di @command{awk} liberamente disponibili
-@cindex @command{awk}, implementazioni di
-@cindex implementazioni di @command{awk}
-@ignore
-From: emory!amc.com!brennan (Michael Brennan)
-Subject: C++ comments in awk programs
-To: arnold@gnu.ai.mit.edu (Arnold Robbins)
-Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT)
-
-@end ignore
-@cindex Brennan, Michael
-@ifnotdocbook
-@quotation
-@i{@`E piuttosto divertente mettere commenti simili nel vostro codice awk:}@*
-@ @ @ @ @ @ @code{// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo}
-@author Michael Brennan
-@end quotation
-@end ifnotdocbook
-
-@docbook
-<blockquote><attribution>Michael Brennan</attribution>
-<literallayout><emphasis>
-@`E piuttosto divertente mettere commenti simili nel vostro codice awk.
-</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<literal>
-// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo
-</literal></literallayout>
-</blockquote>
-@end docbook
-
-Ci sono alcune altre implementazioni di @command{awk} disponibili
-gratuitamente.
-Questa @value{SECTION} descrive in breve dove @`e possibile trovarle:
-
-@table @asis
-@cindex Kernighan, Brian
-@cindex sorgente, codice, Brian Kernighan @command{awk}
-@cindex codice sorgente, Brian Kernighan @command{awk}
-@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
-@cindex Brian Kernighan, @command{awk} di, codice sorgente
-@item Unix @command{awk}
-Brian Kernighan, uno degli sviluppatori originali di Unix @command{awk},
-ha reso disponibile liberamente la sua implementazione di @command{awk}.
-Si pu@`o scaricare questa versione dalla
-@uref{http://www.cs.princeton.edu/~bwk, sua pagina principale}.
-@`E disponibile in parecchi formati compressi:
-
-@table @asis
-@item Archivio Shell
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.shar}
-
-@item File @command{tar} compresso
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.tar.gz}
-
-@item File Zip
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.zip}
-@end table
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-@`E anche disponbile in GitHub:
-
-@example
-git clone git://github.com/onetrueawk/awk bwkawk
-@end example
-
-@noindent
-Questo comando crea una copia del deposito @uref{http://git-scm.com, Git}
-in una directory chiamata @file{bwkawk}. Se si omette questo argomento della
-riga di comando @command{git}, la copia del deposito @`e creata nella
-directory di nome @file{awk}.
-
-Questa versione richiede un compilatore ISO C (standard 1990); il compilatore
-C contenuto in GCC (la collezione di compilatori GNU) @`e pi@`u che sufficiente.
-
-@xref{Estensioni comuni}
-per una lista di estensioni in questo @command{awk} che non sono in
-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}.
-
-@cindex Brennan, Michael
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@cindex codice sorgente, @command{mawk}
-@item @command{mawk}
-Michael Brennan ha scritto un'implementazione indipendente di @command{awk},
-di nome @command{mawk}. @`E disponibile sotto la licenza
-@ifclear FOR_PRINT
-GPL (@pxref{Copia}),
-@end ifclear
-@ifset FOR_PRINT
-GPL,
-@end ifset
-proprio come @command{gawk}.
-
-Il sito di distribuzione originale di @command{mawk} non contiene pi@`u
-il codice sorgente. Una copia @`e disponibile in
-@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}.
-
-Dal 2009 @`e Thomas Dickey a occuparsi della manutenzione di @command{mawk}.
-Le informazioni di base sono disponibili nella
-@uref{http://www.invisible-island.net/mawk, pagine web del progetto}.
-Il puntatore URL da cui scaricare @`e
-@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}.
-
-Una volta scaricato,
-per scompattare questo file pu@`o essere usato @command{gunzip}.
-L'installazione @`e simile a quella di @command{gawk}
-(@pxref{Installazione Unix}).
-
-@xref{Estensioni comuni}
-per una lista di estensioni in @command{mawk} che non sono in POSIX @command{awk}.
-
-@cindex Sumner, Andrew
-@cindex @command{awka}, compilatore per @command{awk}
-@cindex compilatore per @command{awk}, @command{awka}
-@cindex sorgente, codice, @command{awka}
-@cindex codice sorgente di @command{awka}
-@item @command{awka}
-Scritto da Andrew Sumner,
-@command{awka} traduce i programmi @command{awk} in C, li compila,
-e prepara il codice eseguibile usando una libreria di funzioni che
-implementano le funzionalit@`a di base di @command{awk}.
-Comprende anche un certo numero di estensioni.
-
-Il traduttore di @command{awk} @`e rilasciato sotto la licenza GPL, e la
-relativa libreria sotto la licenza LGPL.
-
-Per ottenere @command{awka}, si visiti
-il sito @url{http://sourceforge.net/projects/awka}.
-@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}.
-@c andrewsumner@@yahoo.net
-
-Il progetto sembra essere stato congelato; non ci sono state modifiche nel
-codice sorgente dal 2001 circa.
-
-@cindex Beebe, Nelson H.F.@:
-@cindex @command{pawk} (versione con profilatura di Brian Kernighan @command{awk})
-@cindex codice sorgente, @command{pawk}
-@cindex sorgente, codice, @command{pawk}
-@item @command{pawk}
-Nelson H.F.@: Beebe all'Universit@`a dello Utah ha modificato
-BWK @command{awk} per fornire informazioni di temporizzazione e profilatura.
-Questo @`e differente dall'usare @command{gawk} con l'opzione @option{--profile}
-(@pxref{Profilare})
-nel senso che fornisce un profilo basato sul consumo di CPU, non sul
-numero di esecuzioni di una data riga di codice.
-Sia pu@`o trovare sia in
-@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}
-che in
-@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}.
-
-@item BusyBox @command{awk}
-@cindex BusyBox Awk
-@cindex codice sorgente, BusyBox Awk
-@cindex sorgente, codice, BusyBox Awk
-BusyBox @`e un programma distribuito con licenza GPL che fornisce versioni
-ridotte di parecchie piccole applicazioni, all'interno di un singolo modulo
-eseguibile. @`E stato ideato per sistemi
-integrati.
-Include un'implementazione completa di POSIX @command{awk}. Quando lo si
-compila occorre prestare attenzione a non eseguire @samp{make install}, perch@'e
-in questo modo si andrebbero a sostituire copie di altre applicazioni nella
-directory @file{/usr/local/bin} del sistema corrente. Per ulteriori
-informazioni, si veda @uref{http://busybox.net, la pagina principale del progetto}.
-
-@cindex OpenSolaris
-@cindex Solaris, versione POSIX @command{awk}
-@cindex codice sorgente, Solaris @command{awk}
-@cindex sorgente, codice, Solaris @command{awk}
-@item POSIX @command{awk} per OpenSolaris
-Le versioni di @command{awk} in @file{/usr/xpg4/bin} e @file{/usr/xpg6/bin} su
-Solaris sono @dfn{grosso modo} conformi allo standard POSIX. Sono basate sul
-comando @command{awk} preparato per i PC dalla ditta Mortice Kern. @`E stato
-possibile compilare e far funzionare questo codice sotto GNU/Linux dopo 1--2
-ore di lavoro. Rendere questo codice pi@`u generalmente portabile (usando gli
-strumenti GNU Autoconf e/o Automake) richiederebbe ulteriore lavoro, che non @`e
-stato fin qui compiuto, almeno per quel che risulta a chi scrive.
-
-@cindex Illumos
-@cindex Illumos, @command{awk} conforme a POSIX e
-@cindex codice sorgente, Illumos @command{awk}
-@cindex sorgente, codice, Illumos @command{awk}
-Il codice sorgente era un tempo disponibile dal sito web OpenSolaris.
-Tuttavia, il progetto @`e terminato, e il sito web chiuso. Fortunatamente,
-il progetto
-@uref{http://wiki.illumos.org/display/illumos/illumos+Home, Illumos}
-mette a disposizione questa implementazione. Si possono vedere i singoli file in
-@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
-
-@cindex @command{jawk}
-@cindex Java, implementazione di @command{awk}
-@cindex implementazione Java di @command{awk}
-@cindex codice sorgente, @command{jawk}
-@cindex sorgente, codice, @command{jawk}
-@item @command{jawk}
-Questo @`e un interprete per @command{awk} scritto in Java. Dichiara di
-essere un interprete completo, anche se, poich@'e usa funzionalit@`a di Java
-per l'I/O e per la ricerca di @dfn{regexp}, il linguaggio che supporta
-@`e differente da @command{awk} POSIX.
-Ulteriori informazioni sono disponibili sulla
-@uref{http://jawk.sourceforge.net, pagina principale del progetto}.
-
-@item Libmawk
-@cindex @command{libmawk}
-@cindex codice sorgente, @command{libmawk}
-@cindex sorgente, codice, @command{libmawk}
-Questo @`e un interprete @command{awk} incorporabile, derivato da
-@command{mawk}. Per ulteriori informazioni, si veda
-@uref{http://repo.hu/projects/libmawk/}.
-
-@item @code{pawk}
-@cindex codice sorgente, @command{pawk} (versione Python)
-@cindex sorgente, codice, @command{pawk} (versione Python)
-@cindex @code{pawk}, implementazione simile ad @command{awk} per Python
-Questo @`e un modulo Python che intende introdurre funzionalit@`a di tipo
-@command{awk} in Python. Si veda @uref{https://github.com/alecthomas/pawk} per
-ulteriori informazioni. (Questo programma non @`e correlato con la versione
-modificata da Nelson Beebe di BWK @command{awk}, descritta prima.)
-
-@item @w{QSE @command{awk}}
-@cindex QSE @command{awk}
-@cindex codice sorgente, QSE @command{awk}
-@cindex sorgente, codice, QSE @command{awk}
-Questo @`e un interprete di @command{awk} incorporabile. Per ulteriori
-informazioni, si veda
-@uref{http://code.google.com/p/qse/} e @uref{http://awk.info/?tools/qse}.
-
-@item @command{QTawk}
-@cindex QuikTrim Awk
-@cindex codice sorgente, QuikTrim Awk
-@cindex sorgente, codice, QuikTrim Awk
-Questa @`e un'implementazione indipendente di @command{awk} distribuita con la
-licenza GPL. Ha un gran numero di estensioni rispetto ad @command{awk}
-standard, e pu@`o non essere sintatticamente compatibile al 100% con esso. Si
-veda @uref{http://www.quiktrim.org/QTawk.html} per ulteriori informazioni,
-compreso il manuale. Il puntatore per scaricare QuikTrim non punta all'ultima
-versione: si veda @uref{http://www.quiktrim.org/#AdditionalResources} per un
-puntatore alla versione corrente.
-
-Il progetto sembra essere fermo; non ci sono nuove versioni del codice
-a partire dal 2014 circa.
-
-@item Altre versioni
-Si veda anche [in inglese] la sezione ``Versions and implementations''
-della voce di
-@uref{http://en.wikipedia.org/wiki/Awk_language#Versions_and_implementations,
-Wikipedia} su @command{awk} per informazioni su ulteriori versioni.
-
-@end table
-
-@node Sommario dell'installazione
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-La distribuzione di @command{gawk} @`e disponibile dal sito principale
-di distribuzione del Progetto GNU
-@code{ftp.gnu.org}. La maniera canonica per scaricarlo e installarlo @`e:
-
-@example
-wget http://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-cd gawk-@value{VERSION}.@value{PATCHLEVEL}
-./configure && make && make check
-@end example
-
-@item
-@command{gawk} pu@`o essere installato anche su sistemi non-POSIX. I sistemi
-correntemente supportati sono MS-Windows, usando
-MSYS, MinGW, e Cygwin,
-e sia Vax/VMS che OpenVMS. Le istruzioni per ognuno di questi sistemi sono
-incluse in questa @value{APPENDIX}.
-
-@item
-Le segnalazioni di errori (bug) dovrebbero essere spedite tramite email a
-@email{bug-gawk@@gnu.org}. Le segnalazioni di errore dovrebbero essere scritte
-in inglese e dovrebbero specificare la versione di @command{gawk} in uso, come
-@`e stata compilata, un breve programma e un @value{DF} che permettono di
-riprodurre il problema.
-
-@item
-Ci sono alcune altre implementazioni di @command{awk} disponibili
-gratuitamente. Molte rispettano lo standard POSIX; altre un po' meno.
-
-@end itemize
-
-
-@ifclear FOR_PRINT
-@node Note
-@appendix Note di implementazione
-@cindex @command{gawk}, problemi di implementazione
-@cindex problemi di implementazione, @command{gawk}
-
-Quest'appendice contiene informazioni che interessano soprattutto le persone
-che aggiornano e mantengono @command{gawk}. L'intero contenuto si applica
-specificatamente a @command{gawk} e non ad altre implementazioni.
-
-@menu
-* Modalit@`a di compatibilit@`a:: Come inibire alcune estensioni di
- @command{gawk}.
-* Aggiunte:: Fare aggiunte a @command{gawk}.
-* Future estensioni:: Nuove funzionalit@`a che potranno
- essere implementate in futuro.
-* Limitazioni dell'implementazione:: Alcune limitazioni
- dell'implementazione.
-* Progetto delle estensioni:: Note di progetto sull'estensione API.
-* Meccanismo delle vecchie estensioni:: Alcune compatibilit@`a per le vecchie
- estensioni.
-* Sommario delle note:: Sommario delle note di
- implementazione.
-@end menu
-
-@node Modalit@`a di compatibilit@`a
-@appendixsec Compatibilit@`a all'indietro e debug
-@cindex @command{gawk}, problemi di implementazione, compatibilit@`a all'indietro
-@cindex @command{gawk}, problemi di implementazione, debug
-@cindex risoluzione di problemi, @command{gawk}
-@cindex problemi, risoluzione di, @command{gawk}
-@cindex problemi di implementazione@comma{} @command{gawk}, debug
-
-@xref{POSIX/GNU},
-per un compendio delle estensioni GNU per il linguaggio e il programma
-@command{awk}. Tutte queste funzionalit@`a possono essere inibite invocando
-@command{gawk} con l'opzione @option{--traditional} o con l'opzione
-@option{--posix}.
-
-Se @command{gawk} @`e stato compilato per il debug con @samp{-DDEBUG}, @`e
-possibile specificare un'ulteriore opzione sulla riga di comando:
-
-@table @code
-@item -Y
-@itemx --parsedebug
-Stampa l'informazione contenuta nella pila di analisi, durante la fase di
-analisi iniziale del programma.
-@end table
-
-Quest'opzione @`e utile solo a chi sviluppa @command{gawk} e non all'utente
-occasionale. @`E probabile che non sia neppure disponibile nella versione di
-@command{gawk} che si sta usando, perch@'e rallenta l'esecuzione del programma.
-
-@node Aggiunte
-@appendixsec Fare aggiunte a @command{gawk}
-
-Se si desidera migliorare @command{gawk} in maniera significativa, c'@`e la
-massima libert@`a di farlo. @`E questo lo scopo del software libero; il codice
-sorgente @`e disponibile, ed @`e possibile modificarlo a piacere
-(@pxref{Copia}).
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta di come @`e possibile modificare @command{gawk},
-ed espone alcune considerazioni che si dovrebbero tenere presenti.
-
-@menu
-* Accedere ai sorgenti:: Accedere al deposito dei sorgenti Git.
-* Aggiungere codice:: Aggiungere codice al programma
- principale @command{gawk}.
-* Nuovi sistemi:: Portare @command{gawk} su un nuovo sistema
- operativo.
-* File derivati:: Perch@'e i file derivati sono tenuti
- nel deposito @command{git}.
-@end menu
-
-@node Accedere ai sorgenti
-@appendixsubsec Accedere al deposito dei sorgenti Git di @command{gawk}
-
-Poich@'e @command{gawk} @`e Software Libero, il codice sorgente @`e sempre
-disponibile.
-@iftex
-La
-@end iftex
-@ref{Distribuzione di Gawk} descrive come scaricare e installare
-le versioni ufficiali rilasciate di @command{gawk}.
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-Peraltro, se si intende modificare @command{gawk} e mettere a disposizione le
-modifiche, @`e preferibile lavorare sulla versione in via di sviluppo. Per far
-ci@`o @`e necessario accedere al deposito del codice sorgente di @command{gawk}.
-Il codice @`e mantenuto usando il @uref{http://git-scm.com, sistema distribuito
-di controllo delle versioni Git}. Sar@`a necessario installarlo se non @`e gi@`a
-presente nel sistema. Quando @command{git} @`e disponibile, va usato il comando:
-
-@example
-git clone git://git.savannah.gnu.org/gawk.git
-@end example
-
-@noindent
-Questo comando scarica in locale una copia esatta del deposito dei
-sorgenti di @command{gawk}. Se si sta usando un @dfn{firewall}
-che non consente l'uso del protocollo nativo di Git, @`e possibile accedere
-ugualmente al deposito usando il comando:
-
-@example
-git clone http://git.savannah.gnu.org/r/gawk.git
-@end example
-
-Una volta modificato il sorgente, @`e posibile usare @samp{git diff} per
-produrre una @dfn{patch}, e spedirla al manutentore di @command{gawk}; si veda
-@ref{Bug}, per come farlo.
-
-In passato era disponibile un'interfaccia Git--CVS
-utilizzabile da persone che non avevano a disposizione Git. Purtroppo,
-quest'interfaccia non funziona pi@`u, ma si potrebbe avere maggior fortuna usando
-un sistema di controllo versioni pi@`u moderno, come Bazaar, che @`e dotato di
-un'estensione Git per lavorare con depositi di sorgenti Git.
-
-@node Aggiungere codice
-@appendixsubsec Aggiungere nuove funzionalit@`a
-
-@cindex @command{gawk}, aggiungere funzionalit@`a a
-@cindex funzionalit@`a, aggiungere a @command{gawk}
-@cindex aggiungere funzionalit@`a a @command{gawk}
-Ognuno @`e libero di aggiungere tutte le nuove funzionalit@`a che vuole a
-@command{gawk}. Comunque, se si desidera che tali modifiche siano incorporate
-nella distribuzione di @command{gawk}, ci sono parecchi passi da fare per
-rendere possibile la loro inclusione:
-
-@enumerate 1
-@item
-Prima di inserire la nuova funzionalit@`a all'interno di @command{gawk},
-prendere in considerazione la possibilit@`a di scriverla sotto forma di
-estensione (@pxref{Estensioni dinamiche}).
-Se ci@`o non @`e possibile, continuare con i passi rimanenti descritti in questa
-lista.
-
-@item
-Essere disposti a firmare un documento liberatorio appropriato.
-Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
-di pubblico dominio, tramite la firma di un documento apposito, oppure
-attribuendo il copyright delle modifiche all'FSF.
-Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
-l'hanno fatto. Se ci sono domande da fare, mettersi in contatto con me
-(@pxref{Bug}),
-oppure @EMAIL{assign@@gnu.org,assign chiocciola gnu punto org}.
-
-@item
-Utilizzare l'ultima versione.
-@`E molto pi@`u semplice per me integrare modifiche se sono basate sull'ultima
-versione disponibile di @command{gawk} o, meglio ancora, sull'ultimo codice
-sorgente presente nel deposito Git. Se la versione di @command{gawk} @`e molto
-vecchia, potrei non essere affatto in grado di integrare le modifiche.
-(@xref{Scaricare},
-per informazioni su come ottenere l'ultima versione di @command{gawk}.)
-
-@item
-@ifnotinfo
-Seguire gli @cite{Standard di codifica GNU}.
-@end ifnotinfo
-@ifinfo
-Si veda @inforef{Top, , Version, standards, Standard di Codifica GNU}.
-@end ifinfo
-Questo documento descrive come dovrebbe essere scritto il software GNU.
-Se non lo si @`e letto, @`e bene farlo, preferibilmente @emph{prima}
-di iniziare a modificare @command{gawk}.
-(Gli @cite{Standard di codifica GNU} sono disponibili nel sito web del
-@uref{http://www.gnu.org/prep/standards/, Progetto GNU}.
-Sono disponibili anche versioni in formato Texinfo, Info, e DVI.)
-
-@cindex @command{gawk}, stile di codifica in
-@item
-Usare lo stile di codifica @command{gawk}.
-Il codice sorgente in C di @command{gawk} segue le istruzioni dello
-@cite{Standard di codifica GNU}, con qualche piccola eccezione. Il codice @`e
-formattato usando lo stile tradizionale ``K&R'', in particolare per ci@`o che
-riguarda il posizionamento delle parentesi graffe e l'uso del carattere TAB.
-In breve, le regole di codifica per @command{gawk}
-sono le seguenti:
-
-@itemize @value{BULLET}
-@item
-Usare intestazioni di funzione (prototipi) in stile ANSI/ISO quando
-si definiscono delle funzioni.
-
-@item
-Mettere il nome della funzione all'inizio della riga in cui la si sta definendo.
-
-@item
-Usare @samp{#elif} invece di nidificare istruzioni @samp{#if} all'interno
-di un'istruzione @samp{#else}.
-
-@item
-Mettere il tipo di codice di ritorno della funzione, anche se @`e @code{int},
-sulla riga immediatamente sopra quella che contiene il nome e gli argomenti
-della funzione.
-
-@item
-Mettere degli spazi attorno alle parentesi usate nelle strutture di controllo
-(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch}
-e @code{return}).
-
-@item
-Non mettere spazi davanti alle parentesi usate nelle chiamate di funzione.
-
-@item
-Mettere spazi attorno a tutti gli operatori C e dopo le virgole,
-nelle chiamate di funzione.
-
-@item
-Non usare l'operatore @dfn{virgola} per produrre degli effetti collaterali
-multipli, tranne che nelle parti di inizializzazione e incremento dei cicli
-@code{for}, e nel corpo delle macro.
-
-@item
-Usare dei caratteri TAB per l'indentazione, e non dei semplici spazi.
-
-@item
-Usare lo stile ``K&R'' per formattare le parti di programma incluse fra
-parentesi graffe.
-
-@item
-Usare confronti con @code{NULL} e @code{'\0'} per le condizioni
-contenute nelle istruzioni @code{if}, @code{while} e @code{for}, e anche
-nelle varie clausole @code{case} delle istruzioni @code{switch}, invece
-del semplice puntatore o il semplice valore del carattere.
-
-@item
-Usare i valori @code{true} e @code{false} per le variabili @code{booleane},
-la costante simbolica @code{NULL} per i valori dei puntatori,
-e la costante carattere @code{'\0'} quando @`e il caso, invece dei valori @code{1}
-e @code{0}.
-
-@item
-Fornire un commento descrittivo di una riga per ogni funzione.
-
-@item
-Non usare la funzione @code{alloca()} per allocare memoria dalla @dfn{stack}.
-Il farlo genera dei problemi di portabilit@`a che non giustificano il vantaggio
-secondario di non doversi preoccupare di liberare la memoria. Usare invece
-@code{malloc()} e @code{free()}.
-
-@item
-Non usare confronti nella forma @samp{! strcmp(a, b)} o simili.
-Come disse una volta Henry Spencer, ``@code{strcmp()} non @`e una funzione
-booleana!'' Usare invece @samp{strcmp(a, b) == 0}.
-
-@item
-Per aggiungere nuovi valori a @dfn{flag} binari, usare costanti esadecimali
-esplicite (@code{0x001}, @code{0x002}, @code{0x004}, etc.) invece che
-spostare di un bit a sinistra in incrementi successivi
-(@samp{(1<<0)}, @samp{(1<<1)}, etc.).
-@end itemize
-
-@quotation NOTA
-Qualora fossi costretto a riformattare completamente il codice per
-farlo aderire allo stile di codifica usato in @command{gawk}, potrei anche
-decidere di ignorare del tutto le modifiche proposte.
-@end quotation
-
-@cindex Texinfo
-@item
-Aggiornare la documentazione.
-Insieme col nuovo codice, fornire nuove sezioni e/o capitoli per questo
-@value{DOCUMENT}. Per quanto possibile, usare il formato Texinfo, invece
-di fornire soltanto del testo ASCII non formattato (sebbene un semplice testo
-sia gi@`a meglio che nessuna documentazione). Le convenzioni da seguire in
-@cite{@value{TITLE}} sono elencate dopo la parole chiave @samp{@@bye} alla fine
-del file sorgente Texinfo. Se possibile, aggiornare anche la pagina di manuale
-in formato @command{man}.
-
-Si dovr@`a anche firmare un documento liberatorio relativo alle
-modifiche apportate alla documentazione.
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-@item
-Inviare le modifiche come file di differenze nel formato contestuale unificato.
-Usare @samp{diff -u -r -N} per confrontare i sorgenti originali dell'albero
-di sorgenti @command{gawk} con la versione proposta.
-Si raccomanda di usare la versione GNU di @command{diff} o, ancora meglio,
-@samp{git diff} o @samp{git format-patch}.
-Per inviare le modifiche proposte spedire l'output prodotto da @command{diff}.
-(@xref{Bug}, per l'indirizzo di posta elettronica.)
-
-L'uso di questo formato rende semplice per me l'applicazione delle modifiche
-alla versione principale del sorgente di @command{gawk} (usando il programma di
-utilit@`a @code{patch}). Se invece tocca a me applicare le modifiche a mano,
-con un editor di testo, potrei decidere di non farlo, specialmente
-se le modifiche sono molte.
-
-@item
-Includere una descrizione da aggiungere al file @file{ChangeLog} riguardo alla
-modifica da voi proposta. Questo serve a minimizzare l'attivit@`a a me
-richiesta, rendendo pi@`u facile per me l'accettazione delle modifiche, che
-diventa pi@`u semplice se si include anche questa parte nel file di differenze
-(nel formato @dfn{diff}).
-@end enumerate
-
-Sebbene questa possa sembrare una richiesta molto esigente, si tenga presente
-che, anche se il nuovo codice non @`e opera mia, tocca poi a me manutenerlo e
-correggere eventuali errori. Se non @`e possibile per me farlo senza perderci
-troppo tempo, potrei anche lasciar perdere la modifica.
-
-@node Nuovi sistemi
-@appendixsubsec Portare @command{gawk} su un nuovo Sistema Operativo
-@cindex portabilit@`a, @command{gawk}
-@cindex sistemi operativi, portare @command{gawk} su altri
-
-@cindex portare @command{gawk}
-Se si vuol portare @command{gawk} su di un nuovo sistema operativo, sono
-necessari parecchi passi:
-
-@enumerate 1
-@item
-Seguire le linee-guida contenute
-@ifinfo
-in @ref{Aggiungere codice},
-@end ifinfo
-@ifnotinfo
-nella precedente @value{SECTION}
-@end ifnotinfo
-relative allo stile di codifica, all'invio delle differenze proposte, etc.
-
-@item
-Essere disposti a firmare un documento liberatorio appropriato.
-Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
-di pubblico dominio, tramite la firma di un documento apposito, oppure
-attribuendo il copyright delle modifiche all'FSF.
-Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
-l'hanno fatto. Se ci sono domande da fare, scrivere a me
-oppure all'indirizzo @email{gnu@@gnu.org}.
-
-@item
-Nel realizzare un @dfn{port}, tener presente che il codice
-deve coesistere pacificamente con il resto di @command{gawk} e con le
-versioni per altri sistemi operativi.
-Evitare modifiche non necessarie alla parte di codice che @`e indipendente
-dal sistema operativo. Se possibile, evitare di disseminare @samp{#ifdef},
-utili solo per il proprio @dfn{port}, all'interno del codice sorgente.
-
-Se le modifiche necessarie per un particolare sistema coinvolgono una parte
-troppo rilevante del codice, @`e probabile che io non le accetti.
-In questo caso si possono, naturalmente, distribuire le modifiche per
-proprio conto, basta che si rispettino i vincoli della GPL
-(@pxref{Copia}).
-
-@item
-Un certo numero di file che fanno parte della distribuzione di @command{gawk}
-sono mantenuti da terze persone e non dagli sviluppatori di @command{gawk}.
-Quindi, non si dovrebbero cambiare, se non per ragioni molto
-valide; vale a dire, modifiche a questi file non sono impossibili, ma
-le modifiche a questi file saranno controllate con estrema attenzione.
-I file sono
-@file{dfa.c},
-@file{dfa.h},
-@file{getopt.c},
-@file{getopt.h},
-@file{getopt1.c},
-@file{getopt_int.h},
-@file{gettext.h},
-@file{regcomp.c},
-@file{regex.c},
-@file{regex.h},
-@file{regex_internal.c},
-@file{regex_internal.h}
-e
-@file{regexec.c}.
-
-@item
-Un certo numero di altri file sono prodotti dagli Autotool [comandi di
-configurazione] di GNU (Autoconf, Automake, e GNU @command{gettext}).
-Neppure questi file dovrebbero essere modificati, se non per ragioni molto
-valide. I file sono
-@file{ABOUT-NLS},
-@file{config.guess},
-@file{config.rpath},
-@file{config.sub},
-@file{depcomp},
-@file{INSTALL},
-@file{install-sh},
-@file{missing},
-@file{mkinstalldirs},
-@file{xalloc.h}
-e
-@file{ylwrap}.
-
-@item
-Essere disponibili a continuare a manutenere il @dfn{port}.
-I sistemi operativi non-Unix sono supportati da volontari che tengono
-aggiornato il codice necessario per compilare ed eseguire @command{gawk}
-nei loro sistemi. Se nessuno @`e disponibile a tener aggiornato un @dfn{port},
-questo diventa non pi@`u supportato, e pu@`o essere necessario rimuoverlo dalla
-distribuzione.
-
-@item
-Fornire un appropriato file @file{gawkmisc.???}.
-Ogni @dfn{port} ha il proprio @file{gawkmisc.???} che implementa alcune
-funzioni specifiche per quel sistema operativo. Questa @`e una soluzione pi@`u
-pulita, rispetto a una quantit@`a di @samp{#ifdef} sparsi nel codice. Il file
-@file{gawkmisc.c} nella directory principale dei sorgenti include gli
-appropriati file @file{gawkmisc.???} da ogni sottodirectory. Anche
-quest'ultimo file va aggiornato.
-
-Ogni file @file{gawkmisc.???} del @dfn{port} ha un suffisso esplicativo
-del tipo di macchina o del sistema operativo in questione---per esempio,
-@file{pc/gawkmisc.pc} e @file{vms/gawkmisc.vms}. L'uso di suffissi distinti
-invece di un semplice @file{gawkmisc.c}, rende possibile spostare file da
-una sottodirectory propria del @dfn{port} nella sottodirectory principale,
-senza cancellare incidentalmente il file @file{gawkmisc.c} vero e proprio.
-(Al momento, questo rappresenta un problema solo per i @dfn{port} ai
-sistemi operativi dei PC.)
-
-@item
-Fornire un @file{Makefile} e ogni altro file sorgente o di intestazione in C
-che sia necessario per il proprio sistema operativo. Tutto il codice dovrebbe
-stare in una sottodirectory a parte, il cui nome sia lo stesso, o
-sia indicativo, del proprio sistema operativo o del tipo di computer.
-Se possibile, tentare di strutturare il codice in modo che non sia necessario
-spostare file dalla propria sottodirectory nella directory principale del
-codice sorgente. Se ci@`o non @`e possibile, evitare nel modo pi@`u assoluto di
-usare nomi per i file che siano duplicati di nomi di file presenti nella
-directory principale del codice sorgente.
-
-@item
-Aggiornare la documentazione.
-Scrivere una sezione (o pi@`u sezioni) per questo @value{DOCUMENT}
-che descriva i passi di installazione e compilazione necessari per compilare
-e/o installare @command{gawk} per il sistema desiderato.
-@end enumerate
-
-Seguire queste indicazioni facilita molto l'integrazione delle
-modifiche in @command{gawk} e la loro felice coesistenza con il codice di
-altri sistemi operativi gi@`a presenti.
-
-Nel codice che viene fornito e tenuto aggiornato, si possono
-tranquillamente usare uno stile di codifica e una disposizione delle
-parentesi graffe di proprio gradimento.
-
-@node File derivati
-@appendixsubsec Perch@'e i file generati sono tenuti in Git
-
-@cindex Git, uso per il codice sorgente di @command{gawk}
-@c From emails written March 22, 2012, to the gawk developers list.
-
-Se si esaminano i sorgenti di @command{gawk} nel deposito Git
-si noter@`a che sono inclusi file generati automaticamente dagli strumenti
-dell'infrastruttura GNU, come @file{Makefile.in} generato da Automake e
-anche @file{configure} proveniente da Autoconf.
-
-Questo comportamento @`e differente da quello di molti progetti di
-Libero Software che non memorizzano i file derivati, per mantenere pi@`u
-sgombro il deposito Git, rendendo cos@`{@dotless{i}} pi@`u facile comprendere quali sono le
-modifiche sostanziali confrontando differenti versioni, nel tentativo di
-capire cosa @`e cambiato tra una modifica e la precedente.
-
-Tuttavia, ci sono parecchie ragioni per le quali il manutentore di
-@command{gawk} preferisce mantenere ogni cosa nel deposito Git.
-
-Innanzitutto, perch@'e in questo modo @`e facile generare completamente ogni
-data versione, senza doversi preoccupare di avere a disposizione altri
-strumenti (pi@`u vecchi, probabilmente obsoleti, e in qualche caso
-perfino impossibili da trovare).
-
-Come esempio estremo, se solo si pensa di tentare di compilare, diciamo, la
-versione Unix V7 di @command{awk}, ci si accorge che non solo @`e necessario
-scaricare e ricompilare la versione V7 del comando @command{yacc} per farlo, ma
-anche che serve la versione V7 del comando @command{lex}. E quest'ultima @`e
-praticamente impossibile farla funzionare in un sistema GNU/Linux dei giorni
-nostri.@footnote{Ci abbiamo provato. @`E stata un'esperienza dolorosa.}
-
-(Oppure, diciamo che la versione 1.2 di @command{gawk} richiede il comando
-@command{bison} come funzionava nel 1989, e non @`e presente il file
-@file{awkgram.c} [generato tramite @command{bison}] nel deposito Git. Che cosa
-ci garantisce di riuscire a trovare quella versione di @command{bison}? O che
-@emph{quella} riesca a generarlo?)
-
-Se il deposito Git comprende tutti i file derivati,
-@`e facile, dopo averli scaricati, ricostruire il programma. (Oppure @`e @emph{pi@`u
-facile}, a seconda di quanto si vuole risalire indietro nel tempo).
-
-E qui arriviamo alla seconda (e pi@`u valida) ragione per cui tutti i file
-devono essere proprio nel deposito Git. Domandiamoci a chi ci si rivolge:
-agli sviluppatori di @command{gawk}, oppure a un utilizzatore che intende
-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
-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,
-@`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
-sistemi, @`e una notevole perdita di tempo.
-
-Neppure partire dall'ultimo archivio @command{tar} compresso @`e stata una
-passeggiata: i manutentori avevano eliminato i file compressi in formato
-@file{.gz} e @file{.bz2} sostituendoli con file di tipo @file{.tar.xz}.
-Bisognava quindi per prima cosa scaricare e compilare @command{xz}}.
-A questo serve il file @file{bootstrap.sh}. Va a "toccare"
-[tramite il comando @command{touch}] vari altri file nell'ordine richiesto
-in modo che
-
-@example
-# La formula canonica per compilare il software GNU:
-./bootstrap.sh && ./configure && make
-@end example
-
-@noindent
-tutto @emph{funzioni senza problemi}.
-
-Questo @`e estremamente importante per i rami
-@code{master} e @code{gawk-@var{X}.@var{Y}-stable}.
-
-Inoltre, il manutentore di @command{gawk} potrebbe sostenere che
-ci@`o @`e importante anche per gli sviluppatori di @command{gawk}. Tentando di
-scaricare il ramo @code{xgawk}@footnote{Un ramo (non pi@`u presente) creato da
-uno degli altri sviluppatori, e che non includeva i file generati.} per
-compilarlo, non ci riusc@`{@dotless{i}}. (Mancava il file @file{ltmain.sh}, ed egli non
-aveva idea di come crearlo, e c'erano anche ulteriori problemi.)
-
-La cosa lo lasci@`o in uno stato di frustrazione @emph{estrema}. Riguardo a quel
-ramo, il manutentore @`e in una posizione non differente da quella di un utente
-generico che voglia tentare di compilare @code{gawk-4.1-stable} o @code{master}
-dal deposito Git.
-
-Quindi, il manutentore ritiene che sia non solo importante, ma cruciale, che
-per ogni dato ramo la formula canonica evocata prima
-@emph{funzioni senza problemi}.
-
-@c Added 9/2014:
-Una terza ragione per avere tutti i file @`e che senza di essi, usare @samp{git
-bisect} per tentare di trovare quale modifica ha introdotto un errore diventa
-estremamente difficile. Il manutentore ha tentato di farlo su un altro
-progetto che richiede di eseguire @dfn{script} di inizializzazione allo scopo
-di creare lo @dfn{script} @command{configure} e cos@`{@dotless{i}} via; @`e stata un'esperienza
-veramente dolorosa. Se invece il deposito Git contiene tutto il necessario,
-usare @command{git bisect} al suo interno @`e molto facile.
-
-@c So - that's my reasoning and philosophy.
-
-Quali sono, quindi, alcune delle conseguenze e/o delle cose da fare?
-
-@enumerate 1
-@item
-Non importa se ci sono file differenti nei diversi rami
-prodotti da versioni differenti degli Autotool.
-
-@enumerate A
-@item
-Spetta al manutentore integrarli tra loro, e se ne occuper@`a lui.
-
-@item
-@`E facile per lui eseguire @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1}
-per rimuovere le differenze che non sono rilevanti ai fini della revisione
-del codice sorgente.
-@end enumerate
-
-@item
-Sarebbe sicuramente d'aiuto se tutti usassero le stesse versioni degli Autotool
-GNU che lui usa, che in generale sono le ultime versioni rilasciate di
-Automake,
-Autoconf,
-@command{bison}
-e
-GNU @command{gettext}.
-
-@ignore
-If it would help if I sent out an ``I just upgraded to version x.y
-of tool Z'' kind of message to this list, I can do that. Up until
-now it hasn't been a real issue since I'm the only one who's been
-dorking with the configuration machinery.
-@end ignore
-
-@c @enumerate A
-@c @item
-Installare a partire dal sorgente @`e abbastanza facile. @`E il modo con cui il
-manutentore ha lavorato per anni (e ancora lavora).
-Egli aveva @file{/usr/local/bin} all'inizio del suo @env{PATH} e dava i
-seguenti comandi:
-
-@example
-wget http://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz
-tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz
-cd @var{package}-@var{x}.@var{y}.@var{z}
-./configure && make && make check
-make install # come utente root
-@end example
-
-@c @item
-@ignore
-These days the maintainer uses Ubuntu 12.04 which is medium current, but
-he is already doing the above for Automake, Autoconf, and @command{bison}.
-@end ignore
-
-@ignore
-(C. Rant: Recent Linux versions with GNOME 3 really suck. What
- are all those people thinking? Fedora 15 was such a bust it drove
- me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from
- a UI perspective. Bleah.)
-@end ignore
-@c @end enumerate
-
-@ignore
-@item
-If someone still feels really strongly about all this, then perhaps they
-can have two branches, one for their development with just the clean
-changes, and one that is buildable (xgawk and xgawk-buildable, maybe).
-Or, as I suggested in another mail, make commits in pairs, the first with
-the "real" changes and the second with "everything else needed for
- building".
-@end ignore
-@end enumerate
-
-La maggior parte del testo precedente fa parte di messaggi scritti
-originalmente dal manutentore agli altri sviluppatori @command{gawk}.
-Da uno degli sviluppatori @`e stata avanzata l'obiezione
-``@dots{} che chi scarica il sorgente da Git
-non @`e un utente finale''.
-
-Tuttavia, questo non @`e esatto. Ci sono ``utenti avanzati di @command{awk}''
-che possono installare @command{gawk} (usando la formula canonica vista sopra)
-ma che non conoscono il linguaggio C. Quindi, i rami pi@`u rilevanti
-dovrebbero essere sempre compilabili.
-
-@`E stato proposto poi di lanciare ogni notte uno @dfn{script} tramite il
-programma di utilit@`a @command{cron} per creare archivi in formato @command{tar}
-contenenti tutto ``il codice sorgente.'' Il problema in questo caso @`e che
-ci sono differenti alberi di sorgenti, che corrispondono ai vari rami!
-Quindi gli archivi notturni in questione non sono una risposta valida, anche
-per il fatto che il deposito Git pu@`o rimanere senza alcuna modifica
-significativa per settimane intere.
-
-Fortunatamente, il server Git pu@`o rispondere a questa esigenza. Per ogni
-dato ramo chiamato @var{nome-ramo}, basta usare:
-
-@example
-wget http://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{nome-ramo}.tar.gz
-@end example
-
-@noindent
-per ottenere una copia utilizzabile del ramo in questione.
-
-@node Future estensioni
-@appendixsec Probabili estensioni future
-@ignore
-From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995
-Return-Path: <emory!scalpel.netlabs.com!lwall>
-Message-Id: <9510311732.AA28472@scalpel.netlabs.com>
-To: arnold@skeeve.atl.ga.us (Arnold D. Robbins)
-Subject: Re: May I quote you?
-In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST."
- <m0tAHPQ-00014MC@skeeve.atl.ga.us>
-Date: Tue, 31 Oct 95 09:32:46 -0800
-From: Larry Wall <emory!scalpel.netlabs.com!lwall>
-
-: Greetings. I am working on the release of gawk 3.0. Part of it will be a
-: thoroughly updated manual. One of the sections deals with planned future
-: extensions and enhancements. I have the following at the beginning
-: of it:
-:
-: @cindex PERL
-: @cindex Wall, Larry
-: @display
-: @i{AWK is a language similar to PERL, only considerably more elegant.} @*
-: Arnold Robbins
-: @sp 1
-: @i{Hey!} @*
-: Larry Wall
-: @end display
-:
-: Before I actually release this for publication, I wanted to get your
-: permission to quote you. (Hopefully, in the spirit of much of GNU, the
-: implied humor is visible... :-)
-
-I think that would be fine.
-
-Larry
-@end ignore
-@cindex Perl
-@cindex Wall, Larry
-@cindex Robbins, Arnold
-@quotation
-@i{AWK @`e un linguaggio simile a PERL, solo che @`e notevolmente pi@`u elegante.}
-@author Arnold Robbins
-@end quotation
-
-@quotation
-@i{Hey!}
-@author Larry Wall
-@end quotation
-
-Il file @file{TODO} nel ramo @code{master} del deposito Git di @command{gawk}
-contiene un elenco di possibili futuri miglioramenti. Alcuni di questi
-riguardano il codice sorgente, e altri possibili nuove funzionalit@`a.
-Consultare quel file per esaminare la lista.
-@xref{Aggiunte},
-se si @`e interessati a intraprendere qualcuno dei progetti col@`a elencati.
-
-@node Limitazioni dell'implementazione
-@appendixsec Alcune limitazioni dell'implementazione
-
-La tabella seguente specifica i limiti di @command{gawk} in un sistema di
-tipo Unix (sebbene anche tra questi ci potrebbero essere variazioni). Altri
-sistemi operativi possono avere limiti differenti.
-
-@multitable @columnfractions .40 .60
-@headitem Caratteristica @tab Limiti
-@item Caratteri in una classe di caratteri @tab 2^(numero di bit per byte)
-@item Lunghezza di un record in input @tab @code{MAX_INT}
-@item Lunghezza di un record in output @tab Illimitata
-@item Lunghezza di una riga di codice sorgente @tab Illimitata
-@item Numero di campi in un record @tab @code{MAX_LONG}
-@item Numero di ridirezioni di file @tab Illimitata
-@item Numero di record in input in un singolo file @tab @code{MAX_LONG}
-@item Numero totale di record in input @tab @code{MAX_LONG}
-@item Numero di ridirezioni via @dfn{pipe} @tab min(numero processi per utente, numero di file aperti)
-@item Valori numerici @tab Numeri a virgola mobile in doppia precisione (se non si usa la funzionalit@`a MPFR)
-@item Dimensione di un campo @tab @code{MAX_INT}
-@item Dimensione di una stringa letterale @tab @code{MAX_INT}
-@item Dimensione di una stringa di @dfn{printf} @tab @code{MAX_INT}
-@end multitable
-
-@node Progetto delle estensioni
-@appendixsec Note di progetto dell'estensione API
-
-Questa @value{SECTION} documenta l'architettura dell'estensione API,
-inclusa una trattazione sommaria della progettazione e dei problemi che
-andavano risolti.
-
-La prima versione delle estensioni per @command{gawk} @`e stata sviluppata
-a met@`a degli anni '90, e distribuita con la versione 3.1 di @command{gawk},
-verso la fine degli anni '90.
-Il meccanismo e l'architettura sono rimasti gli stessi per quasi 15 anni,
-fino al 2012.
-
-Il vecchio meccanismo delle estensioni usava tipi di dati e funzioni dello
-stesso @command{gawk}, con un ``abile trucco'' per installare le funzioni
-di estensione.
-
-La distribuzione @command{gawk} conteneva alcuni esempi di estensioni, solo
-poche delle quali erano realmente utili. Tuttavia era chiaro fin da
-principio che il meccanismo di estensione era un'aggiunta improvvisata, e
-non era realmente ben concepito.
-
-@menu
-* Problemi con le vecchie estensioni:: Problemi col vecchio meccanismo.
-* Obiettivi delle estensioni:: Obiettivi del nuovo meccanismo.
-* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
-* Futuri sviluppi delle estensioni:: Possibilit@`a di crescita futura.
-@end menu
-
-@node Problemi con le vecchie estensioni
-@appendixsubsec Problemi con le vecchie estensioni
-
-Il vecchio meccanismo delle estensioni presentava parecchi problemi:
-
-@itemize @value{BULLET}
-@item
-Dipendeva eccessivamente dalla struttura interna di @command{gawk}. Ogni volta
-che la struttura @code{NODE}@footnote{Una struttura di dati fondamentale
-all'interno di @command{gawk}.} veniva modificata, ogni estensione doveva
-essere ricompilata. Inoltre, la scrittura di estensioni richiedeva una
-certa familiarit@`a con le funzioni interne di @command{gawk}. Esisteva
-un po' di documentazione in questo @value{DOCUMENT}, ma era ridotta al minimo.
-
-@item
-Per poter utilizzare servizi di @command{gawk} da un'estensione era necessario
-disporre di funzionalit@`a del @dfn{linker}
-normalmente disponibili in ambiente di tipo Unix, ma non implementate
-nei sistemi MS-Windows; chi voleva utilizzare estensioni in
-MS-Windows doveva aggiungerle al modulo eseguibile di @command{gawk},
-anche se MS-Windows supporta il caricamento dinamico di oggetti condivisi.
-
-@item
-L'API di tanto in tanto veniva modificata, in parallelo ai cambiamenti di
-@command{gawk}; nessuna compatibilit@`a tra le versioni @`e stata mai prevista o
-resa disponibile.
-@end itemize
-
-Nonostante questi inconvenienti, gli sviluppatori del progetto @command{xgawk}
-si basarono su @command{gawk} per sviluppare parecchie estensioni
-significative. Inoltre, migliorarono le capacit@`a, in @command{gawk}, di
-includere file e di accedere a oggetti condivisi.
-
-Una nuova API @`e rimasta un desiderio per lungo tempo, ma solo nel 2012
-il manutentore di @command{gawk} e gli sviluppatori di @command{xgawk}
-iniziarono finalmente a lavorare insieme. Ulteriori informazioni riguardanti
-il progetto @command{xgawk} sono forniti nella @ref{gawkextlib}.
-
-@node Obiettivi delle estensioni
-@appendixsubsec Obiettivi per un nuovo meccanismo
-
-Alcuni obiettivi per la nuova API sono:
-
-@itemize @value{BULLET}
-@item
-L'API dovrebbe essere indipendente dalla struttura interna di @command{gawk}.
-Le modifiche alla struttura interna di @command{gawk} dovrebbero essere
-irrilevanti per chi scrive una funzione di estensione.
-
-@item
-L'API dovrebbe consentire una compatibilit@`a @emph{binaria} [ossia a livello
-di codice eseguibile, e non solo a livello di codice sorgente] tra diverse
-versioni di @command{gawk}, se la stessa API rimane invariata.
-
-@item
-L'API dovrebbe consentire che le estensioni scritte in C o C++ abbiano
-all'incirca la stessa ``struttura'', per il codice awk,
-di quella che hanno le funzioni di @command{awk}. Questo vuol dire che le
-estensioni dovrebbero avere:
-
-@itemize @value{MINUS}
-@item
-La capacit@`a di accedere ai parametri delle funzioni.
-
-@item
-La capacit@`a di trasformare un parametro indefinito in un vettore
-(chiamata per riferimento [@dfn{by reference}]).
-
-@item
-La capacit@`a di creare, leggere e aggiornare variabili globali.
-
-@item
-Un accesso facile a tutti gli elementi di un vettore simultaneamente
-(``appiattimento del vettore'') in modo da poter visitare tutti gli elementi
-del vettore in una maniera semplice per un programma scritto in C.
-
-@item
-La capacit@`a di creare vettori (compresi i veri "vettori di vettori" di
-@command{gawk}).
-@end itemize
-@end itemize
-
-Alcuni ulteriori obiettivi rilevanti sono:
-
-@itemize @value{BULLET}
-@item
-L'API dovrebbe usare solo funzionalit@`a disponibili nella specifica ISO C 90, in
-modo da consentire estensioni scritte con una vasta gamma di compilatori C e
-C++. L'intestazione dovrebbe includere le appropriate direttive
-@samp{#ifdef __cplusplus} e @samp{extern "C"}, in modo da poter utilizzare un
-compilatore C++. (Se si usa C++, il sistema operativo in uso dev'essere in
-grado di invocare dei costruttori e dei distruttori, poich@'e @command{gawk} @`e un
-programma scritto in C. Al momento in cui queste note sono scritte, la cosa
-non @`e stata verificata).
-
-@item
-Il meccanismo API non dovrebbe aver bisogno di accedere ai simboli di
-@command{gawk}@footnote{I @dfn{simboli} sono le variabili e le funzioni
-definite all'interno di @command{gawk}. Accedere a questi simboli da parte
-di codice esterno a @command{gawk} caricato dinamicamente al momento
-dell'esecuzione @`e problematico in ambiente MS-Windows.} da parte del
-@dfn{linker} statico, usato in fase di compilazione, o di quello dinamico,
-in modo da rendere possibile la creazione di estensioni che funzionino anche
-in ambiente MS-Windows.
-@end itemize
-
-In fase di sviluppo, @`e apparso evidente che dovevano essere disponibili alle
-estensioni anche altre funzionalit@`a, che sono state
-successivamente implementate:
-
-@itemize @value{BULLET}
-@item
-Le estensioni dovrebbero essere in grado di agganciarsi al meccanismo di
-ridirezione dell'I/O di @command{gawk}. In particolare, gli sviluppatori di
-@command{xgawk} hanno programmato un cosiddetto ``gancio aperto'' (@dfn{open
-hook}) per gestire autonomamente la lettura dei record. In fase di sviluppo,
-questo meccanismo @`e stato generalizzato, per consentire alle estensioni di
-agganciarsi sia all'elaborazione dell'input, che a quella dell'output, nonch@'e
-all'I/O bidirezionale.
-
-@item
-Un'estensione dovrebbe poter rendere disponibile una funzione di ``call back''
-(richiamo) per effettuare operazioni di pulizia all'uscita di @command{gawk}.
-
-@item
-Un'estensione dovrebbe poter rendere disponibile una stringa di versione
-cos@`{@dotless{i}} che l'opzione @option{--version}
-di @command{gawk} possa informare anche sulle versioni delle estensioni.
-@end itemize
-
-Il vincolo di evitare di accedere ai simboli di @command{gawk} pu@`o parere a
-prima vista piuttosto difficile da rispettare.
-
-Un tipo di architettura, apparentemente usato da Perl e Ruby e forse da altri
-programmi, potrebbe consistere nel mettere il codice principale di
-@command{gawk} in una libreria, limitando il programma di utilit@`a
-@command{gawk} a una piccola funzione @code{main()} in C che richiamerebbe
-dinamicamente la libreria.
-
-Questo inverte i ruoli del programma principale e della sua estensione, e
-complica sia la compilazione che l'installazione, trasformando la semplice
-copia del programma eseguibile @command{gawk} da un sistema all'altro (o da una
-posizione all'altra all'interno dello stesso sistema) in un'operazione ad alto
-rischio.
-
-Pat Rankin ha suggerito la soluzione che @`e stata adottata.
-@xref{Panoramica sul meccanismo delle estensioni}, per maggiori dettagli.
-
-@node Altre scelte progettuali per le estensioni
-@appendixsubsec Altre scelte progettuali
-
-Per una scelta progettuale arbitraria, le estensioni possono accedere ai valori
-delle variabili e dei vettori predefiniti (come @code{ARGV} e @code{FS}), ma
-non possono modificarli, con la sola eccezione di @code{PROCINFO}.
-
-Il motivo di questa scelta @`e di impedire a una funzione di estensione di
-alterare il flusso di un programma @command{awk} togliendogli il controllo.
-Mentre una vera funzione di @command{awk} pu@`o fare quel che vuole, a
-discrezione del programmatore, una funzione di estensione dovrebbe fornire un
-servizio, o rendere disponibile un'API C da utilizzare all'interno di
-@command{awk}, senza interferire con le variabili @code{FS} o @code{ARGC} e
-@code{ARGV}.
-
-Inoltre, diverrebbe facile avviarsi su un sentiero scivoloso. Quante
-funzionalit@`a di @command{gawk} dovrebbero essere disponibili alle estensioni?
-Devono poter usare @code{getline}? Oppure richiamare @code{gsub()} o compilare
-espressioni regolari? Oppure richiamare funzioni interne di @command{awk}?
-(@emph{Questo} potrebbe creare molta confusione.)
-
-Per evitare questi problemi, gli sviluppatori di @command{gawk} hanno scelto di
-iniziare con le funzionalit@`a pi@`u semplici e di base, che sono comunque
-veramente utili.
-
-Sebbene @command{gawk} consenta cose interessanti come l'MPFR,
-e vettori indicizzati internamente con numeri interi,
-un'altra decisione @`e stata quella di non rendere disponibili all'API queste
-funzionalit@`a, per amor di semplicit@`a e per restare fedeli alla tradizionale
-semantica di @command{awk}. (In effetti, i vettori indicizzati internamente
-con numeri interi sono talmente trasparenti che non sono neppure documentati!)
-
-In pi@`u, tutte le funzioni nell'API controllano che i puntatori ai parametri
-passati loro in input non siano @code{NULL}. Se lo sono, viene emesso un
-messaggio di errore. (@`E bene che il codice di estensione verifichi
-che i puntatori ricevuti da @command{gawk} non siano @code{NULL}. Ci@`o non
-dovrebbe succedere, ma gli sviluppatori di @command{gawk} sono solo degli
-esseri umani, e capita anche a loro di commettere degli errori, di tanto in
-tanto.)
-
-Col tempo, l'API si svilupper@`a certamente; gli sviluppatori di @command{gawk}
-si aspettano che questo avvenga in base alle necessit@`a degli utenti. Per ora,
-l'API disponbile sembra fornire un insieme di funzionalit@`a minimo, eppure
-potente, per creare estensioni.
-
-@node Futuri sviluppi delle estensioni
-@appendixsubsec Possibilit@`a di sviluppo futuro
-
-L'API pu@`o ancora essere ampliata, in due modi:
-
-@itemize @value{BULLET}
-@item
-@command{gawk} passa un ``identificativo di estensione'' all'estensione in fase
-di caricamente dell'estensione. L'estensione a sua volta restituisce questo
-identificativo a @command{gawk} a ogni chiamata di funzione. Questo meccanismo
-consente a @command{gawk} di identificare l'estensione che lo chiama, se la
-cosa dovesse risultare necessaria.
-
-@item
-Analogamente, l'estensione passa uno ``spazio dei nomi'' a @command{gawk}
-in fase di registrazione di ogni funzione estesa. Questo @`e fatto in vista di
-un possibile futuro meccanismo per raggruppare funzioni di estensione, e per
-evitare in questo modo possibili conflitti nei nomi di funzione.
-@end itemize
-
-Naturalmente, al momento in cui queste righe sono state scritte, nessuna
-decisione @`e stata presa riguardo ai punti sopra descritti.
-
-@node Meccanismo delle vecchie estensioni
-@appendixsec Compatibilit@`a per le vecchie estensioni
-
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche}, descrive le API supportate e i meccanismi
-per scrivere estensioni per @command{gawk}. Quest'API @`e stata introdotta
-nella @value{PVERSION} 4.1. Peraltro, gi@`a da molti anni @command{gawk}
-metteva a disposizione un meccanismo di estensione che richiedeva una
-familiarit@`a con la struttura interna di @command{gawk} e che non era stato
-progettato altrettanto bene.
-
-Per garantire un periodo di transizione, @command{gawk} @value{PVERSION} 4.1
-continua a supportare il meccanismo di estensione originale.
-Questo rimarr@`a disponibile per la durata di una sola versione principale.
-Il supporto cesser@`a, e sar@`a rimosso dal codice sorgente, al rilascio
-della prossima versione principale.
-
-In breve, le estensioni in stile originale dovrebbero essere compilate
-includendo il file di intestazione @file{awk.h} nel codice sorgente
-dell'estensione. Inoltre, va definito l'identificativo @samp{GAWK} durante la
-preparazione (si usi @samp{-DGAWK} con compilatori in stile Unix). Se non lo
-si fa, le definizioni in @file{gawkapi.h} risulteranno in conflitto con quelle
-in @file{awk.h} e l'estensione non sar@`a compilabile.
-
-Come nelle versioni precedenti, un'estensione vecchio stile sar@`a caricata
-usando la funzione predefinita @code{extension()} (che non viene ulteriormente
-documentata). Questa funzione, a sua volta, trova e carica il file oggetto
-condiviso che contiene l'estensione e chiama la sua routine C @code{dl_load()}.
-
-Poich@'e le estensioni in stile originale e quelle nello stile nuovo usano
-differenti routine di inizializzazione(@code{dl_load()} e @code{dlload()},
-rispettivamente), esse possono tranquillamente essere installate nella stessa
-directory (il cui nome deve essere contenuto nella variabile @env{AWKLIBPATH})
-senza problemi di conflitti.
-
-Il @dfn{team} di sviluppo di @command{gawk} raccomanda caldamente di convertire
-ogni estensione del vecchio tipo ancora in uso, in modo da utilizzare la nuova
-API descritta
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Estensioni dinamiche}.
-
-@node Sommario delle note
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-Le estensioni di @command{gawk} possono essere disabilitata sia con
-l'opzione @option{--traditional} che con l'opzione @option{--posix}.
-L'opzione @option{--parsedebug} @`e disponibile se @command{gawk} @`e stato
-compilato con @samp{-DDEBUG}.
-
-@item
-Il codice sorgente di @command{gawk} @`e conservato in un deposito Git
-pubblicamente accessibile. Tutti possono scaricarlo e visualizzare il
-codice sorgente.
-
-@item
-I contributi a @command{gawk} sono benvenuti. Seguire le istruzioni
-delineate in questo @value{CHAPTER} render@`a pi@`u agevole integrare
-i contributi degli utenti nel codice principale.
-Questo vale sia per il contributo di nuove funzionalit@`a che per il
-@dfn{porting} a ulteriori sistemi operativi.
-
-@item
-@command{gawk} ha alcuni limiti: generalmente quelli imposti
-dall'architettura hardware della macchina.
-
-@item
-La progettazione dell'estensione API @`e volta a risolvere alcuni problemi
-riscontrati nel precedente meccanismo di estensione, ad abilitare
-funzionalit@`a richieste dal progetto @code{xgawk}, e a fornire una
-compatibilit@`a binaria in futuro.
-
-@item
-Il precedente meccanismo di estensione @`e ancora supportato
-nella @value{PVERSION} 4.1
-di @command{gawk}, ma sar@`a @emph{rimosso} nella prossima versione principale.
-
-@end itemize
-
-
-@node Concetti fondamentali
-@appendix Concetti fondamentali di programmazione
-@cindex programmazione, concetti di
-@cindex programmazione, concetti di
-
-Quest'@value{APPENDIX} si propone di definire alcuni dei concetti
-e termini fondamentali usati nel resto di questo @value{DOCUMENT}.
-Poich@'e questo @value{DOCUMENT} @`e dedicato ad @command{awk},
-e non riguarda la programmazione al computer in generale, la trattazione
-@`e necessariamente piuttosto generica e semplificata.
-(Se serve qualcosa di pi@`u approfondito, ci sono molti
-altri testi introduttivi che si possono consultare.)
-
-@menu
-* Fondamenti ad alto livello:: Una visione dall'alto.
-* Fondamenti sui tipi di dati:: Una velocissima introduzione ai tipi di dati.
-@end menu
-
-@node Fondamenti ad alto livello
-@appendixsec Quel che fa un programma
-
-@cindex elaborazione dati
-Al livello pi@`u fondamentale, il compito di un programma @`e di elaborare
-alcuni dati in input e produrre dei risultati.
-@ifnotdocbook
-Si veda la @ref{figura-generica-flusso}.
-@end ifnotdocbook
-@ifdocbook
-Si veda la @inlineraw{docbook, <xref linkend="figura-generica-flusso"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-generica-flusso
-@caption{Flusso generico di un programma}
-@ifclear SMALLPRINT
-@center @image{programma-generico, , , Flusso generico di un programma}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{programma-generico, 11cm, , Flusso generico di un programma}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-@cindex programmi compilati
-@cindex programmi interpretati
-Il ``programma'' nella figura pu@`o essere sia un programma
-compilato@footnote{I programmi compilati sono normalmente scritti
-in linguaggi di programmazione di livello pi@`u basso, come C, C++, o Ada,
-e quindi tradotti, o @dfn{compilati}, in una forma che
-il computer pu@`o eseguire direttamente.}
-(come @command{ls}),
-sia un programma @dfn{interpretato}. In quest'ultimo caso, un programma
-direttamente eseguibile dal computer, come @command{awk}, legge il
-programma, e quindi usa le istruzioni in esso contenute per elaborare i dati.
-
-@cindex programmazione, passi fondamentali
-Quando si scrive un programma, esso @`e composto normalmente
-dai seguenti insiemi di istruzioni di base,
-@ifnotdocbook
-come si vede nella @ref{figura-flusso-elaborazione}:
-@end ifnotdocbook
-@ifdocbook
-come si vede nella @inlineraw{docbook, <xref linkend="figura-flusso-elaborazione"/>}:
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-flusso-elaborazione
-@caption{Fasi di un programma generico}
-@ifclear SMALLPRINT
-@center @image{flusso-elaborazione, , , Fasi di un programma generico}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{flusso-elaborazione, 11cm , , Fasi di un programma generico}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-@table @asis
-@item Inizializzazione
-Queste sono le cose da fare prima di iniziare la reale elaborazione dei
-dati, per esempio controllare gli argomenti con cui @`e stato invocato il
-programma, inizializzare dei dati di cui si potr@`a aver bisogno per la
-successiva elaborazione, e cos@`{@dotless{i}} via.
-Questa fase corrisponde alla regola @code{BEGIN} di @command{awk}
-(@pxref{BEGIN/END}).
-
-Nella preparazione di una torta, questa fase corrisponde a quella di
-tirar fuori tutti i contenitori in cui mischiare gli ingredienti, e la
-teglia in cui cuocerla, e nell'assicurarsi di avere a disposizione tutti gli
-ingredienti necessari.
-
-@item Elaborazione
-Questa fase @`e quella in cui si svolge il lavoro vero e proprio. Il programma
-legge i dati, raggruppati in ``pezzi logici'', e li elabora secondo necessit@`a.
-
-In quasi tutti i linguaggi di programmazione, la lettura dei dati va gestita
-manualmente, controllando dopo ogni lettura se @`e
-rimasto ancora qualcosa d'altro da leggere. Il paradigma @dfn{criterio di
-ricerca--azione} di @command{awk}
-@iftex
-(@pxrefil{Per iniziare})
-@end iftex
-@ifnottex
-(@pxref{Per iniziare})
-@end ifnottex
-gestisce automaticamente la parte di lettura dati.
-
-Nella preparazione di una torta, l'elaborazione corrisponde all'attivit@`a
-vera e propria: rompere le uova, mescolare la farina, l'acqua e gli altri
-ingredienti, e quindi mettere la torta a cuocere nel forno.
-
-@item Pulizia
-Una volta elaborati tutti i dati, ci sono attivit@`a da svolgere prima di aver
-finito. Questa fase corrisponde alla regola @code{END} di @command{awk}.
-(@pxref{BEGIN/END}).
-
-Dopo che la torta @`e stata tirata fuori dal forno, va fatta raffreddare e
-avvolta in una pellicola trasparente per evitare che qualcuno la assaggi,
-e inoltre vanno lavati i contenitori e le posate.
-@end table
-
-@cindex Algoritmi
-Un @dfn{algoritmo} @`e la descrizione dettagliata della procedura necessaria per
-svolgere un compito o per elaborare dati. Lo si pu@`o paragonare alla ricetta
-per preparare una torta. I programmi sono il modo con cui un
-algoritmo viene eseguito da un computer.
-Spesso @`e compito del programmatore sia sviluppare un algoritmo, sia
-programmarlo.
-
-@cindex record
-@cindex campi
-I ``pezzi logici'' nominati precedentemente sono chiamati @dfn{record}
-(registrazioni), in analogia con le registrazioni del personale di una ditta,
-degli studenti di una scuola, o dei pazienti di un dottore.
-Ogni record @`e composto di molte parti, per esempio nome, cognome, data di
-nascita, indirizzo, e cos@`{@dotless{i}} via. Le parti di cui @`e composto un record sono
-chiamate @dfn{campi} del record.
-
-L'atto di leggere i dati @`e noto come @dfn{input}, e quello di generare
-risultati @`e, come facilmente prevedibile, chiamato @dfn{output}. Spesso i due
-sono riuniti sotto il nome di ``input/output'' e, ancor pi@`u spesso, con
-l'abbreviazione ``I/O''. (In inglese ``input'' e ``output'' sono spesso usati
-come verbi, nel gergo informatico, al posto di leggere e scrivere.)
-
-@cindex guidato-dai-dati, linguaggio di programmazione
-@cindex linguaggio di programmazione, guidato dai dati
-@command{awk} gestisce la lettura dei dati, come anche la divisione in
-record e campi. Lo scopo del programma dell'utente @`e di dire ad @command{awk}
-cosa fare con i dati. Questo vien fatto descrivendo @dfn{modelli} da
-ricercare nei dati e @dfn{azioni} da eseguire qualora si siano trovati questi
-modelli. Questa caratteristica dei programmi @command{awk}, di essere
-@dfn{guidati-dai-dati}, di solito li rende pi@`u facili sia da scrivere che da
-leggere.
-
-@node Fondamenti sui tipi di dati
-@appendixsec Valore dei dati in un computer
-
-@cindex variabili
-In un programma si tiene traccia di informazioni e valori in contenitori
-chiamati @dfn{variabili}. Una variabile @`e solo un nome per designare un certo
-valore, come @code{nome}, @code{cognome}, @code{indirizzo}, e cos@`{@dotless{i}} via.
-@command{awk} ha molte variabili predefinite, e ha dei nomi speciali per
-designare il record in input corrente e i campi che compongono il record
-stesso. Si possono inoltre raggruppare molti valori associati tra di loro
-sotto un unico nome, utilizzando un vettore.
-
-@cindex valori numerici
-@cindex valori tipo stringa
-@cindex valori scalari
-@cindex scalari, valori
-I dati, in particolare in @command{awk}, possono avere valori numerici, come 42
-o 3.1415927, o avere come valore delle stringhe. Un valore di tipo stringa @`e
-essenzialmente qualsiasi cosa che non sia un numero, per esempio un nome. Le
-stringhe sono talora chiamate @dfn{dati di tipo carattere}, poich@'e memorizzano
-i singoli caratteri che le formano. Le singole variabili, come pure le
-variabili numeriche e di tipo stringa, sono definite come valori
-@dfn{scalari}. Raggruppamenti di valori, come i vettori, non sono scalari.
-
-@iftex
-La
-@end iftex
-@ref{Aritmetica del computer}, ha fornito un'introduzione di base ai tipi
-numerici (interi e a virgola mobile) e a come questi sono usati in un computer.
-Si consiglia di rileggere quelle informazioni, comprese le numerose avvertente
-l@`a esposte.
-
-@cindex stringhe nulle
-Mentre @`e probabile che ci si sia abituati all'idea di un numero senza un valore
-(cio@`e, allo zero), richiede un po' pi@`u di riflessione abituarsi all'idea di
-dati di tipo carattere a lunghezza zero. Nonostante ci@`o, questo tipo di dato
-esiste. @`E chiamato @dfn{stringa nulla}. La stringa nulla @`e un dato di tipo
-carattere che non ha un valore. In altre parole, @`e vuoto. Si scrive cos@`{@dotless{i}} nei
-programmi @command{awk}: @code{""}.
-
-Gli esseri umani sono abituati a usare il sistema decimale, cio@`e a base 10.
-In base 10, i numeri vanno da 0 a 9, e poi ``vengono riportati'' nella
-colonna successiva. (Chi si ricorda la scuola elementare? 42 = 4 x 10 + 2.)
-
-Ma esistono anche altre basi per i numeri. I computer normalmente usano
-la base 2 o @dfn{binaria}, la base 8 o @dfn{ottale}, e la base 16 o
-@dfn{esadecimale}. Nella numerazione binaria, ogni colonna rappresenta il
-doppio del valore della colonna alla sua destra. Ogni colonna pu@`o contenere
-solo uno 0 o un 1. Quindi, il numero binario 1010 rappresenta (1 x 8) + (0 x
-4) + (1 x 2) + (0 x 1), ossia il numero decimale 10. Le numerazioni ottale ed
-esadecimale sono trattate pi@`u ampiamente
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Numeri non-decimali}.
-
-Al livello pi@`u basso possibile, i computer memorizzano i valori come gruppi di
-cifre binarie, o @dfn{bit}. I computer moderni raggruppano i bit in gruppi di
-otto, detti @dfn{byte}. Applicazioni avanzate talora hanno necessit@`a di
-manipolare i bit direttamente, e @command{gawk} @`e dotato di apposite funzioni.
-
-I programmi sono scritti nei linguaggi di programmazione. Esistono centinaia,
-se non migliaia, di linguaggi di programmazione. Uno dei pi@`u diffusi @`e il
-linguaggio di programmazione C. Il linguaggio C ha esercitato un'influsso
-molto forte nella progettazione del linguaggio @command{awk}.
-
-@cindex Kernighan, Brian
-@cindex Ritchie, Dennis
-Ci sono state parecchie versioni di C. La prima @`e spesso designata come
-``K&R'' C, dalle iniziali di Brian Kernighan e Dennis Ritchie,
-gli autori del primo libro sul C. (Dennis Ritchie ha creato il linguaggio,
-e Brian Kernighan @`e stato uno dei creatori di @command{awk}.)
-
-A met@`a degli anni '80 @`e iniziato uno sforzo rivolto a produrre uno
-standard internazionale per il C. Questo lavoro ha raggiunto un punto di
-arrivo nel 1989 con la produzione dello standard ANSI per il C.
-Questo standard @`e diventato uno standard ISO nel 1990.
-Nel 1999, uno standard ISO C revisionato @`e stato approvato e pubblicato.
-Dove @`e opportuno, POSIX @command{awk} @`e compatible con lo standard
-ISO C del 1999.
-
-
-@node Glossario
-@unnumbered Glossario
-
-@table @asis
-@item Abbraccio mortale
-La situazione in cui due processi che comunicano tra loro sono entrambi bloccati, in
-attesa che l'altro processo faccia qualcosa.
-
-@cindex Ada, linguaggio di programmazione
-@cindex linguaggio di programmazione, Ada
-@item Ada
-Un linguaggio di programmazione originalmente definito dal Department of
-Defense U.S.A.@: per la programmazione integrata. @`E stato progettato per
-favorire dei buoni metodi da seguire nell'ingegneria del software.
-
-@item Ambiente
-Si veda ``Variabili d'ambiente''.
-
-@item @`Ancora
-I metacaratteri @dfn{regexp} @samp{^} e @samp{$}, che richiedono che la
-corrispondenza che si sta cercando si trovi all'inizio o alla fine di una
-stringa, rispettivamente.
-
-@cindex angolo buio
-@item Angolo buio
-Un'area del linguaggio le cui specifiche spesso non erano (o ancora non
-sono) chiare, col risultato di ottenere un comportamente inatteso o non
-desiderabile.
-Tali aree sono segnalate in questo @value{DOCUMENT} con
-@iftex
-il disegno di una torcia a margine
-@end iftex
-@ifnottex
-``(a.b.)'' nel testo
-@end ifnottex
-e sono riportate nell'indice analitico sotto la voce ``angolo buio''.
-
-@cindex ANSI
-@item ANSI
-L'American National Standards Institute. Questo ente produce
-parecchi standard, e tra questi gli standard per i linguaggi di
-programmazione C e C++.
-Questi standard spesso diventano anche internazionali. Si veda anche
-``ISO''.
-
-@item Argomento
-Un argomento pu@`o essere due cose differenti. Pu@`o essere un'opzione o un
-@value{FN} passato a un comando mentre lo si invoca dalla riga dei comandi,
-oppure pu@`o essere qualcosa passato a una @dfn{funzione} all'interno di un
-programma, per esempio all'interno di @command{awk}.
-
-In quest'ultimo caso, un argomento pu@`o essere passato a una funzione in
-due modi. Nel primo modo @`e passato come valore alla funzione chiamata,
-ossia una copia del valore della variabile @`e reso disponibile alla funzione
-chiamata, ma la variabile originale non pu@`o essere modificata dalla
-funzione stessa. Nel secondo modo l'argomento @`e passato per riferimento,
-ossia un puntatore alla variabile in questione @`e passato alla funzione, che
-pu@`o quindi modificarla direttamente. In @command{awk} le variabili scalari
-sono passate per valore, e i vettori sono passati per riferimento.
-Si veda ``Passaggio per valore/riferimento''.
-
-@item Arrotondamento
-Arrotondare il risultato di un'operazione aritmetica pu@`o essere difficile.
-C'@`e pi@`u di un modo di arrotondare, e in @command{gawk} @`e possibile scegliere
-quale metodo dovrebbe essere usato all'interno di un programma.
-@xref{Impostare modi di arrotondare}.
-
-@item Assegnamento
-Un'espressione @command{awk} che cambia il valore di qualche variabile o
-dato oggetto di @command{awk}. Un oggetto a cui si pu@`o assegnare un valore
-@`e detto un @dfn{lvalue}. I valori
-assegnati sono chiamati @dfn{rvalue}.
-@xref{Operatori di assegnamento}.
-
-@cindex Spencer, Henry
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex incredibile assembler (@command{aaa}) scritto in @command{awk}
-@item Assembler incredibilmente scritto in @command{awk}
-Henry Spencer dell'Universit@`a di Toronto ha scritto un assembler adatto a
-molti diversi hardware, usando solo @dfn{script} @command{sed} e
-@command{awk}. @`E lungo migliaia di righe, e include
-la descrizione dell'hardware di
-numerosi micro-computer a 8 bit. @`E un
-buon esempio di programma per cui sarebbe stato
-meglio utilizzare un altro linguaggio.
-Si pu@`o scaricare da @uref{http://awk.info/?awk100/aaa}.
-
-@item Asserzione
-Un'istruzione in un programma che afferma che una condizione @`e verificata in
-un dato punto di un programma.
-Utile per ragionare su come si suppone funzioni un programma.
-
-@item Azione
-Una serie di istruzioni @command{awk} associate a una regola. Se
-l'espressione di ricerca della regola individua un record in input,
-@command{awk} esegue su quel record l'azione relativa. Le azioni sono
-sempre racchiuse tra parentesi graffe.
-(@xref{Panoramica sulle azioni}).
-
-@item Bash
-La versione GNU della shell standard
-@ifnotinfo
-(il @b{B}ourne-@b{A}gain @b{SH}ell).
-@end ifnotinfo
-@ifinfo
-(il Bourne-Again SHell).
-@end ifinfo
-Si veda anche ``Bourne Shell''.
-
-@item Binario
-Notazione a base due, che usa le cifre @code{0}--@code{1}. Poich@'e
-i circuiti elettronici funzionano ``naturalmente'' in base 2
-(basta pensare a Off/On), ogni cosa all'interno di un computer @`e
-calcolata usando la base 2. Ciascuna cifra rappresenta la presenza
-(o l'assenza) di una potenza di 2 ed @`e chiamata un @dfn{bit}.
-Cos@`{@dotless{i}}, per esempio, il numero in base due @code{10101} rappresenta il
-numero in base decimale 21, ((1 x 16) + (1 x 4) + (1 x 1)).
-
-Poich@'e i numeri in base due diventano rapidamente molto lunghi
-sia da leggere che da scrivere, normalmente li si unisce a gruppi di tre
-(ossia, sono visti come numeri ottali) o a gruppi di quattro (ossia, sono
-visti come numeri esadecimali). Non c'@`e un modo diretto per inserire
-numeri a base due in un programma C. Se necessario, tali numeri vengono
-solitamente inseriti come numeri ottali o esadecimali.
-Il numero di cifre in base due contenuto nei registri usati per
-rappresentare i numeri interi all'interno dei computer @`e un'indicazione
-approssimativa della potenza di calcolo del computer stesso. La maggior
-parte dei computer oggi usa 64 bit per rappresentare i numeri interi nei
-registri di calcolo, ma registri a 32 bit, 16 bit e 8 bit sono stati
-largamente in uso in passato.
-@xref{Numeri non-decimali}.
-
-@cindex McIlroy, Doug
-@cindex biscotto della fortuna
-@item Biscotto della fortuna
-Una particolare perla di saggezza, segno, detto o ricordo
-prodotto da (o presentato a) un programma. (Con vivi ringraziamenti al Prof.
-Doug McIlroy).
-@ignore
-From: Doug McIlroy <doug@cs.dartmouth.edu>
-Date: Sat, 13 Oct 2012 19:55:25 -0400
-To: arnold@skeeve.com
-Subject: Re: origin of the term "cookie"?
-
-I believe the term "cookie", for a more or less inscrutable
-saying or crumb of information, was injected into Unix
-jargon by Bob Morris, who used the word quite frequently.
-It had no fixed meaning as it now does in browsers.
-
-The word had been around long before it was recognized in
-the 8th edition glossary (earlier editions had no glossary):
-
-cookie a peculiar goodie, token, saying or remembrance
-returned by or presented to a program. [I would say that
-"returned by" would better read "produced by", and assume
-responsibility for the inexactitude.]
-
-Doug McIlroy
-
-From: Doug McIlroy <doug@cs.dartmouth.edu>
-Date: Sun, 14 Oct 2012 10:08:43 -0400
-To: arnold@skeeve.com
-Subject: Re: origin of the term "cookie"?
-
-> Can I forward your email to Eric Raymond, for possible addition to the
-> Jargon File?
-
-Sure. I might add that I don't know how "cookie" entered Morris's
-vocabulary. Certainly "values of beta give rise to dom!" (see google)
-was an early, if not the earliest Unix cookie. The fact that it was
-found lying around on a model 37 teletype (which had Greek beta in
-its type box) suggests that maybe it was seen to be like milk and
-cookies laid out for Santa Claus. Morris was wont to make such
-connections.
-
-Doug
-@end ignore
-
-@item Bit
-Abbreviazione di ``Binary Digit'' [cifra binaria].
-Tutti i valori nella memoria di un computer sono rappresentati nella forma di
-cifre binarie: valori che sono zero o uno.
-Gruppi di bit possono essere interpretati differentemente---come numeri
-interi, numeri a virgola mobile, dati di tipo carattere, indirizzi di altri
-oggetti contenuti in memoria, o altri dati ancora.
-@command{awk} permette di lavorare con numeri a virgola mobile e stringhe.
-@command{gawk} permette di manipolare bit con le funzioni predefinite
-descritte
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Funzioni a livello di bit}.
-
-I computer sono spesso definiti dal numero di bit che usano per rappresentare
-valori interi. Molti sistemi sono a 32-bit, ma i sistemi a 64-bit sono sempre
-pi@`u numerosi, mentre i sistemi a 16-bit [e quelli a 8-bit] sono praticamente
-scomparsi.
-
-@item Bourne Shell
-La shell standard (@file{/bin/sh}) in Unix e nei sistemi derivati da Unix,
-Originariamente scritto da Steven R.@: Bourne dei Bell Laboratories.
-Molte shell (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) sono
-generalmente compatibili con la Bourne shell, anche quando offrono ulteriori
-funzionalit@`a.
-
-@item C
-Il linguaggio di programmazione di sistema con cui @`e scritta la maggior parte
-del software GNU. Il linguaggio di programmazione @command{awk} ha una
-sintassi simile a quella del C, e
-questo @value{DOCUMENT} puntualizza, quando serve, le somiglianze esistenti
-fra @command{awk} e C.
-
-In generale, @command{gawk} tenta di essere ragionevolmente simile alla
-versione 1990 del C ISO.
-
-@item C Shell
-La C Shell (@command{csh} o la sua versione migliorata @command{tcsh}) @`e una
-shell Unix creata da Bill Joy verso la fine degli anni '70. La C shell si
-differenzia dalla altre shell per le sue funzionalit@`a interattive, e per lo
-stile complessivo, che @`e abbastanza simile a quello del linguaggio C.
-La C shell non @`e compatibile all'indietro con la Bourne Shell, e per questo
-motivo un'attenzione speciale @`e necessaria se si convertono alla C shell
-degli script scritti per altre shell Unix, in particolare per ci@`o che
-concerne la gestione delle variaili di shell.
-Si veda anche ``Bourne Shell''.
-
-@item C++
-Un linguaggio di programmazione molto diffuso, orientato agli oggetti,
-derivato dal C.
-
-@item Campo
-Quando @command{awk} legge un record in input, suddivide il record in parti
-separate da spazi vuoti (o da una @dfn{regexp} che individua il separatore,
-modificabile reimpostando la variabile predefinita @code{FS}). Tali parti
-sono dette campi. Se le parti sono di lunghezza fissa, si pu@`o usare la
-variabile predefinita @code{FIELDWIDTHS} per descriverne le lunghezze.
-Se si desidera specificare i contenuti dei campi, piuttosto che il separatore
-fra i campi, si pu@`o usare la variabile predefinita @code{FPAT} per farlo.
-(@xref{Separatori di campo},
-@iftex
-la
-@end iftex
-@ref{Dimensione costante},
-e
-@iftex
-la
-@end iftex
-@ref{Separazione in base al contenuto}).
-
-@cindex ASCII
-@cindex ISO 8859-1
-@cindex ISO Latin-1
-@cindex caratteri (codifiche macchina di caratteri)
-@cindex insiemi di caratteri (codifiche macchina di caratteri)
-@cindex Unicode
-@item Caratteri
-L'insieme di codici numerici usati da un computer per rappresentare i
-caratteri (lettere, numeri, segni d'interpunzione, etc.) di un particolare
-paese o localit@`a. L'insieme di caratteri pi@`u comunemente in uso oggi @`e
-l'ASCII (American Standard Code for Information Interchange). Molti paesi
-europei usano un'estensione dell'ASCII
-nota come ISO-8859-1 (ISO Latin-1).
-L'insieme di caratteri @uref{http://www.unicode.org, Unicode} sta guadagnando
-popolarit@`a e affermandosi come standard, e il suo uso @`e particolarmente esteso
-nei sistemi GNU/Linux.
-
-@cindex Kernighan, Brian
-@cindex Bentley, Jon
-@cindex @command{chem}, programma di utilit@`a
-@cindex programma di utilit@`a @command{chem}
-@item CHEM
-Un preprocessore per @command{pic} che legge descrizioni di molecole
-e produce l'input a @command{pic} che serve a disegnarle.
-@`E stato scritto in @command{awk}
-da Brian Kernighan e Jon Bentley, ed @`e disponibile in
-@uref{http://netlib.org/typesetting/chem}.
-
-@item Classe di caratteri
-Si veda ``Espressione tra parentesi quadre''.
-
-@cindex programmi compilati
-@item Compilatore
-Un programma che traduce codici sorgente scritti in qualche linguaggio
-in codici eseguibili su un particolare computer. Il codice oggetto risultante
-pu@`o quindi essere eseguito direttamente dal computer.
-Si veda anche ``Interprete''.
-
-@item Concatenazione
-Concatenare due stringhe significa unirle, producendo una nuova stringa.
-Per esempio, la stringa @samp{pippo} concatenata con
-la stringa @samp{pluto} produce la stringa @samp{pippopluto}.
-(@xref{Concatenazione}).
-
-@item Contatore di riferimenti
-Un meccanismo interno di @command{gawk} per minimizzare la quantit@`a di
-memoria necessaria per contenere il valore delle variabili di tipo
-stringa. Se il valore assunto da una variabile @`e usato in pi@`u di un
-posto nel programma, solo una copia del valore stesso @`e tenuta in
-memoria, e il contatore di riferimenti ad esso associato @`e aumentato di
-uno quando lo stesso valore @`e usato da un'ulteriore variabile, e diminuito
-di uno quando la variabile relativa non @`e pi@`u utilizzata. Quando il
-contatore di riferimenti va a zero, la parte di memoria utilizzata per
-contenere il valore della variuabile @`e liberato.
-
-@item Coprocesso
-Un programma subordinato con il quale @`e possibile una comunicazione
-bidirezionale dal programma principale.
-
-@item Dati oggetto
-Sono costituiti da numeri e stringhe di caratteri. I numeri sono convertiti
-in stringhe e viceversa, a seconda delle necessit@`a.
-(@xref{Conversione}).
-
-@item Debugger
-Un programma che serve agli sviluppatori per rimuovere ``bug'' (de-bug) dai
-loro programmi.
-
-@item Dominio di testo
-Un nome unico che identifica un'applicazione.
-Usato per raggruppare messaggi che sono tradotti in fase di esecuzione
-nel linguaggio locale.
-
-@item Doppia precisione
-Una rappresentazione di numeri all'interno del computer che ha una parte
-espressa sotto forma di frazione. I numeri a doppia precisione hanno pi@`u
-cifre decimali che quelli a singola precisione, ma le operazioni che la
-usano consumano pi@`u risorse di quelle
-eseguite in singola precisione. La doppia precisione @`e il formato con cui
-@command{awk} memorizza i valori numerici. Nel linguaggio C @`e il tipo di
-dati detto @code{double}.
-
-@item Editore di flusso
-Un programma che legge record da un flusso in input e li elabora uno o
-pi@`u alla volta. Questo @`e diverso da quel che farebbe un programma batch
-il quale potrebbe leggere completamente i file in input, prima di
-iniziare a fare alcunch@'e, ed @`e diverso anche da un programma interattivo, che
-richiede input dall'utente [tipicamente, una riga alla volta].
-
-@item Effetto collaterale
-Un effetto collaterale ha luogo quando un'espressione ha un effetto ulteriore,
-invece di produrre solo un valore. Espressioni di assegnamento,
-incremento e decremento, e invocazioni di funzioni hanno effetti collaterali.
-(@xref{Operatori di assegnamento}).
-
-@cindex epoch, definizione di
-@item Epoca [Inizio del tempo in Unix]
-la data usata come ``inizio del tempo'' per i campi che contengono date.
-I valori del tempo nella maggior parte dei dei sistemi sono rappresentati
-in numero di secondi trascorsi dall'Epoca, con funzioni di libreria
-che consentono di convertire tali valori nei formati normali di data e ora.
-
-L'Epoca nei sistemi Unix e POSIX parte dal primo gennaio 1970 alle ore
-00:00:00 UTC.
-Si veda anche ``GMT'' e ``UTC''.
-
-@item Esadecimale
-Notazione per l'aritmetica in base 16, che usa le cifre @code{0}--@code{9} e
-le lettere @code{A}--@code{F}, con @samp{A}
-che rappresenta 10, @samp{B} che rappresenta 11, e cos@`{@dotless{i}} via, fino a
-@samp{F} per 15.
-I numeri esadecimali sono scritti in C prefissandoli con @samp{0x},
-per indicarne la base. Quindi, @code{0x12} @`e 18 ((1 x 16) + 2).
-@xref{Numeri non-decimali}.
-
-@item Espressione booleana
-Cos@`{@dotless{i}} detta dal nome del matematico inglese George Boole.
-Si veda anche ``Espressione logica''.
-
-@item Espressione condizionale
-Un'espressione che usa l'operatore ternario @samp{?:}, come p.es.
-@samp{@var{expr1} ? @var{expr2} : @var{expr3}}. Dell'espressione
-@var{expr1} viene calcolato il valore; se risulta verificata, il valore
-dell'intera espressione diviene quello di @var{expr2}; altrimenti il valore @`e
-quello di @var{expr3}. In ogni caso, solo una delle due espressioni
-@var{expr2} e @var{expr3}
-viene calcolata. (@xref{Espressioni condizionali}).
-
-@item Espressione di confronto
-Una relazione che @`e vera o falsa, del tipo di @samp{a < b}.
-Espressioni di confronto sono usate nelle istruzioni
-@code{if}, @code{while}, @code{do}, @code{for}
-e nelle espressioni di ricerca per scegliere quale record in input elaborare.
-(@xref{Tipi di variabile e confronti}).
-
-@item Espressione di intervallo
-Una parte di un'espressione regolare che permette di specificare
-corrispondenze multiple di qualche parte della @dfn{regexp}. Le espressioni di
-intervallo non erano originariamente ammesse nei programmi @command{awk}.
-
-@item Espressione di ricerca [@dfn{pattern}]
-@itemx (detta anche "criterio di ricerca" o "modello di ricerca")
-Le espressioni di ricerca individuano per @command{awk} a quali record in
-input sono applicabili determinate
-regole.
-
-Un'espressione di ricerca [pattern] @`e un'espressione condizionale specifica
-che viene confrontata con ogni record
-in input. Se la corrispondenza esiste, si dice che il modello @dfn{individua}
-il record in input. Una tipica espressione di ricerca potrebbe confrontare
-il record in input con un'espressione regolare.
-(@xref{Panoramica sui criteri di ricerca}).
-
-@item Espressione logica
-Un'espressione che usa gli operatori logici AND, OR e NOT,
-scritti come @samp{&&}, @samp{||}, e @samp{!} in @command{awk}.
-Spesso chiamate espressioni booleane, dal nome del matematico che per primo
-ha sistematizzato questo tipo di logica matematica.
-
-@item Espressione regolare
-un'espressione regolare (abbreviabile come ``@dfn{regexp}'') @`e un modello che
-descrive un assieme di stringhe, potenzialmente illimitato. Per esempio
-l'espressione regolare
-@samp{R.*xp} corrisponde a qualsiasi stringa che inizia con la lettera
-@samp{R} e termina con le lettere @samp{xp}. In @command{awk}, le espressioni
-regolari sono usate nei modelli [pattern] e nelle espressioni condizionali.
-Le espressioni regolari possono contenere sequenze di protezione.
-@iftex
-(@xrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@xref{Espressioni regolari}).
-@end ifnottex
-
-@item Espressione regolare calcolata
-Si veda ``Espressioni regolari dinamiche''.
-
-@item Espressione regolare costante
-Un'espressione regolare costante @`e un'espressione regolare scritta tra barre,
-come @code{/pippo/}. A una tale espressione viene assegnato un valore quando
-si scrive un programma @command{awk} e non pu@`o essere modificata in fase di
-esecuzione del programma. (@xref{Uso di @dfn{regexp}}.)
-
-@item Espressione regolare dinamica
-Un'espressione regolare dinamica @`e un'espressione regolare scritta come
-un'espressione normale. Potrebbe essere una costante stringa, come
-@code{"pippo"}, ma potrebbe anche essere un'espressione il cui valore @`e variabile
-(@xref{Espressioni regolari calcolate}).
-
-@item Espressione tra parentesi quadre
-All'interno di una @dfn{espressione regolare}, un'espressione racchiusa
-fra parentesi quadre sta a indicare che un singolo carattere appartiene
-a una specifica classe di caratteri. Un'espressione tra parentesi quadre
-pu@`o contenere una lista di uno o pi@`u caratteri, come @samp{[abc]}, un
-intervallo di caratteri, come @samp{[A-Z]}, o un nome, delimitato da
-@samp{:}, che designa un insieme di caratteri conosciuto, come
-@samp{[:digit:]}. La forma di espressione tra parentesi quadre
-racchiusa tra @samp{:} @`e indipendente dalla rappresentazione binaria dei
-caratteri stessi, che potrebbe utilizzare le codifiche ASCII, EBCDIC, o
-Unicode, a seconda dell'architettura del computer, e della localizzazione.
-Si veda anche ``Espressioni regolari''.
-
-@item Espressione tra parentesi quadre complementata
-La negazione di una @dfn{espressione tra parentesi quadre}. Tutto ci@`o che
-@emph{non} @`e descritto da una data espressione tra parentesi quadre.
-Il simbolo @samp{^} precede l'espressione tra parentesi quadre che viene
-negata. Per esempio: @samp{[[^:digit:]}
-designa qualsiasi carattere che non sia una cifra. @samp{[^bad]}
-designa qualsiasi carattere che non sia una delle lettere @samp{b}, @samp{a},
-o @samp{d}.
-Si veda ``Espressione tra parentesi quadre''.
-
-@item Estensione
-Una funzionalit@`a aggiunta o una modifica a un linguaggio di programmazione
-o a un programma di utilit@`a, non definita dallo standard di quel linguaggio
-o di quel programma di utilit@`a.
-@command{gawk} ha molte estensioni rispetto al POSIX @command{awk} (fin
-troppe).
-
-@item FDL
-Free Documentation License. Si veda ``Licenza Documentazione Libera''.
-
-@item File speciale
-Un @value{FN} interpretato internamente da @command{gawk}, invece che
-gestito direttamente dal sistema operativo in cui viene eseguito
-@command{gawk}---per esempio, @file{/dev/stderr}.
-(@xref{File speciali}).
-
-@item Flag [Indicatore]
-Una variabile [di tipo booleano] che, se verificata, indica la presenza o
-l'assenza di qualche condizione.
-
-@item Formato
-Le stringhe di formato controllano il modo in cui le funzioni
-@code{strftime()}, @code{sprintf()} e l'istruzione @code{printf} visualizzano
-l'output che producono. Inoltre, le conversioni da numeri a stringhe sono
-controllate dalle stringhe di formato contenute nelle variabili predefinite
-@code{CONVFMT} e @code{OFMT}. (@xref{Lettere di controllo}).
-
-@cindex formattatore incredibilmente duttile (@command{awf})
-@cindex programma @command{awf} (formattatore incredibilmente duttile)
-@item Formattatore incredibilmente duttile (@command{awf})
-Henry Spencer all'Universit@`a di Toronto ha scritto un formattatore che
-accetta un ampio sottoassieme dei comandi di formattazione @samp{nroff -ms}
-e @samp{nroff -man} usando
-@command{awk} e @command{sh}.
-Si pu@`o scaricare da @uref{http://awk.info/?tools/awf}.
-
-@item Fortran
-Abbreviazione di FORmula TRANslator (traduttore di formule), @`e uno dei primi
-linguaggi di programmazione, pensato per il calcolo scientifico.
-@`E stato ideato da John Backus ed @`e disponibile a partire dal 1957. @`E ancora
-in uso ai giorni nostri.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Stallman, Richard
-@item Free Software Foundation
-Un'organizzazione senza fini di lucro dedicata alla
-produzione e distribuzione di software liberamente distribuibile.
-@`E stata fondata da Richard M.@: Stallman, l'autore dell'originale editor
-Emacs. GNU Emacs @`e la versione di Emacs maggiormente usata oggigiorno.
-
-@item FSF
-Si veda ``Free Software Foundation''.
-
-@item Funzione
-Una parte di un programma @command{awk} che si pu@`o chiamare da qualsiasi
-punto del programma, per eseguire un compito. @command{awk} ha parecchie
-funzioni predefinite.
-Gli utenti possono definire essi stessi delle funzioni in qualsiasi parte
-del programma. Le funzioni possono essere ricorsive, ossia possono
-chiamare se stesse.
-@iftex
-@xrefil{Funzioni}.
-@end iftex
-@ifnottex
-@xref{Funzioni}.
-@end ifnottex
-In @command{gawk} @`e anche possibile avere funzioni condivise tra diversi
-programmi, incluse secondo necessit@`a usando la direttiva
-@code{@@include}
-(@pxref{Includere file}).
-In @command{gawk} il nome della funzione da chiamare pu@`o essere generato
-in fase di esecuzione, ossia in maniera dinamica.
-L'estensione API di @command{gawk} fornisce funzioni di costruzione
-(@pxref{Funzioni di costruzione}).
-
-@item Funzioni predefinite
-Il linguaggio @command{awk} fornisce funzioni predefinite, che compiono
-calcoli vari, di tipo numerico, di input/output e di tipo carattere. Esempi
-sono @code{sqrt()} ([square root], la radice quadrata di un numero) e
-@code{substr()} (che estrae una sottostringa da una stringa).
-@command{gawk} fornisce funzioni per la gestione di data e ora,
-le operazioni a livello di bit, l'ordinamento di
-vettori, il controllo di tipo [di variabile] e la traduzione di stringhe
-in fase di esecuzione di progranna.
-(@xref{Funzioni predefinite}).
-
-@item @command{gawk}
-L'implementazione GNU di @command{awk}.
-
-@cindex GPL (General Public License)
-@cindex General Public License (GPL)
-@cindex GNU General Public License
-@item General Public License
-Un documento che descrive le condizioni alle quali @command{gawk} e i suoi
-file sorgenti possono essere distribuiti. (@xref{Copia}).
-
-@item GMT
-``Greenwich Mean Time''.
-Il termine tradizionalmente usato per UTC.
-@`E la datazione usata internamente dai sistemi Unix e POSIX.
-Si veda anche ``Epoca'' e ``UTC''.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Progetto GNU
-@item GNU
-``GNU's not Unix'' (GNU non @`e Unix).
-Un progetto della Free Software Foundation, ancora in corso, che mira a creare
-un ambiente di calcolo completo, liberamente distribuibile, aderente allo
-standard POSIX.
-
-@item GNU/Linux
-Una variante del sistema GNU che usa il kernel Linux,
-invece del kernel proprio della Free Software Foundation, noto come Hurd.
-Il kernel Linux @`e un clone di Unix stabile, efficiente, completo di tutte le
-funzionalit@`a, ed @`e stato portato su varie architetture hardware.
-@`E molto diffuso su sistemi del tipo dei Personal Computer, ma funziona bene
-anche in parecchi altri computer.
-Il codice sorgente del kernel Linux @`e disponibile nei termini della GNU General
-Public License, la qual cosa @`e forse il suo aspetto pi@`u rilevante.
-
-@item GPL
-Si veda ``General Public License''.
-
-@item Graffe
-I caratteri @samp{@{} e @samp{@}}. Le parentesi graffe sono usate in
-@command{awk} per delimitare azioni, istruzioni composte, e il codice che
-costituisce le funzioni.
-
-@item Guidato dai dati
-Una descrizione dei programmi @command{awk}, nei quali si specifica quali sono
-i dati che si vogliono elaborare, e cosa fare quando si trovano tali dati.
-
-@item I/O
-Abbreviazione per ``Input/Output,'' ovvero il trasferimento di dati da e verso
-un programma in esecuzione.
-
-@item Individuazione
-L'azione che consiste nel confrontare una stringa con un'espressione regolare.
-Se la @dfn{regexp} descrive qualcosa che @`e contenuto nella stringa, si dice che
-la @dfn{individua}.
-
-@item Internazionalizzazione
-La procedura con cui si scrive o si modifica un programma
-in modo che possa inviare messaggi in lingue differenti, senza richiedere
-ulteriori modifiche al codice sorgente.
-
-@item Intero
-Un numero intero, cio@`e un numero che non ha una parte frazionaria.
-
-@cindex programmi interpretati
-@item Interprete
-Un programma che accetta come input del codice sorgente, e usa le
-istruzione contenute nello stesso per elaborare dati e fornire risultati.
-@command{awk} @`e tipicamente (ma non sempre) implementato come un interprete.
-Si veda anche ``Compilatore''.
-
-@item Intervallo (nelle righe di input)
-Una sequenza di righe consecutive nel/nei file in input. Un'espressione di
-ricerca pu@`o specificare intervalli di righe di input da far elaborare ad
-@command{awk} oppure pu@`o specificare singole righe.
-(@xref{Panoramica sui criteri di ricerca}).
-
-@cindex ISO
-@item ISO
-Acronimo di International Organization for Standardization.
-Questo ente elabora degli standard internazionali in vari settori, inclusi i
-linguaggi di programmazione, come il C e il C++.
-In ambito informatico, standard importanti come quelli per il C, C++, e POSIX
-sono allo stesso tempo standard nazionali americani e standard internazionali
-ISO.
-In questo @value{DOCUMENT} lo Standard C @`e chiamato ``ISO C''.
-Si veda @uref{http://www.iso.org/iso/home/about.htm, il sito web ISO} per
-ulteriori informazioni sul nome dell'ente e sul suo acronimo di tre lettere,
-che rimane lo stesso in tutte le lingue.
-
-@item Istruzione
-Un'espressione all'interno di un programma @command{awk} nella parte
-"azione" di una regola @dfn{criterio di ricerca--azione}, o all'interno
-di una funzione @command{awk}. Un'espressione pu@`o essere un assegnamento
-di variabile, un'operazione su un vettore, un ciclo, etc.
-
-@item Istruzione composta
-Una serie di istruzioni @command{awk}, racchiuse tra parentesi graffe.
-Le istruzioni composte possono essere nidificate [possono esserci pi@`u livelli
-di parentesi graffe].
-(@xref{Istruzioni}).
-
-@item Istruzione di controllo
-Un'istruzione di controllo @`e un'istruzione per eseguire una data operazione
-o un insieme di operazioni all'interno di un programma @command{awk},
-se una determinata condizione @`e verificata.
-Istruzioni di controllo sono: @code{if}, @code{for}, @code{while}, e @code{do}
-(@pxref{Istruzioni}).
-
-@cindex Java, linguaggio di programmazione
-@cindex linguaggio di programmazione, Java
-@item Java
-Un moderno linguaggio di programmazione originalmente sviluppato da Sun
-Microsystems (ora Oracle) che prevede la programmazione orientata agli
-oggetti. Sebbene normalmente sia implementato compilando le istruzioni
-per una macchina virtuale standard (la JVM---Java Virtual Machine) il
-linguaggio pu@`o essere compilato per essere eseguito in maniera nativa.
-
-@item Korn Shell
-La Korn Shell (@command{ksh}) @`e una shell Unix sviluppata da David Korn,
-presso i Bell Laboratories, nei primi anni '80. La Korn shell @`e
-compatibile all'indietro con la Bourne shell e comprende molte funzionalit@`a
-presenti nella C Shell.
-Si veda anche ``Bourne Shell''.
-
-@item LDL
-Si veda ``Licenza Documentazione Libera''.
-
-@cindex LGPL (Lesser General Public License)
-@cindex Lesser General Public License (LGPL)
-@cindex GNU Lesser General Public License
-@item Lesser General Public License
-Questo documento descrive i termini nei quali possono essere distribuiti
-degli archivi contenenti librerie in formato eseguibile o oggetti condivisi,
-e il relativo codice sorgente.
-
-@item LGPL
-Si veda ``Lesser General Public License''.
-
-@item Licenza Documentazione Libera
-Questo documento descrive i termini in base ai quali questo @value{DOCUMENT}
-@`e pubblicato e pu@`o essere copiato.
-(@xref{Licenza per Documentazione Libera GNU (FDL)}).
-
-@item Linguaggio @command{awk}
-Il linguaggio in cui i programmi @command{awk} sono scritti.
-
-@item Linux
-Si veda ``GNU/Linux''.
-
-@item Lista di caratteri
-Si veda ``Espressione tra parentesi quadre''.
-
-@item Localizzazioni
-La funzionalit@`a che fornisce i dati necessari perch@'e un programma
-internazionalizzato interagisca con l'utente in un particolare linguaggio.
-
-@item @dfn{Lvalue}
-[left-value, ossia valore a sinistra] Un'espressione che pu@`o stare alla
-sinistra di un operatore di assegnamento.
-Nella maggior parte dei linguaggi, gli @dfn{lvalue} possono essere variabili o
-elementi di un vettore. In @command{awk}, un designatore di campo pu@`o anche
-essere usato come un @dfn{lvalue}.
-
-@item Marcatura temporale
-Un valore nel formato ``secondi a partire dall'epoch'' usato dai sistemi Unix
-e POSIX. Usato per le funzioni @command{gawk}
-@code{mktime()}, @code{strftime()}, e @code{systime()}.
-Si veda anche ``Epoca,'' ``GMT,'' e ``UTC''.
-
-@item Metacaratteri
-Caratteri usati all'interno di una @dfn{regexp} e che non rappresentano se
-stessi.
-Servono invece per rappresentare operazioni con espressioni regolari, come
-per esempio delle ripetizioni, dei raggruppamenti, o delle alternanze.
-
-@item Nidificazione
-Una nidificazione si riscontra dove l'informazione @`e organizzata a strati,
-o dove degli oggetti contengono altri oggetti simili.
-In @command{gawk} la direttiva @code{@@include}
-pu@`o essere nidificata. La nidificazione ``naturale'' delle operazioni
-aritmetiche e logiche pu@`o essere modificato attraverso l'uso di parentesi.
-(@pxref{Precedenza}).
-
-@item No-op
-Un'operazione che non fa nulla.
-
-@item Numero
-Un dato oggetto il cui valore @`e numerico. Le implementazioni di @command{awk}
-usano numeri a virgola mobile in doppia precisione per rappresentare i numeri.
-Le primissime implementazioni di @command{awk} usavano numeri a virgola mobile
-in singola precisione.
-
-@item Numero a virgola mobile
-Spesso descritto, in termini matematici, come un numero ``razionale'' o reale,
-@`e soltanto un numero che pu@`o avere una parte frazionaria.
-Si veda anche ``Doppia precisione'' e ``Singola precisione''.
-
-@item Operatori di espressioni regolari
-Si veda ``Metacaratteri''.
-
-@item Ottale
-Notazione avente come base 8, nella quale le cifre sono @code{0}--@code{7}.
-I numeri ottali in C sono scritti premettendo uno @samp{0},
-per indicare la base. Quindi, @code{013} @`e 11 ((1 x 8) + 3).
-@xref{Numeri non-decimali}.
-
-@item Parentesi Graffe
-Si veda ``Graffe''.
-
-@item Parola chiave
-nel linguaggio @command{awk}, una parola chiave (keyword) @`e una parola
-che ha un significato speciale. Queste parole sono riservate e non possono
-essere usate come nomi di variabili.
-
-Le parole chiave di @command{gawk} sono:
-@code{BEGIN},
-@code{BEGINFILE},
-@code{END},
-@code{ENDFILE},
-@code{break},
-@code{case},
-@code{continue},
-@code{default}
-@code{delete},
-@code{do@dots{}while},
-@code{else},
-@code{exit},
-@code{for@dots{}in},
-@code{for},
-@code{function},
-@code{func},
-@code{if},
-@code{next},
-@code{nextfile},
-@code{switch},
-e
-@code{while}.
-
-@item PEBKAC
-Un acronimo inglese che descrive qual @`e probabilmente la causa pi@`u frequente
-di problemi nell'uso di un computer. (@dfn{Problem Exists Between Keyboard and
-Chair} [il problema si trova tra la tastiera e la sedia].)
-
-@item Percorso di ricerca
-In @command{gawk}, una lista di directory in cui cercare file contenenti del
-codice sorgente per @command{awk}.
-Nella shell, una lista di directory in cui ricercare un programma eseguibile.
-
-@item Plug-in
-Si veda ``Estensione''.
-
-@item POSIX
-Il nome di una serie di standard che specificano l'interfaccia di un Sistema
-Operativo Portabile (Portable Operating System). La ``IX'' specifica
-che questi standard sono stati originati dallo Unix.
-Lo standard pi@`u rilevante per gli utenti @command{awk} @`e lo
-@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}.
-Lo standard POSIX 2008 pu@`o essere trovato in rete all'indirizzo:
-@url{http://www.opengroup.org/onlinepubs/9699919799/}.
-
-@item Precedenza
-L'ordine in cui le operazioni sono eseguite quando si usano degli operatori
-se non si stabiliscono precedenze per mezzo di parentesi.
-
-@item Private
-Variabili e/o funzioni che sono riservate all'uso esclusivo di funzioni di
-libreria, e non per il programma principale @command{awk}. Un'attenzione
-particolare va prestata quando si desigano tali variabili e funzioni.
-(@xref{Nomi di variabili di libreria}).
-
-@item Programma @command{awk}
-Un programma @command{awk} consiste in una serie di @dfn{espressioni di
-ricerca} e @dfn{azioni}, che formano delle @dfn{regole}. Per ogni record in
-input a un progranna, le regole del programma sono elaborate nell'ordine in
-cui sono scritte. I programmi
-@command{awk} possono anche contenere definizioni di funzioni.
-
-@item Record
-Si veda ``Record in input'' e ``Record in output''.
-
-@item Record in input
-Una singola parte di dati letta da @command{awk}. Solitamente, un
-record in input di @command{awk} consiste in una linea di testo.
-(@xref{Record}).
-
-@item Record in output
-Un singolo pezzo di dati scritto da @command{awk}. Solitamente, un
-record in output di @command{awk} consiste di una o pi@`u righe di testo.
-@xref{Record}.
-
-@item Ricorsione
-Quando una funzione chiama se stessa, direttamente o indirettamente.
-Se questo @`e chiaro, si pu@`o passare a leggere la definizione successiva.
-Altrimenti, si veda la voce ``Ricorsione''.
-
-@item @dfn{regexp}
-Si veda ``Espressione regolare''.
-
-@item Regola
-Un segmento di un programma @command{awk} che specifica come trattare singoli
-record in input. Una regola consiste in una @dfn{espressione di ricerca} e in
-una @dfn{azione}.
-@command{awk} legge un record in input; poi, per ogni regola, se il record in
-input soddisfa l'espressione di ricerca della regola, @command{awk} esegue
-l'azione specificata dalla regola.
-Altrimenti, la regola non ha alcun effetto su quel record in input.
-
-@item Ridirezione
-Ridirezione significa ricevere input da quaclosa che non sia il flusso dello
-standard input, o dirigere output a qualcosa di diverso dal flusso dello
-standard output.
-
-Si pu@`o ridirigere input all'istruzione @code{getline} usando gli operatori
-@samp{<}, @samp{|}, e @samp{|&}.
-Si pu@`o ridirigere l'output delle istruzioni @code{print} e @code{printf} verso
-un file o un comando di sistema, usando gli operatori @samp{>}, @samp{>>},
-@samp{|}, e @samp{|&}.
-(@xref{Getline},
-e @ref{Ridirezione}).
-
-@item @dfn{Rvalue}
-[right-value, ossia valore a destra] Un valore che pu@`o apparire alla destra
-di un operatore di assegnazione.
-In @command{awk}, essenzialmente ogni espressione ha un valore.
-Ognuno di questi valori @`e un @dfn{rvalue}.
-
-@item Scalare
-Un valore singolo, sia numerico che di tipo stringa.
-Le variabili normali sono scalari; i vettori e le funzioni non lo sono.
-
-@item Scorciatoia
-La natura degli operatori logici @command{awk} @samp{&&} e @samp{||}.
-Se il valore dell'intera espressione in cui sono contenuti @`e determinabile
-valutando solo una parte iniziale dell'espressione, la parte seguente non @`e
-presa in considerazione.
-(@xref{Operatori booleani}).
-
-@item @dfn{Script} @command{awk}
-Un altro nome per designare un programma @command{awk}.
-
-@item @command{sed}
-Si veda ``Editore di flusso''.
-
-@item Seme
-Il valore iniziale, o il punto di partenza, di una sequenza di numeri casuali.
-
-@item Sequenze di protezione
-Una speciale sequenza di caratteri usata per descrivere caratteri non
-stampabili, come @samp{\n} (ritorno a capo) o @samp{\033} per il carattere
-ASCII ESC (Escape). (@xref{Sequenze di protezione}).
-
-@item Shell
-Il programma che interpreta i comandi nei sistemi Unix e in quelli che
-rispettano lo standard POSIX.
-La shell funziona sia interattivamente che come un linguaggio di
-programmazione, che elabora file sequenziali, detti @dfn{script} di shell.
-
-@item Singola precisione
-Una rappresentazione di numeri all'interno del computer che ha una parte
-espressa sotto forma di frazione. I numeri a singola precisione hanno meno
-cifre significative di quelli a doppia precisione, ma le operazioni relative
-richiedono talora meno risorse elaborative da parte del computer.
-Questo tipo di numero @`e quello usato da alcune tra le prime versioni di
-@command{awk} per memorizzare valori numerici. Nel linguaggio C, sono numeri
-di tipo @code{float}.
-
-@item Spazio
-Il carattere generato premendo la barra spaziatrice sulla tastiera.
-
-@item Spazio vuoto
-Una sequenza di spazi, TAB, o caratteri di ritorno a capo presenti in un
-record in input o in una stringa.
-
-@item Stringa
-Un dato che consiste in una sequenza di caratteri, come @samp{Io sono una
-stringa}. Le costanti stringa sono scritte tra doppi apici nel linguaggio
-@command{awk} e possono contenere sequenze di protezione
-(@xref{Sequenze di protezione}).
-
-@item Stringa nulla
-Una stringa che non contiene alcun carattere. @`E rappresentabile
-esplicitamente nei programmi @command{awk} mettendo due caratteri di
-doppio apice uno dietro all'altro (@code{""}). La si pu@`o inserire nei dati
-in input mettendo due separatori di campo uno dietro all'altro.
-
-@item Stringa vuota
-Si veda ``Stringa nulla''.
-
-@item Tab
-Il carattere generato premendo il tasto @kbd{TAB} sulla tastiera.
-Normalmente pu@`o generare sino a otto spazi in output.
-
-@cindex Linux
-@cindex GNU/Linux
-@cindex Unix
-@cindex sistemi operativi basati su BSD
-@cindex NetBSD
-@cindex FreeBSD
-@cindex OpenBSD
-@item Unix
-Un sistema operativo per computer originalmente sviluppato nei primi anni '70
-presso gli AT&T Bell Laboratories. Inizialmente si diffuse nelle universit@`a
-di tutto il mondo e in seguito si estese agli ambienti del mondo del lavoro
-come un sistema per lo sviluppo del software e come server di rete.
-Ci sono parecchie versioni di Unix a pagamento, come pure parecchi sistemi
-operativi modellati su Unix e il cui codice sorgente @`e liberamente
-disponibile. (come GNU/Linux, @uref{http://www.netbsd.org, NetBSD},
-@uref{http://www.freebsd.org, FreeBSD}, e
-@uref{http://www.openbsd.org, OpenBSD}).
-
-@item UTC
-L'abbreviazione comune per ``Universal Coordinated Time'' (tempo coordinato
-universale). Questa @`e l'ora standard di Greenwich, (UK), usata come tempo
-di riferimento per i calcoli relativi a marcature temporali.
-Si veda anche ``Epoca'' e ``GMT''.
-
-@item Variabile
-Un nome per designare un valore. In @command{awk}, le variabili possono
-essere degli scalari o dei vettori.
-
-@item Variabili d'ambiente
-Una collezione di stringhe, in formato @samp{@var{nome}=@var{valore}}, che
-ogni programma ha a disposizione. Gli utenti in generale assegnano valori
-alle variabili d'ambiente per fornire informazioni a vari programmi.
-Esempi tipici sono le variabili d'ambiente @env{HOME} e @env{PATH}.
-
-@item Variabili predefinite
-@code{ARGC},
-@code{ARGV},
-@code{CONVFMT},
-@code{ENVIRON},
-@code{FILENAME},
-@code{FNR},
-@code{FS},
-@code{NF},
-@code{NR},
-@code{OFMT},
-@code{OFS},
-@code{ORS},
-@code{RLENGTH},
-@code{RSTART},
-@code{RS},
-e
-@code{SUBSEP}
-sono le variabili con un significato speciale in @command{awk}.
-In pi@`u,
-@code{ARGIND},
-@code{BINMODE},
-@code{ERRNO},
-@code{FIELDWIDTHS},
-@code{FPAT},
-@code{IGNORECASE},
-@code{LINT},
-@code{PROCINFO},
-@code{RT},
-e
-@code{TEXTDOMAIN}
-sono le variabili con un significato speciale in @command{gawk}.
-Se i loro valori sono modificati, il contesto di esecuzione di @command{awk}
-cambia.
-(@xref{Variabili predefinite}).
-
-@item Vettore
-Un raggruppamento di molti valori con uno stesso nome.
-La maggior parte dei linguaggi fornisce solo vettori sequenziali.
-@command{awk} fornisce vettori associativi.
-
-@item Vettore associativo
-Un vettore i cui indici possono essere numeri o stringhe, e non solamente
-interi sequenziali compresi in un intervallo prestabilito.
-
-@end table
-
-@end ifclear
-
-@c The GNU General Public License.
-
-@node Copia
-@unnumbered Licenza Pubblica Generale GNU (GPL)
-@ifnotdocbook
-@center Versione 3, 29 Giugno 2007
-@end ifnotdocbook
-@docbook
-<subtitle>Versione 3, 29 Giugno 2007</subtitle>
-@end docbook
-
-@c This file is intended to be included within another document,
-@c hence no sectioning command or @node.
-
-@display
-Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
-
-This is an unofficial translation of the GNU General Public License into
-Italian. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU GPL—only
-the original English text of the GNU GPL does that. However, we hope that this
-translation will help Italian speakers understand the GNU GPL better.
-
-Questa @`e una traduzione non ufficiale in italiano della GNU General Public
-License. Questa traduzione non @`e stata pubblicata dalla Free Software
-Foundation, e non stabilisce i termini legali di distribuzione del software
-che usa la GNU GPL. Soltanto la versione originale in inglese della GNU GPL
-fa ci@`o. Ciononostante, speriamo che questa traduzione possa aiutare gli utenti
-di lingua italiana a comprendere un po' meglio la GNU GPL.
-
-A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
-di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
-@end display
-
-@c fakenode --- for prepinfo
-@heading Preambolo
-
-La GNU General Public License @`e una licenza libera e basata su copyleft per
-software e altri tipi di opere.
-
-Le licenze della maggior parte del software e di altre opere materiali sono
-pensate per togliere la libert@`a di condividere e modificare tali opere. Al
-contrario, la GNU General Public License ha l'obiettivo di garantire la
-libert@`a di condividere e modificare tutte le versioni di un programma e di
-fare in modo che esso rimanga software libero per tutti gli utenti. Noi, Free
-Software Foundation, usiamo la GNU General Public License per la maggior parte
-del nostro software; essa viene applicata anche a qualunque altro software
-rilasciato dall'autore sotto questa licenza. Chiunque pu@`o utilizzare questa
-licenza per i suoi programmi.
-
-Quando parliamo di software libero (free software), ci riferiamo al concetto
-di libert@`a, non al prezzo. Le nostre General Public License sono progettate
-per garantire che chiunque abbia la libert@`a di distribuire copie di software
-libero (anche dietro pagamento di un prezzo, se lo desidera), che chiunque
-riceva o possa ricevere il codice sorgente se lo vuole, che chiunque possa
-apportare modifiche al software o utilizzarne delle porzioni in altri software
-liberi, e che chiunque sappia che ha il diritto di fare tutte queste cose col
-software libero.
-
-Per proteggere i vostri diritti, abbiamo la necessit@`a di impedire che altri vi
-neghino questi diritti o vi obblighino a rinunciarvi. Pertanto, chiunque
-distribuisce o modifica software rilasciato con questa licenza assume dei
-precisi doveri: il dovere di rispettare la libert@`a degli altri.
-
-Per esempio, chi distribuisce copie di un programma rilasciato sotto questa
-licenza, sia gratis che dietro pagamento di un prezzo, e' obbligato a
-riconoscere a chi riceve il software esattamente gli stessi diritti che ha
-ricevuto. Deve garantire che chi riceva il software abbia o possa avere
-accesso al codice sorgente. E deve chiaramente far conoscere ai destinatari
-del software queste condizioni, cos@`{@dotless{i}} che essi conoscano quali sono i loro
-diritti.
-
-Gli sviluppatori che usano la GNU GPL proteggono i vostri diritti in due modi:
-(1) Rivendicando il copyright sul software, e (2) offrendovi questa licenza
-che vi garantisce il diritto legale di copiarlo e/o di modificarlo.
-
-Al fine di proteggere gli sviluppatori e gli autori, la GPL spiega chiaramente
-che non c'@`e nessuna garanzia per questo software libero. Nell'interesse degli
-utenti e degli autori, la GPL impone che le versioni modificate del software
-vengano esplicitamente marcate come ``modificate'', in maniera tale che
-eventuali problemi non vengano erroneamente attribuiti agli autori delle
-versioni precedenti.
-
-Alcuni dispositivi sono progettati per negare agli utenti l'installazione o
-l'esecuzione di versioni modificate del software che gira sugli stessi, anche
-se il costruttore si riserva la possibilit@`a di farlo. Ci@`o @`e fondamentalmente
-incompatibile con l'obiettivo di garantire la libert@`a degli utenti di
-modificare il software. Una ripetizione sistematica di tali abusi avviene nel
-campo dei dispositivi per usi individuali, e ci@`o rende questi abusi ancora pi@`u
-inaccettabili. Pertanto, abbiamo realizzato questa versione della GPL al fine
-di proibire queste pratiche. Se problemi simili dovessero sorgere in altri
-ambiti, saremo pronti ad estendere queste misure a questi nuovi ambiti in
-versioni future della GPL, nella maniera che si render@`a necessaria per
-difendere la libert@`a degli utenti.
-
-In conclusione, tutti i programmi sono costantemente minacciati dai brevetti
-sul software. Gli Stati non dovrebbero permettere ai brevetti sul software di
-limitare lo sviluppo e l'utilizzo di software per computer, ma nei Paesi in
-cui ci@`o avviene noi vogliamo evitare in particolare il pericolo che i brevetti
-sul software applicati ad un programma libero possano renderlo, a tutti gli
-effetti, proprietario. Per impedire ci@`o, la GPL assicura che non @`e possibile
-utilizzare i brevetti sul software per rendere un programma non libero.
-
-I termini e le condizioni esatte per la copia, la distribuzione e la modifica
-del software sono riportate di seguito.
-
-@c fakenode --- for prepinfo
-@heading TERMINI E CONDIZIONI
-
-@enumerate 0
-@item Definizioni
-
-``Questa Licenza'' si riferisce alla versione 3 della GNU General Public
-License.
-
-``Copyright'' indica anche leggi simili al copyright che riguardano altri tipi
-di opere, come le maschere per la produzione di semiconduttori.
-
-``Il Programma'' indica qualunque opera che sia soggetta a copyright e che sia
-rilasciata sotto questa Licenza. I detentori della licenza sono indicati come
-``tu'' o ``voi''. Licenziatari e destinatari possono essere individui o
-organizzazioni.
-
-``Modificare'' un'opera significa copiare o adattare tutta o parte dell'opera in
-una maniera che richieda un permesso di copyright, e non indica la semplice
-azione di fare una esatta copia dell'opera. L'opera risultante viene chiamata
-``versione modificata'' dell'opera precedente, oppure viene detta opera ``basata
-sulla'' opera precedente.
-
-Una ``opera coperta da questa licenza'' indica il Programma originale non
-modificato oppure un'opera basata sul Programma.
-
-``Propagare'' un'opera significa fare qualunque cosa con essa che, in mancanza
-di un esplicito permesso, ti renda direttamente o indirettamente perseguibile
-per violazione secondo le vigenti normative sul copyright, ad eccezione della
-semplice esecuzione del Programma su un computer o della modifica di una copia
-privata. La Propagazione include la copia, la distribuzione (con o senza
-modifiche), la messa a disposizione al pubblico e, in alcuni stati, altre
-attivit@`a simili e connesse.
-
-``Distribuire'' un'opera indica qualunque forma di propagazione che permetta a
-terze parti di effettuare o ricevere delle copie. La mera interazione con un
-utente attraverso una rete di computer, senza che ci sia alcun trasferimento
-di una copia, non @`e considerata ``Distribuzione''.
-
-Una interfaccia utente interattiva fornisce delle ``Adeguate Informazioni
-Legali'' soltanto nel caso in cui include una apposita funzionalit@`a, resa
-adeguatamente visibile, che (1) visualizzi un'adeguata informazione di
-copyright, e (2) informi l'utente che non c'@`e alcuna garanzia sull'opera
-(eccetto nel caso in cui delle garanzie sono espressamente fornite), dica che
-il licenziatario pu@`o distribuire l'opera utilizzando questa Licenza, indichi
-come @`e possibile prendere visione di una copia di questa Licenza. Se
-l'interfaccia presenta una lista di comandi o di opzioni, come per esempio un
-men@`u, una delle opzioni fornite nella lista deve rispettare questa condizione.
-
-@item Codice Sorgente
-
-Il ``codice sorgente'' di un'opera indica la forma pi@`u indicata dell'opera per
-effettuare modifiche su di essa. Il ``codice oggetto'' indica qualunque forma
-dell'opera che non sia codice sorgente.
-
-Una ``Interfaccia Standard'' @`e una interfaccia che risponde ad uno standard
-ufficiale definito da un ente di standardizzazione riconosciuto o, nel caso di
-interfacce specifiche per un particolare linguaggio di programmazione, una
-interfaccia che @`e largamente utilizzata dagli sviluppatori per sviluppare in
-tale linguaggio.
-
-Le ``Librerie di Sistema'' di un eseguibile includono qualsiasi cosa, eccetto
-l'opera nel suo insieme, che (a) sia inclusa nella normale forma di
-pacchettizzazione di un ``Componente Principale'', ma che non @`e parte di quel
-Componente Principale, e (b) che serva solo a consentire l'uso dell'opera con
-quel Componente Principale, o per implementare una Interfaccia Standard per la
-quale esista una implementazione disponibile al pubblico in forma sorgente. Un
-``Componente Principale'', in questo contesto, @`e un componente essenziale
-(kernel, gestore di finestre eccetera) dello specifico sistema operativo
-(ammesso che ce ne sia uno) sul quale l'eseguibile esegue, o un compilatore
-utilizzato per produrre il programma, o un interprete di codice oggetto
-utilizzato per eseguire il programma.
-
-Il ``Sorgente Corrispondente'' per un'opera in forma di codice oggetto @`e il
-codice sorgente necessario per generare, installare e (per un programma
-eseguibile) eseguire il codice oggetto e per modificare l'opera, inclusi gli
-script per controllare le suddette attivit@`a di generazione, installazione ed
-esecuzione. Non sono incluse le Librerie di Sistema usate dal programma, o gli
-strumenti di utilit@`a generica o i programmi liberamente accessibili che sono
-utilizzati, senza modifiche, per portare a termine le suddette attivit@`a ma che
-non fanno parte dell'opera. Per esempio, il sorgente corrispondente include i
-file con le definizioni delle interfacce associati ai file sorgente
-dell'opera, e il codice sorgente delle librerie condivise e sottoprogrammi
-collegati dinamicamente specificatamente necessari per il programma, ad
-esempio a causa di stretta comunicazione dati o di controllo di flusso tra
-questi sottoprogrammi e altre parti del programma.
-
-Il Sorgente Corrispondente non include qualunque cosa che l'utente possa
-rigenerare automaticamente da altre parti del Sorgente Corrispondente stesso.
-
-Il Sorgente Corrispondente di un'opera in forma di codice sorgente @`e l'opera
-stessa.
-
-@item Principali Diritti
-
-Tutti i diritti garantiti da questa Licenza sono garantiti per la durata del
-copyright sul Programma, e sono irrevocabili ammesso che le suddette
-condizioni siano rispettate. Questa Licenza afferma esplicitamente il tuo
-permesso illimitato di eseguire il Programma non modificato. Il risultato
-dell'esecuzione di un programma coperto da questa Licenza @`e a sua volta
-coperto da questa Licenza solo se il risultato stesso, a causa del suo
-contenuto, @`e un'opera coperta da questa Licenza. Questa Licenza riconosce il
-tuo diritto all'uso legittimo o altri diritti equivalenti, come stabilito
-dalla legislazione sul copyright.
-
-Puoi creare, eseguire e propagare programmi coperti da questa Licenza che tu
-non distribuisci, senza alcuna condizione fino a quando la tua Licenza rimane
-valida. Puoi distribuire opere coperte da questa Licenza ad altri al solo
-scopo di ottenere che essi facciano delle modifiche al programma
-esclusivamente per te, o che ti forniscano dei servizi per l'esecuzione di
-queste opere, ammesso che tu rispetti i termini di questa Licenza nel
-distribuire tutto il materiale per il quale non detieni il copyright. Coloro i
-quali creano o eseguono per conto tuo un programma coperto da questa Licenza
-lo fanno esclusivamente in tua vece, sotto la tua direzione e il tuo
-controllo, in maniera tale che sia proibito a costoro effettuare copie di
-materiale di cui detieni il copyright al di fuori della relazione che
-intrattengono nei tuoi confronti.
-
-Distribuire opere coperte da licenza in qualunque altra circostanza @`e
-consentito soltanto alle condizioni espresse in seguito. Non @`e consentito
-sottolicenziare le opere: la sezione 10 lo rende non necessario.
-
-@item Protezione dei diritti legali degli utenti dalle leggi anti-elusione
-
-Nessun programma protetto da questa Licenza pu@`o essere considerato parte di
-una misura tecnologica di restrizione che sottosta ad alcuna delle leggi che
-soddisfano l'articolo 11 del ``WIPO copyright treaty'' adottato il 20 Dicembre
-1996, o a simili leggi che proibiscono o limitano l'elusione di tali misure
-tecnologiche di restrizione.
-
-Quando distribuisci un programma coperto da questa Licenza, rifiuti tutti i
-poteri legali atti a proibire l'elusione di misure tecnologiche di restrizione
-ammesso che tale elusione sia effettuata nell'esercizio dei diritti garantiti
-da questa Licenza riguardo al programma coperto da questa Licenza, e rinunci
-all'intenzione di limitare l'operativit@`a o la modifica del programma per far
-valere, contro i diritti degli utenti del programma, diritti legali tuoi o di
-terze parti che impediscano l'elusione di misure tecnologiche di restrizione.
-
-@item Distribuzione di Copie Esatte
-
-Ti @`e permesso distribuire copie esatte del codice sorgente del Programma come
-lo hai ricevuto, con qualunque mezzo, ammesso che tu aggiunga in maniera
-appropriata su ciascuna copia una appropriata nota di copyright; che tu lasci
-intatti tutti gli avvisi che affermano che questa Licenza e tutte le clausole
-non-permissive aggiunte in accordo con la sezione 7 sono valide per il codice
-che distribuisci; che tu lasci intatti tutti gli avvisi circa l'assenza di
-garanzia; che tu fornisca a tutti i destinatari una copia di questa Licenza
-assieme al Programma.
-
-Puoi richiedere il pagamento di un prezzo o di nessun prezzo per ciascuna
-copia che distribuisci, e puoi offrire supporto o garanzia a pagamento.
-
-@item Distribuzione di Versioni modificate del sorgente
-
-Puoi distribuire un'opera basata sul Programma, o le modifiche per produrla a
-partire dal Programma, nella forma di codice sorgente secondo i termini della
-sezione 4, ammesso che tu rispetti anche tutte le seguenti condizioni:
-
-@enumerate a
-@item
-L'opera deve recare con s@`e delle informazioni adeguate che affermino che tu
-l'hai modificata, indicando la data di modifica.
-
-@item
-L'opera deve recare informazioni adeguate che affermino che essa @`e rilasciata
-sotto questa Licenza e sotto le condizioni aggiuntive secondo quanto indicato
-dalla Sezione 7. Questa condizione modifica la condizione espressa alla
-sezione 4 di ``lasciare intatti tutti gli avvisi''.
-
-@item
-Devi rilasciare l'intera opera, nel suo complesso, sotto questa Licenza a
-chiunque venga in possesso di una copia di essa. Questa Licenza sar@`a pertanto
-applicata, assieme ad eventuali clausole aggiunte in osservanza della Sezione
-7, all'opera nel suo complesso, a tutte le sue parti, indipendentemente da
-come esse siano pacchettizzate. Questa Licenza nega il permesso di licenziare
-l'opera in qualunque altro modo, ma non rende nullo un tale permesso ammesso
-che tu lo abbia ricevuto separatamente.
-
-@item
-Se l'opera ha delle interfacce utente interattive, ciascuna deve mostrare
-delle Adeguate Informazioni Legali; altrimenti, se il Programma ha delle
-interfacce interattive che non visualizzano delle Adeguate Informazioni
-Legali, il tuo programma non @`e obbligato a visualizzarle.
-@end enumerate
-
-La giustapposizione di un'opera coperta da questa Licenza assieme ad altre
-opere separate e indipendenti, che non sono per loro natura estensioni del
-Programma, e che non sono combinate con esso a formare un altro programma pi@`u
-grande, dentro o in uno stesso supporto di memorizzazione a lungo termine o di
-distribuzione, @`e semplicemente detto ``aggregato'' se la raccolta e il suo
-copyright non sono utilizzati per limitare l'accesso o i diritti legali degli
-utenti della raccolta stessa oltre ci@`o che ciascun singolo programma consente.
-L'inclusione di un programma coperto da questa Licenza in un aggregato non
-comporta l'applicazione di questa Licenza alle altre parti dell'aggregato.
-
-@item Distribuzione in formato non-sorgente
-
-Puoi distribuire un programma coperto da questa Licenza in formato di codice
-oggetto secondo i termini delle sezioni 4 e 5, ammesso che tu fornisca anche
-il Sorgente Corrispondente in formato comprensibile da un computer sotto i
-termini di questa stessa Licenza, in uno dei seguenti modi:
-
-@enumerate a
-@item
-Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
-i mezzi fisici di distribuzione), accompagnato dal Sorgente Corrispondente su
-un supporto fisico duraturo comunemente utilizzato per lo scambio di software.
-
-@item
-Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
-i mezzi fisici di distribuzione), accompagnato da un'offerta scritta, valida
-per almeno tre anni e valida per tutto il tempo durante il quale tu offri
-ricambi o supporto per quel modello di prodotto, di fornire a chiunque
-possieda il codice oggetto (1) una copia del Sorgente Corrispondente di tutto
-il software contenuto nel prodotto che @`e coperto da questa Licenza, su un
-supporto fisico duraturo comunemente utilizzato per lo scambio di software, ad
-un prezzo non superiore al costo ragionevole per effettuare fisicamente tale
-distribuzione del sorgente, oppure (2) accesso alla copia del Sorgente
-Corrispondente attraverso un server di rete senza alcun costo aggiuntivo.
-
-@item
-Distribuendo copie singole del codice oggetto assieme ad una copia
-dell'offerta scritta di fornire il Sorgente Corrispondente. Questa possibilit@`a
-@`e permessa soltanto occasionalmente e per fini non commerciali, e solo se tu
-hai ricevuto il codice oggetto assieme ad una tale offerta, in accordo alla
-sezione 6b.
-
-@item
-Distribuendo il codice oggetto mediante accesso da un luogo designato (gratis
-o dietro pagamento di un prezzo), e offrendo un accesso equivalente al
-Sorgente Corrispondente alla stessa maniera a partire dallo stesso luogo senza
-costi aggiuntivi. Non devi obbligare i destinatari a copiare il Sorgente
-Corrispondente assieme al codice oggetto. Se il luogo dal quale copiare il
-codice oggetto @`e un server di rete, il Sorgente Corrispondente pu@`o trovarsi su
-un server differente (gestito da te o da terze parti) che fornisca
-funzionalit@`a equivalenti per la copia, a patto che tu fornisca delle
-indicazioni chiare accanto al codice oggetto che indichino dove trovare il
-Sorgente Corrispondente. Indipendentemente da quale server ospiti il Sorgente
-Corrispondente, tu rimani obbligato ad assicurare che esso rimanga disponibile
-per tutto il tempo necessario a soddisfare queste condizioni.
-
-@item
-Distribuendo il codice oggetto mediante trasmissione peer-to-peer, a patto che
-tu informi gli altri peer circa il luogo in cui il codice oggetto e il
-Sorgente Corrispondente sono gratuitamente offerti al pubblico secondo i
-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
-obbligatoriamente inclusa nella distribuzione del codice oggetto del
-programma.
-
-Un ``Prodotto Utente'' @`e un (1) ``prodotto consumer'', cio@`e qualunque propriet@`a
-personale tangibile che @`e normalmente utilizzata per scopi personali,
-familiari o domestici, oppure (2) qualunque cosa progettata o venduta per
-essere utilizzata in ambiente domestico. Nella classificazione di un prodotto
-come ``prodotto consumer'', i casi dubbi andranno risolti in favore dell'ambito
-di applicazione. Per un dato prodotto ricevuto da un dato utente, ``normalmente
-utilizzato'' si riferisce ad un uso tipico o comune di quella classe di
-prodotti, indipendentemente dallo stato dell'utente specifico o dal modo in
-cui l'utente specifico utilizza, o si aspetta o ci si aspetta che utilizzi, il
-prodotto. Un prodotto @`e un ``prodotto consumer'' indipendentemente dal fatto che
-abbia usi commerciali, industriali o diversi da quelli ``consumer'', a meno che
-questi usi non rappresentino il solo modo utile di utilizzare il prodotto in
-questione.
-
-Le ``Informazioni di Installazione'' per un Prodotto Utente sono i metodi, le
-procedure, le chiavi di autorizzazioni o altre informazioni necessarie per
-installare ed eseguire versioni modificate di un programma coperto da questa
-Licenza all'interno di un Prodotto Utente, a partire da versioni modificate
-dei suoi Sorgenti Corrispondenti. Tali informazioni devono essere sufficienti
-ad assicurare che il funzionamento del codice oggetto modificato non sia in
-nessun caso proibito o ostacolato per il solo fatto che sono state apportate
-delle modifiche.
-
-Se distribuisci un codice oggetto secondo le condizioni di questa sezione in,
-o assieme, o specificatamente per l'uso in o con un Prodotto Utente, e la
-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
-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)
-
-La condizione che richiede di fornire delle Informazioni di Installazione non
-implica che venga fornito supporto, garanzia o aggiornamenti per un programma
-che @`e stato modificato o installato dal destinatario, o per il Prodotto Utente
-in cui esso @`e stato modificato o installato. L'accesso ad una rete pu@`o essere
-negato se le modifiche apportate impattano materialmente sull'operativit@`a
-della rete o se violano le regole e i protocolli di comunicazione attraverso
-la rete.
-
-Il Sorgente Corrispondente distribuito, e le Informazioni di Installazione
-fornite, in accordo con questa sezione, devono essere in un formato che sia
-pubblicamente documentato (e con una implementazione pubblicamente disponibile
-in formato di codice sorgente), e non devono richiedere speciali password o
-chiavi per essere spacchettate, lette o copiate.
-
-@item Condizioni Aggiuntive
-
-Le ``Condizioni Aggiuntive'' sono condizioni che completano le condizioni di
-questa Licenza permettendo delle eccezioni a una o pi@`u delle condizioni sopra
-elencate. Le condizioni aggiuntive che sono applicabili all'intero Programma
-devono essere considerate come se fossero incluse in questa Licenza, a patto
-che esse siano valide secondo le normative vigenti. Se alcune condizioni
-aggiuntive fanno riferimento soltanto ad alcune parti del Programma, quelle
-parti possono essere utilizzate separatamente sotto le stesse condizioni, ma
-l'intero Programma rimane sottoposto a questa Licenza senza riferimento ad
-alcuna condizione aggiuntiva.
-
-Quando distribuisci una copia di un programma coperto da questa Licenza, puoi,
-a tua discrezione, eliminare qualunque condizione aggiuntiva dalla copia, o da
-parte di essa. (Le Condizioni Aggiuntive possono essere scritte in maniera
-tale da richiedere la loro rimozione in certi casi di modifica del Programma).
-Puoi aggiungere Condizioni Aggiuntive su materiale, aggiunto da te ad un'opera
-coperta da questa Licenza, per il quale hai o puoi garantire un'adeguata
-licenza di copyright.
-
-Indipendentemente da qualunque altra condizione di questa Licenza, e per il
-materiale che aggiungi ad un'opera coperta da questa Licenza, puoi (se
-autorizzato dai legittimi detentori del copyright per il suddetto materiale)
-aggiungere alle condizioni di questa Licenza delle condizioni che:
-
-@enumerate a
-@item
-Negano la garanzia o limitano la responsabilit@`a del Programma in maniera
-differente da quanto riportato nelle sezioni 15 e 16 di questa Licenza; oppure
-
-@item
-Richiedono il mantenimento di specifiche e circostanziate informative legali o
-di note di attribuzione ad autori nel materiale o assieme alle Adeguate
-Informazioni Legali mostrate dal Programma che lo contiene; oppure
-
-@item
-Proibiscono di fornire informazioni errate o ingannevoli sull'origine e la
-provenienza del materiale in oggetto, o richiedono che versioni modificate di
-tale materiale siano appositamente marcate in maniera differente rispetto alla
-versione originale; oppure
-
-@item
-Limitano l'utilizzo per scopi pubblicitari del nome dei detentori del
-copyright o degli autori del materiale; oppure
-
-@item
-Rifiutano di garantire diritti secondo le leggi sulla propriet@`a intellettuale
-circa l'uso di nomi, marchi di fabbrica o similari; oppure
-
-@item
-Richiedono l'indennizzo dei detentori del copyright o degli autori del
-materiale in oggetto da parte di chi distribuisce il materiale (o versioni
-modificate dello stesso) con impegni contrattuali circa la responsabilit@`a nei
-confronti del destinatario, per qualunque responsabilit@`a che questi impegni
-contrattuali dovessero imporre direttamente ai suddetti detentori del
-copyright e autori.
-@end enumerate
-
-Tutte le altre condizioni addizionali non-permissive sono considerate
-``ulteriori restrizioni'', secondo il significato specificato alla sezione 10.
-Se il Programma o parti di esso contengono, all'atto della ricezione dello
-stesso, informative che specificano che esso @`e soggetto a questa Licenza
-assieme ad una condizione che @`e una ``ulteriore restrizione'', puoi rimuovere
-quest'ultima condizione. Se un documento di licenza contiene ulteriori
-restrizioni ma permette di rilicenziare o distribuire il Programma con questa
-Licenza, puoi aggiungere al Programma del materiale coperto dalle condizioni
-di quel documento di licenza, a patto che le ulteriori restrizioni non
-compaiano nelle versioni rilicenziate o ridistribuite.
-
-Se aggiungi ad un Programma coperto da questa Licenza delle condizioni
-aggiuntive in accordo con questa sezione, devi aggiungere anche, nei file
-sorgenti corrispondenti, un avviso che riassuma le condizioni aggiuntive
-applicate a quei file, ovvero un avviso che specifichi dove @`e possibile
-trovare copia delle condizioni aggiunte.
-
-Tutte le Condizioni aggiuntive, permissive o non-permissive, devono essere
-espresse nella forma di una licenza scritta e separata, o espresse
-esplicitamente come eccezioni; in entrambi i casi valgono le condizioni
-succitate.
-
-@item Cessazione di Licenza
-
-Non puoi propagare o modificare un programma coperto da questa Licenza in
-maniera diversa da quanto espressamente consentito da questa Licenza.
-Qualunque tentativo di propagare o modificare altrimenti il Programma @`e nullo,
-e provoca l'immediata cessazione dei diritti garantiti da questa Licenza
-(compresi tutte le eventuali licenze di brevetto garantite ai sensi del terzo
-paragrafo della sezione 11).
-
-In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la tua
-licenza da parte di un dato detentore del copyright viene ripristinata (a) in
-via cautelativa, a meno che e fino a quando il detentore del copyright non
-cessa esplicitamente e definitivamente la tua licenza, e (b) in via permanente
-se il detentore del copyright non ti notifica in alcun modo la violazione
-entro 60 giorni dalla cessazione della licenza.
-
-Inoltre, la tua licenza da parte di un dato detentore del copyright viene
-ripristinata in maniera permanente se il detentore del copyright ti notifica
-la violazione in maniera adeguata, se questa @`e la prima volta che ricevi una
-notifica di violazione di questa Licenza (per qualunque Programma) dallo
-stesso detentore di copyright, e se rimedi alla violazione entro 30 giorni
-dalla data di ricezione della notifica di violazione.
-
-La cessazione dei tuoi diritti come specificato in questa sezione non provoca
-la cessazione delle licenze di terze parti che abbiano ricevuto copie o
-diritti da te secondo questa Licenza. Se i tuoi diritti cessano e non sono
-ristabiliti in via permanente, non hai diritto di ricevere nuove licenze per
-lo stesso materiale, secondo quanto stabilito nella sezione 10.
-
-@item L'ottenimento di copie non richiede l'accettazione della Licenza
-
-Non sei obbligato ad accettare i termini di questa Licenza al solo fine di
-ottenere o eseguire una copia del Programma. Similmente, propagazioni
-collaterali di un Programma coperto da questa Licenza che occorrono come
-semplice conseguenza dell'utilizzo di trasmissioni peer-to-peer per la
-ricezione di una copia non richiedono l'accettazione della Licenza. In ogni
-caso, solo e soltanto questa Licenza ti garantiscono il permesso di propagare
-e modificare qualunque programma coperto da questa Licenza. Queste azioni
-violano le leggi sul copyright nel caso in cui tu non accetti questa Licenza.
-Pertanto, modificando o propagando un programma coperto da questa Licenza,
-indichi implicitamente la tua accettazione della Licenza.
-
-@item Licenza Automatica per i successivi destinatari
-
-Ogni qual volta distribuisci un programma coperto da questa Licenza, il
-destinatario riceve automaticamente una licenza, dal detentore originario del
-copyright, di eseguire, modificare e propagare il programma, nel rispetto di
-questa Licenza. Non sei ritenuto responsabile del rispetto di questa Licenza
-da parte di terze parti.
-
-Una ``transazione d'entit@`a'' @`e una transazione che trasferisce il controllo di
-una organizzazione, o sostanzialmente di tutti i suoi beni, che suddivide una
-organizzazione o che fonde pi@`u organizzazioni. Se la propagazione di un
-programma coperto da questa Licenza @`e conseguente ad una transazione di
-entit@`a, ciascuna parte che ha ruolo nella transazione e che riceve una copia
-del programma riceve allo stesso tempo qualsiasi licenza sul programma che i
-predecessori della parte possedevano o potevano rilasciare nel rispetto del
-paragrafo precedente, e in pi@`u il diritto di possesso del Sorgente
-Corrispondente del programma dal predecessore in interesse, se il predecessore
-lo possiede o se pu@`o ottenerlo senza troppe difficolt@`a.
-
-Non puoi imporre nessuna ulteriore restrizione sull'esercizio dei diritti
-garantiti o affermati da questa Licenza. Per esempio, non puoi imporre un
-prezzo di licenza, una royalty, o altri costi per l'esercizio dei diritti
-garantiti da questa Licenza, a non puoi dar corso ad una controversia (ivi
-incluse le controversie incrociate o la difesa in cause legali) affermando che
-siano stati violati dei brevetti a causa della produzione, dell'uso, della
-vendita, della messa in vendita o dell'importazione del Programma o di sue
-parti.
-
-@item Brevetti
-
-Un ``contribuente'' @`e un detentore di copyright che autorizza l'uso secondo
-questa Licenza di un Programma o di un'opera basata sul Programma. L'opera
-cos@`{@dotless{i}} licenziata viene chiamata ``versione del contribuente''.
-
-I ``diritti essenziali di brevetto'' da parte di un contribuente sono tutti i
-diritti di brevetto che appartengono o che sono controllati dal contribuente,
-che siano gi@`a acquisiti o che saranno acquisiti in futuro, che possano essere
-violati in qualche maniera, consentita da questa Licenza, generando,
-modificando o vendendo la versione del contribuente, ma non includono i
-diritti che possano essere violati soltanto come conseguenza di ulteriori
-modifiche alla versione del contribuente. In relazione a questa definizione,
-il termine ``controllo'' include il diritto di garantire sottolicenze di
-brevetto in maniera consistente con le condizioni di questa Licenza.
-
-Ciascun contribuente ti garantisce la licenza di brevetto sui diritti
-essenziali di brevetto del contribuente stesso non-esclusiva, valida in tutto
-il mondo, esente da royalty, di creare, usare, vendere, offrire in vendita,
-importare e altrimenti eseguire, modificare e propagare i contenuti della
-versione del contribuente.
-
-Nei tre paragrafi successivi, con ``licenza di brevetto'' si intende qualunque
-accordo o contratto, comunque denominato, di non rivendicazione di un brevetto
-(come per esempio un permesso esplicito di utilizzare un brevetto o un accordo
-di rinuncia alla persecuzione per violazione di brevetto). ``Garantire'' una
-tale licenza di brevetto ad una parte significa portare a termine un tale
-accordo o contratto di non rivendicazione di brevetto contro la parte.
-
-Se distribuisci un programma coperto da questa Licenza, confidando
-consapevolmente su una licenza di brevetto, e il Sorgente Corrispondente per
-il programma non @`e reso disponibile per la copia, senza alcun onere aggiuntivo
-e comunque nel rispetto delle condizioni di questa Licenza, attraverso un
-server di rete pubblicamente accessibile o tramite altri mezzi facilmente
-accessibili, allora devi (1) fare in modo che il Sorgente Corrispondente sia
-reso disponibile come sopra, oppure (2) fare in modo di rinunciare ai benefici
-della licenza di brevetto per quel particolare programma, oppure (3)
-adoperarti, in maniera consistente con le condizioni di questa Licenza, per
-estendere la licenza di brevetto a tutti i destinatari successivi. ``Confidare
-consapevolmente'' significa che tu sei attualmente cosciente che, eccettuata la
-licenza di brevetto, la distribuzione da parte tua di un programma protetto da
-questa Licenza in un paese, o l'utilizzo in un paese del programma coperto da
-questa Licenza da parte di un destinatario, pu@`o violare uno o pi@`u brevetti in
-quel paese che tu hai ragione di ritenere validi.
-
-Se, come conseguenza o in connessione con una singola transazione o con un
-dato accordo, distribuisci, o fai in modo di distribuire, un programma coperto
-da questa Licenza, e garantisci una licenza di brevetto per alcune delle parti
-che ricevono il Programma autorizzandole ad utilizzare, propagare, modificare
-o distribuire una specifica copia del Programma, allora la licenza di brevetto
-che fornisci @`e automaticamente estesa a tutti i destinatari del Programma
-coperto da questa Licenza e delle opere basate sul Programma.
-
-Una licenza di brevetto @`e ``discriminatoria'' se non include nell'ambito della
-sua copertura, proibisce l'esercizio, o @`e vincolata al non-esercizio di uno o
-pi@`u dei diritti che sono specificatamente garantiti da questa Licenza. Non
-puoi distribuire un Programma coperto da questa Licenza se sei parte di un
-accordo con una terza parte la cui attivit@`a comprende la distribuzione di
-software, secondo il quale tu sei costretto ad un pagamento alla parte terza
-in funzione della tua attivit@`a di distribuzione del Programma, e in
-conseguenza del quale la parte terza garantisce, a qualunque delle parti che
-riceveranno il Programma da te, una licenza di brevetto discriminatoria (a)
-assieme a copie del Programma coperto da questa Licenza distribuite da te (o
-ad altre copie fatte da codeste copie), oppure (b) principalmente per e in
-connessione con specifici prodotti o raccolte di prodotti che contengono il
-Programma, a meno che l'accordo non sia stato stipulato, o le licenze di
-brevetto non siano state rilasciate, prima del 28 Marzo 2007.
-
-Nessuna parte di questa Licenza pu@`o essere interpretata come atta ad escludere
-o limitare gli effetti di qualunque altra licenza o altri meccanismi di difesa
-dalla violazione che possano altrimenti essere resi disponibili dalla
-normativa vigente in materia di brevetti.
-
-@item Nessuna resa di libert@`a altrui
-
-Se ti vengono imposte delle condizioni (da un ordine giudiziario, da un
-accordo o da qualunque altra eventualit@`a) che contraddicono le condizioni di
-questa Licenza, non sei in nessun modo esonerato dal rispetto delle condizioni
-di questa Licenza. Se non puoi distribuire un Programma coperto da questa
-Licenza per sottostare simultaneamente agli obblighi derivanti da questa
-Licenza e ad altri obblighi pertinenti, allora non puoi distribuire il
-Programma per nessun motivo. Per esempio, se accetti delle condizioni che ti
-obbligano a richiedere il pagamento di una royalty per le distribuzioni
-successivamente effettuate da coloro ai quali hai distribuito il Programma,
-l'unico modo per soddisfare sia queste condizioni che questa Licenza @`e evitare
-del tutto la distribuzione del Programma.
-
-@item Utilizzo con la GNU Affero General Public License
-
-Indipendentemente da qualunque altra condizione espressa da questa Licenza,
-hai il permesso di collegare o combinare qualunque Programma coperto da questa
-Licenza con un'opera rilasciata sotto la versione 3 della licenza GNU Affero
-General Public License, ottenendo un singolo Programma derivato, e di
-distribuire il Programma risultante. Le condizioni di questa Licenza
-continuano a valere per le parti riguardanti il Programma che sono coperte da
-questa Licenza, mentre le condizioni speciali della GNU Affero General Public
-License, sezione 13, riguardanti l'interazione mediante rete, saranno
-applicate al Programma cos@`{@dotless{i}} risultante.
-
-@item Versioni rivedute di questa Licenza
-
-La Free Software Foundation pu@`o pubblicare delle versioni rivedute e/o delle
-nuove versioni della GNU General Public License di tanto in tanto. Tali
-versioni saranno simili, nello spirito, alla presente versione, ma potranno
-differire nei dettagli al fine di affrontare nuovi problemi e nuove
-situazioni.
-
-A ciascuna versione viene assegnato un numero identificativo di versione. Se
-il Programma specifica che si applica a s@`e stesso una certa versione della GNU
-General Public License, ``o qualunque altra versione successiva'', hai la
-possibilit@`a di sottostare alle condizioni di quella specifica versione o di
-qualunque altra versione successiva pubblicata dalla Free Software Foundation.
-Se il Programma non specifica un numero di versione della GNU General Public
-License, puoi scegliere qualunque versione della GNU General Public License
-pubblicata dalla Free Software Foundation.
-
-Se il Programma specifica che un sostituto o un procuratore pu@`o decidere quali
-versioni future della GNU General Public License posso essere utilizzate,
-allora tale scelta di accettazione di una data versione ti autorizza, in
-maniera permanente, ad utilizzare quella versione della Licenza per il
-Programma.
-
-Versioni successive della Licenza possono garantire diritti aggiuntivi o
-leggermente differenti. Ad ogni modo, nessun obbligo aggiuntivo viene imposto
-agli autori o ai detentori di copyright come conseguenza della tua scelta di
-adottare una versione successiva della Licenza.
-
-@item Rinuncia alla Garanzia
-
-NON C'@`E NESSUNA GARANZIA PER IL PROGRAMMA, PER QUANTO CONSENTITO DALLE
-VIGENTI NORMATIVE. ECCETTO QUANDO ALTRIMENTI STABILITO PER ISCRITTO, I
-DETENTORI DEL COPYRIGHT E/O LE ALTRE PARTI FORNISCONO IL PROGRAMMA ``COS@`I COME
-@`E'' SENZA GARANZIA DI ALCUN TIPO, N@'E ESPRESSA N@'E IMPLICITA, INCLUSE, MA NON
-LIMITATE A, LE GARANZIE DI COMMERCIABILIT@`A O DI UTILIZZABILIT@`A PER UN
-PARTICOLARE SCOPO. L'INTERO RISCHIO CONCERNENTE LA QUALIT@`A E LE PRESTAZIONI
-DEL PROGRAMMA @`E DEL LICENZIATARIO. SE IL PROGRAMMA DOVESSE RISULTARE
-DIFETTOSO, IL LICENZIATARIO SI ASSUME I COSTI DI MANUTENZIONE, RIPARAZIONE O
-CORREZIONE.
-
-@item Limitazione di Responsabilit@`a
-
-IN NESSUN CASO, A MENO CHE NON SIA RICHIESTO DALLA NORMATIVA VIGENTE O
-CONCORDATO PER ISCRITTO, I DETENTORI DEL COPYRIGHT, O QUALUNQUE ALTRA PARTE
-CHE MODIICA E/O DISTRIBUISCE IL PROGRAMMA SECONDO LE CONDIZIONI PRECEDENTI,
-POSSONO ESSERE RITENUTI RESPONSABILI NEI CONFRONTI DEL LICENZIATARIO PER
-DANNI, INCLUSO QUALUNQUE DANNEGGIAMENTO GENERICO, SPECIALE, INCIDENTALE O
-CONSEQUENZIALE DOVUTO ALL'USO O ALL'IMPOSSIBILIT@`A D'USO DEL PROGRAMMA
-(INCLUSI, MA NON LIMITATI A, LE PERDITE DI DATI, LA CORRUZIONE DI DATI, LE
-PERDITE SOSTENUTE DAL LICENZIATARIO O DA TERZE PARTI O L'IMPOSSIBILIT@`A DEL
-PROGRAMMA A FUNZIONARE ASSIEME AD ALTRI PROGRAMMI), ANCHE NEL CASO IN CUI IL
-DETENTORE O LE ALTRE PARTI SIANO STATI AVVISATI CIRCA LA POSSIBILIT@`A DI TALI
-DANNEGGIAMENTI.
-
-@item Interpretazione delle Sezioni 15 e 16
-
-Se la dichiarazione di garanzia e la limitazione di responsabilit@`a fornite
-precedentemente non hanno effetto legale in un paese a causa delle loro
-condizioni, le corti di giustizia devono applicare la norma locale che pi@`u si
-avvicini al rifiuto assoluto di qualsivoglia responsabilit@`a civile relativa al
-Programma, a meno che una garanzia o una assunzione di responsabilit@`a scritta
-non accompagni una copia del programma ottenuta dietro pagamento.
-@end enumerate
-
-@c fakenode --- for prepinfo
-@heading FINE DEI TERMINI E DELLE CONDIZIONI
-
-@c fakenode --- for prepinfo
-@heading Come applicare queste condizioni di Licenza ai vostri programmi
-
-Se sviluppi un nuovo programma, e vuoi che esso sia della massima utilit@`a, il
-modo migliore @`e renderlo software libero in modo che chiunque possa
-ridistribuirlo e modificarlo secondo i termini di questa Licenza.
-
-Per fare ci@`o, allega le seguenti note informative al programma. Il modo
-migliore @`e inserirle all'inizio di ciascun file sorgente, al fine di rimarcare
-adeguatamente la mancanza di garanzia; ciascun file dovrebbe inoltre contenere
-la dichiarazione di copyright e un riferimento al posto in cui @`e possibile
-ottenere la versione completa delle note informative.
-
-@smallexample
-@var{<una riga con nome del programma e breve descrizione di ci@`o che fa.>}
-Copyright (C) @var{<anno>} @var{<nome dell'autore>}
-
-Questo software @`e libero; lo puoi distribuire e/o modificare alle condizioni
-stabilite nella 'GNU General Public License' pubblicata dalla Free Software
-Foundation; fai riferimento alla versione 3 della Licenza, o (a tua scelta)
-a una qualsiasi versione successiva.
-
-Questo programma @`e distribuito con la speranza che sia utile, ma SENZA
-ALCUNA GARANZIA; senza neppure la garanzia implicita di COMMERCIABILIT@`A o
-IDONEIT@`A AD UN PARTICOLARE SCOPO. Si veda la 'GNU General Public License' per
-ulteriori dettagli.
-
-Dovresti aver ricevuto una copia della GNU General Public License assieme a
-questo programma; se non @`e cos@`{@dotless{i}}, si veda
-@url{http://www.gnu.org/licenses/}.
-@end smallexample
-
-Inoltre, aggiungi le informazioni necessarie a contattarti via posta ordinaria
-o via posta elettronica.
-
-Se il programma interagisce mediante terminale, fai in modo che visualizzi,
-quando viene avviato in modalit@`a interattiva, un breve messaggio come quello
-che segue:
-
-@smallexample
-@var{<programma>} Copyright (C) @var{<anno>} @var{<nome dell'autore>}
-Questo programma non ha ALCUNA GARANZIA; per dettagli usare il comando
-@samp{show w}.
-Questo @`e software libero, e ognuno @`e libero di ridistribuirlo
-sotto certe condizioni; usare il comando @samp{show c} per i dettagli.
-@end smallexample
-
-Gli ipotetici comandi @samp{show w} e @samp{show c} devono visualizzare le parti
-corrispondenti della GNU General Public License. Naturalmente i comandi del
-tuo programma potrebbero essere differenti; per una interfaccia di tipo GUI,
-dovresti usare un bottone ``About'' o ``Info''.
-
-Devi inoltre fare in modo che il tuo datore di lavoro (se lavori come
-programmatore presso terzi) o la tua scuola, eventualmente, firmino una
-``rinuncia al copyright'' sul programma, se necessario. Per maggiori
-informazioni su questo punto, e su come applicare e rispettare la GNU GPL,
-consultare la pagina @url{http://www.gnu.org/licenses/}.
-
-La GNU General Public License non consente di incorporare il programma
-all'interno di software proprietario. Se il tuo programma @`e una libreria di
-funzioni, potresti ritenere pi@`u opportuno consentire il collegamento tra
-software proprietario e la tua libreria. Se @`e questo ci@`o che vuoi, allora
-utilizza la GNU Lesser General Public License anzich@'e questa Licenza, ma prima
-leggi @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
-
-@ifclear FOR_PRINT
-@c The GNU Free Documentation License.
-@node Licenza per Documentazione Libera GNU (FDL)
-@unnumbered Licenza per Documentazione Libera GNU (FDL)
-@ifnotdocbook
-@center Versione 1.3, 3 Novembre 2008
-@end ifnotdocbook
-
-@docbook
-<subtitle>Versione 1.3, 3 Novembre 2008 </subtitle>
-@end docbook
-
-@cindex FDL (Free Documentation License)
-@cindex Free Documentation License (FDL)
-@cindex GNU Free Documentation License
-
-@c This file is intended to be included within another document,
-@c hence no sectioning command or @node.
-
-@display
-Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org}
-
-This is an unofficial translation of the GNU Free Documentation License into
-Italian. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU FDL—only
-the original English text of the GNU FDL does that. However, we hope that this
-translation will help Italian speakers understand the GNU FDL better.
-
-Questa @`e una traduzione non ufficiale della GNU Free Documentation License
-in italiano. Non @`e una pubblicazione della Free Software Foundation, e non
-ha validit@`a legale per i termini di distribuzione della documentazione che
-usa la GNU FDL; solo il testo originale inglese della GNU FDL ha tale
-validit@`a. Comunque, speriamo che questa traduzione aiuti chi parla
-italiano a comprendere meglio la GNU FDL.
-
-A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
-di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
-
-@end display
-
-@enumerate 0
-@item
-PREAMBOLO
-
-Lo scopo di questa licenza @`e di rendere @dfn{liberi} un manuale, un testo o
-altri documenti funzionali e utili, nel senso di assicurare a tutti la
-libert@`a effettiva di copiarli e ridistribuirli, con o senza modifiche, con
-o senza fini di lucro. In secondo luogo questa licenza prevede per autori
-ed editori il modo per ottenere il giusto riconoscimento del proprio
-lavoro, preservandoli dall'essere considerati responsabili per modifiche
-apportate da altri.
-
-Questa licenza garantisce il ``copyleft'': questo significa che i lavori che
-derivano dal documento originale devono essere ugualmente liberi. @`E il
-complemento alla Licenza Pubblica Generale GNU, che @`e una licenza di tipo
-``copyleft'' pensata per il software libero.
-
-Questa licenza @`e stata progettata appositamente per l'uso con manuali di
-software libero, perch@'e il software libero ha bisogno di documentazione
-libera: un programma libero dovrebbe accompagnarsi a manuali che
-forniscano le stesse libert@`a del software. Questa licenza non @`e limitata
-alla manualistica del software; pu@`o essere utilizzata per ogni testo che
-tratti un qualsiasi argomento e al di l@`a dell'avvenuta pubblicazione
-cartacea. Si raccomanda l'uso di questa licenza principalmente per opere
-che abbiano fini didattici o per manuali.
-
-@item
-APPLICABILIT@`A E DEFINIZIONI
-
-Questa licenza si applica a qualsiasi manuale o altra opera, su ogni tipo
-di supporto, che contenga la nota, posta dal detentore del copyright, che
-attesti la possibilit@`a di distribuzione secondo i termini di questa
-licenza. Tale nota permette universalmente, senza pagamento di diritti e
-senza limiti di durata di utilizzare il lavoro secondo le condizioni qui
-specificate. Con ``documento'', nel seguito ci si riferisce a qualsiasi
-manuale o opera. Ogni fruitore @`e un destinatario della licenza ed @`e ad
-esso che si fa riferimento. Si conviene che la licenza viene accettata se
-si copia, modifica o distribuisce il lavoro in una maniera tale da
-richiedere il permesso secondo le leggi sul copyright.
-
-Una ``versione modificata'' del documento @`e ogni opera contenente il
-documento stesso o parte di esso, sia riprodotto alla lettera che con
-modifiche, oppure traduzioni in un'altra lingua.
-
-Una ``sezione secondaria'' @`e un'appendice cui si fa riferimento o una
-premessa del documento e riguarda esclusivamente il rapporto dell'editore
-o dell'autore del documento con l'argomento generale del documento stesso
-(o argomenti affini) e non contiene nulla che possa essere compreso
-nell'argomento principale. (Perci@`o, se il documento @`e in parte un manuale
-di matematica, una sezione secondaria non pu@`o contenere spiegazioni di
-matematica). Il rapporto con l'argomento pu@`o essere un tema collegato
-storicamente con il soggetto principale o con soggetti affini, o essere
-costituito da argomentazioni legali, commerciali, filosofiche, etiche o
-politiche pertinenti.
-
-Le ``sezioni non modificabili'' sono alcune sezioni secondarie i cui titoli
-sono esplicitamente elencati come titoli delle sezioni non modificabili
-nella nota che indica che il documento @`e realizzato sotto questa licenza.
-Se una sezione non rientra nella precedente definizione di sezione
-secondaria, allora non @`e permesso che venga definita come non
-modificabile. Il documento pu@`o anche non contenere sezioni non
-modificabili. Se nel documento non vengono indicate sezioni non
-modificabili, allora significa che non ve ne sono.
-
-I ``testi di copertina'' sono dei brevi brani di testo che sono elencati,
-nella prima o quarta pagina di copertina, nella nota che indica che il
-documento @`e rilasciato sotto questa licenza. Il testo sulla prima di
-copertina pu@`o essere composto al massimo di 5 parole mentre quello sulla
-quarta di copertina pu@`o essere al massimo di 25 parole.
-
-Una copia ``trasparente'' indica una copia leggibile da un calcolatore,
-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
-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
-per intralciare o scoraggiare modifiche future da parte dei lettori non @`e
-trasparente. Un formato immagine non @`e trasparente se viene usato per
-rappresentare una notevole quantit@`a di testo. Una copia non ``trasparente''
-viene detta ``opaca''.
-
-Esempi di formati adatti per copie trasparenti sono l'@sc{ASCII} puro senza
-marcatori, il formato di ingresso per Texinfo, il formato di ingresso per
-La@TeX{}, @acronym{SGML} o @acronym{XML} accoppiati ad una @acronym{DTD}
-pubblica e disponibile, e i formati conformi agli standard @acronym{HTML}
-semplice, Postscript e @acronym{PDF} progettati per essere modificati
-manualmente. Esempio di formati immagine trasparenti includono il
-@acronym{PNG}, @acronym{XCF} e @acronym{JPG}. I formati opachi includono i
-formati proprietari che possono essere letti e modificati solo con word
-processor proprietari, @acronym{SGML} o @acronym{XML} per cui non @`e in
-genere disponibile la @acronym{DTD} o gli strumenti per il trattamento, e i
-formati @acronym{HTML}, Postscript e @acronym{PDF} generati automaticamente
-da qualche word processor esclusivamente come output.
-
-La ``pagina del titolo'' di un libro stampato indica la pagina del titolo
-stessa, pi@`u qualche pagina seguente per quanto necessario a contenere in
-modo leggibile, il materiale che la licenza prevede che compaia nella
-pagina del titolo. Per opere in formati in cui non sia contemplata
-esplicitamente la pagina del titolo, con ``pagina del titolo'' si intende il
-testo prossimo al titolo dell'opera, precedente l'inizio del corpo del
-testo.
-
-Il termine ``editore'' indica qualunque persona o entit@`a che distribuisce al
-pubblico copie del documento.
-
-Una sezione ``Intitolata XYZ'' significa una sottosezione con nome del
-documento il cui titolo sia precisamente XYZ o che contenga XYZ in
-parentesi dopo il testo che traduce XYZ in un'altra lingua (in questo caso
-XYZ sta per uno specifico nome di sezione menzionato sotto, come per i
-``Riconoscimenti'', ``Dediche'', ``Approvazioni'', o ``Storia''). Secondo questa
-definizione, ``preservare il titolo'' di tale sezione quando si modifica il
-documento, significa che essa rimane una sezione ``Intitolata XYZ''.
-
-Il Documento pu@`o includere dei limiti alla garanzia accanto alla nota
-affermante l'applicazione di questa licenza al documento. Questi limiti
-alla garanzia sono da considerare da includere come riferimento a questa
-licenza, ma solo per quanto riguarda le limitazioni alla garanzia: ogni
-altra implicazione che questi limiti alla garanzia possono avere @`e da
-considerarsi nulla e non ha effetto sul significato di questa licenza.
-
-@item
-COPIE LETTERALI
-
-Si pu@`o copiare e distribuire il documento con qualsiasi mezzo, con o senza
-fini di lucro, purch@'e tutte le copie contengano questa licenza, le note di
-copyright e l'avviso che questa licenza si applica al documento, e che non
-si aggiungano altre condizioni al di fuori di quelle della licenza stessa.
-Non si possono usare misure tecniche per impedire o controllare la lettura
-o la produzione di copie successive alle copie che si producono o
-distribuiscono. Si possono comunque accettare compensi per la copiatura.
-Se si distribuiscono un numero sufficiente di copie si devono seguire
-anche le condizioni della sezione 3.
-
-Alle stesse condizioni sopra menzionate si possono prestare copie e
-mostrarle pubblicamente.
-
-@item
-COPIARE IN NOTEVOLI QUANTIT@`A
-
-Se si pubblicano a mezzo stampa (o in formati che tipicamente posseggono
-copertine) pi@`u di 100 copie del documento, e la nota della licenza
-richiede uno o pi@`u testi di copertina, si devono includere nelle copie, in
-modo chiaro e leggibile, tutti i testi di copertina indicati: il testo
-della prima di copertina in prima di copertina e il testo di quarta di
-copertina in quarta di copertina. Ambedue devono identificare l'editore
-che pubblica il documento. La prima di copertina deve presentare il titolo
-completo con tutte le parole che lo compongono egualmente visibili ed
-evidenti. Si pu@`o aggiungere altro materiale alle copertine. Il copiare con
-modifiche limitate alle sole copertine, purch@'e si preservino il titolo e
-le altre condizioni viste in precedenza, @`e considerato alla stregua di
-copiare alla lettera.
-
-Se il testo richiesto per le copertine @`e troppo voluminoso per essere
-riprodotto in modo leggibile, se ne pu@`o mettere una prima parte (per
-quanto ragionevolmente pu@`o stare) in copertina, e continuare il resto
-nelle pagine immediatamente seguenti.
-
-Se si pubblicano o distribuiscono copie opache del documento in numero
-superiore a 100, si deve anche includere una copia trasparente leggibile
-da un calcolatore in ogni copia oppure menzionare in ogni copia opaca un
-indirizzo di rete di calcolatori pubblicamente accessibile che utilizzi un
-protocollo di rete standard pubblico, da cui si possa scaricare
-liberamente una copia trasparente completa del documento, senza materiale
-aggiuntivo. Se si adotta quest'ultima opzione, si deve prestare la giusta
-attenzione, nel momento in cui si inizia la distribuzione in quantit@`a
-elevata di copie opache, ad assicurarsi che la copia trasparente rimanga
-accessibile all'indirizzo stabilito fino ad almeno un anno dopo l'ultima
-distribuzione (direttamente o attraverso distributori o rivenditori) di
-quell'edizione al pubblico.
-
-@`E caldamente consigliato, bench@'e non obbligatorio, contattare l'autore del
-documento prima di distribuirne un numero considerevole di copie, per
-metterlo in grado di fornire una versione aggiornata del documento.
-
-@item
-MODIFICHE
-
-Si possono copiare e distribuire versioni modificate del documento
-rispettando le condizioni delle precedenti sezioni 2 e 3, purch@'e la
-versione modificata sia realizzata seguendo questa stessa licenza, con la
-versione modificata che svolga il ruolo del ``documento'', cos@`{@dotless{i}} da estendere
-la licenza sulla distribuzione e la modifica a chiunque ne possieda una
-copia. Inoltre nelle versioni modificate si deve:
-
-@enumerate A
-@item
-Usare nella pagina del titolo (e nelle copertine se ce ne sono) un titolo
-diverso da quello del documento, e da quelli di versioni precedenti (che
-devono essere elencati nella sezione storia del documento ove presenti).
-Si pu@`o usare lo stesso titolo di una versione precedente se l'editore di
-quella versione originale ne ha dato il permesso.
-
-@item
-Elencare nella pagina del titolo, come autori, una o pi@`u persone o gruppi
-responsabili in qualit@`a di autori delle modifiche nella versione
-modificata, insieme ad almeno cinque tra i principali autori del documento
-(tutti gli autori principali se sono meno di cinque), a meno che questi
-non abbiano acconsentito a liberarvi da quest'obbligo.
-
-@item
-Dichiarare nella pagina del titolo il nome dell'editore della versione
-modificata in qualit@`a di editore.
-
-@item
-Conservare tutte le note di copyright
-del documento originale.
-
-@item
-Aggiungere un'appropriata nota di copyright per
-le modifiche di seguito alle altre note di copyright.
-
-@item
-Includere, immediatamente dopo la nota di copyright, una nota di licenza
-che dia pubblicamente il permesso di usare la versione modificata nei
-termini di questa licenza, nella forma mostrata nell'Addendum alla fine di
-questo testo.
-
-@item
-Preservare in tale nota di licenza l'elenco completo di sezioni non
-modificabili e testi di copertina richiesti come previsto dalla licenza
-del documento.
-
-@item
-Includere una copia non modificata di questa licenza.
-
-@item
-Conservare la sezione intitolata ``Storia'', e il suo titolo, e aggiungere
-a questa un elemento che riporti almeno il titolo, l'anno, i nuovi autori,
-e gli editori della versione modificata come figurano nella pagina del
-titolo. Se non ci sono sezioni intitolate ``Storia'' nel documento,
-crearne una che riporti il titolo, gli autori, gli editori del documento
-come figurano nella pagina del titolo, quindi aggiungere un elemento che
-descriva la versione modificata come detto in precedenza.
-
-@item
-Conservare l'indirizzo in rete riportato nel documento, se c'@`e, al fine
-del pubblico accesso ad una copia trasparente, e possibilmente l'indirizzo
-in rete per le precedenti versioni su cui ci si @`e basati. Questi possono
-essere collocati nella sezione ``Storia''. Si pu@`o omettere un indirizzo di
-rete per un'opera pubblicata almeno quattro anni prima del documento
-stesso, o se l'originario editore della versione cui ci si riferisce ne d@`a
-il permesso.
-
-@item
-In ogni sezione di ``Ringraziamenti'' o ``Dediche'', si conservi il titolo
-della sezione, e all'interno della sezione tutta la sostanza e il tono di
-ognuno dei ringraziamenti ai contributori e/o le dediche ivi contenute.
-
-@item
-Si conservino inalterate le sezioni non modificabili del documento, nei
-propri testi e nei propri titoli. I numeri della sezione o equivalenti non
-sono considerati parte del titolo della sezione.
-
-@item
-Si cancelli ogni sezione intitolata ``Approvazioni''. Tale sezione non pu@`o
-essere inclusa nella versione modificata.
-
-@item
-Non si cambi il titolo di sezioni esistenti in ``Approvazioni'' o in modo
-tale che si possa creare confusione con i titoli di sezioni non
-modificabili.
-
-@item
-Si conservino tutti i limiti alla garanzia.
-@end enumerate
-
-
-
-Se la versione modificata comprende nuove sezioni di primaria
-importanza o appendici che ricadono in ``sezioni secondarie'', e non
-contengono materiale copiato dal documento, si ha facolt@`a di rendere non
-modificabili quante sezioni si voglia. Per fare ci@`o si aggiunga il loro
-titolo alla lista delle sezioni non modificabili nella nota di licenza
-della versione modificata. Questi titoli devono essere distinti dai titoli
-di ogni altra sezione.
-
-Si pu@`o aggiungere una sezione intitolata ``Approvazioni'', a patto che non
-contenga altro che le approvazioni alla versione modificata prodotte da
-vari soggetti--per esempio, affermazioni di revisione o che il testo @`e
-stato approvato da una organizzazione come la definizione normativa di uno
-standard.
-
-Si pu@`o aggiungere un brano fino a cinque parole come testo di prima di
-copertina e un brano fino a 25 parole come testo di quarta di copertina,
-alla fine dell'elenco dei testi di copertina nella versione modificata.
-Solamente un brano del testo di prima di copertina e uno del testo di
-quarta di copertina possono essere aggiunti (anche con adattamenti) da
-ciascuna persona o organizzazione. Se il documento include gi@`a un testo di
-copertina per la stessa copertina, precedentemente aggiunto o adattato da
-qualunque fruitore o dalla stessa organizzazione nel nome della quale si
-agisce, non se ne pu@`o aggiungere un altro, ma si pu@`o rimpiazzare il
-vecchio ottenendo l'esplicita autorizzazione dall'editore precedente che
-aveva aggiunto il testo di copertina.
-
-L'autore/i e l'editore/i del documento non danno, tramite questa licenza,
-il permesso di usare i loro nomi per pubblicizzare o asserire, anche
-implicitamente, la loro approvazione di ogni versione modificata.
-
-@item
-COMBINAZIONE DI DOCUMENTI
-
-Si pu@`o combinare il documento con altri pubblicati con questa licenza,
-seguendo i termini definiti nella precedente sezione 4 per le versioni
-modificate, a patto che si includa l'insieme di tutte le sezioni non
-modificabili di tutti i documenti originali, senza modifiche, e si
-elenchino tutte come sezioni non modificabili della combinazione di
-documenti nella licenza della stessa, mantenendo tutti i limiti alla
-garanzia.
-
-Nella combinazione @`e necessaria una sola copia di questa licenza, e pi@`u
-sezioni non modificabili possono essere rimpiazzate da una singola copia
-se identiche. Se ci sono pi@`u sezioni non modificabili con lo stesso nome
-ma contenuti differenti, si renda unico il titolo di ciascuna sezione
-aggiungendovi, alla fine e tra parentesi, il nome dell'autore o editore
-della sezione, se noti, o altrimenti un numero distintivo. Si facciano gli
-stessi aggiustamenti ai titoli delle sezioni nell'elenco delle sezioni non
-modificabili nella nota di copyright della combinazione.
-
-Nella combinazione si devono unire le varie sezioni intitolate ``Storia''
-nei vari documenti originali di partenza per formare una unica sezione
-intitolata ``Storia''; allo stesso modo si unisca ogni sezione intitolata
-``Ringraziamenti'', e ogni sezione intitolata ``Dediche''. Si devono eliminare
-tutte le sezioni intitolate ``Approvazioni''.
-
-@item
-RACCOLTE DI DOCUMENTI
-
-Si pu@`o produrre una raccolta che consista del documento e di altri
-documenti rilasciati sotto questa licenza, e rimpiazzare le singole copie
-di questa licenza nei vari documenti con una sola inclusa nella raccolta,
-solamente se si seguono le regole fissate da questa licenza per le copie
-alla lettera come se si applicassero a ciascun documento.
-
-Si pu@`o estrarre un singolo documento da tale raccolta e distribuirlo
-separatamente sotto questa licenza, solo se si inserisce una copia di
-questa licenza nel documento estratto e se si seguono tutte le altre
-regole fissate da questa licenza per le copie alla lettera del documento.
-
-@item
-AGGREGAZIONE A LAVORI INDIPENDENTI
-
-Un'unione del documento o sue derivazioni con altri documenti o lavori
-separati o indipendenti, all'interno di, o a formare un, archivio o un
-supporto, per la memorizzazione o la distribuzione, viene chiamato un
-``aggregato'' se il copyright risultante dall'unione non viene usato per
-limitare i diritti legali degli utilizzatori oltre a ci@`o che viene
-permesso dai singoli lavori. Quando il documento viene incluso in un
-aggregato, questa licenza non si applica ad altri lavori nell'aggregato
-che non siano essi stessi dei lavori derivati dal documento.
-
-Se le esigenze del testo di copertina della sezione 3 sono applicabili a
-queste copie del documento allora, se il documento @`e inferiore alla met@`a
-dell'intero aggregato i testi di copertina del documento possono essere
-piazzati in copertine che delimitano il documento all'interno
-dell'aggregato, o dell'equivalente elettronico delle copertine se il
-documento @`e in un formato elettronico. Altrimenti devono apparire nella
-copertina dell'intero aggregato.
-
-@item
-TRADUZIONE
-
-La traduzione @`e considerata un tipo di modifica, di conseguenza si possono
-distribuire traduzioni del documento nei termini della sezione 4.
-Rimpiazzare sezioni non modificabili con traduzioni richiede un
-particolare permesso da parte dei detentori del copyright, ma @`e possibile
-includere la traduzione di parti o di tutte le sezioni non modificabili in
-aggiunta alle versioni originali di queste sezioni. @`E possibile includere
-una traduzione di questa licenza, di tutte le avvertenze del documento e
-di tutti i limiti di garanzia, a condizione che si includa anche la
-versione originale in inglese della licenza completa, comprese le
-avvertenze e limitazioni di garanzia. In caso di discordanza tra la
-traduzione e la versione originale inglese di questa licenza o avvertenza
-o limitazione di garanzia, prevale sempre la versione originale inglese.
-
-Se una sezione del documento viene titolata ``Riconoscimenti'', ``Dediche'', o
-``Storia'', il requisito (sezione 4) di preservare il titolo (sezione 1)
-richieder@`a tipicamente il cambiamento del titolo.
-
-@item
-CESSAZIONE DELLA LICENZA
-
-Non si pu@`o sublicenziare il documento, copiarlo, modificarlo, o
-distribuirlo al di fuori dei termini espressamente previsti da questa
-licenza. Ogni altro tentativo di applicare una licenza al documento,
-copiarlo, modificarlo, o distribuirlo @`e nullo e pone fine automaticamente
-ai diritti previsti da questa licenza.
-
-In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la
-specifica licenza di un particolare detentore del copyright viene
-ripristinata (a) in via provvisoria, a meno che e fino a quando il
-detentore del copyright non faccia estinguere esplicitamente e
-definitivamente la licenza, e (b) in via permanente se il detentore del
-copyright non notifica in alcun modo la violazione entro 60 giorni dalla
-cessazione della licenza.
-
-Inoltre, la licenza di un dato detentore del copyright viene ripristinata
-in maniera permanente se quest'ultimo notifica la violazione in maniera
-adeguata, se si tratta della prima volta che si riceve una notifica di
-violazione della licenza (per qualsiasi opera) dallo stesso detentore di
-copyright, e se la violazione viene corretta entro 30 giorni dalla data di
-ricezione della notifica di violazione.
-
-La cessazione dei diritti come specificato in questa sezione non provoca
-la cessazione delle licenze di terze parti che abbiano ricevuto copie o
-diritti secondo questa licenza. Se i diritti sono cessati e non sono stati
-ristabiliti in via permanente, la ricezione di una copia dello stesso
-materiale, in tutto o in parte, non d@`a alcun diritto ad utilizzarlo.
-
-@item
-REVISIONI FUTURE DI QUESTA LICENZA
-
-La Free Software Foundation pu@`o occasionalmente pubblicare versioni nuove
-o rivedute della Licenza per Documentazione Libera GNU. Le nuove versioni
-saranno simili nello spirito alla versione attuale ma potrebbero
-differirne in qualche dettaglio per affrontare nuovi problemi e concetti.
-Si veda @uref{http://www.gnu.org/copyleft/}.
-
-Ad ogni versione della licenza viene dato un numero che la distingue. Se
-il documento specifica che si riferisce ad una versione particolare della
-licenza ``o ogni versione successiva'', si ha la possibilit@`a di seguire
-termini e condizioni sia della versione specificata che di ogni versione
-successiva pubblicata (non come bozza) dalla Free Software Foundation. Se
-il documento non specifica un numero di versione particolare di questa
-licenza, si pu@`o scegliere ogni versione pubblicata (non come bozza) dalla
-Free Software Foundation. Se il documento specifica che un delegato pu@`o
-decidere quale futura versione di questa licenza pu@`o essere utilizzata,
-allora la dichiarazione pubblica di accettazione della versione, da parte
-del delegato, autorizza in maniera permanente a scegliere tale versione
-per il documento.
-
-@item
-CAMBIO DI LICENZA
-
-Il termine ``sito per la collaborazione massiva multiautore'' (o ``sito
-MMC'')
-indica qualsiasi server web che pubblica opere sottoponibili a copyright e
-fornisce a chiunque appositi strumenti per modificare tali opere. Un wiki
-pubblico modificabile da chiunque @`e un esempio di server in questione. Una
-``collaborazione massiva multiautore'' (o ``MMC'') contenuta nel sito indica
-un qualunque insieme di opere sottoponibili a copyright pubblicate sul
-sito MMC.
-
-Il termine ``CC-BY-SA'' indica la licenza Creative Commons Attribution-Share
-Alike 3.0 pubblicata dalla Creative Commons Corporation, un'organizzazione
-senza fini di lucro con sede principale a San Francisco, California, come
-anche le future versioni di tale licenza pubblicate dalla stessa
-organizzazione.
-
-``Incorporare'' significa pubblicare o ripubblicare un documento in tutto o
-in parte, come parte di un altro documento.
-
-Una MMC @`e ``qualificata a cambiare questa licenza'' se ha adottato questa
-licenza e se tutte le opere precedentemente pubblicate con questa licenza
-altrove rispetto alla MMC e successivamente incorporate del tutto o in
-parte nella MMC (1) non hanno testo di copertina o sezioni invarianti e
-(2) sono state incorporate prima del 1° Novembre 2008.
-
-L'operatore di un sito MMC pu@`o ripubblicare un MMC contenuto nel sito con
-una CC-BY-SA nello stesso sito in qualsiasi momento prima del 1° Agosto
-2009, da parte di una MMC qualificata a cambiare questa licenza.
-
-@end enumerate
-
-@c fakenode --- for prepinfo
-@unnumberedsec ADDENDUM: Come usare questa licenza per i vostri documenti
-
-Per applicare questa licenza ad un documento che si @`e scritto, si includa
-una copia della licenza nel documento e si inserisca la seguente nota di
-copyright appena dopo la pagina del titolo:
-
-@smallexample
-@group
- Copyright (C) @var{<anno>} @var{<il vostro nome>}
- @`E permesso copiare, distribuire e/o modificare questo documento
- seguendo i termini della ``Licenza per documentazione libera GNU'', versione 1.3
- o ogni versione successiva pubblicata dalla Free Software Foundation;
- senza sezioni non modificabili, senza testi di prima di copertina e di quarta di copertina.
- Una copia della licenza @`e inclusa nella sezione intitolata
- ``Licenza per la documentazione libera GNU''.
-@end group
-@end smallexample
-
-Se ci sono sezioni non modificabili, testi di prima di copertina e di
-quarta di copertina, scrivere nella parte ``with@dots{} di copertina'' il testo seguente:
-
-@smallexample
-@group
- con le seguenti sezioni non modificabili @var{lista dei loro titoli},
- con i seguenti testi di prima di copertina @var{elenco},
- e con i seguenti testi di quarta di copertina @var{elenco},
-@end group
-@end smallexample
-
-Se esistono delle sezioni non modificabili ma non i testi di copertina, o
-qualche altra combinazione dei tre elementi sopra riportati, fondere
-assieme le due alternative in modo da conformarsi alla situazione descritta.
-
-Se il vostro documento contiene esempi non banali di programma in codice
-sorgente si raccomanda di rilasciare gli esempi contemporaneamente
-applicandovi anche una licenza di software libero di vostra scelta, come
-per esempio la Licenza Pubblica Generica GNU, al fine di permetterne l'uso
-come software libero.
-
-@end ifclear
-
-@ifnotdocbook
-@node Indice analitico
-@unnumbered Indice analitico
-@end ifnotdocbook
-@printindex cp
-
-@bye
-
-Unresolved Issues:
-------------------
-1. From ADR.
-
- Robert J. Chassell points out that awk programs should have some indication
- of how to use them. It would be useful to perhaps have a "programming
- style" section of the manual that would include this and other tips.
-
-Consistency issues:
- /.../ regexps are in @code, not @samp
- ".." strings are in @code, not @samp
- no @print before @dots
- values of expressions in the text (@code{x} has the value 15),
- should be in roman, not @code
- Use TAB and not tab
- Use ESC and not ESCAPE
- Use space and not blank to describe the space bar's character
- The term "blank" is thus basically reserved for "blank lines" etc.
- To make dark corners work, the @value{DARKCORNER} has to be outside
- closing `.' of a sentence and after (pxref{...}).
- " " should have an @w{} around it
- Use "non-" only with language names or acronyms, or the words bug and option and null
- Use @command{ftp} when talking about anonymous ftp
- Use uppercase and lowercase, not "upper-case" and "lower-case"
- or "upper case" and "lower case"
- Use "single precision" and "double precision", not "single-precision" or "double-precision"
- Use alphanumeric, not alpha-numeric
- Use POSIX-compliant, not POSIX compliant
- Use --foo, not -Wfoo when describing long options
- Use "Bell Laboratories", but not "Bell Labs".
- Use "behavior" instead of "behaviour".
- Use "coprocess" instead of "co-process".
- Use "zeros" instead of "zeroes".
- Use "nonzero" not "non-zero".
- Use "runtime" not "run time" or "run-time".
- Use "command-line" as an adjective and "command line" as a noun.
- Use "online" not "on-line".
- Use "whitespace" not "white space".
- Use "Input/Output", not "input/output". Also "I/O", not "i/o".
- Use "lefthand"/"righthand", not "left-hand"/"right-hand".
- Use "workaround", not "work-around".
- Use "startup"/"cleanup", not "start-up"/"clean-up"
- Use "filesystem", not "file system"
- Use @code{do}, and not @code{do}-@code{while}, except where
- actually discussing the do-while.
- Use "versus" in text and "vs." in index entries
- Use @code{"C"} for the C locale, not ``C'' or @samp{C}.
- The words "a", "and", "as", "between", "for", "from", "in", "of",
- "on", "that", "the", "to", "with", and "without",
- should not be capitalized in @chapter, @section etc.
- "Into" and "How" should.
- Search for @dfn; make sure important items are also indexed.
- "e.g." should always be followed by a comma.
- "i.e." should always be followed by a comma.
- The numbers zero through ten should be spelled out, except when
- talking about file descriptor numbers. > 10 and < 0, it's
- ok to use numbers.
- For most cases, do NOT put a comma before "and", "or" or "but".
- But exercise taste with this rule.
- Don't show the awk command with a program in quotes when it's
- just the program. I.e.
-
- {
- ....
- }
-
- not
- awk '{
- ...
- }'
-
- Do show it when showing command-line arguments, data files, etc, even
- if there is no output shown.
-
- Use numbered lists only to show a sequential series of steps.
-
- Use @code{xxx} for the xxx operator in indexing statements, not @samp.
- Use MS-Windows not MS Windows
- Use MS-DOS not MS DOS
- Use an empty set of parentheses after built-in and awk function names.
- Use "multiFOO" without a hyphen.
- Use "time zone" as two words, not "timezone".
-
-Date: Wed, 13 Apr 94 15:20:52 -0400
-From: rms@gnu.org (Richard Stallman)
-To: gnu-prog@gnu.org
-Subject: A reminder: no pathnames in GNU
-
-It's a GNU convention to use the term "file name" for the name of a
-file, never "pathname". We use the term "path" for search paths,
-which are lists of file names. Using it for a single file name as
-well is potentially confusing to users.
-
-So please check any documentation you maintain, if you think you might
-have used "pathname".
-
-Note that "file name" should be two words when it appears as ordinary
-text. It's ok as one word when it's a metasyntactic variable, though.
-
-------------------------
-ORA uses filename, thus the macro.
-
-Suggestions:
-------------
-
-Better sidebars can almost sort of be done with:
-
- @ifdocbook
- @macro @sidebar{title, content}
- @inlinefmt{docbook, <sidebar><title>}
- \title\
- @inlinefmt{docbook, </title>}
- \content\
- @inlinefmt{docbook, </sidebar>}
- @end macro
- @end ifdocbook
-
-
- @ifnotdocbook
- @macro @sidebar{title, content}
- @cartouche
- @center @b{\title\}
-
- \content\
- @end cartouche
- @end macro
- @end ifnotdocbook
-
-But to use it you have to say
-
- @sidebar{Title Here,
- @include file-with-content
- }
-
-which sorta sucks.
-
-TODO:
-Check that all dark corners are indexed properly.
-
diff --git a/doc/it/gawk.texi b/doc/it/gawk.texi
deleted file mode 100644
index ea3fd2f8..00000000
--- a/doc/it/gawk.texi
+++ /dev/null
@@ -1,46902 +0,0 @@
-% ****************************************************
-% * DO NOT MODIFY THIS FILE!!!! *
-% * It was generated from gawktexi.in by sidebar.awk *
-% * Edit gawktexi.in instead. *
-% ****************************************************
-\language=30
-\input texinfo @c -*-texinfo-*-
-@c vim: filetype=texinfo
-@c %**start of header (This is for running Texinfo on a region.)
-@setfilename gawk-it.info
-@settitle Guida Utente di GNU Awk
-@documentlanguage it
-@c %**end of header (This is for running Texinfo on a region.)
-
-@dircategory Creazione e manipolazione di testi
-@direntry
-* Gawk: (gawk). Un linguaggio per scandire ed elaborare testi.
-@end direntry
-@dircategory Programmi di utilit@`a individuale
-@direntry
-* awk: (gawk)Avviare gawk. Scansione e processo di testi.
-@end direntry
-
-@c Enable better indexing, requires texindex from Texinfo 6 or later.
-@tex
-\global\usebracesinindexestrue
-@end tex
-
-@ifset FOR_PRINT
-@tex
-\gdef\xrefprintnodename#1{``#1''}
-@end tex
-@end ifset
-
-@ifclear FOR_PRINT
-@c With early 2014 texinfo.tex, restore PDF links and colors
-@tex
-\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
-\gdef\urlcolor{0.5 0.09 0.12} % Also
-\global\urefurlonlylinktrue
-@end tex
-@end ifclear
-
-@ifnotdocbook
-@set BULLET @bullet{}
-@set MINUS @minus{}
-@end ifnotdocbook
-
-@ifdocbook
-@set BULLET
-@set MINUS
-@end ifdocbook
-
-@set xref-automatic-section-title
-
-@c The following information should be updated here only!
-@c This sets the edition of the document, the version of gawk it
-@c applies to and all the info about who's publishing this edition
-
-@c These apply across the board.
-@c Aggiornata alla versione del 3 marzo 2017
-@set UPDATE-MONTH gennaio 2017
-@set VERSION 4.1
-@set PATCHLEVEL 4
-
-@c added Italian hyphenation stuff
-@hyphenation{ven-go-no o-met-te-re o-met-ten-do}
-
-@set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
-@ifset FOR_PRINT
-@set TITLE Programmare efficacemente in awk
-@end ifset
-@ifclear FOR_PRINT
-@set TITLE GAWK: Programmare efficacemente in AWK
-@end ifclear
-@set SUBTITLE Una Guida Utente per GNU Awk
-@set EDITION 4.1
-
-@iftex
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@ifclear SMALLPRINT
-@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
-@end ifclear
-@ifset SMALLPRINT
-@set DARKCORNER @inmargin{@image{lflashlight,0.7cm}, @image{rflashlight,0.7cm}}
-@end ifset
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end iftex
-@ifinfo
-@set DOCUMENT File Info
-@set CHAPTER nodo principale
-@set APPENDIX nodo principale
-@set SECTION nodo secondario
-@set SECTIONS nodi secondari
-@set SUBSECTION nodo
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE videata
-@end ifinfo
-@ifhtml
-@set DOCUMENT Documento
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE videata
-@end ifhtml
-@ifdocbook
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifdocbook
-@ifxml
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifxml
-@ifplaintext
-@set DOCUMENT libro
-@set CHAPTER capitolo
-@set APPENDIX appendice
-@set SECTION sezione
-@set SECTIONS sezioni
-@set SUBSECTION sottosezione
-@set DARKCORNER (a.b.)
-@set COMMONEXT (e.c.)
-@set PAGE pagina
-@end ifplaintext
-
-@ifdocbook
-@c empty on purpose
-@set PART1
-@set PART2
-@set PART3
-@set PART4
-@end ifdocbook
-
-@ifnotdocbook
-@set PART1 Parte I:@*
-@set PART2 Parte II:@*
-@set PART3 Parte III:@*
-@set PART4 Parte IV:@*
-@end ifnotdocbook
-
-@c some special symbols
-@iftex
-@set LEQ @math{@leq}
-@set PI @math{@pi}
-@end iftex
-@ifdocbook
-@set LEQ @inlineraw{docbook, &le;}
-@set PI @inlineraw{docbook, &pgr;}
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@set LEQ <=
-@set PI @i{pi}
-@end ifnotdocbook
-@end ifnottex
-
-@ifnottex
-@ifnotdocbook
-@macro ii{text}
-@i{\text\}
-@end macro
-@end ifnotdocbook
-@end ifnottex
-
-@ifdocbook
-@macro ii{text}
-@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
-@end macro
-@end ifdocbook
-
-@ifclear FOR_PRINT
-@set FN nome-file
-@set FFN Nome-file
-@c for Italian plurals {FN}s
-@set FNS nomi-file
-@set FFNS Nomi-file
-@set DF file-dati
-@set DDF File-dati
-@set PVERSION versione
-@end ifclear
-@ifset FOR_PRINT
-@set FN nome-file
-@set FFN Nome-File
-@c for Italian plurals {FN}s
-@set FNS nomi-file
-@set FFNS Nomi-file
-@set DF file-dati
-@set DDF File-dati
-@set PVERSION Versione
-@end ifset
-
-@c For HTML, spell out email addresses, to avoid problems with
-@c address harvesters for spammers.
-@ifhtml
-@macro EMAIL{real,spelled}
-``\spelled\''
-@end macro
-@end ifhtml
-@ifnothtml
-@macro EMAIL{real,spelled}
-@email{\real\}
-@end macro
-@end ifnothtml
-
-@c Indexing macros
-@ifinfo
-
-@macro cindexawkfunc{name}
-@cindex @code{\name\}
-@end macro
-
-@macro cindexgawkfunc{name}
-@cindex @code{\name\}
-@end macro
-
-@end ifinfo
-
-@ifnotinfo
-
-@macro cindexawkfunc{name}
-@cindex @code{\name\()}, funzione
-@end macro
-
-@macro cindexgawkfunc{name}
-@cindex @code{\name\()}, funzione (@command{gawk})
-@end macro
-@end ifnotinfo
-
-@ignore
-Some comments on the layout for TeX.
-1. Use at least texinfo.tex 2016-02-05.07.
-@end ignore
-
-@c merge the function and variable indexes into the concept index
-@ifinfo
-@synindex fn cp
-@synindex vr cp
-@end ifinfo
-@iftex
-@syncodeindex fn cp
-@syncodeindex vr cp
-@end iftex
-@ifxml
-@syncodeindex fn cp
-@syncodeindex vr cp
-@end ifxml
-@ifdocbook
-@synindex fn cp
-@synindex vr cp
-@end ifdocbook
-
-@c If "finalout" is commented out, the printed output will show
-@c black boxes that mark lines that are too long. Thus, it is
-@c unwise to comment it out when running a master in case there are
-@c overfulls which are deemed okay.
-
-@iftex
-@finalout
-@end iftex
-
-@copying
-@docbook
-<para>
-&ldquo;To boldly go where no man has gone before&rdquo;
-(&ldquo;Per arrivare l@`a dove nessun uomo @`e mai giunto prima&rdquo;)
-@`e un Marchio Registrato della Paramount Pictures Corporation.</para>
-
-<para>Titolo originale:</para>
-@b{Gawk: Effective AWK Programming}@*
-@i{A User's Guide for GNU Awk}
-
-<para>Published by:</para>
-<literallayout class="normal">Free Software Foundation
-51 Franklin Street, Fifth Floor -- Boston, MA 02110-1301 USA
-Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email>
-URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink></literallayout>
-
-<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2017
-Free Software Foundation, Inc.
-All Rights Reserved.
-</literallayout>
-
-</para>Traduzione e revisione:<para>
-<literallayout class="normal">
-Antonio Giovanni Colombo -- <email>azc100(chiocciola)gmail(punto)com</email>
-Marco Curreli -- <email>marcocurreli(chiocciola)tiscali(punto)it</email>
-(Italian Linux Documentation Project (<ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink>)
-</literallayout>
-
-<para>Pubblicato da:</para>
-<literallayout class="normal">Free Software Foundation
-Email: <email>gnu@@gnu.org</email>
-URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink>
-
-e da:
-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 &copy; 2016
-Free Software Foundation, Inc.
-All Rights Reserved.
-</literallayout>
-@end docbook
-
-@ifnotdocbook
-@iftex
-Copyright @copyright{} 2017 -- Free Software Foundation, Inc.
-@end iftex
-@end ifnotdocbook
-@sp 2
-Questa @`e l'Edizione @value{EDITION} di @cite{@value{TITLE}: @value{SUBTITLE}},
-per la versione @value{VERSION}.@value{PATCHLEVEL} (o successiva)
-dell'implementazione GNU di AWK.
-@ifnottex
-@ifnotxml
-@ifnotdocbook
-(Titolo originale: @i{Gawk: Effective AWK Programming: A User's Guide for GNU Awk.)}
-@end ifnotdocbook
-@end ifnotxml
-@end ifnottex
-
-@`E garantito il permesso di copiare, distribuire e/o modificare questo
-documento seguendo i termini della Licenza per Documentazione Libera
-GNU, Versione 1.3 o ogni versione successiva pubblicata dalla Free
-Software Foundation; con le Sezioni Non Modificabili ``GNU General
-Public License'', con i testi di copertina ``Un Manuale GNU'', e con i
-testi di quarta di copertina come in (a) pi@`u avanti.
-@ifclear FOR_PRINT
-Una copia della licenza @`e acclusa nella sezione intitolata
-"Licenza per Documentazione Libera GNU".
-@end ifclear
-@ifset FOR_PRINT
-Una copia della licenza
-si pu@`o trovare in internet all'indirizzo
-@uref{http://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
-il sito web del Progetto GNU}.
-@end ifset
-
-@enumerate a
-@item
-Il testo di quarta di copertina della FSF @`e: ``@`E garantito il permesso di
-copiare e modificare questo manuale GNU.''
-@end enumerate
-@end copying
-
-@c Comment out the "smallbook" for technical review. Saves
-@c considerable paper. Remember to turn it back on *before*
-@c starting the page-breaking work.
-
-@c 4/2002: Karl Berry recommends commenting out this and the
-@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
-@c if they want to waste paper.
-@c @smallbook
-
-
-@c Uncomment this for the release. Leaving it off saves paper
-@c during editing and review.
-@setchapternewpage odd
-
-@shorttitlepage GNU Awk
-@titlepage
-@title @value{TITLE}
-@subtitle @value{SUBTITLE}
-@subtitle Edizione @value{EDITION}
-@subtitle @value{UPDATE-MONTH}
-@author Arnold D. Robbins
-
-@ifnotdocbook
-@c Include the Distribution inside the titlepage environment so
-@c that headings are turned off. Headings on and off do not work.
-
-@page
-@vskip 0pt plus 1filll
-``To boldly go where no man has gone before''
-(``Per arrivare l@`a dove nessun uomo @`e mai giunto prima'')
-@`e un Marchio Registrato della Paramount Pictures Corporation. @*
-@c sorry, i couldn't resist
-@sp 1
-Titolo originale:@*
-@b{Gawk: Effective AWK Programming}@*
-@i{A User's Guide for GNU Awk}
-@sp 0
-Published by @strong{Free Software Foundation}@*
-51 Franklin Street, Fifth Floor -- Boston, MA 02110-1301 USA @*
-Tel.: +1-617-542-5942 -- Fax: +1-617-542-2652 -- Email: @email{gnu@@gnu.org} @*
-URL: @uref{http://www.gnu.org/}
-@sp 0
-@c This one is correct for gawk 3.1.0 from the FSF
-ISBN 1-882114-28-0
-@sp 0
-Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
-Free Software Foundation, Inc.
-@sp 1
-Traduzione e revisione:@*
-Antonio Giovanni Colombo -- @email{azc100(chiocciola)gmail(punto)com}@*
-Marco Curreli -- @email{marcocurreli(chiocciola)tiscali(punto)it}@*
-(Italian Linux Documentation Project -- @uref{http://www.pluto.it/ildp})
-@sp 1
-Pubblicato da:
-Free Software Foundation@*
-Email: @email{gnu@@gnu.org}; URL: @uref{http://www.gnu.org/}
-
-e da:
-Italian Linux Documentation Project (ILDP)@*
-Email: @email{ildp@@pluto.it}; URL: @uref{http://www.pluto.it/ildp}
-
-@insertcopying
-@sp 1
-@end ifnotdocbook
-@end titlepage
-
-@c Thanks to Bob Chassell for directions on doing dedications.
-@iftex
-@headings off
-@page
-@w{ }
-@sp 9
-
-@ifclear SMALLPRINT
-@center @i{Ai miei genitori, per il loro amore, e per lo splendido esempio che mi hanno dato.}
-@sp 1
-@center @i{A mia moglie, Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme a me.}
-@sp 1
-@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka, per aver arricchito le nostre vite in misura incalcolabile.}
-@end ifclear
-
-@ifset SMALLPRINT
-@center @i{Ai miei genitori, per il loro amore,}
-@center @i{ e per lo splendido esempio che mi hanno dato.}
-@sp 1
-@center @i{A mia moglie, Miriam, per avermi reso completo.} @*
-@center @i{ Grazie per aver costruito la tua vita insieme a me.}
-@sp 1
-@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka,}
-@center @i{per aver arricchito le nostre vite in misura incalcolabile.}
-@end ifset
-
-@sp 1
-@w{ }
-@page
-@w{ }
-@page
-@headings on
-@end iftex
-
-@docbook
-<dedication>
-<para>Ai miei genitori, per il loro amore, e per lo splendido
-esempio che mi hanno dato.</para>
-<para>A mia moglie Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme con me.</para>
-<para>Ai nostri figli Chana, Rivka, Nachum e Malka,
-per aver arricchito le nostre vite in misura incalcolabile.</para>
-</dedication>
-@end docbook
-
-@iftex
-@headings off
-@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
-@oddheading @| @| @strong{@thischapter}@ @ @ @thispage
-@end iftex
-
-@ifnottex
-@ifnotxml
-@ifnotdocbook
-@node Top
-@top Introduzione Generale
-@c Preface node should come right after the Top
-@c node, in `unnumbered' sections, then the chapter, `What is gawk'.
-@c Licensing nodes are appendices, they're not central to AWK.
-
-Questo file documenta @command{awk}, un programma che si pu@`o usare per
-selezionare dei record determinati in un file ed eseguire azioni su di essi.
-
-@noindent
-Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2017 @*
-Free Software Foundation, Inc.
-
-@noindent
-Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, Inc.
-
-
-@insertcopying
-
-@end ifnotdocbook
-@end ifnotxml
-@end ifnottex
-
-@menu
-* Introduzione3:: Alcune parole gentili riguardo a questo
- @value{DOCUMENT}.
-* Introduzione4:: Ulteriori parole gentili.
-* Prefazione:: Di cosa tratta questo @value{DOCUMENT};
- breve storia e ringraziamenti.
-* Per iniziare:: Un'introduzione elementare all'uso di
- @command{awk}. Come eseguire un programma
- @command{awk}. Sintassi della riga di
- comando.
-* Invocare Gawk:: Come eseguire @command{gawk}.
-* Espressioni regolari:: Tutto quel che c'@`e da sapere
- sull'individuazione di stringhe tramite
- espressioni regolari.
-* Leggere file:: Come leggere file e manipolare campi.
-* Stampare:: Come stampare usando @command{awk}.
- Descrizione delle istruzioni @code{print} e
- @code{printf}. @`E descritta inoltre la
- ridirezione dell'output.
-* Espressioni:: Le espressioni sono i componenti elementari
- delle istruzioni.
-* Criteri di ricerca e azioni:: Panoramica sui criteri di ricerca e sulle
- azioni.
-* Vettori:: La descrizione e l'uso dei vettori. Sono
- inoltre descritte le istruzioni di controllo
- relative ai vettori.
-* Funzioni:: Funzioni predefinite e definite dall'utente.
-* Funzioni di libreria:: Una libreria di funzioni di @command{awk}.
-* Programmi di esempio:: Molti programmi @command{awk} con
- spiegazioni dettagliate.
-* Funzionalit@`a avanzate:: Roba per utenti sofisticati, propria di
- @command{gawk}.
-* Internazionalizzazione:: Come far s@`{@dotless{i}} che @command{gawk} parli la
- vostra lingua.
-* Debugger:: Il debugger di @command{gawk}.
-* Calcolo con precisione arbitraria:: Calcolo con precisione arbitraria in
- @command{gawk}.
-* Estensioni dinamiche:: Aggiungere nuove funzioni predefinite di
- @command{gawk}.
-* Storia del linguaggio:: L'evoluzione del linguaggio @command{awk}.
-* Installazione:: Installare @command{gawk} in vari sistemi
- operativi.
-* Note:: Note riguardo ad aggiunte a @command{gawk}
- e possibili futuri sviluppi.
-* Concetti fondamentali:: Velocissima introduzione alla
- programmazione.
-* Glossario:: Spiegazione di alcuni termini poco
- familiari.
-* Copia:: Il vostro diritto a copiare e distribuire
- @command{gawk}.
-* Licenza per Documentazione Libera GNU (FDL):: La licenza per questo
- @value{DOCUMENT}.
-* Indice analitico:: Indice dei concetti e delle variabili.
-
-@detailmenu
-* Storia:: La storia di @command{gawk} e
- @command{awk}.
-* Nomi:: Che nome usare per trovare
- @command{awk}.
-* Questo manuale:: Uso di questo @value{DOCUMENT}.
- Comprende esempi di file in input
- utilizzabili.
-* Convenzioni:: Convenzioni tipografiche.
-* Storia del manuale:: Breve storia del progetto GNU e di
- questo @value{DOCUMENT}.
-* Come contribuire:: Un aiuto per la salvezza del mondo.
-* Ringraziamenti:: Ringraziamenti.
-* Eseguire gawk:: Come eseguire programmi
- @command{gawk}; comprende la sintassi
- della riga di comando.
-* Monouso:: Eseguire un breve programma
- @command{awk} di tipo usa-e-getta.
-* Leggere dal terminale:: Senza uso di file in input (input
- immesso da tastiera).
-* Lunghi:: Mettere programmi @command{awk}
- permanenti in file.
-* @dfn{Script} eseguibili:: Preparare programmi @command{awk}
- da eseguire come @dfn{script}.
-* Commenti:: Aggiungere documentazione a programmi
- @command{gawk}.
-* Protezione:: Ulteriore discussione di problemi
- connessi alle protezioni nella shell.
-* Doppi apici in DOS:: Doppi apici in file .BAT Windows
-* File dati di esempio:: File di dati di esempio da usare nei
- programmi @command{awk} illustrati in
- questo @value{DOCUMENT}.
-* Molto semplice:: Un esempio molto semplice.
-* Due regole:: Un esempio meno semplice di programma
- di una riga, che usa due regole.
-* Maggiore sofisticazione:: Un esempio pi@`u complesso.
-* Istruzioni/Righe:: Suddividere o riunire istruzioni
- su [una o pi@`u] righe.
-* Altre funzionalit@`a:: Altre funzionalit@`a di @command{awk}.
-* Quando:: Quando usare @command{gawk} e quando
- usare altre cose.
-* Sommario dell'introduzione:: Sommario dell'introduzione.
-* Riga di comando:: Come eseguire @command{awk}.
-* Opzioni:: Opzioni sulla riga di comando e loro
- significato.
-* Altri argomenti:: Nomi dei file in input e assegnamento
- di valori a variabili.
-* Specificare lo standard input:: Come specificare lo standard input
- insieme ad altri file.
-* Variabili d'ambiente:: Le variabili d'ambiente usate da
- @command{gawk}.
-* AWKPATH (Variabile):: Ricerca di programmi @command{awk}
- in una lista di directory.
-* AWKLIBPATH (Variabile):: Ricerca di librerie condivise
- @command{awk} in una lista di
- directory.
-* Altre variabili d'ambiente:: Le variabili d'ambiente.
-* Codice di ritorno:: Il codice di ritorno all'uscita
- da @command{gawk}.
-* Includere file:: Come includere altri file nel
- proprio programma.
-* Caricare librerie condivise:: Caricare librerie condivise nel
- proprio programma.
-* Parti obsolete:: Opzioni e/o funzionalit@`a obsolete.
-* Non documentato:: Opzioni e funzionalit@`a non documentate.
-* Sommario invocazione:: Sommario di come eseguire
- @command{awk}.
-* Uso di @dfn{regexp}:: Come usare le espressioni regolari.
-* Sequenze di protezione:: Come scrivere caratteri non stampabili.
-* Operatori di espressioni regolari:: Operatori di espressioni regolari.
-* Espressioni tra parentesi quadre:: Cosa possono contenere @samp{[...]}.
-* Pi@`u lungo da sinistra:: Quanto @`e lungo il testo individuato.
-* Espressioni regolari calcolate:: Usare @dfn{regexp} dinamiche.
-* Operatori di @dfn{regexp} GNU:: Operatori propri del software GNU.
-* Maiuscolo-Minuscolo:: Fare confronti ignorando
- maiuscolo/minuscolo.
-* Sommario espressioni regolari:: Sommario delle espressioni regolari.
-* Record:: Controllare come i dati sono suddivisi
- in record.
-* awk divisione record:: Divisione dei record con @command{awk}
- standard.
-* gawk divisione record:: Divisione dei record con @command{gawk}.
-* Campi:: Un'introduzione ai campi.
-* Campi non costanti:: Numeri di campo variabili.
-* Cambiare i campi:: Cambiare il contenuto di un campo.
-* Separatori di campo:: I separatori di campo, e come
- cambiarli.
-* Separatori di campo di default:: Come di solito sono separati i campi.
-* Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori.
-* Campi di un solo carattere:: Fare di ogni carattere un campo
- separato.
-* Separatori campo da riga di comando:: Impostare @code{FS} dalla riga di
- comando.
-* Campo intera riga:: Fare di una riga intera un campo
- solo.
-* Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
- sommario.
-* Dimensione costante:: Leggere campi di larghezza costante.
-* Separazione in base al contenuto:: Definire campi dal loro Contenuto.
-* Righe multiple:: Record su righe multiple
-* Getline:: Richiedere input usando @code{getline}.
-* Getline semplice:: Usare @code{getline} senza argomenti.
-* Getline variabile:: Usare @code{getline} in una variabile.
-* Getline file:: Usare @code{getline} da un file.
-* Getline variabile file:: Usare @code{getline} in una variabile
- da un file.
-* Getline @dfn{pipe}:: Usare @code{getline} da una @dfn{pipe}.
-* Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile
- da una @dfn{pipe}.
-* Getline coprocesso:: Usare @code{getline} da un coprocesso.
-* Getline variabile coprocesso:: Usare @code{getline} in una variabile
- da un coprocesso.
-* Note su getline:: Cose importanti da sapere su
- @code{getline}.
-* Sommario di getline:: Sommario delle varianti di
- @code{getline}.
-* Timeout in lettura:: Leggere input entro un tempo limite.
-* Proseguire dopo errore in input:: Rielaborare input dopo certi errori.
-* Directory su riga di comando:: Cosa accade se si mette una directory
- sulla riga di comando.
-* Sommario di Input:: Sommario di Input.
-* Esercizi su Input:: Esercizi.
-* Print:: L'istruzione @code{print}.
-* Esempi su print:: Semplici esempi di
- istruzioni @code{print}.
-* Separatori di output:: I separatori di output e come
- modificarli.
-* OFMT:: Controllare l'output di numeri con
- @code{print}.
-* Printf:: L'istruzione @code{printf}.
-* Printf Fondamenti:: Sintassi dell'istruzione
- @code{printf}.
-* Lettere di controllo:: Lettere di controllo del formato.
-* Modificatori di formato:: Modificatori specifiche di formato.
-* Esempi su printf:: Numerosi esempi.
-* Ridirezione:: Come ridirigere l'output a diversi
- file e @dfn{pipe}.
-* FD speciali:: File speciali per I/O.
-* File speciali:: Interpretazione @value{FNS} in
- @command{gawk}. @command{gawk}
- permette di accedere a descrittori di
- file ereditati.
-* Altri file ereditati:: Accedere ad altri file aperti con
- @command{gawk}.
-* Reti speciali:: File speciali per comunicazioni con
- la rete.
-* Avvertimenti speciali:: Cose a cui prestare attenzione.
-* Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e
- @dfn{pipe}.
-* Continuazione dopo errori:: Abilitare continuazione dopo errori
- in output.
-* Sommario di Output:: Sommario di Output.
-* Esercizi su Output:: Esercizi.
-* Valori:: Costanti, variabili ed espressioni
- regolari.
-* Costanti:: Costanti di tipo stringa, numeriche ed
- espressioni regolari.
-* Costanti scalari:: Costanti numeriche e stringhe.
-* Numeri non-decimali:: Cosa sono i numeri ottali ed
- esadecimali.
-* Costanti come espressioni regolari:: Costanti fornite tramite espressioni
- regolari.
-* Usare le costanti @dfn{regexp}:: Quando e come usare una costante
- specificata tramite espressioni
- regolari
-* Costanti @dfn{regexp} normali:: Costanti @dfn{regexp} normali in
- @command{awk}.
-* Costanti @dfn{regexp} forti:: Costanti @dfn{regexp} fortemente
- tipizzate.
-* Variabili:: Le variabili permettono di
- definire valori da usare in seguito.
-* Usare variabili:: Usare variabili nei propri programmi.
-* Opzioni di assegnamento:: Impostare variabili dalla riga di
- comando, e un sommario della sintassi
- della riga di comando.
- Questo @`e un metodo di input avanzato.
-* Conversione:: La conversione di stringhe in numeri
- e viceversa.
-* Stringhe e numeri:: Come @command{awk} converte tra
- stringhe e numeri.
-* Localizzazione e conversioni:: Come la localizzazione pu@`o influire
- sulle conversioni.
-* Tutti gli operatori:: Gli operatori di @command{gawk}.
-* Operatori aritmetici:: Operazioni aritmetiche (@samp{+},
- @samp{-}, etc.)
-* Concatenazione:: Concatenazione di stringhe.
-* Operatori di assegnamento:: Cambiare il valore di una variabile
- o di un campo.
-* Operatori di incremento:: Incrementare il valore numerico di una
- variabile.
-* Valori e condizioni di verit@`a:: Determinare Vero/Falso.
-* Valori di verit@`a:: Cosa @`e ``vero'' e cosa @`e ``falso''.
-* Tipi di variabile e confronti:: Come alle variabili si assegna il tipo
- e l'effetto che questo ha sul confronto
- di numeri e stringhe con @samp{<}, etc.
-* Tipi di variabile:: Tipo stringa rispetto a tipo numero.
-* Operatori di confronto:: Gli operatori di confronto.
-* Confronto POSIX di stringhe:: Confronto tra stringhe usando le
- regole POSIX.
-* Operatori booleani:: Combinare espressioni di confronto
- usando operatori booleani @samp{||}
- (``or''), @samp{&&} (``and'') e
- @samp{!} (``not'').
-* Espressioni condizionali:: Le espressioni condizionali scelgono
- una tra due sottoespressioni, a
- seconda del valore di una terza
- sottoespressione.
-* Chiamate di funzione:: Una chiamata di funzione @`e
- un'espressione.
-* Precedenza:: Come si nidificano i vari operatori.
-* Localizzazioni:: Come la localizzazione influenza la
- gestione dati.
-* Sommario delle espressioni:: Sommario delle espressioni.
-* Panoramica sui criteri di ricerca:: Come scrivere un criterio di ricerca.
-* @dfn{regexp} come criteri di ricerca:: Espressioni regolari come criteri
- di ricerca.
-* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
- criterio di ricerca.
-* Intervalli:: Specificare intervalli di record con i
- criteri di ricerca.
-* BEGIN/END:: Specificare regole di inizio e fine
- programma.
-* Usare BEGIN/END:: Come e perch@'e usare regole BEGIN/END.
-* I/O e BEGIN/END:: Problemi di I/O nelle regole BEGIN/END.
-* BEGINFILE/ENDFILE:: Due condizioni speciali per controlli
- avanzati.
-* Vuoto:: Il criterio di ricerca vuoto, che
- corrisponde a ogni record.
-* Usare variabili di shell:: Come usare variabili di shell in
- @command{awk}.
-* Panoramica sulle azioni:: Cosa costituisce un'azione.
-* Istruzioni:: Descrizione dettagliata delle varie
- istruzioni di controllo.
-* Istruzione if:: Eseguire in maniera condizionale
- istruzioni @command{awk}.
-* Istruzione while:: Eseguire il ciclo, finch@'e @`e
- verificata una condizione.
-* Istruzione do:: Eseguire l'azione specificata, continuare
- a eseguire il ciclo
- finch@'e @`e verificata una condizione.
-* Istruzione for:: Un'altra istruzione iterativa, che
- permette di specificare clausole
- iniziali e di incremento.
-* Istruzione switch:: Valutazione di quale insieme di
- istruzioni eseguire, a seconda del
- valore assunto da una variabile.
-* Istruzione break:: Uscire subito dal ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione continue:: Andare alla fine del ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione next:: Smettere di elaborare il record
- corrente.
-* Istruzione nextfile:: Smettere di elaborare il file
- corrente.
-* Istruzione exit:: Interrompere l'esecuzione di @command{awk}.
-* Variabili predefinite:: Sommario delle variabili predefinite.
-* Variabili modificabili dall'utente:: Variabili predefinite modificabili per
- controllare @command{awk}.
-* Variabili auto-assegnate:: Variabili predefinite con cui
- @command{awk} fornisce informazioni.
-* ARGC e ARGV:: Modi di usare @code{ARGC} e
- @code{ARGV}.
-* Sommario criteri e azioni:: Sommario criteri e azioni.
-* Fondamenti sui vettori:: Informazioni di base sui vettori.
-* Introduzione ai vettori:: Introduzione ai vettori.
-* Visitare elementi:: Come esaminare un elemento di un
- vettore.
-* Impostare elementi:: Come cambiare un elemento di un
- vettore.
-* Esempio di vettore:: Esempio semplice di vettore
-* Visitare un intero vettore:: Variazione dell'istruzione
- @code{for}. Cicla attraverso gli
- indici degli elementi contenuti in
- un vettore.
-* Controllare visita:: Controllare l'ordine in cui i vettori
- sono visitati.
-* Indici numerici di vettore:: Come usare numeri come indici in
- @command{awk}.
-* Indici non inizializzati:: Usare variabili non inizializzate
- come indici.
-* Cancellazione:: L'istruzione @code{delete} toglie un
- elemento da un vettore.
-* Vettori multidimensionali:: Emulare vettori multidimensionali in
- @command{awk}.
-* Visitare vettori multidimensionali:: Visitare vettori multidimensionali.
-* Vettori di vettori:: Vettori multidimensionali veri.
-* Sommario dei vettori:: Sommario dei vettori.
-* Funzioni predefinite:: Riepilogo delle funzioni predefinite.
-* Chiamare funzioni predefinite:: Come chiamare funzioni predefinite.
-* Funzioni numeriche:: Funzioni che trattano numeri, comprese
- @code{int()}, @code{sin()}
- e @code{rand()}.
-* Funzioni per stringhe:: Funzioni di manipolazione di stringhe,
- come @code{split()}, @code{match()}
- e @code{sprintf()}.
-* Dettagli ostici:: Pi@`u di quel che si vorrebbe sapere su
- @samp{\} e @samp{&} con @code{sub()},
- @code{gsub()}, e @code{gensub()}.
-* Funzioni di I/O:: Funzioni per i file e per i comandi
- della shell.
-* Funzioni di tempo:: Funzione per gestire marcature temporali.
-* Funzioni a livello di bit:: Funzioni per operazioni di
- manipolazione bit.
-* Funzioni per i tipi:: Funzioni per conoscere il tipo
- di una variabile.
-* Funzioni di internazionalizzazione:: Funzioni per tradurre stringhe.
-* Funzioni definite dall'utente:: Descrizione dettagliata delle funzioni
- definite dall'utente.
-* Sintassi delle definizioni:: Come scrivere definizioni e cosa
- significano.
-* Esempio di funzione:: Un esempio di definizione di
- funzione e spiegazione della stessa.
-* Precisazioni sulle funzioni:: Cose a cui prestare attenzione.
-* Chiamare una funzione:: Non usare spazi.
-* Campo di validit@`a variabili:: Variabili locali e globali.
-* Parametri per valore/riferimento:: Passaggio parametri.
-* Istruzione return:: Specificare il valore che una
- funzione restituisce.
-* Variabili di tipo dinamico:: Come cambiare tipo a una variabile in
- fase di esecuzione del programma.
-* Chiamate indirette:: Scegliere la funzione da chiamare in
- fase di esecuzione del programma.
-* Sommario delle funzioni:: Sommario delle funzioni.
-* Nomi di variabili di libreria:: Che nomi @`e meglio dare alle variabili
- private globali nelle funzioni di
- libreria
-* Funzioni di tipo generale:: Funzioni di uso generale.
-* Funzione strtonum:: Da usare se non @`e disponibile la
- funzione predefinita
- @code{strtonum()}.
-* Funzione assert:: Una funzione per controllare
- affermazioni in programmi
- @command{awk}.
-* Funzione round:: Una funzione per eseguire
- arrotondamenti se @code{sprintf()}
- non lo fa correttamente.
-* Funzione random Cliff:: Il generatore Cliff di numeri casuali.
-* Funzioni ordinali:: Funzioni per usare caratteri come
- numeri e viceversa.
-* Funzione join:: Una funzione per raccogliere un
- vettore in una stringa.
-* Funzione getlocaltime:: Una funzione per ottenere data e
- ora nel formato desiderato.
-* Funzione readfile:: Una funzione per leggere un file
- intero in un colpo solo.
-* Apici alla shell:: Una funzione per passare stringhe
- con apici alla shell.
-* Gestione File Dati:: Funzioni for gestire file dati
- specificati sulla riga di comando,
-* Funzione filetrans:: Una funzione per gestire il passaggio
- da un file in input al successivo.
-* Funzione rewind:: Una funzione per rileggere il file
- di input.
-* Controllo di file:: Controllare che i file in input siano
- accessibili.
-* File vuoti:: Controllare se i file in input sono
- vuoti.
-* Ignorare assegnamenti di variabili:: Trattare assegnamenti di variabili
- come nomi di file.
-* Funzione getopt:: Una funzione per trattare argomenti
- presenti sulla riga di comando.
-* Funzioni Passwd:: Funzioni per ottenete informazioni
- sull'utente [da /etc/passwd].
-* Funzioni Group:: Funzioni per ottenete informazioni
- sul gruppo [da /etc/group].
-* Visitare vettori:: Una funzione per visitare vettori
- di vettori.
-* Sommario funzioni di libreria:: Sommario funzioni di libreria.
-* Esercizi con le librerie:: Esercizi.
-* Eseguire esempi:: Come eseguire i programmi di esempio.
-* Cloni:: Cloni di programmi di utilit@`a comuni.
-* Programma cut:: Il programma di utilit@`a @command{cut}.
-* Programma egrep:: Il programma di utilit@`a @command{egrep}.
-* Programma id:: Il programma di utilit@`a @command{id}.
-* Programma split:: Il programma di utilit@`a @command{split}.
-* Programma tee:: Il programma di utilit@`a @command{tee}.
-* Programma uniq:: Il programma di utilit@`a @command{uniq}.
-* Programma wc:: Il programma di utilit@`a @command{wc}.
-* Programmi vari:: Alcuni interessanti programmi in
- @command{awk}
-* Programma dupword:: Trovare parole duplicate in un
- documento.
-* Programma alarm:: Un programma di sveglia.
-* Programma translate:: Un programma simile al comando di
- utilit@`a @command{tr}.
-* Programma labels:: Stampare etichette per lettere.
-* Programma utilizzo parole:: Un programma per produrre un contatore
- dell'utilizzo di parole in un testo.
-* Programma riordino diario:: Eliminare righe doppie da un file di
- cronologia.
-* Programma extract:: Estrarre programmi da file sorgenti
- Texinfo.
-* Programma sed semplice:: Un semplice editor di flusso.
-* Programma igawk:: Un programma per fornire ad
- @command{awk} la possibilit@`a di
- includere file.
-* Programma anagram:: Trovare anagrammi da una lista di
- parole.
-* Programma signature:: La gente fa cose stupefacenti se ha
- troppo tempo libero.
-* Sommario dei programmi:: Sommario dei programmi.
-* Esercizi sui programmi:: Esercizi.
-* Dati non decimali:: Consentire dati di input in base
- diversa da 10.
-* Ordinamento di vettori:: Modi per controllare la visita di un
- vettore e il suo ordinamento.
-* Controllare visita vettori:: Come usare PROCINFO["sorted_in"].
-* Funzioni di ordinamento di vettori:: Come usare @code{asort()} e
- @code{asorti()}.
-* I/O bidirezionale:: Comunicazione nei due sensi con un
- altro processo.
-* Reti TCP/IP:: Usare @command{gawk} per
- programmazione di rete.
-* Profilare:: Profilare i propri programmi
- @command{awk}.
-* Sommario funzionalit@`a avanzate:: Sommario funzionalit@`a avanzate.
-* I18N e L10N:: Internazionalizzazione e localiz.
-* Utilizzare @command{gettext}:: Come funziona GNU @code{gettext}.
-* I18N per programmatore:: Funzionalit@`a per il programmatore.
-* I18N per traduttore:: Funzionalit@`a per il traduttore.
-* Estrazione di stringhe:: Estrarre stringhe marcate.
-* Ordinamento di printf:: Riordinare argomenti @code{printf}
- [nelle stringhe da tradurre].
-* Portabilit@`a nell'I18N:: Problemi di portabilit@`a a livello di
- @command{awk}.
-* Esempio I18N:: Un semplice esempio di
- internazionalizzazione.
-* Gawk internazionalizzato:: @command{gawk} stesso @`e
- internazionalizzato.
-* Sommario I18N:: Sommario sull'internazionalizzazione.
-* Debugging:: Introduzione al debugger di
- @command{gawk}.
-* Nozioni sul debug:: Generalit@`a sul debug.
-* Terminologia nel debug:: Concetti fondamentali sul debug.
-* Debug di Awk:: Il debug di @command{awk}.
-* Esempio di sessione di debug:: Esempio di sessione di debug di
- @command{gawk}.
-* Invocazione del debugger:: Come avviare il debugger.
-* Trovare il bug:: Trovare il bug.
-* Lista dei comandi di debug:: I principali comandi di debug.
-* Controllo dei breakpoint:: Controllo dei punti d'interruzione.
-* Controllo esecuzione debugger:: Controllo di esecuzione.
-* Vedere e modificare dati:: Vedere e modificare dati.
-* Stack di esecuzione:: Lavorare con lo stack.
-* Informazioni sul debugger:: Ottenere informazioni sullo stato
- del programma e del debugger.
-* Comandi vari del debugger:: Comandi vari del debugger.
-* Supporto per Readline:: Supporto per Readline.
-* Limitazioni:: Limitazioni.
-* Sommario sul debug:: Sommario sul debug.
-* Aritmetica del computer:: Una rapida introduzione alla matematica del
- computer.
-* Definizioni matematiche:: Altre cose da sapere.
-* Funzionalit@`a MPFR:: Funzionalit@`a per il calcolo a
- precisione arbitraria in @command{gawk}
-* Cautela col calcolo in VM:: Cose da sapere.
-* Inesattezza nei calcoli:: La matematica in virgola mobile non @`e
- esatta.
-* Rappresentazioni inesatte:: Molti numeri non sono rappresentati
- esattamente.
-* Confronti tra valori in VM:: Come confrontare valori in virgola mobile.
-* Gli errori si sommano:: Gli errori diventano sempre maggiori.
-* Ottenere la precisione:: Ottenere la precisione voluta.
-* Tentare di arrotondare:: Tentare di aggiungere bit di precisione e
- arrotondare.
-* Impostare la precisione:: Impostare la precisione.
-* Impostare modi di arrotondare:: Impostare la modalit@`a di
- arrotondamento.
-* Interi a precisione arbitraria:: Aritmetica dei numeri interi a precisione
- arbitraria con @command{gawk}.
-* Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente.
-* Sommario virgola mobile:: Sommario della trattazione della
- virgola mobile.
-* Introduzione alle estensioni:: Cos'@`e un'estensione.
-* Licenza delle estensioni:: tipo di licenza delle estensioni.
-* Panoramica sul meccanismo delle estensioni:: Come funziona a grandi linee.
-* Descrizione dell'API delle estensioni:: Una descrizione completa dell'API.
-* Intro funzioni API delle estensioni:: Introduzione alle funzioni dell'API.
-* Tipi di dati generali:: I tipi di dati.
-* Funzioni di allocazione memoria:: Funzioni per allocare memoria.
-* Funzioni di costruzione:: Funzioni per creare valori.
-* Funzioni di registrazione:: Funzioni per registrare cose con
- @command{gawk}.
-* Funzioni di estensione:: Registrare funzioni di estensione.
-* Funzioni di exit callback:: Registrare una exit di callback.
-* Stringa di versione Estensioni:: Registrare una stringa di versione.
-* Analizzatori di input:: Registrare un analizzatore di input.
-* Processori di output:: Registrare un processore di output.
-* Processori bidirezionali:: Registrare un processore
- bidirezionale.
-* Stampare messaggi:: Stampare messaggi dalle estensioni.
-* Aggiornare @code{ERRNO}:: Funzioni per aggiornare @code{ERRNO}.
-* Richiedere valori:: Come ottenere un valore.
-* Accedere ai parametri:: Funzioni per acceder ai parametri.
-* Accedere alla tabella simboli:: Funzioni per accedere alle variabili
- globali.
-* Tabella simboli per nome:: Accedere e aggiornare variabili per nome.
-* Tabella simboli tramite cookie:: Accedere alle variabili per ``cookie''.
-* Valori nascosti:: Creare e usare valori nascosti.
-* Manipolazione di vettori:: Funzioni per lavorare coi vettori.
-* Tipi di dati per i vettori:: Tipi dati per lavorare coi vettori.
-* Funzioni per i vettori:: Funzioni per lavorare coi vettori.
-* Appiattimento di vettori:: Come appiattire i vettori.
-* Creazione di vettori:: Come creare e popolare vettori.
-* Ridirezione API:: Come accedere alla ridirezioni e
- modificarle.
-* Variabili dell'estensione API:: Variabili fornite dall'API.
-* Versione dell'estensione:: Informazioni sulla versione API.
-* Variabili informative di estens. API:: Variabili che forniscono informazioni
- sull'invocazione di @command{gawk}.
-* Codice predefinito di un'estensione API:: Codice predefinito di interfaccia API.
-* Modifiche dalla versione API 1:: Modifiche dalla versione 1 dell'API.
-* Trovare le estensioni:: Come @command{gawk} trova le
- estensioni compilate.
-* Esempio di estensione:: Esempio di codice C di un'estensione.
-* Descrizione interna file:: Quello che le nuove funzioni faranno.
-* Operazioni interne file:: Codice per gestire file all'interno.
-* Usare operazioni interne file:: Come usare un'estensione esterna.
-* Esempi di estensione:: Le estensioni di esempio incluse con
- @command{gawk}.
-* Esempio di estensione funzioni file:: Funzioni relative ai file.
-* Esempio di estensione Fnmatch:: Un'interfaccia a @code{fnmatch()}.
-* Esempio di estensione Fork:: Un'interfaccia a @code{fork()} e
- altre funzioni di processo.
-* Esempio di estensione Inplace:: Consentire modifica file input
- nell'estensione.
-* Esempio di estensione Ord:: Conversioni di caratteri in valori
- numerici e viceversa.
-* Esempio di estensione Readdir:: Un'interfaccia a @code{readdir()}.
-* Esempio di estensione Revout:: Invertire la stringa in output.
-* Esempio di estensione Rev2way:: Esempio di I/O bidirezionale.
-* Esempio di estensione Rwarray:: Scaricare e ricaricare un vettore.
-* Esempio di estensione Readfile:: Leggere un intero file in una stringa.
-* Esempio di estensione Time:: Un'interfaccia a @code{gettimeofday()}
- e @code{sleep()}.
-* Esempio di estensione API Test:: Test per la API.
-* gawkextlib:: Il progetto @code{gawkextlib}.
-* Sommario delle estensioni:: Sommario delle estensioni.
-* Esercizi sulle estensioni:: Esercizi.
-* V7/SVR3.1:: Le principali differenze tra V7 e
- System V Release 3.1.
-* SVR4:: Differenze minori tra System V
- Release 3.1 e 4.
-* POSIX:: Nuove funzionalit@`a per lo standard
- POSIX.
-* BTL:: Nuove funzionalit@`a dalla versione
- di @command{awk} di Brian Kernighan.
-* POSIX/GNU:: Le estensioni in @command{gawk} non
- previste in @command{awk} POSIX.
-* Storia delle funzionalit@`a:: Storia delle funzionalit@`a di
- @command{gawk}.
-* Estensioni comuni:: Sommario Estensioni comuni.
-* Intervalli e localizzazione:: Come le localizzazioni influiscono
- sugli intervalli delle espressioni
- regolari.
-* Contributori:: I maggiori contributori a
- @command{gawk}.
-* Sommario della storia:: Sommario della storia.
-* Distribuzione di Gawk:: Contenuto della distribuzione di
- @command{gawk}.
-* Scaricare:: Come ottenere la distribuzione.
-* Scompattazione:: Come estrarre la distribuzione.
-* Contenuti della distribuzione:: Cosa c'@`e nella distribuzione.
-* Installazione Unix:: Installare @command{gawk} su
- varie versioni di Unix.
-* Installazione veloce:: Compilare @command{gawk} sotto Unix.
-* File da usare a inizio sessione:: Funzioni di personalizzazione shell.
-* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase
- di compilazione.
-* Filosofia della configurazione:: Come si suppone che funzioni.
-* Installazione non-Unix:: Installazioni su altri Sistemi
- Operativi.
-* Installazione su PC:: Installare e compilare
- @command{gawk} su Microsoft Windows.
-* Installazione binaria su PC:: Installare una distribuzione pronta
- all'uso.
-* Compilazione su PC:: Compilare @command{gawk} per
- Windows32.
-* Uso su PC:: Eseguire @command{gawk} su Windows32.
-* Cygwin:: Compilare ed eseguire @command{gawk}
- 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.
-* Vecchio Gawk su VMS:: Una versione non aggiornata arriva
- con alcune versioni di VMS.
-* Bug:: Notificare problemi e bug.
-* Indirizzo Bug:: Dove notificare problemi.
-* Usenet:: Dove non notificare problemi.
-* Manutentori:: Manutentori di version non-*nix.
-* Altre versioni:: Altre implementazioni di
- @command{awk} liberamente
- disponibili.
-* Sommario dell'installazione:: Sommario dell'installazione.
-* Modalit@`a di compatibilit@`a:: Come inibire alcune estensioni di
- @command{gawk}.
-* Aggiunte:: Fare aggiunte a @command{gawk}.
-* Accedere ai sorgenti:: Accedere al deposito sorgenti Git.
-* Aggiungere codice:: Aggiungere codice al programma
- principale @command{gawk}.
-* Nuovi sistemi:: Rendere disponibile @command{gawk}
- a un nuovo sistema operativo.
-* File derivati:: Perch@'e i file ancillari sono tenuti
- nel deposito @command{git}.
-* Future estensioni:: Nuove funzionalit@`a che potranno
- essere implementate in futuro.
-* Limitazioni dell'implementazione:: Alcune limitazioni
- dell'implementazione.
-* Progetto delle estensioni:: Note di progetto sull'estensione API.
-* Problemi con le vecchie estensioni:: Problemi con la precedente
- implementazione di estensioni.
-* Obiettivi delle estensioni:: Obiettivi del nuovo meccanismo.
-* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
-* Futuri sviluppi delle estensioni:: Possibilit@`a di crescita futura.
-* Meccanismo delle vecchie estensioni:: Problemi con le vecchie estensioni.
-* Sommario delle note:: Sommario delle note di
- implementazione.
-* Fondamenti ad alto livello:: Una visione dall'alto.
-* Fondamenti sui tipi di dati:: Una velocissima introduzione ai tipi
- di dati.
-@end detailmenu
-@end menu
-
-@c dedication for Info file
-@ifinfo
-Ai miei genitori, per il loro amore, e per lo splendido
-esempio che mi hanno dato.
-@sp 1
-A mia moglie Miriam, per avermi reso completo.
-Grazie per aver costruito la tua vita insieme a me.
-@sp 1
-Ai nostri figli Chana, Rivka, Nachum e Malka,
-per aver arricchito le nostre vite in misura incalcolabile.
-@end ifinfo
-
-@ifset SMALLPRINT
-@fonttextsize 10
-@end ifset
-
-@summarycontents
-@contents
-
-@ifset SMALLPRINT
-@fonttextsize 11
-@end ifset
-
-@node Introduzione3
-@unnumbered Introduzione alla Terza Edizione
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Michael</firstname>
- <surname>Brennan</surname>
- <!-- can't put mawk into command tags. sigh. -->
- <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
- </author>
- <date>Marzo 2001</date>
- </prefaceinfo>
-@end docbook
-
-Arnold Robbins e io siamo buoni amici. Ci siamo conosciuti
-@c 11 years ago
-nel 1990 per un insieme di
-circostanze---e per il nostro linguaggio di programmazione preferito, AWK.
-Tutto era iniziato un paio d'anni prima.
-Avevo appena iniziato un nuovo lavoro e avevo notato un computer Unix scollegato
-che giaceva in un angolo.
-Nessuno sapeva come usarlo, tanto meno io. Comunque,
-qualche giorno pi@`u tardi, stava funzionando, con
-me come @code{root} e solo e unico utente.
-Quel giorno, iniziai la transizione da statistico a programmatore Unix.
-
-In uno dei miei giri per biblioteche e librerie alla ricerca di libri sullo
-Unix, trovai il libro, dalla copertina grigia, su AWK, noto anche come @:
-Alfred V.@: Aho, Brian W.@: Kernighan e
-Peter J.@: Weinberger, @cite{The AWK Programming Language}, (Addison-Wesley,
-1988). Il semplice paradigma di programmazione di AWK
----trovare un'espressione di ricerca nell'input e di conseguenza compiere
-un'azione---riduceva spesso
-complesse e tediose manipolazioni di dati a poche righe di codice. Ero
-entusiasta di cimentarmi nella programmazione in AWK.
-
-Ahim@`e, l'@command{awk} sul mio computer era una versione limitata del
-linguaggio descritto nel libro grigio. Scoprii che il mio computer aveva il
-``vecchio @command{awk}'' mentre il libro descriveva il ``nuovo
-@command{awk}.''
-Imparai che non era un caso isolato; la vecchia versione si rifiutava di farsi da
-parte o di cedere il suo nome. Se un sistema aveva un nuovo @command{awk},
-questo era chiamato invariabilmente @command{nawk}, e pochi sistemi lo avevano.
-Il miglior modo per ottenere un nuovo @command{awk} era quello di scaricare via
-@command{ftp} il codice sorgente di @command{gawk} da @code{prep.ai.mit.edu}.
-@command{gawk} era una versione del nuovo @command{awk} scritta da David Trueman
-e Arnold, e disponibile sotto la GNU General Public License.
-
-Per inciso, ora non @`e
-pi@`u cos@`{@dotless{i}} difficile trovare un nuovo @command{awk}. @command{gawk} viene
-fornito con GNU/Linux, e si possono scaricare i binari e il codice sorgente per
-quasi tutti i sistemi; mia moglie usa @command{gawk} nella sua stazione di lavoro VMS.
-
-Il mio sistema Unix non era inizialmente collegato a una presa di corrente; a
-maggior ragione non era collegato a una rete. Cos@`{@dotless{i}}, ignaro dell'esistenza di
-@command{gawk} e in generale della comunit@`a di Unix, e desiderando un nuovo
-@command{awk}, ne scrissi uno mio, chiamato @command{mawk}. Prima di aver
-finito, scoprii l'esistenza di @command{gawk},
-ma era troppo tardi per fermarmi, cos@`{@dotless{i}} alla fine inviai un messaggio
-a un newsgroup @code{comp.sources}.
-
-Qualche giorno dopo ricevetti un cordiale messaggio di posta elettronica
-da Arnold che si presentava.
-Propose di scambiarci progetti e algoritmi, e
-alleg@`o una bozza dello standard POSIX, che mi permise di
-aggiornare @command{mawk} per includere le estensioni al linguaggio
-aggiunte dopo la pubblicazione di @cite{The AWK Programming Language}.
-
-Francamente, se i nostri ruoli fossero stati
-invertiti, io non sarei stato cos@`{@dotless{i}} disponibile e probabilmente non ci
-saremmo mai incontrati. Sono felice che l'incontro sia avvenuto.
-Lui @`e un vero esperto tra gli esperti di AWK e una persona squisita.
-Arnold mette a disposizione della Free Software Foundation parti significative
-della sua esperienza e del suo tempo.
-
-Questo libro @`e il manuale di riferimento di @command{gawk}, ma sostanzialmente
-@`e un libro sulla programmazione in AWK che
-interesser@`a un vasto pubblico.
-@`E un riferimento completo al linguaggio AWK come definito dalla versione del
-1987 di Bell Laboratories e codificato nelle POSIX Utilities
-standard del 1992.
-
-D'altra parte, un programmatore AWK alle prime armi pu@`o studiare
-una quantit@`a di programmi pratici che permettono di apprezzare
-la potenza dei concetti di base di AWK:
-flusso di controllo guidato dai dati, ricerca di corrispondenze tramite
-espressioni regolari e vettori associativi.
-Chi desidera qualcosa di nuovo pu@`o provare l'interfaccia di @command{gawk}
-verso i protocolli di rete attraverso i file speciali @file{/inet}.
-
-I programmi in questo libro evidenziano come un programma AWK sia
-generalmente molto pi@`u piccolo e veloce da sviluppare
-di uno equivalente scritto in C.
-Di conseguenza, @`e spesso conveniente creare un prototipo di un
-algoritmo o di un progetto in AWK per arrivare a eseguirlo in breve tempo e
-scoprire prima i problemi che possono presentarsi. Spesso, l'efficienza di
-questa versione iniziale interpretata @`e sufficiente e il prototipo
-AWK diventa il prodotto finale.
-
-Il nuovo comando @command{pgawk} (profiling @command{gawk}) produce
-conteggi sull'esecuzione delle istruzioni del programma.
-Recentemente ho fatto un tentativo con un algoritmo che, a fronte di
-@ifnotdocbook
-@math{n}
-@end ifnotdocbook
-@ifdocbook
-@i{n}
-@end ifdocbook
-righe di input, produceva il risultato in un tempo
-@tex
-$\sim\! Cn^2$,
-@end tex
-@ifnottex
-@ifnotdocbook
-~ C n^2,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>&sim; Cn<superscript>2</superscript></emphasis>
-@end docbook
-mentre in teoria
-avrebbe dovuto terminare in un tempo
-@tex
-$\sim\! Cn\log n$.
-@end tex
-@ifnottex
-@ifnotdocbook
-~ C n log n.
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>&sim; Cn log n</emphasis>
-@end docbook
-Dopo qualche minuto di attenta lettura
-del profilo in @file{awkprof.out}, ho ricondotto il problema a
-una singola riga di codice. @command{pgawk} @`e una gradita integrazione
-ai miei strumenti di programmatore.
-
-Arnold ha condensato in questo libro oltre un decennio di esperienza nell'uso di
-programmi AWK e nello sviluppo di @command{gawk}. Se si vuole usare
-AWK o imparare ad usarlo, @`e consigliabile leggere questo libro.
-
-@ifnotdocbook
-@cindex Brennan, Michael
-@display
-Michael Brennan
-Autore di @command{mawk}
-Marzo 2001
-@end display
-@end ifnotdocbook
-
-@node Introduzione4
-@unnumbered Introduzione alla Quarta Edizione
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Michael</firstname>
- <surname>Brennan</surname>
- <!-- can't put mawk into command tags. sigh. -->
- <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
- </author>
- <date>Ottobre 2014</date>
- </prefaceinfo>
-@end docbook
-
-Ci sono cose che non cambiano. Tredici anni fa scrivevo:
-``Se si vuole usare AWK o imparare ad usarlo, @`e consigliabile
-leggere questo libro.''
-Era vero allora e rimane vero anche oggi.
-
-Imparare a usare un linguaggio di programmazione richiede qualcosa di pi@`u
-che padroneggiarne la sintassi. Occorre comprendere come
-usare le funzionalit@`a del linguaggio per risolvere problemi pratici di
-programmazione. Uno dei punti pi@`u importanti di questo libro @`e che
-fornisce molti esempi che mostrano come utilizzare AWK.
-
-Altre cose, invece, cambiano. I nostri computer sono diventati molto pi@`u
-veloci e la loro memoria @`e molto pi@`u estesa.
-Per questa ragione, la velocit@`a di esecuzione e l'uso efficiente della
-memoria, caratteristiche di un linguaggio di livello elevato, hanno minore
-rilevanza.
-Scrivere un programma prototipo in AWK per poi riscriverlo in C per
-migliorare l'utilizzo delle risorse capita sempre meno, perch@'e sempre pi@`u
-spesso il prototipo @`e abbastanza veloce anche per essere messo in produzione.
-
-Naturalmente, ci sono tipi di calcoli che sono effettuati pi@`u agevolmente
-da programmi scritti in C o C++.
-Con @command{gawk} 4.1 e successive versioni, non @`e necessario
-decidere se scrivere un programma in AWK oppure in C/C++. Si pu@`o scrivere
-buona parte del programma in AWK e le parti che richiedono
-specificamente il C/C++ possono essere scritte in C/C++ e quindi il tutto
-pu@`o essere eseguito come un programma unico, con il modulo @command{gawk}
-che carica dinamicamente il modulo C/C++ in fase di esecuzione.
-@c Chapter 16
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche},
-spiega la procedura in gran
-dettaglio, e, come prevedibile, riporta molti esempi che sono di aiuto per
-approfondire anche gli aspetti pi@`u complessi.
-
-@`E per me un piacere programmare in AWK ed @`e stato divertente (ri)leggere
-questo libro. Penso che sar@`a lo stesso per voi.
-
-@ifnotdocbook
-@cindex Brennan, Michael
-@display
-Michael Brennan
-Autore di @command{mawk}
-Ottobre 2014
-@end display
-@end ifnotdocbook
-@node Prefazione
-@unnumbered Prefazione
-@c I saw a comment somewhere that the preface should describe the book itself,
-@c and the introduction should describe what the book covers.
-@c
-@c 12/2000: Chuck wants the preface & intro combined.
-
-@c This bit is post-processed by a script which turns the chapter
-@c tag into a preface tag, and moves this stuff to before the title.
-@c Bleah.
-@docbook
- <prefaceinfo>
- <author>
- <firstname>Arnold</firstname>
- <surname>Robbins</surname>
- <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
- <affiliation><jobtitle>Israel</jobtitle></affiliation>
- </author>
- <date>Febbraio 2015</date>
- </prefaceinfo>
-@end docbook
-
-Lavorando con file di testo capita di dover eseguire alcuni tipi ripetitivi di
-operazioni. Si potrebbe voler estrarre alcune righe e scartare il resto, o fare
-modifiche laddove siano verificate certe condizioni, lasciando inalterato il
-resto del file. Questi compiti risultano spesso pi@`u agevoli usando
-@command{awk}. Il programma di utilit@`a @command{awk} interpreta un linguaggio
-di programmazione specializzato che rende facile eseguire semplici attivit@`a
-di riformattazione di dati.
-
-@cindex Brian Kernighan, @command{awk} di
-L'implementazione GNU di @command{awk} @`e chiamata @command{gawk}; se
-invocato con le opzioni o con le variabili d'ambiente appropriate,
-(@pxref{Opzioni}), @`e pienamente
-compatibile con le specifiche
-POSIX@footnote{Lo standard POSIX 2008 @`e accessibile in rete all'indirizzo
-@w{@url{http://www.opengroup.org/onlinepubs/9699919799/}.}}
-del linguaggio @command{awk}
-e con la versione Unix di @command{awk} mantenuta
-da Brian Kernighan.
-Ci@`o implica che tutti i programmi
-@command{awk} scritti correttamente dovrebbero funzionare con @command{gawk}.
-Perci@`o nella maggior parte dei casi non si distingue tra @command{gawk} e
-altre implementazioni di @command{awk}.
-
-@cindex @command{awk}, POSIX e, si veda anche POSIX @command{awk}
-@cindex @command{awk}, POSIX e
-@cindex POSIX, @command{awk} e
-@cindex @command{gawk}, @command{awk} e
-@cindex @command{awk}, @command{gawk} e
-@cindex @command{awk}, uso di
-Usando @command{awk} potete:
-
-@itemize @value{BULLET}
-@item
-Gestire piccole basi di dati personali
-
-@item
-Generare rapporti
-
-@item
-Validare dati
-
-@item
-Produrre indici ed effettuare altre operazioni per la preparazione di documenti
-
-@item
-Sperimentare algoritmi che possono essere adattati in seguito ad altri
-linguaggi per computer
-@end itemize
-
-@cindex @command{awk}, si veda anche @command{gawk}
-@cindex @command{gawk}, si veda anche @command{awk}
-@cindex @command{gawk}, uso di
-Inoltre,
-@command{gawk}
-fornisce strumenti che rendono facile:
-
-@itemize @value{BULLET}
-@item
-Estrarre frammenti di dati per l'elaborazione
-
-@item
-Ordinare dati
-
-@item
-Effettuare semplici comunicazioni di rete
-
-@item
-Creare il profilo di esecuzione ed effettuare il debug
-di programmi @command{awk}.
-
-@item
-Estendere il linguaggio con funzioni scritte in C o C++.
-@end itemize
-
-Questo @value{DOCUMENT} spiega il linguaggio @command{awk} e come lo si pu@`o
-usare efficacemente. @`E richiesta una familiarit@`a coi comandi di sistema
-di base, come @command{cat} e @command{ls},@footnote{Questi programmi di
-utilit@`a sono disponibili sui sistemi conformi a POSIX, come pure sui sistemi
-tradizionali basati su Unix. Se si usa qualche altro sistema operativo, si
-deve comunque avere familiarit@`a con i concetti di ridirezione I/O e di
-@dfn{pipe}.} cos@`{@dotless{i}} come con le funzionalit@`a di base della shell, come la
-ridirezione, l'input/output (I/O) e le @dfn{pipe}.
-
-@cindex GNU @command{awk}, si veda @command{gawk}
-Implementazioni del linguaggio @command{awk} sono disponibili per diversi
-sistemi operativi di computer. Questo @value{DOCUMENT}, oltre a descrivere il
-linguaggio @command{awk} in generale, descrive anche la specifica
-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,
-Microsoft Windows
-(tutte le versioni),
-e OpenVMS.@footnote{Qualche altro sistema operativo obsoleto su cui
-@command{gawk} era stato portato non @`e pi@`u mantenuto e il codice specifico
-per quei sistemi @`e stato rimosso.}
-
-@menu
-* Storia:: La storia di @command{gawk} e
- @command{awk}.
-* Nomi:: Che nome usare per trovare
- @command{awk}.
-* Questo manuale:: Uso di questo @value{DOCUMENT}.
- Comprende esempi di file in input
- utilizzabili.
-* Convenzioni:: Convenzioni tipografiche.
-* Storia del manuale:: Breve storia del Progetto GNU e di
- questo @value{DOCUMENT}.
-@ifset FOR_PRINT
-* Aggiornamenti:: Come tenersi al corrente.
-@end ifset
-* Come contribuire:: Un aiuto per la salvezza del mondo.
-* Ringraziamenti:: Ringraziamenti.
-@end menu
-
-@node Storia
-@unnumberedsec La storia di @command{gawk} e @command{awk}
-@cindex ricetta per un linguaggio di programmazione
-@cindex linguaggio di programmazione, ricetta per un
-@cindex programmazione, ricetta per un linguaggio di
-@cindex sidebar, Ricetta per un linguaggio di programmazione
-@ifdocbook
-@docbook
-<sidebar><title>Ricetta per un linguaggio di programmazione</title>
-@end docbook
-
-
-@multitable {2 parti di} {1 parte di @code{egrep}} {1 parte di @code{snobol}}
-@item @tab 1 parte di @code{egrep} @tab 1 parte di @code{snobol}
-@item @tab 2 parti di @code{ed} @tab 3 parti di C
-@end multitable
-
-Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
-Preparare una concisa documentazione e distribuire.
-
-Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
-parti di C. Documentare molto bene e distribuire.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ricetta per un linguaggio di programmazione}
-
-
-
-@multitable {2 parti di} {1 parte di @code{egrep}} {1 parte di @code{snobol}}
-@item @tab 1 parte di @code{egrep} @tab 1 parte di @code{snobol}
-@item @tab 2 parti di @code{ed} @tab 3 parti di C
-@end multitable
-
-Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
-Preparare una concisa documentazione e distribuire.
-
-Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
-parti di C. Documentare molto bene e distribuire.
-@end cartouche
-@end ifnotdocbook
-
-@cindex Aho, Alfred
-@cindex Weinberger, Peter
-@cindex Kernighan, Brian
-@cindex @command{awk}, storia di
-Il nome @command{awk} deriva dalle iniziali dei suoi progettisti: Alfred V.@:
-Aho, Peter J.@: Weinberger e Brian W.@: Kernighan. La versione originale di
-@command{awk} fu scritta nel 1977 negli AT&T Bell Laboratories.
-Nel 1985, una nuova versione rese il linguaggio di programmazione
-pi@`u potente, introducendo le funzioni definite dall'utente, flussi di input
-multipli ed espressioni regolari calcolate.
-Questa nuova versione ebbe larga diffusione con Unix System V
-Release 3.1 (1987).
-La versione in System V Release 4 (1989) ha aggiunto alcune nuove funzionalit@`a
-e ha fatto pulizia nel comportamento di alcuni degli ``punti oscuri'' del
-linguaggio. Le specifiche per @command{awk} nello standard POSIX Command
-Language and Utilities ha in seguito reso pi@`u chiaro il linguaggio. Sia i
-progettisti di @command{gawk} che quelli dell'originale @command{awk} dei Bell
-Laboratories hanno collaborato alla formulazione delle specifiche POSIX.
-
-@cindex Rubin, Paul
-@cindex Fenlason, Jay
-@cindex Trueman, David
-Paul Rubin ha scritto @command{gawk}, nel 1986.
-Jay Fenlason l'ha completata, seguendo i consigli di Richard Stallman.
-Anche John Woods ha fornito parti del codice. Nel 1988 e 1989, David Trueman,
-col mio aiuto, ha rivisto completamente @command{gawk} per la compatibilit@`a
-col pi@`u recente @command{awk}.
-Intorno al 1994, sono divenuto il manutentore principale.
-Lo sviluppo corrente @`e incentrato sulla correzione degli errori, sul
-miglioramento delle prestazioni, sulla conformit@`a agli standard e,
-occasionalmente, su nuove funzionalit@`a.
-
-Nel maggio 1997, J@"urgen Kahrs avvert@`{@dotless{i}} la necessit@`a di un accesso alla
-rete da @command{awk}, e con un piccolo aiuto da parte mia, cominci@`o ad
-aggiungere funzionalit@`a a @command{gawk} per fare questo. A quel tempo,
-lui scrisse anche il grosso di
-@cite{@value{GAWKINETTITLE}}
-(un documento separato, disponibile come parte della distribuzione
-@command{gawk}). Il suo codice alla fine venne integrato nella distribuzione
-principale di @command{gawk} con la versione 3.1 di @command{gawk}.
-
-John Haque ha riscritto la parte interna di @command{gawk}, mentre metteva a
-punto un debugger a livello di @command{awk}. Questa versione divenne
-disponibile come @command{gawk} versione 4.0 nel 2011.
-
-@xref{Contributori}
-per un elenco completo di quelli che hanno fornito contributi importanti a
-@command{gawk}.
-
-@node Nomi
-@unnumberedsec Una rosa, con ogni altro nome...
-
-@cindex @command{awk}, nuovo e vecchio
-Il linguaggio @command{awk} si @`e evoluto nel corso degli anni. Tutti i
-dettagli si trovano in @ref{Storia del linguaggio}.
-Il linguaggio descritto in questo @value{DOCUMENT}
-viene spesso citato come ``nuovo @command{awk}''.
-Per analogia, la versione originale di @command{awk} @`e citata
-come ``vecchio @command{awk}.''
-
-Su molti sistemi di uso corrente, eseguendo il programma di utilit@`a
-@command{awk}, si invoca qualche versione del nuovo
-@command{awk}.@footnote{Solo i sistemi Solaris usano ancora un
-vecchio @command{awk} per il programma di utilit@`a predefinito
-@command{awk}. Una versione pi@`u moderna di @command{awk} si trova
-nella directory @file{/usr/xpg6/bin} su questi sistemi.} Se
-il comando @command{awk} nel sistema in uso @`e il vecchio, il
-risultato che vedrete per il programma di test che segue @`e
-del tipo:
-
-@example
-$ @kbd{awk 1 /dev/null}
-@error{} awk: syntax error near line 1
-@error{} awk: bailing out near line 1
-@end example
-
-@noindent
-Se questo @`e il caso, dovreste cercare una versione del nuovo @command{awk},
-o semplicemente installare @command{gawk}!
-
-All'interno di questo @value{DOCUMENT}, quando si fa riferimento a
-funzionalit@`a del linguaggio che dovrebbe essere disponibile in ogni
-implementazione completa di @command{awk} POSIX, viene usato il termine
-@command{awk}. Quando si fa riferimento a una funzionalit@`a specifica
-dell'implementazione GNU, viene usato i termine @command{gawk}.
-
-@node Questo manuale
-@unnumberedsec Uso di questo @value{DOCUMENT}
-@cindex @command{awk}, descrizione dei termini
-
-Il termine @command{awk} si riferisce sia a uno specifico programma sia al
-linguaggio che si usa per dire al programma stesso cosa deve fare. Quando dobbiamo
-essere precisi, chiamiamo il linguaggio ``il linguaggio @command{awk},''
-e il programma ``l'utilit@`a @command{awk}.''
-Questo @value{DOCUMENT} spiega
-sia come scrivere programmi nel linguaggio @command{awk} che come
-eseguire l'utilit@`a @command{awk}.
-Il termine ``programma @command{awk}'' si riferisce a un programma scritto
-dall'utente nel linguaggio di programmazione @command{awk}.
-
-@cindex @command{gawk}, @command{awk} e
-@cindex @command{awk}, @command{gawk} e
-@cindex POSIX @command{awk}
-In primo luogo, questo @value{DOCUMENT} spiega le funzionalit@`a di @command{awk}
-come definite nello standard POSIX, e lo fa nel contesto dell'implementazione
-@command{gawk}. Oltre a questo, cerca anche di descrivere le differenze
-significative tra @command{gawk}
-e altre
-@ifclear FOR_PRINT
-implementazioni @command{awk}.@footnote{Tutte queste differenze
-si trovano nell'indice alla
-voce ``differenze tra @command{awk} e @command{gawk}.''}
-@end ifclear
-@ifset FOR_PRINT
-implementazioni @command{awk}.
-@end ifset
-Infine, vien fatta rilevare ogni funzionalit@`a di @command{gawk} non
-inclusa nello standard POSIX per @command{awk}.
-
-@ifnotinfo
-Questo @value{DOCUMENT} ha il difficile compito di essere tanto una guida
-introduttiva che un manuale di riferimento. I neofiti possono
-tranquillamente saltare i dettagli che sembrano loro troppo complessi.
-Possono anche ignorare i molti riferimenti incrociati, preparati avendo in
-mente gli utenti esperti e per le versioni Info e
-@uref{http://www.gnu.org/software/gawk/manual/, HTML}
-del @value{DOCUMENT}.
-@end ifnotinfo
-
-Ci sono dei riquadri
-sparsi in tutto il @value{DOCUMENT}.
-Aggiungono una spiegazione pi@`u completa su punti importanti, ma che
-probabilmente non sono di interesse in sede di prima lettura.
-@ifclear FOR_PRINT
-Si trovano tutti nell'indice analitico, alla voce ``sidebar.'' @c non c'e riquadro nell'indice analitico
-@end ifclear
-
-La maggior parte delle volte, gli esempi usano programmi @command{awk} completi.
-Alcune delle @value{SECTIONS} pi@`u avanzate mostrano solo la parte del programma
-@command{awk} che illustra il concetto che si sta descrivendo.
-
-Sebbene questo @value{DOCUMENT} sia destinato soprattutto alle persone che non
-hanno una precedente conoscenza di @command{awk}, esso contiene anche tante
-informazioni che anche gli esperti di @command{awk} troveranno utili.
-In particolare, dovrebbero essere d'interesse la descrizione di POSIX
-@command{awk} e i programmi di esempio
-@ifnottex
-in
-@end ifnottex
-@iftex
-nel
-@end iftex
-@ref{Funzioni di libreria} e
-@ifnotdocbook
-@ifnottex
-in
-@end ifnottex
-@end ifnotdocbook
-@iftex
-nel
-@end iftex
-@ref{Programmi di esempio}.
-
-Questo @value{DOCUMENT} @`e suddiviso in diverse parti, come segue:
-
-@c FULLXREF ON
-
-@itemize @value{BULLET}
-@item
-La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
-nel dettaglio.
-Inizia con le nozioni di base, e continua con tutte le caratteristiche di
-@command{awk}. Contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Per iniziare},
-fornisce le nozioni minime indispensabili per iniziare a usare @command{awk}.
-
-@item
-@ref{Invocare Gawk},
-descrive come eseguire @command{gawk}, il significato delle sue
-opzioni da riga di comando e come trovare i file sorgenti del programma
-@command{awk}.
-
-@item
-@ref{Espressioni regolari},
-introduce le espressioni regolari in generale, e in particolare le variet@`a
-disponibili in @command{awk} POSIX e @command{gawk}.
-
-@item
-@ref{Leggere file},
-descrive come @command{awk} legge i dati inseriti dall'utente.
-Introduce i concetti di record e campi, e anche il
-comando @code{getline}.
-Contiene una prima descrizione della ridirezione I/O, e una breve descrizione
-dell'I/O di rete.
-
-@item
-@ref{Stampare},
-descrive come i programmi @command{awk} possono produrre output con
-@code{print} e @code{printf}.
-
-@item
-@ref{Espressioni},
-descrive le espressioni, che sono i componenti elementari di base
-per portare a termine la maggior parte delle operazioni in un programma.
-
-@item
-@ref{Criteri di ricerca e azioni},
-descrive come scrivere espressioni di ricerca per individuare corrispondenze nei
-record, le azioni da eseguire quando si @`e trovata una corrispondenza
-in un record, e le variabili predefinite di @command{awk} e
-@command{gawk}.
-
-@item
-@ref{Vettori},
-tratta dell'unica struttura di dati di @command{awk}: il vettore associativo.
-Vengono trattati anche l'eliminazione di elementi del vettore e di interi
-vettori, e l'ordinamento dei vettori in @command{gawk}.
-Il @value{CHAPTER} descrive inoltre come @command{gawk} fornisce vettori di
-vettori.
-
-@item
-@ref{Funzioni},
-descrive le funzioni predefinite fornite da @command{awk} e
-@command{gawk}, e spiega come definire funzioni personalizzate. Viene
-anche spiegato come @command{gawk} permetta di invocare funzioni in
-maniera indiretta.
-@end itemize
-
-@item
-La Parte II illustra come usare @command{awk} e @command{gawk} per la
-risoluzione di problemi. Qui ci sono molti programmi da leggere e da cui imparare.
-Questa parte contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Funzioni di libreria},
-fornisce diverse funzioni pensate per
-essere usate dai programmi scritti in @command{awk}.
-
-@item
-@ref{Programmi di esempio},
-fornisce molti programmi @command{awk} di esempio.
-@end itemize
-
-La lettura di questi due capitoli permette di capire come
-@command{awk} pu@`o risolvere problemi pratici.
-
-@item
-La Parte III si concentra sulle funzionalit@`a specifiche di @command{gawk}.
-Contiene i seguenti capitoli:
-
-@c nested
-@itemize @value{MINUS}
-@item
-@ref{Funzionalit@`a avanzate},
-descrive diverse funzionalit@`a avanzate.
-Di particolare rilevanza sono
-la capacit@`a di controllare l'ordine di visita dei vettori,
-quella di instaurare comunicazioni bidirezionali con altri processi,
-di effettuare connessioni di rete TCP/IP, e di
-profilare i propri programmi @command{awk}.
-
-@item
-@ref{Internazionalizzazione},
-descrive funzionalit@`a speciali per tradurre i messaggi
-di programma in diverse lingue in fase di esecuzione.
-
-@item
-@ref{Debugger}, descrive il debugger di @command{gawk}.
-
-@item
-@ref{Calcolo con precisione arbitraria},
-illustra le capacit@`a di calcolo avanzate.
-
-@item
-@ref{Estensioni dinamiche},
-descrive come aggiungere nuove variabili e
-funzioni a @command{gawk} scrivendo estensioni in C o C++.
-@end itemize
-
-@item
-@ifclear FOR_PRINT
-La Parte IV contiene le appendici, il Glossario, e due licenze relative,
-rispettivamente, al codice sorgente di @command{gawk} e a questo
-@value{DOCUMENT}. Contiene le seguenti appendici:
-@end ifclear
-
-@ifset FOR_PRINT
-La Parte IV contiene le seguenti appendici,
-che includono la Licenza per Documentazione Libera GNU:
-@end ifset
-
-@itemize @value{MINUS}
-@item
-@ref{Storia del linguaggio},
-descrive l'evoluzione del linguaggio @command{awk} dalla sua prima versione
-fino a oggi. Descrive anche come @command{gawk}
-ha acquisito nuove funzionalit@`a col passare del tempo.
-
-@item
-@ref{Installazione},
-descrive come ottenere @command{gawk}, come compilarlo
-sui sistemi compatibili con POSIX,
-e come compilarlo e usarlo su diversi sistemi
-non conformi allo standard POSIX. Spiega anche come segnalare gli errori
-di @command{gawk} e dove si possono ottenere altre implementazioni
-di @command{awk} liberamente disponibili.
-
-@ifset FOR_PRINT
-@item
-@ref{Copia},
-presenta la licenza applicabile al codice sorgente @command{gawk}.
-@end ifset
-
-@ifclear FOR_PRINT
-@item
-@ref{Note},
-descrive come disabilitare le estensioni @command{gawk},
-come contribuire scrivendo del nuovo codice per @command{gawk},
-e alcune possibili direzioni per il futuro sviluppo di @command{gawk}.
-
-@item
-@ref{Concetti fondamentali},
-fornisce del materiale di riferimento a livello elementare per chi
-sia completamente digiuno di programmazione informatica.
-
-Il @ref{Glossario}, definisce quasi tutti i termini significativi
-usati all'interno di questo @value{DOCUMENT}. Se si incontrano termini
-coi quali non si ha familiarit@`a, questo @`e il posto dove cercarli.
-
-@item
-@ref{Copia}, e
-@ref{Licenza per Documentazione Libera GNU (FDL)},
-presentano le licenze che si applicano, rispettivamente, al codice sorgente
-di @command{gawk} e a questo @value{DOCUMENT}.
-@end ifclear
-@end itemize
-@end itemize
-
-@ifset FOR_PRINT
-La versione di questo @value{DOCUMENT} distribuita con @command{gawk}
-contiene ulteriori appendici e altro materiale.
-Per ragioni di spazio, per questa edizione a stampa abbiamo tralasciato alcune
-delle appendici. Si possono trovare in rete ai seguenti indirizzi:
-
-@itemize @value{BULLET}
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Notes.html,
-L'appendice sulle note di implementazione}
-descrive come disabilitare le estensioni @command{gawk}, come contribuire
-scrivendo del nuovo codice per @command{gawk}, dove reperire informazioni
-su alcune possibili future direzioni dello sviluppo di @command{gawk}, e
-sulle decisioni di progetto che hanno influito sulle estensioni API.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
-L'appendice sui concetti fondamentali}
-fornisce del materiale di riferimento a livello elementare per chi sia completamente a
-digiuno di programmazione informatica.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
-Il Glossario}
-definisce la maggior parte, se non tutti, i termini significativi usati
-nel corso del libro. Se si incontrano termini con cui non si ha familiarit@`a,
-questo @`e il posto dove cercarli.
-
-@item
-@uref{http://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html, la licenza GNU FDL}
-@`e la licenza che vale per questo @value{DOCUMENT}.
-@end itemize
-
-@c ok not to use CHAPTER / SECTION here
-Alcuni dei capitoli hanno sezioni con esercizi; queste sono anche
-state omesse dall'edizione a stampa ma sono disponibili online.
-@end ifset
-
-@c FULLXREF OFF
-
-@node Convenzioni
-@unnumberedsec Convenzioni tipografiche
-
-@cindex Texinfo
-Questo @value{DOCUMENT} @`e scritto in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
-il linguaggio di formattazione della documentazione GNU. Viene usato un unico
-file sorgente Texinfo per produrre sia la versione a stampa della documentazione
-sia quella online.
-@ifnotinfo
-A causa di ci@`o, le convenzioni tipografiche
-sono leggermente diverse da quelle presenti in altri libri che potete aver letto.
-@end ifnotinfo
-@ifinfo
-Questo @value{SECTION} documenta brevemente le convenzioni tipografiche usate in Texinfo.
-@end ifinfo
-
-Gli esempi da immettere sulla riga di comando sono preceduti dai
-comuni prompt di shell primario e secondario, @samp{$} e @samp{>}.
-L'input che si inserisce viene mostrato @kbd{in questo modo}.
-@c 8/2014: @print{} is stripped from the texi to make docbook.
-@ifclear FOR_PRINT
-L'output del comando @`e preceduto dal glifo ``@print{}'', che
-in genere rappresenta lo standard output del comando.
-@end ifclear
-@ifset FOR_PRINT
-L'output del comando, normalmente il suo standard output, @`e stampato
-@code{in questo modo}.
-@end ifset
-Messaggi di errore e altri output sullo standard error del comando sono
-preceduti dal glifo ``@error{}''. Per esempio:
-
-@example
-$ @kbd{echo ciao su stdout}
-@print{} ciao su stdout
-$ @kbd{echo salve su stderr 1>&2}
-@error{} salve su stderr
-@end example
-
-@ifnotinfo
-Nel testo, quasi tutto ci@`o che riguarda la programmazione,
-per esempio i nomi dei comandi,
-appare in @code{questo font}. I frammenti
-di codice appaiono nello stesso font e tra apici, @samp{in questo modo}.
-Ci@`o che viene sostituito dall'utente o dal programmatore
-appare in @var{questo font}.
-Le opzioni sono stampate cos@`{@dotless{i}}: @option{-f}.
-I @value{FNS} sono indicati in questo modo: @file{/percorso/al/file}.
-@ifclear FOR_PRINT
-Certe cose sono
-evidenziate @emph{in questo modo}, e se un punto dev'essere reso in modo pi@`u
-marcato, viene evidenziato @strong{in questo modo}.
-@end ifclear
-La prima occorrenza di un
-nuovo termine @`e usualmente la sua @dfn{definizione} e appare nello stesso
-font della precedente occorrenza di ``definizione'' in questa frase.
-@end ifnotinfo
-
-I caratteri che si battono sulla tastiera sono scritti come @kbd{questi}. In
-particolare, ci sono caratteri speciali chiamati ``caratteri di controllo''.
-Questi sono caratteri che vengono battuti tenendo premuti il tasto
-@kbd{CONTROL} e un altro tasto contemporaneamente.
-Per esempio, @kbd{Ctrl-d} @`e battuto premendo e tenendo premuto il tasto
-@kbd{CONTROL}, poi premendo il tasto @kbd{d} e infine rilasciando entrambi i
-tasti.
-
-Per amor di brevit@`a, in questo @value{DOCUMENT}, la versione di Brian
-Kernighan di @command{awk} sar@`a citata come ``BWK @command{awk}.''
-(@xref{Altre versioni} per informazioni su questa e altre versioni.)
-
-@ifset FOR_PRINT
-@quotation NOTA
-Note interessanti sono stampate in questo modo.
-@end quotation
-
-@quotation ATTENZIONE
-Note di avviso o raccomandazioni di cautela sono stampate in questo modo.
-@end quotation
-@end ifset
-
-@c fakenode --- for prepinfo
-@unnumberedsubsec Angoli Bui
-@cindex Kernighan, Brian
-@quotation
-@i{Gli angoli bui sono essenzialmente frattali---per quanto vengano
-illuminati, ce n'@`e sempre uno pi@`u piccolo e pi@`u buio.}
-@author Brian Kernighan
-@end quotation
-
-@cindex a.b., si veda angolo buio
-@cindex angolo buio
-Fino allo standard POSIX (e @cite{@value{TITLE}}),
-molte caratteristiche di @command{awk} erano poco documentate o
-non documentate affatto. Le descrizioni di queste caratteristiche
-(chiamate spesso ``angoli bui'') sono segnalate in questo @value{DOCUMENT} con
-@iftex
-il disegno di una torcia elettrica nel margine, come mostrato qui.
-@value{DARKCORNER}
-@end iftex
-@ifnottex
-``(a.b.)''.
-@end ifnottex
-@ifclear FOR_PRINT
-Appaiono anche nell'indice sotto la voce ``angolo buio.''
-@end ifclear
-
-Ma come osservato nella citazione d'apertura, ogni trattazione degli
-angoli bui @`e per definizione incompleta.
-
-@cindex e.c., si veda estensioni comuni
-Estensioni al linguaggio standard di @command{awk} disponibili in pi@`u di una
-implementazione di @command{awk} sono segnate
-@ifclear FOR_PRINT
-``@value{COMMONEXT},'' ed elencate nell'indice sotto ``estensioni comuni''
-e ``comuni, estensioni''.
-@end ifclear
-@ifset FOR_PRINT
-``@value{COMMONEXT}'' per ``estensioni comuni.''
-@end ifset
-
-@node Storia del manuale
-@unnumberedsec Breve storia del Progetto GNU e di questo @value{DOCUMENT}
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Stallman, Richard
-La Free Software Foundation (FSF) @`e un'organizzazione senza scopo di lucro
-dedita alla produzione e distribuzione di software liberamente distribuibile.
-@`E stata fondata da Richard M.@: Stallman, l'autore della prima versione
-dell'editor Emacs. GNU Emacs @`e oggi la versione di Emacs pi@`u largamente usata.
-
-@cindex Progetto GNU
-@cindex GNU, Progetto
-@cindex GPL (General Public License)
-@cindex General Public License, si veda GPL
-@cindex documentazione, online
-Il Progetto GNU@footnote{GNU sta per ``GNU's Not Unix.''}
-@`e un progetto della Free Software
-Foundation in continuo sviluppo per creare un ambiente per computer completo, liberamente
-distribuibile, conforme allo standard POSIX.
-La FSF usa la GNU General Public License (GPL) per assicurare che
-il codice sorgente del loro software sia sempre
-disponibile all'utente finale.
-@ifclear FOR_PRINT
-Una copia della GPL @`e inclusa
-@ifnotinfo
-in questo @value{DOCUMENT}
-@end ifnotinfo
-per la consultazione
-(@pxref{Copia}).
-@end ifclear
-La GPL si applica al codice sorgente in linguaggio C per @command{gawk}.
-Per saperne di pi@`u sulla FSF e sul Progetto GNU,
-si veda @uref{http://www.gnu.org, la pagina principale del Progetto GNU}.
-Questo @value{DOCUMENT} si pu@`o leggere anche dal
-@uref{http://www.gnu.org/software/gawk/manual/, sito di GNU}.
-
-@ifclear FOR_PRINT
-Una shell, un editor (Emacs), compilatori ottimizzanti C, C++ e
-Objective-C altamente portabili, un debugger simbolico e dozzine di grandi e
-piccoli programmi di utilit@`a (come @command{gawk}), sono stati completati e
-sono liberamente disponibili. Il kernel del sistema operativo GNU (noto come
-HURD), @`e stato rilasciato ma @`e ancora allo stato di sviluppo iniziale.
-
-@cindex Linux
-@cindex GNU/Linux
-@cindex sistemi operativi basati su BSD
-In attesa che il sistema operativo GNU venga pi@`u completatamente
-sviluppato, si dovrebbe prendere in considerazione l'uso di GNU/Linux, un
-sistema operativo liberamente distribuibile e basato su Unix disponibile
-per Intel, Power Architecture,
-Sun SPARC, IBM S/390, e altri
-sistemi.@footnote{La terminologia ``GNU/Linux'' @`e spiegata
-nel @ref{Glossario}.}
-Molte distribuzioni GNU/Linux sono
-scaricabili da internet.
-@end ifclear
-
-@ifnotinfo
-Il @value{DOCUMENT} @`e realmente libero---almeno, l'informazione che contiene
-@`e libera per chiunque---. Il codice sorgente del @value{DOCUMENT}, leggibile
-elettronicamente, viene fornito con @command{gawk}.
-@ifclear FOR_PRINT
-(Dare un'occhiata alla Free Documentation
-License in @ref{Licenza per Documentazione Libera GNU (FDL)}.)
-@end ifclear
-@end ifnotinfo
-
-@cindex Close, Diane
-Il @value{DOCUMENT} in s@'e ha gi@`a avuto parecchie edizioni in passato.
-Paul Rubin ha scritto la prima bozza di @cite{The GAWK Manual};, che era
-lunga una quarantina di pagine.
-Diane Close e Richard Stallman l'hanno migliorata arrivando alla
-versione che era
-lunga una novantina di pagine, e descriveva solo la versione originale
-``vecchia'' di @command{awk}.
-Ho iniziato a lavorare con quella versione nell'autunno del 1988.
-Mentre ci stavo lavorando,
-la FSF ha pubblicato parecchie versioni preliminari, numerate 0.@var{x}).
-Nel 1996, l'edizione 1.0 fu rilasciata assieme a @command{gawk} 3.0.0.
-La FSF ha pubblicato le prime due edizioni col
-titolo @cite{GAWK: The GNU Awk User's Guide}.
-@ifset FOR_PRINT
-SSC ha pubblicato due edizioni del @value{DOCUMENT} col
-titolo @cite{Effective awk Programming}, e O'Reilly ha pubblicato
-la terza edizione nel 2001
-@end ifset
-
-Questa edizione mantiene la struttra di base delle edizioni precedenti.
-Per l'edizione FSF 4.0, il contenuto era stato accuratamente rivisto
-e aggiornato. Tutti i riferimenti a versioni di @command{gawk} anteriori alla
-versione 4.0 sono stati eliminati.
-Di particolare interesse in quella edizione era l'aggiunta del @ref{Debugger}.
-
-Per l'edizione FSF
-@ifclear FOR_PRINT
-@value{EDITION},
-@end ifclear
-@ifset FOR_PRINT
-@value{EDITION}
-(la quarta edizione, come pubblicata da O'Reilly),
-@end ifset
-il contenuto @`e stato riorganizzato in parti,
-e le aggiunte pi@`u importanti sono
-@iftex
-il
-@end iftex
-@ref{Calcolo con precisione arbitraria}, e
-@iftex
-il
-@end iftex
-@ref{Estensioni dinamiche}.
-
-Questo @value{DOCUMENT} continuer@`a certamente ad evolversi. Se si trovano
-errori nel @value{DOCUMENT}, si prega di segnalarli! @xref{Bug}
-per informazioni su come inviare le segnalazione di problemi elettronicamente.
-@ifset FOR_PRINT
-@node Restare aggiornati
-@unnumberedsec Come restare aggiornati
-
-Potreste avere una versione di @command{gawk} pi@`u recente di quella
-descritta qui. Per vedere cosa @`e cambiato,
-dovreste prima guardare il file @file{NEWS} nella distribuzione di
-@command{gawk}, che fornisce un sommario ad alto livello dei
-cambiamenti in ciascuna versione.
-
-You can then look at the @uref{http://www.gnu.org/software/gawk/manual/,
-online version} of this @value{DOCUMENT} to read about any new features.
-@end ifset
-
-@ifclear FOR_PRINT
-@node Come contribuire
-@unnumberedsec Come collaborare
-
-Come manutentore di GNU @command{awk}, un tempo pensai che sarei stato in grado
-di gestire una raccolta di programmi @command{awk} pubblicamente disponibili e
-avevo anche esortato a collaborare. Rendere disponibili le cose su Internet
-aiuta a contenere la distribuzione @command{gawk} entro dimensioni gestibili.
-
-L'iniziale raccolta di materiale, come questo, @`e tuttora disponibile
-su @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
-
-Chi fosse @emph{seriamente} interessato a contribuire nell'implementazione
-di un sito Internet dedicato ad argomenti riguardanti il
-linguaggio @command{awk}, @`e pregato di contattarmi.
-
-@ignore
-Nella speranza di
-fare qualcosa di pi@`u esteso, acquisii il dominio @code{awk.info}.
-
-Tuttavia, mi accorsi che non potevo dedicare abbastanza tempo per la gestione
-del codice inviato dai collaboratori: l'archivio non cresceva e il dominio
-rimase in disuso per diversi anni.
-
-Alla fine del 2008, un volontario si assunse il compito di mettere a punto
-un sito web collegato ad @command{awk}---@uref{http://awk.info}---e fece un
-lavoro molto ben fatto.
-
-Se qualcuno ha scritto un programma @command{awk} interessante, o un'estensione
-a @command{gawk} che vuole condividere col resto del mondo, @`e invitato a
-consultare la pagina @uref{http://awk.info/?contribute} per sapere come
-inviarlo per contribuire al sito web.
-
-Mentre scrivo, questo sito @`e in cerca di un responsabile; se qualcuno @`e
-interessato mi contatti.
-@end ignore
-
-@ignore
-Altri collegamenti:
-
-http://www.reddit.com/r/linux/comments/dtect/composing_music_in_awk/
-@end ignore
-@end ifclear
-
-@node Ringraziamenti
-@unnumberedsec Ringraziamenti
-
-La bozza iniziale di @cite{The GAWK Manual} riportava i seguenti ringraziamenti:
-
-@quotation
-Molte persone devono essere ringraziate per la loro assistenza nella produzione
-di questo manuale. Jay Fenlason ha contribuito con molte idee e programmi di
-esempio. Richard Mlynarik e Robert Chassell hanno fatto utili osservazioni
-sulle bozze di questo manuale. Lo scritto
-@cite{A Supplemental Document for AWK} di John W.@: Pierce, del
-Chemistry Department di UC San Diego, fa il punto su diverse questioni rilevanti
-sia per l'implementazione di @command{awk} che per questo manuale, che
-altrimenti ci sarebbero sfuggite.
-@end quotation
-
-@cindex Stallman, Richard
-Vorrei ringraziare Richard M.@: Stallman, per la sua visione di un mondo
-migliore e per il suo coraggio nel fondare la FSF e nel dare inizio al
-Progetto GNU.
-
-@ifclear FOR_PRINT
-Edizioni precedenti di questo @value{DOCUMENT} riportavano i seguenti
-ringraziamenti:
-@end ifclear
-@ifset FOR_PRINT
-La precedente edizione di questo @value{DOCUMENT} riportava
-i seguenti ringraziamenti:
-@end ifset
-
-@quotation
-Le seguenti persone (in ordine alfabetico)
-hanno inviato commenti utili riguardo alle diverse
-versioni di questo libro:
-Rick Adams,
-Dr.@: Nelson H.F. Beebe,
-Karl Berry,
-Dr.@: Michael Brennan,
-Rich Burridge,
-Claire Cloutier,
-Diane Close,
-Scott Deifik,
-Christopher (``Topher'') Eliot,
-Jeffrey Friedl,
-Dr.@: Darrel Hankerson,
-Michal Jaegermann,
-Dr.@: Richard J.@: LeBlanc,
-Michael Lijewski,
-Pat Rankin,
-Miriam Robbins,
-Mary Sheehan,
-e
-Chuck Toporek.
-
-@cindex Berry, Karl
-@cindex Chassell, Robert J.@:
-@c @cindex Texinfo
-Robert J.@: Chassell ha dato preziosissimi consigli
-sull'uso di Texinfo.
-Merita anche un particolare ringraziamento per avermi
-convinto a @emph{non} dare a questo @value{DOCUMENT}
-il titolo @cite{How to Gawk Politely}. [Un gioco di parole in inglese che pu@`o
-significare sia
-@cite{Come usare Gawk educatamente}
-che @cite{Come curiosare educatamente}].
-Karl Berry ha aiutato in modo significativo con la parte @TeX{} di Texinfo.
-
-@cindex Hartholz, Marshall
-@cindex Hartholz, Elaine
-@cindex Schreiber, Bert
-@cindex Schreiber, Rita
-Vorrei ringraziare Marshall ed Elaine Hartholz di Seattle e il Dr.@: Bert e Rita
-Schreiber di Detroit per i lunghi periodi di vacanza trascorsi in tutta
-tranquillit@`a in casa loro, che mi hanno permesso di fare importanti progressi
-nella scrittura di questo @value{DOCUMENT} e con lo stesso @command{gawk}.
-
-@cindex Hughes, Phil
-Phil Hughes di SSC
-ha contribuito in modo molto importante prestandomi il suo portatile col sistema
-GNU/Linux, non una volta, ma due, il che mi ha permesso di fare tantissimo lavoro
-mentre ero fuori casa.
-
-@cindex Trueman, David
-David Trueman merita un riconoscimento speciale; ha fatto un lavoro da sentinella
-durante lo sviluppo di @command{gawk} affinch@'e funzioni bene e senza errori.
-Sebbene non sia pi@`u impegnato con @command{gawk},
-lavorare con lui a questo progetto @`e stato un vero piacere.
-
-@cindex Drepper, Ulrich
-@cindex GNITS mailing list
-@cindex mailing list, GNITS
-Gli intrepidi membri della lista GNITS, con una particolare menzione per Ulrich
-Drepper, hanno fornito un aiuto prezioso e commenti per il progetto
-delle funzionalit@`a di internazionalizzazione.
-
-Chuck Toporek, Mary Sheehan, e Claire Cloutier della O'Reilly & Associates hanno
-fornito un'assistenza editoriale rilevante per questo @value{DOCUMENT} per la
-versione 3.1 di @command{gawk}.
-@end quotation
-
-@cindex Beebe, Nelson H.F.@:
-@cindex Buening, Andreas
-@cindex Collado, Manuel
-@cindex Colombo, Antonio
-@cindex Davies, Stephen
-@cindex Deifik, Scott
-@cindex Demaille, Akim
-@cindex G., Daniel Richard
-@cindex Hankerson, Darrel
-@cindex Jaegermann, Michal
-@cindex Kahrs, J@"urgen
-@cindex Kasal, Stepan
-@cindex Malmberg, John E.
-@cindex Pitts, Dave
-@cindex Ramey, Chet
-@cindex Rankin, Pat
-@cindex Schorr, Andrew
-@cindex Vinschen, Corinna
-@cindex Zaretskii, Eli
-
-Dr.@: Nelson Beebe,
-Andreas Buening,
-Dr.@: Manuel Collado,
-Antonio Colombo,
-Stephen Davies,
-Scott Deifik,
-Akim Demaille,
-Daniel Richard G.,
-Darrel Hankerson,
-Michal Jaegermann,
-J@"urgen Kahrs,
-Stepan Kasal,
-John Malmberg,
-Dave Pitts,
-Chet Ramey,
-Pat Rankin,
-Andrew Schorr,
-Corinna Vinschen,
-ed Eli Zaretskii
-(in ordine alfabetico)
-costituiscono l'attuale ``gruppo di lavoro sulla portabilit@`a'' di
-@command{gawk}. Senza il loro duro lavoro e il loro aiuto,
-@command{gawk} non sarebbe stato neanche lontanamente il buon programma che @`e
-oggi. @`E stato e continua a essere un piacere lavorare con questo gruppo
-di ottimi collaboratori.
-
-Notevoli contributi di codice e documentazione sono arrivati da
-parecchie persone. @xref{Contributori} per l'elenco completo.
-
-@ifset FOR_PRINT
-@cindex Oram, Andy
-Grazie ad Andy Oram della O'Reilly Media per aver iniziato
-la quarta edizione e per il suo aiuto in corso d'opera.
-Grazie a Jasmine Kwityn per il suo lavoro di revisione.
-@end ifset
-
-Grazie a Michael Brennan per le Prefazioni.
-
-@cindex Duman, Patrice
-@cindex Berry, Karl
-Grazie a Patrice Dumas per il nuovo programma @command{makeinfo}.
-Grazie a Karl Berry, che continua a lavorare per tenere
-aggiornato il linguaggio di marcatura Texinfo.
-
-@cindex Kernighan, Brian
-@cindex Brennan, Michael
-@cindex Day, Robert P.J.@:
-Robert P.J.@: Day, Michael Brennan e Brian Kernighan hanno gentilmente
-fatto da revisiori per l'edizione 2015 di questo @value{DOCUMENT}. Le loro
-osservazioni hanno contribuito a migliorare la stesura finale.
-
-Vorrei ringraziare Brian Kernighan per la sua preziosa assistenza durante
-la fase di collaudo e di debug di @command{gawk} e
-per l'aiuto in corso d'opera e i consigli nel chiarire diversi punti sul
-linguaggio. Non avremmo proprio fatto un cos@`{@dotless{i}} buon lavoro su @command{gawk} e
-sulla sua documentazione senza il suo aiuto.
-
-Brian @`e un fuoriclasse sia come programmatore che come autore di manuali
-tecnici. @`E mio dovere ringraziarlo (una volta di pi@`u) per la sua costante
-amicizia e per essere stato per me un modello da seguire ormai da quasi
-30 anni! Averlo come revisiore @`e per me un privilegio eccitante, ma @`e
-stata anche un'esperienza che mi ha fatto sentire molto piccolo@enddots{}
-
-@cindex Robbins, Miriam
-@cindex Robbins, Jean
-@cindex Robbins, Harry
-@cindex D-o
-Devo ringraziare la mia meravigliosa moglie, Miriam, per la sua pazienza nel
-corso delle molte versioni di questo progetto, per la correzione delle bozze e
-per aver condiviso con me il computer.
-Vorrei ringraziare i miei genitori per il loro amore, e per la gentilezza con cui
-mi hanno cresciuto ed educato.
-Infine, devo riconoscere la mia gratitudine a D-o, per le molte opportunit@`a
-che mi ha offerto, e anche per i doni che mi ha elargito, con cui trarre
-vantaggio da quelle opportunit@`a.
-@ifnotdocbook
-@sp 2
-@noindent
-Arnold Robbins @*
-Nof Ayalon @*
-Israel @*
-Febbraio 2015
-@end ifnotdocbook
-
-@ifnotinfo
-@part @value{PART1}Il Linguaggio @command{awk}
-@end ifnotinfo
-
-@ifdocbook
-@part Il Linguaggio @command{awk}
-
-La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
-nel dettaglio. Inizia con le nozioni di base, e continua con tutte le
-funzionalit@`a di @command{awk}. Sono incluse anche molte, ma non tutte, le
-funzionalit@`a di @command{gawk}. Questa parte contiene i
-seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Per iniziare}
-
-@item
-@ref{Invocare Gawk}
-
-@item
-@ref{Espressioni regolari}
-
-@item
-@ref{Leggere file}
-
-@item
-@ref{Stampare}
-
-@item
-@ref{Espressioni}
-
-@item
-@ref{Modelli e azioni}
-
-@item
-@ref{Vettori}
-
-@item
-@ref{Funzioni}
-@end itemize
-@end ifdocbook
-@node Per iniziare
-@chapter Per iniziare con @command{awk}
-@c @cindex @dfn{script}, definizione di
-@c @cindex rule, definizione di
-@c @cindex program, definizione di
-@c @cindex basic function of @command{awk}
-@cindex @command{awk}, funzione di
-
-Il compito fondamentale di @command{awk} @`e quello di ricercare righe (o
-altre unit@`a di testo) in file che corrispondano a certi criteri di ricerca.
-Quando una riga corrisponde a uno dei criteri, @command{awk} esegue su
-quella riga le azioni specificate per quel criterio. @command{awk} continua
-a elaborare righe in input in questo modo, finch@'e non raggiunge la fine delle
-righe nei file in input.
-
-@cindex @command{awk}, uso di
-@cindex linguaggi di programmazione@comma{} guidati-dai-dati/procedurali
-@cindex @command{awk}, programmi
-I programmi scritti in @command{awk} sono differenti dai programmi scritti
-nella maggior parte degli altri linguaggi,
-poich@'e i programmi @command{awk} sono @dfn{guidati dai dati} (ovvero,
-richiedono di descrivere i dati sui quali si vuole operare, e in seguito
-che cosa fare una volta che tali dati siano stati individuati).
-La maggior parte degli altri linguaggi sono @dfn{procedurali}; si deve
-descrivere, in maniera molto dettagliata, ogni passo che il programma
-deve eseguire. Lavorando con linguaggi procedurali, solitamente @`e
-molto pi@`u difficile descrivere chiaramente i dati che il programma
-deve elaborare.
-Per questa ragione i programmi @command{awk} sono spesso piacevolmente
-facili da leggere e da scrivere.
-
-@cindex programma, definizione di
-@cindex regola, definizione di
-Quando si esegue @command{awk}, va specificato un
-@dfn{programma} @command{awk} che
-dice ad @command{awk} cosa fare. Il programma consiste di una serie di
-@dfn{regole} (pu@`o anche contenere @dfn{definizioni di funzioni},
-una funzionalit@`a avanzata che per ora ignoreremo;
-@pxref{Funzioni definite dall'utente}). Ogni regola specifica un
-criterio di ricerca e un'azione da effettuare
-una volta che viene trovato un record corrispondente.
-
-Sintatticamente, una regola consiste in un @dfn{criterio di ricerca}, seguito
-da una @dfn{azione}.
-L'azione @`e racchiusa tra parentesi graffe per separarla dal criterio di
-ricerca.
-Per separare regole, basta andare a capo. Quindi un programma
-@command{awk} ha una struttura simile a questa:
-
-@example
-@var{criterio} @{ @var{azione} @}
-@var{criterio} @{ @var{azione} @}
-@dots{}
-@end example
-
-@menu
-* Eseguire gawk:: Come iniziare a eseguire programmi
- @command{gawk}; comprende la sintassi
- della riga di comando.
-* File dati di esempio:: File di dati di esempio da usare nei
- programmi @command{awk} illustrati in
- questo @value{DOCUMENT}.
-* Molto semplice:: Un esempio molto semplice.
-* Due regole:: Un esempio meno semplice di programma
- di una riga, che usa due regole.
-* Maggiore sofisticazione:: Un esempio pi@`u complesso.
-* Istruzioni/Righe:: Suddividere o riunire istruzioni
- su [una o pi@`u] righe.
-* Altre funzionalit@`a:: Altre funzionalit@`a di @command{awk}.
-* Quando:: Quando usare @command{gawk} e quando
- usare altre cose.
-* Sommario dell'introduzione:: Sommario dell'introduzione.
-@end menu
-
-@node Eseguire gawk
-@section Come iniziare a eseguire programmi @command{gawk}
-
-@cindex programmi @command{awk}, eseguire
-Ci sono vari modi di eseguire un programma @command{awk}. Se il programma @`e
-corto, @`e pi@`u facile includerlo nel comando con cui si invoca @command{awk},
-cos@`{@dotless{i}}:
-
-@example
-awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex riga di comando, formati
-Quando il programma @`e lungo, di solito @`e meglio metterlo in un file
-ed eseguirlo con un comando come questo:
-
-@example
-awk -f @var{file-di-programma} @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} si occupa di entrambe queste modalit@`a insieme
-a parecchie varianti di ciascuna di esse.
-
-@menu
-* Monouso:: Eseguire un breve programma
- @command{awk} di tipo usa-e-getta.
-* Leggere dal terminale:: Senza uso di file in input (input
- immesso da tastiera).
-* Lunghi:: Mettere programmi @command{awk}
- permanenti in file.
-* @dfn{Script} eseguibili:: Preparare programmi @command{awk}
- da eseguire come @dfn{script}.
-* Commenti:: Aggiungere documentazione a programmi
- @command{gawk}.
-* Protezione:: Ulteriore discussione di problemi
- connessi all'uso di apici nella shell.
-@end menu
-
-@node Monouso
-@subsection Eseguire un breve programma @command{awk} usa-e-getta
-
-Una volta acquisita familiarit@`a con @command{awk}, capiter@`a spesso di
-preparare semplici
-programmi nel momento in cui servono. In questo caso si pu@`o scrivere
-il programma come primo argomento del comando @command{awk}, cos@`{@dotless{i}}:
-
-@example
-awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@noindent
-dove @var{programma} consiste in una serie di criteri di ricerca e di
-azioni, come descritto precedentemente.
-
-@cindex apice singolo (@code{'})
-@cindex @code{'} (apice singolo)
-Questo formato di comando chiede alla @dfn{shell}, ossia all'interpretatore
-dei comandi, di richiamare @command{awk} e di usare il @var{programma} per
-trattare record nei file in input.
-Il @var{programma} @`e incluso tra apici in modo che
-la shell non interpreti qualche carattere destinato ad @command{awk} come
-carattere speciale
-della shell. Gli apici fanno inoltre s@`{@dotless{i}} che la shell tratti tutto il
-@var{programma} come un solo argomento per @command{awk}, e permettono che
-@var{programma} sia pi@`u lungo di una riga.
-
-@cindex shell, @dfn{script}
-@cindex programmi @command{awk}, eseguire, da @dfn{script} di shell
-Questo formato @`e utile anche per eseguire programmi @command{awk} di
-dimensioni piccole o medie da @dfn{script} di shell, perch@'e non richiede
-un file separato che contenga il programma @command{awk}. Uno @dfn{script}
-di shell @`e pi@`u affidabile, perch@'e non ci sono altri file che possono
-venirsi a trovare fuori posto.
-
-Pi@`u avanti in questo capitolo,
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ifdocbook
-@value{SECTION}
-@end ifdocbook
-@ref{Molto semplice},
-si vedranno esempi di parecchi programmi,
-brevi, scritti sulla riga di comando.
-
-@node Leggere dal terminale
-@subsection Senza uso di file in input (input immesso da tastiera)
-
-@cindex standard input
-@cindex input, standard
-@cindex file in input, eseguire @command{awk} senza usarli
-Si pu@`o anche eseguire @command{awk} senza indicare alcun file in input. Se
-si immette la seguente riga di comando:
-
-@example
-awk '@var{programma}'
-@end example
-
-@noindent
-@command{awk} prende come input del @var{programma} lo @dfn{standard input},
-che di solito significa qualsiasi cosa venga immesso dalla tastiera.
-Ci@`o prosegue finch@'e non si segnala una fine-file battendo @kbd{Ctrl-d}.
-(In sistemi operativi non-POSIX, il carattere di fine-file pu@`o essere diverso.)
-
-@cindex input, file in, si veda file in input
-@cindex file in input, eseguire @command{awk} senza usarli
-@cindex programmi @command{awk}, eseguire, senza file in input
-Per esempio, il seguente programma stampa un consiglio da amico
-(dalla @cite{Guida galattica per gli autostoppisti} di Douglas Adams ),
-per non lasciarsi spaventare dalle complessit@`a della programmazione per
-computer:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Non v\47allarmate!" @}'}
-@print{} Non v'allarmate!
-@end example
-
-@command{awk} esegue le istruzioni associate a @code{BEGIN} prima di leggere
-qualsiasi input. Se non ci sono altre istruzioni nel proprio programma, come
-in questo caso, @command{awk} si ferma, invece di tentare di leggere input che
-non sa come elaborare.
-Il @samp{\47} @`e un modo straordinario (spiegato pi@`u avanti) per inserire un
-apice singolo nel programma, senza dover ricorrere a fastidiosi meccanismi
-di protezione della shell.
-
-@quotation NOTA
-Se si usa Bash come shell, si dovrebbe digitare il comando @samp{set +H} prima
-eseguire questo programma interattivamente, per non avere una cronologia dei
-comandi nello stile della C shell, che tratta il @samp{!} come un carattere
-speciale. Si raccomanda di inserire quel comando nel proprio file di
-personalizzazione della shell.
-@end quotation
-
-Il seguente semplice programma @command{awk}
-emula il comando @command{cat}; ovvero copia qualsiasi cosa si
-batta sulla tastiera nel suo standard output (perch@'e succede @`e spiegato fra
-poco):
-
-@example
-$ @kbd{awk '@{ print @}'}
-@kbd{Ora @`e il tempo per tutti gli uomini buoni}
-@print{} Ora @`e il tempo per tutti gli uomini buoni
-@kbd{di venire in aiuto al loro paese.}
-@print{} di venire in aiuto al loro paese.
-@kbd{Or sono sedici lustri e sette anni, ...}
-@print{} Or sono sedici lustri e sette anni, ...
-@kbd{Cosa, io preoccupato?}
-@print{} Cosa, io preoccupato?
-@kbd{Ctrl-d}
-@end example
-
-@node Lunghi
-@subsection Eseguire programmi lunghi
-
-@cindex programmi @command{awk}, eseguire
-@cindex programmi @command{awk}, lunghi
-@cindex file, programmi @command{awk} in
-Talora i programmi @command{awk} sono molto lunghi. In tali situazioni
-conviene mettere il programma in un file separato. Per dire ad
-@command{awk} di usare quel file come programma, digitare:
-
-@example
-awk -f @var{file-sorgente} @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex @option{-f}, opzione
-@cindex riga di comando, opzione @option{-f}
-L'opzione @option{-f} dice al comando @command{awk} di ottenere il programma
-@command{awk} dal file @var{file-sorgente} (@pxref{Opzioni}).
-Ogni @value{FN} pu@`o essere usato come @var{file-sorgente}. Per esempio, si
-potrebbe mettere il programma:
-
-@example
-BEGIN @{ print \"Non v'allarmate!\" @}
-@end example
-
-@noindent
-nel file @file{consiglio}. Allora questo comando:
-
-@example
-awk -f consiglio
-@end example
-
-@noindent
-@`e equivalente al comando:
-
-@example
-awk 'BEGIN @{ print \"Non v\47allarmate!\" @}'
-@end example
-
-@cindex protezione, nella riga di comando di @command{gawk}
-@noindent
-Questo @`e gi@`a stato spiegato prima
-(@pxref{Leggere dal terminale}).
-Si noti che normalmente non serve mettere apici singoli nel @value{FN} che si
-fornisce con @option{-f}, perch@'e di solito i @value{FNS} non contengono
-caratteri che sono speciali per la shell. Si noti che in @file{consiglio},
-il programma @command{awk} non ha dei doppi apici che lo delimitano. I
-doppi apici sono necessari solo per programmi scritti direttamente sulla riga
-di comando di @command{awk}.
-(Inoltre, se il programma si trova in un file, @`e possibile usare un apice
-singolo all'interno del programma, invece del magico @samp{\47}.)
-
-@cindex apice singolo (@code{'}), nella riga di comando di @command{gawk}
-@cindex @code{'} (apice singolo), nella riga di comando di @command{gawk}
-Per identificare chiaramente un file di programma @command{awk} come tale,
-si pu@`o aggiungere il suffisso @file{.awk} al @value{FN}. Ci@`o non
-cambia l'esecuzione del programma @command{awk} ma semplifica
-la ``manutenzione''.
-
-@node @dfn{Script} eseguibili
-@subsection Programmi @command{awk} da eseguire come @dfn{script}
-@cindex programmi @command{awk}
-@cindex @code{#} (cancelletto), @code{#!} (@dfn{script} eseguibili)
-@cindex Unix, @dfn{script} @command{awk} e
-@cindex cancelletto (@code{#}), @code{#!} (@dfn{script} eseguibili)
-
-Una volta familiarizzato con @command{awk}, si potrebbero scrivere
-@dfn{script} che richiamano @command{awk}, usando il meccanismo di
-@dfn{script} @samp{#!}. Ci@`o @`e
-possibile in molti sistemi operativi.@footnote{Il meccanismo @samp{#!}
-funziona nei sistemi
-GNU/Linux, in quelli basati su BSD e nei sistemi Unix a pagamento.}
-Per esempio, si potrebbe modificare il file @file{consiglio} e farlo divenire:
-
-@example
-#! /bin/awk -f
-
-BEGIN @{ print \"Non v'allarmate!\" @}
-@end example
-
-@noindent
-Dopo aver reso eseguibile questo file (con il comando @command{chmod}),
-digitare semplicemente @samp{consiglio}
-al prompt della shell e il sistema si preparer@`a a eseguire @command{awk}
-come se si fosse digitato @samp{awk -f consiglio}:
-
-@example
-$ @kbd{chmod +x consiglio}
-$ @kbd{consiglio}
-@print{} Non v'allarmate!
-@end example
-
-@noindent
-(Si suppone che la directory corrente sia tra quelle contenute nella variabile
-che indica il "percorso" di ricerca [solitamente @code{$PATH}]. In caso
-contrario si potrebbe aver bisogno di digitare @samp{./consiglio} nella
-shell.)
-
-@dfn{Script} @command{awk} autocontenuti sono utili se si vuol scrivere un
-programma che gli utenti possono richiamare senza dover essere informati che
-il programma @`e scritto in @command{awk}.
-
-@cindex sidebar, Comprendere @samp{#!}
-@ifdocbook
-@docbook
-<sidebar><title>Comprendere @samp{#!}</title>
-@end docbook
-
-@cindex portabilit@`a, @code{#!} (@dfn{script} eseguibili)
-
-@command{awk} @`e un linguaggio @dfn{interpretato}. Ci@`o significa che il
-comando @command{awk} legge il programma dell'utente e poi elabora i dati
-secondo le istruzioni contenute nel programma (diversamente da un linguaggio
-@dfn{compilato} come il C, dove il programma viene prima compilato in codice
-macchina che @`e eseguito direttamente dal processore del sistema). Il
-programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
-Molti linguaggi moderni sono interpretati.
-
-La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
-interpretatore
-da richiamare, con degli argomenti facoltativi che saranno passati a
-quell'interpretatore sulla riga di comando. Il sistema operativo quindi
-richiama l'interpretatore con gli argomenti dati e con l'intera lista di
-argomenti con cui era stato invocato il programma. Il primo argomento nella
-lista @`e l'intero @value{FN} del programma @command{awk}. Il resto della lista
-degli argomenti contiene opzioni per @command{awk}, oppure @value{DF}, o
-entrambi. (Si noti che in molti sistemi @command{awk} pu@`o essere trovato in
-@file{/usr/bin} invece che in @file{/bin}.)
-
-Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
-32 caratteri. Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
-
-Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
-dopo il percorso del comando @command{awk}. Non funziona. Il sistema
-operativo tratta il resto della riga come un argomento solo, e lo passa ad
-@command{awk}.
-Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni probabilit@`a un
-messaggio di errore di qualche tipo da @command{awk}.
-
-@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
-@cindex portabilit@`a, variabile @code{ARGV}
-Infine, il valore di @code{ARGV[0]}
-(@pxref{Variabili predefinite})
-pu@`o variare a seconda del sistema operativo.
-Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
-di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
-dello @dfn{script} dell'utente (@samp{consiglio}). @value{DARKCORNER}
-Non bisogna fidarsi del valore di @code{ARGV[0]}
-per ottenere il nome del proprio @dfn{script}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Comprendere @samp{#!}}
-
-
-@cindex portabilit@`a, @code{#!} (@dfn{script} eseguibili)
-
-@command{awk} @`e un linguaggio @dfn{interpretato}. Ci@`o significa che il
-comando @command{awk} legge il programma dell'utente e poi elabora i dati
-secondo le istruzioni contenute nel programma (diversamente da un linguaggio
-@dfn{compilato} come il C, dove il programma viene prima compilato in codice
-macchina che @`e eseguito direttamente dal processore del sistema). Il
-programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
-Molti linguaggi moderni sono interpretati.
-
-La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
-interpretatore
-da richiamare, con degli argomenti facoltativi che saranno passati a
-quell'interpretatore sulla riga di comando. Il sistema operativo quindi
-richiama l'interpretatore con gli argomenti dati e con l'intera lista di
-argomenti con cui era stato invocato il programma. Il primo argomento nella
-lista @`e l'intero @value{FN} del programma @command{awk}. Il resto della lista
-degli argomenti contiene opzioni per @command{awk}, oppure @value{DF}, o
-entrambi. (Si noti che in molti sistemi @command{awk} pu@`o essere trovato in
-@file{/usr/bin} invece che in @file{/bin}.)
-
-Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
-32 caratteri. Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
-
-Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
-dopo il percorso del comando @command{awk}. Non funziona. Il sistema
-operativo tratta il resto della riga come un argomento solo, e lo passa ad
-@command{awk}.
-Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni probabilit@`a un
-messaggio di errore di qualche tipo da @command{awk}.
-
-@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
-@cindex portabilit@`a, variabile @code{ARGV}
-Infine, il valore di @code{ARGV[0]}
-(@pxref{Variabili predefinite})
-pu@`o variare a seconda del sistema operativo.
-Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
-di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
-dello @dfn{script} dell'utente (@samp{consiglio}). @value{DARKCORNER}
-Non bisogna fidarsi del valore di @code{ARGV[0]}
-per ottenere il nome del proprio @dfn{script}.
-@end cartouche
-@end ifnotdocbook
-
-@node Commenti
-@subsection Documentare programmi @command{gawk}.
-@cindex @code{#} (cancelletto), commentare
-@cindex cancelletto (@code{#}), commentare
-@cindex commentare
-@cindex programmi @command{awk}, documentazione
-
-Un @dfn{commento} @`e del testo incluso in un programma per aiutare le
-persone che lo leggeranno; non @`e parte del programma eseguibile vero e
-proprio. I commenti possono spiegare cosa fa il programma e come funziona.
-Quasi tutti i linguaggi di programmazione possono contenere commenti, poich@'e
-i programmi sono solitamente difficili da comprendere senza di essi.
-
-Nel linguaggio @command{awk}, un commento inizia con il segno del
-cancelletto (@samp{#}) e continua fino alla fine della riga.
-Il @samp{#} non deve necessariamente essere il primo carattere della riga.
-Il linguaggio @command{awk} ignora il resto di una riga dopo il carattere
-cancelletto.
-Per esempio, potremmo mettere quel che segue in @file{consiglio}:
-
-@example
-# Questo programma stampa uno scherzoso consiglio amichevole.
-# Aiuta a far passare la paura del computer agli utenti novelli.
-BEGIN @{ print "Non v'allarmate!" @}
-@end example
-
-Si possono mettere dei commenti nei programmi @command{awk} usa-e-getta da
-digitare direttamente da tastiera, ma ci@`o solitmanete non serve molto; il
-fine di un commento @`e di aiutare l'utente o qualcun altro a comprendere il
-programma, quando lo rilegge in un secondo tempo.
-
-@cindex protezione, per piccoli programmi awk
-@cindex apice singolo (@code{'}), vs.@: apostrofo
-@cindex @code{'} (apice singolo), vs.@: apostrofo
-@quotation ATTENZIONE
-Come detto in
-@ref{Monouso},
-si possono includere programmi di dimensioni da piccole a medie tra apici
-singoli, per mantenere compatti i propri @dfn{script} di shell
-autocontenuti. Nel far questo, @emph{non} bisogna inserire un apostrofo
-(ossia un apice singolo) in un commento, (o in qualsiasi altra parte del
-vostro programma). La shell interpreta gli apici singoli come delimitatori
-di chiusura dell'intero programma. Di conseguenza, solitamente la shell
-emette un messaggio riguardo ad apici presenti in numero dispari, e se
-@command{awk} viene comunque eseguito, @`e probabile che stampi strani
-messaggi di errori di sintassi.
-Per esempio, nel caso seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Ciao" @} # un'idea brillante'}
->
-@end example
-
-La shell considera il secondo apice singolo come delimitatore del testo
-precedente, e trova che un nuovo testo tra apici ha inizio verso la fine
-della riga di comando. A causa di ci@`o emette una richiesta secondaria di
-input, e si mette in attesa di ulteriore input.
-Con il comando @command{awk} Unix, se si chiude l'ulteriore stringa tra
-apici singoli il risultato @`e il seguente:
-
-@example
-$ @kbd{awk '@{ print "Ciao" @} # un'idea brillante'}
-> @kbd{'}
-@error{} awk: fatale: non riesco ad aprire file `brillante'
-@error{} in lettura (File o directory non esistente)
-@end example
-
-@cindex @code{\} (barra inversa)
-@cindex barra inversa (@code{\})
-Mettere una barra inversa prima dell'apice singolo in @samp{un'idea} non
-risolverebbe, poich@'e le barre inverse non sono speciali all'interno di apici
-singoli.
-La prossima @value{SUBSECTION} descrive le regole di protezione della shell.
-@end quotation
-
-@node Protezione
-@subsection Uso di apici nella shell.
-@cindex shell, uso di apici, regole per
-
-@menu
-* Doppi apici in DOS:: Passaggio di apici in file .BAT Windows.
-@end menu
-
-Per programmi @command{awk} di lunghezza da corta a media spesso conviene
-digitare il programma sulla riga di comando @command{awk}.
-La maniera migliore per farlo @`e racchiudere l'intero programma tra apici
-singoli.
-Questo vale sia che si digiti il programma interattivamente su
-richiesta della shell, sia che lo si scriva come parte di uno @dfn{script}
-di shell di maggiori dimensioni:
-
-@example
-awk '@var{testo del programma}' @var{input-file1} @var{input-file2} @dots{}
-@end example
-
-@cindex shell, uso di apici, regole per
-@cindex Bourne shell, uso di apici, regole per la
-Quando si lavora con la shell, non guasta avere una conoscenza
-di base sulle regole per l'uso di apici nella shell. Le regole
-seguenti valgono solo per shell in stile Bourne (come Bash, la
-Bourne-Again shell). Se si usa la C shell, si avranno regole differenti.
-
-Prima di immergerci nelle regole, introduciamo un concetto che ricorre
-in tutto questo @value{DOCUMENT}, che @`e quello della stringa @dfn{null},
-o vuota.
-
-La stringa nulla @`e una variabile, di tipo carattere, che non ha un valore.
-In altre parole, @`e vuota. Nei programmi @command{awk} si scrive cos@`{@dotless{i}}:
-@code{""}. Nella shell la si pu@`o scrivere usando apici sia singoli
-che doppi: @code{""} oppure @code{''}. Sebbena la stringa nulla non contenga
-alcun carattere, essa esiste lo stesso. Si consideri questo comando:
-
-@example
-$ @kbd{echo ""}
-@end example
-
-@noindent
-Qui, il comando @command{echo} riceve un solo argomento, anche se
-quell'argomento non contiene alcun carattere. Nel resto di questo
-@value{DOCUMENT}, usiamo indifferentemente i termini @dfn{stringa nulla}
-e @dfn{stringa vuota}. Ora, proseguiamo con le regole relative agli apici:
-
-
-@itemize @value{BULLET}
-@item
-Elementi tra apici possono essere concatenati con elementi non tra apici.
-La shell converte il tutto in un singolo argomento da passare
-al comando.
-
-@item
-Mettere una barra inversa (@samp{\}) prima di qualsiasi singolo carattere
-lo protegge. La shell toglie la barra inversa e passa il carattere
-protetto al comando.
-
-@item
-@cindex @code{\} (barra inversa), nei comandi di shell
-@cindex barra inversa (@code{\}), nei comandi di shell
-@cindex apice singolo (@code{'}), nei comandi di shell
-@cindex @code{'} (apice singolo), nei comandi di shell
-Gli apici singoli proteggono qualsiasi cosa sia inclusa tra un apice di
-apertura e uno di chiusura.
-La shell non interpreta il testo protetto, il quale viene passato cos@`{@dotless{i}} com'@`e
-al comando.
-@`E @emph{impossibile} inserire un apice singolo in un testo racchiuso fra
-apici singoli. Potete trovare in
-@ref{Commenti}
-un esempio di cosa succede se si prova a farlo.
-
-@item
-@cindex doppio apice (@code{"}), nei comandi shell
-@cindex @code{"} (doppio apice), nei comandi shell
-I doppi apici proteggono la maggior parte di quel che @`e racchiuso tra i
-doppi apici di apertura e quelli di chiusura.
-La shell effettua almeno la sostituzione di variabili e di comandi
-sul testo racchiuso tra doppi apici.
-Shell differenti possono fare ulteriori tipi di elaborazione
-sul testo racchiuso tra doppi apici.
-
-Poich@'e alcuni caratteri all'interno di un testo racchiuso tra doppi apici
-sono interpretati dalla shell, essi devono essere @dfn{protetti} all'interno
-del testo stesso. Sono da tener presenti i caratteri
-@samp{$}, @samp{`}, @samp{\}, e @samp{"}, tutti i quali devono essere
-preceduti da una barra inversa quando ricorrono all'interno di un testo
-racchiuso tra doppi apici, per poter essere passati letteralmente al
-programma. (La barra inversa viene tolta prima del passaggio al programma.)
-Quindi, l'esempio visto
-@ifnotinfo
-precedentemente
-@end ifnotinfo
-in @ref{Leggere dal terminale}:
-
-@example
-awk 'BEGIN @{ print "Non v\47allarmate!" @}'
-@end example
-
-@noindent
-si potrebbe scrivere invece cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk "BEGIN @{ print \"Non v'allarmate!\" @}"}
-@print{} Non v'allarmate!
-@end example
-
-@cindex apice singolo (@code{'}), con doppio apice
-@cindex @code{'} (apice singolo), con doppio apice
-Va notato che l'apice singolo non @`e speciale all'interno di un testo
-racchiuso tra doppi apici.
-
-@item
-Le stringhe nulle sono rimosse se presenti come parte di un argomento
-non-nullo sulla riga di comando, mentre oggetti esplicitamente nulli
-sono mantenuti come tali.
-Per esempio, per richiedere che il separatore di campo @code{FS} sia
-impostato alla stringa nulla, digitare:
-
-@example
-awk -F "" '@var{programma}' @var{file} # corretto
-@end example
-
-@noindent
-@cindex stringa nulla come argomento a @command{gawk}, protezione della
-Non @`e invece da usare:
-
-@example
-awk -F"" '@var{programma}' @var{file} # errato!
-@end example
-
-@noindent
-Nel secondo caso, @command{awk} tenta di usare il nome del programma come
-valore di @code{FS}, e il primo @value{FN} come testo del programma!
-Ci@`o come minimo genera un errore di sintassi, e un comportamento confuso nel
-caso peggiore.
-@end itemize
-
-@cindex protezione, nella riga di comando di @command{gawk}, trucchi per
-Mischiare apici singoli e doppi @`e difficile. Occorre utilizzare
-trucchi della shell per gli apici, come questi:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo. <'"'"'>" @}'}
-@print{} Questo @`e un apice singolo. <'>
-@end example
-
-@noindent
-Questo programma stampa tre stringhe tra apici concatenate tra loro.
-La prima e la terza sono rinchiuse tra apici singoli, la seconda tra apici
-doppi.
-
-Quanto sopra pu@`o essere ``semplificato'' cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <'\''>" @}'}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-@noindent
-A voi la scelta del pi@`u leggibile dei due.
-
-Un'altra opzione @`e quella di usare doppi apici, proteggendo i doppi apici
-inclusi, a livello @command{awk}:
-
-@example
-$ @kbd{awk "BEGIN @{ print \"Questo @`e un apice singolo <'>\" @}"}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-@noindent
-Quest'opzione @`e fastidiosa anche perch@'e il doppio apice, la barra inversa e
-il simbolo del dollaro sono molto comuni nei programmi @command{awk} pi@`u
-avanzati.
-
-Una terza opzione @`e quella di usare le sequenze ottali equivalenti
-(@pxref{Sequenze di protezione})
-per i caratteri
-apice singolo e doppio, cos@`{@dotless{i}}:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <\47>" @}'}
-@print{} Questo @`e un apice singolo <'>
-$ @kbd{awk 'BEGIN @{ print "Questo @`e un doppio apice <\42>" @}'}
-@print{} Questo @`e un doppio apice <">
-@end example
-
-@noindent
-Questo funziona bene, ma sai dovrebbe commentare chiaramente quel che
-il testo protetto significa.
-
-Una quarta possibilit@`a @`e di usare assegnamenti di variabili sulla riga di
-comando, cos@`{@dotless{i}}:
-
-@example
-@kbd{$ awk -v sq="'" 'BEGIN @{ print "Questo @`e un apice singolo <" sq ">" @}'}
-@print{} Questo @`e un apice singolo <'>
-@end example
-
-(Qui, le due stringhe costanti e il valore di @code{sq} sono concatenati in
-un'unica stringa che @`e stampata da @code{print}.)
-
-Se servono veramente sia gli apici singoli che quelli doppi nel proprio
-programma @command{awk}, @`e probabilmente meglio tenerlo in un file separato,
-dove la shell non interferisce, e si potr@`a scrivere quello che si vuole.
-
-@node Doppi apici in DOS
-@subsubsection Doppi apici in file .BAT Windows
-
-@ignore
-Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
-From: jeroen.brink@inter.NL.net
-Subject: (g)awk "contribution"
-To: arnold@skeeve.com
-Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
-
-Hello Arnold,
-
-maybe you can help me out. Found your email on the GNU/awk online manual
-pages.
-
-I've searched hard to figure out how, on Windows, to print double quotes.
-Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
-figured out how to do this myself.
-
-How to print all lines in a file surrounded by double quotes (on Windows):
-
-gawk "{ print \"\042\" $0 \"\042\" }" <file>
-
-Maybe this is a helpfull tip for other (Windows) gawk users. However, i
-don't have a clue as to where to "publish" this tip! Do you?
-
-Kind regards,
-
-Jeroen Brink
-@end ignore
-
-Sebbene questo @value{DOCUMENT} in generale si preoccupi solo di sistemi POSIX
-e della shell POSIX, il problema che stiamo per vedere emerge abbastanza
-spesso presso parecchi utenti, e per questo ne parliamo.
-
-@cindex Brink, Jeroen
-Le ``shell'' nei sistemi Microsoft Windows usaso il carattere doppio apice
-per protezione, e rendono difficile o impossibile inserire un carattere
-doppio apice in uno @dfn{script} scritto su una riga di comando.
-l'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come
-stampare tutte le righe di un file, racchiudendole tra doppi apici:
-
-@example
-gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
-@end example
-
-
-@node File dati di esempio
-@section @value{DDF} per gli esempi
-
-@cindex input file, esempi
-@cindex file di @code{mail-list}
-Molti degli esempi in questo @value{DOCUMENT} hanno come input due @value{DF}
-di esempio. Il primo, @file{mail-list}, contiene una lista di nomi di
-persone, insieme ai loro indirizzi email e a informazioni riguardanti le
-persone stesse.
-Il secondo @value{DF}, di nome @file{inventory-shipped}, contiene
-informazioni riguardo a consegne mensili. In entrambi i file,
-ogni riga @`e considerata come un @dfn{record}.
-
-Nel @file{mail-list}, ogni record contiene il nome di una persona,
-il suo numero di telefono, il suo indirizzo email, e un codice che indica
-la sua relazione con l'autore della lista.
-Le colonne sono allineate usando degli spazi.
-Una @samp{A} nell'ultima colonna indica che quella persona @`e un conoscente
-[Acquaintance]. Una @samp{F} nell'ultima colonna significa che quella
-persona @`e un amico [Friend]. Una @samp{R} vuol dire che quella persona @`e
-un parente [Relative]:
-
-@example
-@c system if test ! -d eg ; then mkdir eg ; fi
-@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi
-@c system if test ! -d eg/data ; then mkdir eg/data ; fi
-@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
-@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
-@c file eg/data/mail-list
-Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-Anthony 555-3412 anthony.asserturo@@hotmail.com A
-Becky 555-7685 becky.algebrarum@@gmail.com A
-Bill 555-1675 bill.drowning@@hotmail.com A
-Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-Camilla 555-2912 camilla.infusarum@@skynet.be R
-Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-Julie 555-6699 julie.perscrutabor@@skeeve.com F
-Martin 555-6480 martin.codicibus@@hotmail.com A
-Samuel 555-3430 samuel.lanceolis@@shu.edu A
-Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@c endfile
-@end example
-
-@cindex file @code{inventory-shipped}
-Il @value{DF} @file{inventory-shipped} contiene
-informazioni sulle consegne effettuate durante l'anno.
-Ogni record contiene il mese, il numero di contenitori verdi spediti,
-il numero di scatole rosse spedite, il numero di borse arancione spedite,
-e il numero di pacchetti blu spediti, in quest'ordine.
-Ci sono 16 record, relativi ai dodici mesi dello scorso anno e ai primi
-quattro mesi dell'anno in corso.
-Una riga vuota separa i data relativi a ciascun anno:
-
-@example
-@c file eg/data/inventory-shipped
-Jan 13 25 15 115
-Feb 15 32 24 226
-Mar 15 24 34 228
-Apr 31 52 63 420
-May 16 34 29 208
-Jun 31 42 75 492
-Jul 24 34 67 436
-Aug 15 34 47 316
-Sep 13 55 37 277
-Oct 29 54 68 525
-Nov 20 87 82 577
-Dec 17 35 61 401
-
-Jan 21 36 64 620
-Feb 26 58 80 652
-Mar 24 75 70 495
-Apr 21 70 74 514
-@c endfile
-@end example
-
-Questi file di esempio sono inclusi nella distribuzione @command{gawk},
-nella directory @file{awklib/eg/data}.
-
-@node Molto semplice
-@section Alcuni esempi molto semplici
-
-I seguenti comandi eseguono un semplice programma @command{awk} che cerca
-nel file in input @file{mail-list} la stringa di caratteri @samp{li} (una
-sequenza di caratteri @`e solitamente chiamato una @dfn{stringa};
-il termine @dfn{stringa} @`e basato su un uso linguistico, del tipo
-``una stringa di perle'' o ``una stringa di luci decorative''):
-
-@example
-awk '/li/ @{ print $0 @}' mail-list
-@end example
-
-@noindent
-Quando si incontra una riga che contiene @samp{li}, la si stampa, perch@'e
-@w{@samp{print $0}} significa "stampa la riga corrente". (Lo scrivere solo
-@samp{print} ha lo stesso significato, quindi avremmo anche potuto
-limitarci a fare cos@`{@dotless{i}}).
-
-Si sar@`a notato che delle barre (@samp{/}) delimitano la stringa @samp{li}
-nel programma @command{awk}. Le barre indicano che @samp{li} @`e il
-modello da ricercare. Questo tipo di notazione @`e definita come
-@dfn{espressione regolare}, e sar@`a trattata pi@`u avanti in maggior dettaglio
-@iftex
-(@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}).
-@end ifnottex
-Il modello pu@`o corrispondere anche solo a una parte di una parola.
-Ci sono
-apici singoli che racchiudono il programma @command{awk} in modo che la
-shell non interpreti alcuna parte di esso come un carattere speciale della
-shell.
-
-Questo @`e quello che il programma stampa:
-
-@example
-$ @kbd{awk '/li/ @{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@end example
-
-@cindex azioni, default
-@cindex criteri di ricerca, default
-In una regola @command{awk}, il criterio di selezione o l'azione possono
-essere omessi, ma non entrambi. Se il criterio @`e omesso, l'azione viene
-applicata a @emph{ogni} riga dell'input.
-Se l'azione viene omessa, per default si stampano tutte le righe che
-sono individuate dal criterio di selezione.
-
-@cindex azioni, omesse
-Quindi, si potrebbe omettere l'azione (l'istruzione @code{print} e le
-graffe) nell'esempio precedente e il risultato sarebbe lo stesso:
-@command{awk} stampa tutte le righe che corrispondono al criterio di
-ricerca @samp{li}. Per confronto, omettendo l'istruzione @code{print} ma
-lasciando le graffe si richiede un'azione nulla, che non fa nulla (cio@`e non
-stampa alcuna riga).
-
-@cindex programmi @command{awk}, esempi molto corti
-Molti programmi @command{awk} pratici sono lunghi solo una o due righe.
-Qui sotto troviamo una collezione di programmi utili e corti, per iniziare.
-Alcuni di questi programmi contengono elementi del linguaggio che non sono
-ancora stati spiegati. (La descrizione del programma fornisce una buona
-idea di quel che si vuole ottenere, ma occorre leggere il resto del
-@value{DOCUMENT} per divenire esperti in @command{awk}!)
-Molti degli esempi usano un @value{DF} di nome @file{data}. Questo serve solo
-a indicare la posizione del nome; se questi programmi devono venir usati per
-se stessi, sostituire i propri @value{FNS} al posto di @file{data}.
-Per futura memoria, si noti che spesso c'@`e pi@`u di un modo per fare qualcosa
-in @command{awk}. In un altro momento, si potrebbe tornare a guardare questi
-esempi per vedere se si riescono a trovare modi differenti per fare le stesse
-cose mostrate qui appresso:
-
-@itemize @value{BULLET}
-@item
-Stampare ogni riga lunga pi@`u di 80 caratteri:
-
-@example
-awk 'length($0) > 80' data
-@end example
-
-L'unica regola presente ha un'espressione di relazione come modello
-e non ha azione---quindi applica l'azione di default, stampando il record.
-
-@item
-Stampare la lunghezza della riga in input pi@`u lunga:
-
-@example
-awk '@{ if (length($0) > max) max = length($0) @}
- END @{ print max @}' data
-@end example
-
-Il codice associato a @code{END} viene eseguito dopo che tutto
-l'input @`e stato letto; @`e l'altra faccia della medaglia di @code{BEGIN}.
-
-@cindex programma @command{expand}
-@cindex @command{expand}, programma
-@item
-Stampare la lunghezza della riga pi@`u lunga in @file{data}:
-
-@example
-expand data | awk '@{ if (x < length($0)) x = length($0) @}
- END @{ print "la lunghezza massima di una riga @`e" x @}'
-@end example
-
-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
-otto spazi bianchi in fase di stampa.]
-
-@item
-Stampare ogni riga che abbia almeno un campo:
-
-@example
-awk 'NF > 0' data
-@end example
-
-Questa @`e una maniera facile per eliminare le righe vuote dal file (o
-piuttosto, per creare un nuovo file, simile al vecchio, ma nel quale le
-linee vuote sono state tolte).
-
-@item
-Stampare sette numeri casuali compresi tra 0 e 100, inclusi:
-
-@example
-awk 'BEGIN @{ for (i = 1; i <= 7; i++)
- print int(101 * rand()) @}'
-@end example
-
-@item
-Stampare il numero totale di byte usato da un @var{elenco-file}:
-
-@example
-ls -l @var{elenco-file} | awk '@{ x += $5 @}
- END @{ print "byte totali: " x @}'
-@end example
-
-@item
-Stampare il numero totale di kilobyte usati da @var{elenco-file}:
-
-@c Don't use \ continuation, not discussed yet
-@c Remember that awk does floating point division,
-@c no need for (x+1023) / 1024
-@example
-ls -l @var{elenco-file} | awk '@{ x += $5 @}
- END @{ print "K-byte totali:", x / 1024 @}'
-@end example
-
-@item
-Stampare una lista in ordine alfabetico di tutti gli utenti del sistema
-[Unix]:
-
-@example
-awk -F: '@{ print $1 @}' /etc/passwd | sort
-@end example
-
-@item
-Contare le righe in un file:
-
-@example
-awk 'END @{ print NR @}' data
-@end example
-
-@item
-Stampare le righe pari nel @value{DF}:
-
-@example
-awk 'NR % 2 == 0' data
-@end example
-
-Se aveste usato invece l'espressione @samp{NR % 2 == 1},
-il programma avrebbe stampato le righe dispari.
-@end itemize
-
-@node Due regole
-@section Un esempio che usa due regole
-@cindex programmi @command{awk}
-
-Il programma @command{awk} legge il file in input una riga alla volta.
-Per ogni riga @command{awk} controlla la corrispondenza con ogni regola.
-Se viene trovata pi@`u di una corrispondenza, vengono eseguite altrettante
-azioni, nell'ordine in cui appaiono nel programma @command{awk}.
-Se non viene trovata nessuna corrispondenza, non viene eseguita alcuna azione.
-
-Dopo aver elaborato tutte le regole che hanno corrispondenza con la riga (e
-pu@'o darsi che nessuna corrisponda), @command{awk} legge la riga successiva. Comunque
-@pxref{Istruzione next},
-@ifdocbook
-e @ref{Istruzione Nextfile}.)
-@end ifdocbook
-@ifnotdocbook
-e anche @pxref{Istruzione nextfile}.)
-@end ifnotdocbook
-Si prosegue cos@`{@dotless{i}} finch@'e il programma raggiunge la fine del file.
-Per esempio, il seguente programma @command{awk} contiene due regole:
-
-@example
-/12/ @{ print $0 @}
-/21/ @{ print $0 @}
-@end example
-
-@noindent
-La prima regola ha la stringa @samp{12} da cercare e
-@samp{print $0} come
-azione. La seconda regola ha la
-stringa @samp{21} da cercare e ha ancora @samp{print $0} come azione.
-L'azione di ciascuna regola @`e racchiusa in una coppia di parentesi graffe.
-
-Questo programma stampa ogni riga che contiene la stringa
-@samp{12} @emph{oppure} la stringa @samp{21}. Se una riga contiene entrambe
-le stringhe, @`e stampata due volte, una volta per ogni regola.
-
-Questo @`e ci@`o che capita se eseguiamo questo programma sui nostri @value{DF},
-@file{mail-list} e @file{inventory-shipped}:
-
-@example
-$ @kbd{awk '/12/ @{ print $0 @}}
-> @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
-@print{} Anthony 555-3412 anthony.asserturo@@hotmail.com A
-@print{} Camilla 555-2912 camilla.infusarum@@skynet.be R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@print{} Jan 21 36 64 620
-@print{} Apr 21 70 74 514
-@end example
-
-@noindent
-Si noti che la riga che inizia con @samp{Jean-Paul}
-nel file @file{mail-list}
-@`e stata stampata due volte, una volta per ogni regola.
-
-@node Maggiore sofisticazione
-@section Un esempio pi@`u complesso
-
-Dopo aver imparato a eseguire alcuni semplici compiti, vediamo cosa possono
-fare i tipici programmi @command{awk}.
-Questo esempio mostra come @command{awk} pu@`o essere usato per riassumere,
-selezionare e riordinare l'output di un altro comando. Sono usate
-funzionalit@`a di cui non si @`e ancora parlato, quindi non ci si deve preoccupare
-se alcuni dettagli risulteranno oscuri:
-
-@example
-ls -l | awk '$6 == "Nov" @{ somma += $5 @}
- END @{ print somma @}'
-@end example
-
-@cindex comando @command{ls}
-Questo comando stampa il numero totale di byte in tutti i file contenuti
-nella directory corrente, la cui data di modifica @`e novembre (di qualsiasi
-anno). La parte @w{@samp{ls -l}} dell'esempio @`e un comando di sistema che
-fornisce un elenco dei file in una directory, con anche la dimensione di
-ogni file e la data di ultima modifica. Il suo output @`e del tipo:
-
-@example
--rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile
--rw-r--r-- 1 arnold user 10809 Nov 7 13:03 awk.h
--rw-r--r-- 1 arnold user 983 Apr 13 12:14 awk.tab.h
--rw-r--r-- 1 arnold user 31869 Jun 15 12:20 awkgram.y
--rw-r--r-- 1 arnold user 22414 Nov 7 13:03 awk1.c
--rw-r--r-- 1 arnold user 37455 Nov 7 13:03 awk2.c
--rw-r--r-- 1 arnold user 27511 Dec 9 13:07 awk3.c
--rw-r--r-- 1 arnold user 7989 Nov 7 13:03 awk4.c
-@end example
-
-@noindent
-@cindex continuazione di riga, nella C shell
-Il primo campo contiene le autorizzazioni di lettura/scrittura [r/w], il
-secondo il numero dei collegamenti al file [cio@`e il numero di nomi con cui
-il file @`e conosciuto], e il terzo campo identifica il proprietario del file.
-Il quarto campo identifica il gruppo a cui appartiene il file.
-Il quinto campo contiene la dimensione del file, in byte.
-Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora,
-rispettivamente, in cui il file @`e stato modificato. Infine, il nono campo
-contiene il @value{FN}.
-
-@c @cindex automatic initialization
-@cindex inizializzazione automatica
-L'espressione @samp{$6 == "Nov"} nel nostro programma @command{awk} controlla
-se il sesto campo dell'output di @w{@samp{ls -l}} corrisponda alla stringa
-@samp{Nov}. Ogni volta che una riga ha la stringa
-@samp{Nov} come suo sesto campo, @command{awk} esegue l'azione
-@samp{somma += $5}. Questo aggiunge il quinto campo (la dimensione del file)
-alla variabile @code{somma}. Come risultato, quando @command{awk} ha finito
-di leggere tutte le righe in input, @code{somma} contiene la somma totale
-delle dimensioni dei file che corrispondono al criterio di ricerca.
-(Ci@`o funziona contando sul fatto che le variabili @command{awk} sono
-automaticamente inizializzate a zero.)
-
-Dopo che l'ultima riga dell'output di @command{ls} @`e stata elaborata, la
-regola @code{END} viene eseguita e viene stampato il valore di @code{somma}.
-In questo esempio, il valore di @code{somma} @`e 80600.
-
-Queste tecniche pi@`u avanzate di @command{awk} sono trattate in
-@value{SECTIONS}
-successive (@pxref{Panoramica sulle azioni}). Prima di poter passare a una
-programmazione pi@`u avanzata con @command{awk}, @`e necessario sapere come
-@command{awk} interpreta i file in input e visualizza quelli in output.
-Modificando campi e usando l'istruzione @code{print} @`e possibile produrre
-dei rapporti molto utili ed esteticamente gradevoli.
-
-@node Istruzioni/Righe
-@section Istruzioni e righe in @command{awk}
-@cindex interruzioni di riga
-@cindex andare a capo
-
-Molto spesso, ogni riga di un programma @command{awk} @`e un'istruzione a s@'e
-stante o una regola isolata, come:
-
-@example
-awk '/12/ @{ print $0 @}
- /21/ @{ print $0 @}' mail-list inventory-shipped
-@end example
-
-@cindex @command{gawk}, andare a capo
-Comunque, @command{gawk} ignora i ritorni a capo dopo ognuno di questi
-simboli e istruzioni:
-
-@example
-, @{ ? : || && do else
-@end example
-
-@noindent
-Un ritorno a capo in ogni altro punto del programma @`e considerato come la
-fine di un'istruzione.@footnote{Il @samp{?} e i @samp{:} elencati sopra sono
-usati nell'espressione condizionale in tre parti descritta in
-@ref{Espressioni condizionali}.
-Il cambio di riga dopo @samp{?} e i @samp{:} @`e un'estensione minore in
-@command{gawk}; specificando @option{--posix} come opzione
-(@pxref{Opzioni}), quest'estensione non @`e valida.}
-
-@cindex @code{\} (barra inversa), continuazione di riga e
-@cindex barra inversa (@code{\}), continuazione di riga e
-Volendo dividere una sola istruzione su due righe in un punto in cui
-andando a capo sarebbe considerata conclusa, @`e possibile @dfn{continuare}
-nella riga successiva terminando la prima riga con un carattere di
-barra inversa (@samp{\}). La barra inversa dev'essere l'ultimo carattere
-sulla riga, per essere riconosciuto come un carattere di continuazione.
-Una barra inversa @`e consentita in ogni parte dell'istruzione, anche in mezzo
-a una stringa o a un'espressione regolare. Per esempio:
-
-@example
-awk '/Questa espressione regolare @`e troppo lunga, quindi\
- la continuiamo sulla riga seguente/ @{ print $1 @}'
-@end example
-
-@noindent
-@cindex portabilit@`a, continuazione di riga con barra inversa e
-Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri
-programmi di esempio. @command{gawk} non pone limiti alla lunghezza di
-una riga, quindi la continuazione tramite barra inversa non @`e mai strettamente
-necessaria; serve soltanto a migliorare la leggibilit@`a del programma.
-Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto
-concise molte istruzioni nei programmi presentati in questo @value{DOCUMENT}.
-La continuazione tramite barra inversa @`e molto utile quando il proprio
-programma @command{awk} si trova in un file sorgente separato, invece di
-essere immesso nella riga di comando. Si noti anche che molte implementazioni
-di @command{awk} presentano delle differenze su dove @`e possibile usare
-la continuazione tramite barra inversa. Per esempio, potrebbero non
-consentire di spezzare una costante di tipo stringa usando la continuazione
-tramite barra inversa. Quindi, per ottenere la massima portabilit@`a dei
-propri programmi @command{awk}, @`e meglio non spezzare le righe nel
-mezzo di un'espressione regolare o di una stringa.
-@c 10/2000: gawk, mawk, and current bell labs awk allow it,
-@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though! sigh.
-
-@cindex comando @command{csh}
-@cindex barra inversa (@code{\}), continuazione di riga e, in @command{csh}
-@cindex @code{\} (barra inversa), continuazione di riga e, in @command{csh}
-@quotation ATTENZIONE
-@emph{la continuazione tramite barra inversa non funziona come sopra descritto
-nella C shell.} Funziona per programmi @command{awk} contenuti in file e
-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
-indicata con una barra inversa. Per esempio:
-
-@example
-% @kbd{awk 'BEGIN @{ \}
-? @kbd{ print \\}
-? @kbd{ "ciao, mondo" \}
-? @kbd{@}'}
-@print{} ciao, mondo
-@end example
-
-@noindent
-Qui, il @samp{%} e il @samp{?} sono i prompt primario e secondario della
-C shell, analogamente a quelli usati nella shell standard @samp{$} e @samp{>}.
-
-Si confronti l'esempio precedente, come viene scritto in una shell conforme
-a POSIX:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{print \}
-> @kbd{"ciao, mondo"}
-> @kbd{@}'}
-@print{} ciao, mondo
-@end example
-@end quotation
-
-@command{awk} @`e un linguaggio orientato alla riga. L'azione relativa a ogni
-regola deve iniziare sulla stessa riga del criterio di selezione. Per avere
-criterio di selezione e azione su righe separate, si
-@emph{deve} usare la continuazione tramite barra inversa; non si pu@`o fare
-diversamente.
-
-@cindex barra inversa (@code{\}), continuazione di riga, commenti e
-@cindex @code{\} (barra inversa), continuazione di riga, commenti e
-@cindex commenti, continuazione di riga con barra inversa e i
-Un'altra cosa da tener presente @`e che la continuazione tramite barra inversa e
-i commenti non possono essere frammisti. Non appena @command{awk} incontra
-un @samp{#} che inizia un commento, ignora @emph{tutto} il resto della riga.
-Per esempio:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "Non allarmarti" # una amichevole \}
-> @kbd{ regola BEGIN}
-> @kbd{@}'}
-@error{} gawk: riga com.:2: regola BEGIN
-@error{} gawk: riga com.:2: ^ syntax error
-@end example
-
-@noindent
-In questo caso, parrebbe che la barra inversa continui il commento sulla riga
-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.
-
-@cindex istruzioni multiple
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Quando le istruzioni @command{awk} all'interno di una regola sono brevi, si
-potrebbe metterne pi@`u d'una su una riga sola. Ci@`o @`e possibile separando le
-istruzioni con un punto e virgola (@samp{;}).
-Questo vale anche per le regole stesse.
-Quindi, il programma visto all'inizio di
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION}
-poteva essere scritto anche cos@`{@dotless{i}}:
-
-@example
-/12/ @{ print $0 @} ; /21/ @{ print $0 @}
-@end example
-
-@quotation NOTA BENE
-La possibilit@`a che pi@`u regole coesistano sulla stessa riga, se sono separate
-da un punto e virgola, non esisteva nel linguaggio @command{awk} originale;
-@`e stata aggiunta per congruenza con quanto @`e consentito per le istruzioni
-all'interno di un'azione.
-@end quotation
-
-@node Altre funzionalit@`a
-@section Altre funzionalit@`a di @command{awk}
-
-@cindex variabili
-Il linguaggio @command{awk} mette a disposizione un numero di variabili
-@dfn{built-in}, o @dfn{predefinite}, che il programma dell'utente pu@`o usare
-per ottenere informazioni da @command{awk}. Ci sono pure altre variabili
-che il programma pu@`o impostare, per definire come @command{awk} deve
-gestire i dati.
-
-Inoltre, @command{awk} mette a disposizione parecchie funzioni predefinite
-[@dfn{built-in}] per effettuare calcoli di tipo comune e operazioni che
-agiscono sulle stringhe di caratteri.
-@command{gawk} mette a disposizione funzioni predefinite per gestire le
-marcature temporali, per effettuare manipolazioni a livello di bit, per
-tradurre stringhe al momento dell'esecuzione del programma
-(internazionalizzazione), per determinare qual @`e il tipo di una variabile,
-e per ordinare dei vettori.
-
-Nel seguito della presentazione del linguaggio @command{awk}, saranno
-introdotte molte delle variabili e parecchie funzioni. Esse sono
-descritte sistematicamente in @ref{Variabili predefinite} e in
-@ref{Funzioni}.
-
-@node Quando
-@section Quando usare @command{gawk}
-
-@cindex @command{awk}, uso di
-Ora che abbiamo visto qualcosa di quel che @command{awk} @`e in grado di fare,
-ci si potr@`a chiedere come @command{awk} potrebbe tornare utile. Usando
-programmi di utilit@`a, criteri di ricerca sofisticati, separatori
-di campo, istruzioni aritmetiche, e altri criteri di selezione, @`e possibile
-produrre degli output molto pi@`u complessi. Il linguaggio @command{awk} @`e
-molto utile per fornire dei tabulati partendo da grandi quantit@`a di dati
-grezzi, per esempio riassumendo informazioni dall'output di altri
-programmi di utilit@`a come @command{ls}.
-(@xref{Maggiore sofisticazione}.)
-
-I programmi scritti con @command{awk} sono normalmente molto pi@`u
-corti dei loro equivalenti in altri linguaggi. Ci@`o rende i programmi
-@command{awk} facili da comporre e da utilizzare. Spesso i programmi
-@command{awk} possono essere scritti al volo a terminale, usati una volta sola
-e buttati via. Poich@'e i programmi @command{awk} sono interpretati, si pu@`o
-evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico
-dello sviluppo software, ossia edita-compila-prova-correggi.
-
-@cindex Brian Kernighan, @command{awk} di
-In @command{awk} sono stati scritti programmi complessi, compreso un assembler
-completo, pluri-piattaforma per
-@ifclear FOR_PRINT
-@iftex
-microprocessori a 8-bit (@pxrefil{Glossario}, per maggiori informazioni),
-@end iftex
-@ifnottex
-microprocessori a 8-bit (@pxref{Glossario}, per maggiori informazioni),
-@end ifnottex
-@end ifclear
-@ifset FOR_PRINT
-microprocessori a 8-bit,
-@end ifset
-e un assembler di microcodice per un computer dedicato esclusivamente
-al linguaggio Prolog.
-Le possibilit@`a dell'originale @command{awk} erano messe a dura prova
-da programmi di questa complessit@`a, ma le versioni moderne sono pi@`u robuste.
-
-@cindex programmi @command{awk}, complessi
-Se capita di scrivere programmi @command{awk} pi@`u lunghi di, diciamo,
-qualche centinaio di righe, si potrebbe considerare la possibilit@`a di usare
-un linguaggio di programmazione differente da @command{awk}.
-La shell consente di ricercare stringhe ed espressioni regolari; inoltre
-consente di usare in maniera efficace i comandi di utilit@`a del sistema.
-Python offre un piacevole equilibrio tra la facilit@`a di una programmazione
-ad alto livello, e la possibilit@`a di interagire a livello di sistema
-operativo.@footnote{Altri linguaggi di @dfn{script} popolari comprendono Ruby
-e Perl.}
-
-@node Sommario dell'introduzione
-@section Sommario
-
-@c FIXME: Review this chapter for summary of builtin functions called.
-@itemize @value{BULLET}
-@item
-I programmi in @command{awk} consistono di coppie di
-@var{criterio di ricerca}--@var{azione}.
-
-@item
-Un'@var{azione} senza una @var{condizione di ricerca} viene sempre eseguita.
-L'@var{azione} di default per una condizione mancante @`e @samp{@{ print $0 @}}.
-
-@item
-Usare
-@samp{awk '@var{programma}' @var{file}}
-oppure
-@samp{awk -f @var{file-programma} @var{file}}
-per eseguire @command{awk}.
-
-@item
-Si pu@`o usare la notazione speciale @samp{#!} nella prima riga per creare
-programmi @command{awk} che siano eseguibili direttamente.
-
-@item
-I commenti nei programmi @command{awk} iniziano con @samp{#} e continuano
-fino alla fine della stessa riga.
-
-@item
-Prestare attenzione ai problemi con gli apici nei programmi @command{awk}
-che facciano parte di uno @dfn{script} della shell (o di un file .BAT di
-MS-Windows).
-
-@item
-Si pu@`o usare la continuazione tramite barra inversa per continuare righe di
-codice sorgente. Le righe sono continuate automaticamente dopo i simboli
-virgola, parentesi aperta, punto interrogativo, punto e virgola,
-@samp{||}, @samp{&&}, @code{do} ed @code{else}.
-@end itemize
-@node Invocare Gawk
-@chapter Eseguire @command{awk} e @command{gawk}
-
-Questo @value{CHAPTER} tratta di come eseguire @command{awk}, delle opzioni da
-riga di comando, sia quelle dello standard POSIX che quelle specifiche di
-@command{gawk}, e di cosa fanno @command{awk} e @command{gawk} con gli
-argomenti che non sono opzioni.
-Prosegue poi spiegando come @command{gawk} cerca i file sorgenti,
-leggendo lo standard input assieme ad altri file, le variabili d'ambiente di
-@command{gawk}, lo stato di ritorno di @command{gawk}, l'uso dei file inclusi,
-e opzioni e/o funzionalit@`a obsolete e non documentate.
-
-Molte delle opzioni e funzionalit@`a qui descritte sono trattate con
-maggior dettaglio nei capitoli successivi del @value{DOCUMENT}; gli argomenti
-presenti in questo @value{CHAPTER} che al momento non interessano si possono
-tranquillamente saltare.
-
-@menu
-* Riga di comando:: Come eseguire @command{awk}.
-* Opzioni:: Opzioni sulla riga di comando e loro
- significato.
-* Altri argomenti:: Nomi dei file in input e assegnamento di
- valori a variabili.
-* Specificare lo standard input:: Come specificare lo standard input insieme ad
- altri file.
-* Variabili d'ambiente:: Le variabili d'ambiente usate da
- @command{gawk}.
-* Codice di ritorno:: Il codice di ritorno all'uscita da
- @command{gawk}.
-* Includere file:: Come includere altri file nel proprio
- programma.
-* Caricare librerie condivise:: Caricare librerie condivise nel
- proprio programma.
-* Parti obsolete:: Opzioni e/o funzionalit@`a obsolete.
-* Non documentato:: Opzioni e funzionalit@`a non documentate.
-* Sommario invocazione:: Sommario invocazione.
-@end menu
-
-@node Riga di comando
-@section Come eseguire @command{awk}
-@cindex riga di comando, eseguire @command{awk} da
-@cindex @command{awk}, eseguire
-@cindex argomenti, riga di comando, eseguire @command{awk}
-@cindex opzioni sulla riga di comando, eseguire @command{awk}
-
-Ci sono due modi di eseguire @command{awk}: con un programma esplicito o con
-uno o pi@`u file di programma. Qui @`e mostrata la sintassi di entrambi; le voci
-racchiuse tra [@dots{}] sono opzionali:
-
-@display
-@command{awk} [@var{opzioni}] @option{-f} @var{file_di _programma} [@option{--}] @var{file} @dots{}
-@command{awk} [@var{opzioni}] [@option{--}] @code{'@var{programma}'} @var{file} @dots{}
-@end display
-
-@cindex GNU, opzioni estese
-@cindex estese, opzioni
-@cindex opzioni estese
-In aggiunta alle tradizionali opzioni di una sola lettera in stile POSIX,
-@command{gawk} consente anche le opzioni estese GNU.
-
-@cindex angolo buio, invocare @command{awk}
-@cindex @dfn{lint}, controlli con programma vuoto
-@`E possibile invocare @command{awk} con un programma vuoto:
-
-@example
-awk '' file_dati_1 file_dati_2
-@end example
-
-@cindex @option{--lint}, opzione
-@noindent
-Fare cos@`{@dotless{i}} ha comunque poco senso; @command{awk} termina
-silenziosamente quando viene fornito un programma vuoto.
-@value{DARKCORNER}
-Se @`e stato specificato @option{--lint} sulla riga di comando,
-@command{gawk} emette un avviso che avverte
-che il programma @`e vuoto.
-
-@node Opzioni
-@section Opzioni sulla riga di comando
-@cindex opzioni sulla riga di comando
-@cindex riga di comando, opzioni
-@cindex GNU, opzioni estese
-@cindex opzioni estese
-
-Le opzioni sono precedute da un trattino e consistono in un unico carattere.
-Le opzioni estese in stile GNU sono precedute da un doppio trattino e
-consistono in una parola
-chiave. La parola chiave pu@`o essere abbreviata, a condizione che
-l'abbreviazione identifichi univocamente l'opzione. Se l'opzione prevede un
-argomento, la parola chiave @`e immediatamente seguita da un segno di uguale
-(@samp{=}) e dal valore dell'argomento, oppure la parola chiave e il valore
-dell'argomento sono separati da spazi.
-Se un'opzione con un valore viene immessa pi@`u di una volta,
-l'ultimo valore @`e quello che conta.
-
-@cindex POSIX @command{awk}, opzioni estese GNU e
-Ogni opzione estesa di @command{gawk} ha una corrispondente opzione
-breve in stile POSIX.
-Le opzioni estese e brevi sono
-intercambiabili in tutti i contesti.
-L'elenco seguente descrive le opzioni richieste dallo standard POSIX:
-
-@table @code
-@item -F @var{fs}
-@itemx --field-separator @var{fs}
-@cindex @option{-F}, opzione
-@cindex @option{--field-separator}, opzione
-@cindex @code{FS}, variabile, l'opzione @code{--field-separator} e
-Imposta la variabile @code{FS} a @var{fs}
-(@pxref{Separatori di campo}).
-
-@item -f @var{file-sorgente}
-@itemx --file @var{file-sorgente}
-@cindex @option{-f}, opzione
-@cindex @option{--file}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-Legge il sorgente del programma @command{awk} da @var{file-sorgente}
-anzich@'e prenderlo dal primo argomento che non @`e un'opzione.
-Quest'opzione pu@`o essere data pi@`u volte; il programma @command{awk}
-@`e formato dalla concatenazione del contenuto di ogni
-@var{file-sorgente} specificato.
-
-@item -v @var{var}=@var{val}
-@itemx --assign @var{var}=@var{val}
-@cindex @option{-v}, opzione
-@cindex @option{--assign}, opzione
-@cindex variabili, impostazione
-Imposta la variabile @var{var} al valore @var{val} @emph{prima} che inizi
-l'esecuzione del programma. Tali valori di variabile sono disponibili
-all'interno della regola @code{BEGIN}
-(@pxref{Altri argomenti}).
-
-L'opzione @option{-v} pu@`o impostare una sola variabile per volta, ma pu@`o
-essere usata pi@`u di una volta, impostando ogni volta una variabile
-differente, in questo modo:
-@samp{awk @w{-v pippo=1} @w{-v pluto=2} @dots{}}.
-
-@cindex predefinite, variabili, opzione @code{-v}@comma{} impostare con
-@cindex variabili predefinite, impostare con opzione @code{-v}
-@quotation ATTENZIONE
-Usare @option{-v} per impostare valori di variabili predefinite
-pu@`o condurre a risultati sorprendenti. @command{awk} reimposter@`a i
-valori di quelle variabili secondo le sue necessit@`a, anche ignorando
-eventuali valori iniziali che possono essere stati assegnati.
-@end quotation
-
-@item -W @var{gawk-opt}
-@cindex @option{-W}, opzione
-Fornisce un'opzione specifica dell'implementazione. Questa @`e la convenzione
-POSIX per fornire opzioni specifiche dell'implementazione.
-Queste opzioni
-hanno anche una corrispondente opzione estesa scritta in stile GNU.
-Si noti che le opzioni estese possono essere abbreviate, sempre che
-le abbreviazioni siano univoche.
-L'elenco completo delle opzioni specifiche di @command{gawk} @`e riportato di
-seguito.
-
-@item --
-@cindex riga di comando, opzioni, fine delle
-@cindex opzioni sulla riga di comando, fine delle
-Segnale della fine delle opzioni da riga di comando. I seguenti argomenti
-non sono trattati come opzioni anche se iniziano con @samp{-}. Questa
-interpretazione di @option{--} segue le convenzioni POSIX per l'analisi degli
-argomenti.
-
-@cindex @code{-} (meno), nomi di file che iniziano con
-@cindex meno (@code{-}), nomi di file che iniziano con
-@`E utile se si hanno @value{FNS} che iniziano con @samp{-},
-o negli @dfn{script} di shell, se si hanno @value{FNS} che devono essere
-specificati dall'utente che potrebbero iniziare con @samp{-}.
-@`E utile anche per passare opzioni al programma @command{awk};
-si veda @ref{Funzione getopt}.
-@end table
-
-L'elenco che segue descrive le opzioni specifiche di @command{gawk}:
-
-@c Have to use @asis here to get docbook to come out right.
-@table @asis
-@item @option{-b}
-@itemx @option{--characters-as-bytes}
-@cindex @option{-b}, opzione
-@cindex @option{--characters-as-bytes}, opzione
-Fa s@`{@dotless{i}} che @command{gawk} tratti tutti i dati in input come caratteri di un solo
-byte. In aggiunta, tutto l'output scritto con @code{print} o @code{printf}
-viene trattato come composto da caratteri contenuti in un solo byte.
-
-Normalmente, @command{gawk} segue lo standard POSIX e cerca di elaborare i suoi
-dati di input in accordo con la localizzazione corrente
-(@pxref{Localizzazioni}).
-Questo spesso pu@`o comportare la conversione di caratteri multibyte in
-caratteri estesi (internamente), e pu@`o
-creare problemi o confusione se i dati di input non contengono caratteri
-multibyte validi. Quest'opzione @`e una maniera facile di dire a @command{gawk}:
-``Gi@`u le mani dai miei dati!''.
-
-@item @option{-c}
-@itemx @option{--traditional}
-@cindex @option{-c}, opzione
-@cindex @option{--traditional}, opzione
-@cindex modalit@`a compatibile di (@command{gawk}), specificare
-Specifica la @dfn{modalit@`a di compatibilit@`a}, nella quale le estensioni GNU al
-linguaggio @command{awk} sono disabilitate; in questo modo @command{gawk} si
-comporta proprio come la versione di BWK @command{awk}.
-
-@xref{POSIX/GNU},
-che riassume le estensioni.
-@ifclear FOR_PRINT
-Si veda anche
-@ref{Modalit@`a di compatibilit@`a}.
-@end ifclear
-
-@item @option{-C}
-@itemx @option{--copyright}
-@cindex @option{-C}, opzione
-@cindex @option{--copyright}, opzione
-@cindex GPL (General Public License), stampare
-Stampa la versione ridotta della General Public License ed esce.
-
-@item @option{-d}[@var{file}]
-@itemx @option{--dump-variables}[@code{=}@var{file}]
-@cindex @option{-d}, opzione
-@cindex @option{--dump-variables}, opzione
-@cindex fornire una lista di tutte le variabili del programma
-@cindex @file{awkvars.out}, file
-@cindex file @file{awkvars.out}
-@cindex variabili globali, stampare una lista delle
-Stampa una lista ordinata di variabili globali, i loro tipi, e i valori finali
-in @var{file}. Se non viene fornito alcun @var{file}, stampa questa lista
-in un file chiamato @file{awkvars.out} nella directory corrente.
-Non sono consentiti spazi tra @option{-d} e @var{file}, se
-@var{file} viene specificato.
-
-@cindex risoluzione di problemi, refusi@comma{} variabili globali
-@cindex problemi, risoluzione di, refusi@comma{} variabili globali
-Avere una lista di tutte le variabili globali @`e un buon modo per cercare
-refusi nei propri programmi.
-Si pu@`o usare quest'opzione anche se si ha un grosso programma con tantissime
-funzioni, e si vuol essere sicuri che le funzioni non usino
-inavvertitamente variabili globali che sarebbero dovute essere locali
-(questo @`e un errore particolarmente facile da fare con nomi di variabile
-semplici come @code{i}, @code{j}, etc.).
-
-@item @option{-D}[@var{file}]
-@itemx @option{--debug}[@code{=}@var{file}]
-@cindex @option{-D}, opzione
-@cindex @option{--debug}, opzione
-@cindex @command{awk}, debug, abilitare
-Abilita l'esecuzione del debug di programmi @command{awk}
-(@pxref{Debugging}).
-Per default, il debugger legge i comandi interattivamente dalla tastiera
-(standard input).
-L'argomento opzionale @var{file} consente di specificare un file con una lista
-di comandi per il debugger da eseguire in maniera non interattiva.
-Non sono consentiti spazi tra @option{-D} e @var{file}, se
-@var{file} viene indicato.
-
-@item @option{-e} @var{testo-del-programma}
-@itemx @option{--source} @var{testo-del-programma}
-@cindex @option{-e}, opzione
-@cindex @option{--source}, opzione
-@cindex codice sorgente, combinare
-Fornisce del codice sorgente nel @var{testo-del-programma}.
-Quest'opzione consente di combinare il codice sorgente contenuto in file
-col codice sorgente immesso sulla riga di comando.
-Questo @`e particolarmente utile quando si hanno funzioni di libreria che si
-vogliono usare dai programmi da riga di comando
-(@pxref{AWKPATH (Variabile)}).
-
-@item @option{-E} @var{file}
-@itemx @option{--exec} @var{file}
-@cindex @option{-E}, opzione
-@cindex @option{--exec}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-@cindex CGI, @command{awk} @dfn{script} per
-Simile a @option{-f}, legge il testo del programma @command{awk} da
-@var{file}. Ci sono due differenze rispetto a @option{-f}:
-
-@itemize @value{BULLET}
-@item
-Quest'opzione fa terminare l'elaborazione delle opzioni; qualsiasi
-altra cosa sulla riga di comando viene inoltrata direttamente al programma
-@command{awk}.
-
-@item
-Le variabili da riga di comando della forma
-@samp{@var{var}=@var{value}} non sono ammesse.
-@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
-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,
-si veda la Sezione 4.4 di @uref{http://www.ietf.org/rfc/rfc3875,
-RFC 3875}. Si veda anche
-@uref{http://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
-note esplicative spedite alla mailing list @command{gawk} bug}.}
-Quest'opzione dovrebbe essere usata
-con @dfn{script} @samp{#!}
-(@pxref{@dfn{Script} eseguibili}), in questo modo:
-
-@example
-#! /usr/local/bin/gawk -E
-
-@var{il programma awk @`e qui @dots{}}
-@end example
-
-@item @option{-g}
-@itemx @option{--gen-pot}
-@cindex @option{-g}, opzione
-@cindex @option{--gen-pot}, opzione
-@cindex portabilit@`a, generare file oggetto
-@cindex file oggetto portabili, generare
-Analizza il programma sorgente e
-genera un file GNU @command{gettext} @dfn{portable object template} sullo
-standard output per tutte le costanti di tipo stringa che sono state marcate
-come da tradurre.
-@xref{Internazionalizzazione},
-per informazioni su quest'opzione.
-
-@item @option{-h}
-@itemx @option{--help}
-@cindex @option{-h}, opzione
-@cindex @option{--help}, opzione
-@cindex GNU, opzioni estese, stampare una lista di
-@cindex opzioni, stampare una lista di
-@cindex stampa, lista di opzioni
-Stampa un messaggio sull'``uso'' riassumendo le opzioni brevi ed estese
-accettate da @command{gawk} ed esce.
-
-@item @option{-i} @var{file-sorgente}
-@itemx @option{--include} @var{file-sorgente}
-@cindex @option{-i}, opzione
-@cindex @option{--include}, opzione
-@cindex @command{awk}, programmi, collocazione dei
-Legge una libreria di sorgenti @command{awk} da @var{file-sorgente}.
-Quest'opzione @`e del tutto equivalente a usare la direttiva @code{@@include}
-all'interno del proprio programma. @`E molto simile all'opzione
-@option{-f}, ma ci sono due differenze importanti. Primo, quando viene usata
-l'opzione @option{-i}, il sorgente del programma non viene caricato se @`e
-stato caricato in precedenza, mentre con @option{-f}, @command{gawk} carica
-sempre il file. Secondo, poich@'e quest'opzione @`e pensata per essere usata
-con librerie di codice, @command{gawk} non riconosce tali file come
-costituenti l'input del programma principale. Cos@`{@dotless{i}}, dopo l'elaborazione di
-un argomento @option{-i}, @command{gawk} si aspetta di trovare il codice
-sorgente principale attraverso l'opzione @option{-f} o sulla riga di comando.
-
-@item @option{-l} @var{ext}
-@itemx @option{--load} @var{ext}
-@cindex @option{-l}, opzione
-@cindex @option{--load}, opzione
-@cindex caricare estensioni
-Carica un'estensione dinamica denominata @var{ext}. Le estensioni sono
-memorizzate come librerie condivise di sistema.
-Quest'opzione ricerca la libreria usando la variabile d'ambiente
-@env{AWKLIBPATH}. Il suffisso corretto per la piattaforma in uso verr@`a
-fornito per default, perci@`o non @`e necessario specificarlo nel nome
-dell'estensione. La routine di inizializzazione dell'estensione dovrebbe
-essere denominata @code{dl_load()}. Un'alternativa @`e quella di usare la
-direttiva @code{@@load} all'interno del programma per caricare una libreria
-condivisa. Questa funzionalit@`a avanzata @`e descritta in dettaglio in
-@ref{Estensioni dinamiche}.
-
-@item @option{-L}[@var{valore}]
-@itemx @option{--lint}[@code{=}@var{valore}]
-@cindex @option{-l}, opzione
-@cindex @option{--lint}, opzione
-@cindex @dfn{lint}, controlli, emissione di avvertimenti
-@cindex avvertimenti, emissione di
-Emette messaggi d'avvertimento relativi a costrutti dubbi o non portabili ad
-altre implementazioni di @command{awk}.
-Non sono consentiti spazi tra @option{-L} e @var{valore}, se
-viene indicato il @var{valore}.
-Alcuni avvertimenti vengono emessi quando @command{gawk} legge preliminarmente
-il programma. Altri vengono emessi quando il programma viene eseguito.
-Con l'argomento opzionale @samp{fatal}, gli avvertimenti @dfn{lint} sono considerati
-come errori gravi. Potrebbe essere una misura drastica, per@`o il suo uso
-incoragger@`a certamente lo sviluppo di programmi @command{awk} pi@`u corretti.
-Con l'argomento opzionale @samp{invalid}, vengono emessi solo gli avvertimenti
-relativi a quello che @`e effettivamente non valido (funzionalit@`a non ancora
-completamente implementata).
-
-Alcuni avvertimenti vengono stampati solo una volta, anche se i costrutti dubbi
-per i quali vengono emessi avvisi ricorrono diverse volte nel programma
-@command{awk}. Perci@`o, nell'eliminazione dei problemi rilevati da
-@option{--lint}, bisogna porre attenzione a cercare tutte le occorrenze di ogni
-costrutto inappropriato. Siccome i programmi @command{awk} generalmente sono
-brevi, questa non @`e un'operazione gravosa.
-
-@item @option{-M}
-@itemx @option{--bignum}
-@cindex @option{-M}, opzione
-@cindex @option{--bignum}, opzione
-Chiede il calcolo con precisione arbitraria sui numeri. Quest'opzione non ha
-alcun effetto se @command{gawk} non @`e compilato per l'uso delle librerie GNU
-MPFR e MP
-(@pxref{Calcolo con precisione arbitraria}).
-
-@item @option{-n}
-@itemx @option{--non-decimal-data}
-@cindex @option{-n}, opzione
-@cindex @option{--non-decimal-data}, opzione
-@cindex esadecimali@comma{} valori, abilitare l'interpretazione di
-@cindex ottali@comma{} valori, abilitare l'interpretazione di
-@cindex risoluzione di problemi, opzione @code{--non-decimal-data}
-Abilita l'interpretazione automatica di valori ottali ed esadecimali
-nei dati di input
-(@pxref{Dati non decimali}).
-
-@quotation ATTENZIONE
-Quest'opzione pu@`o generare gravi malfunzionamenti nei vecchi programmi.
-Usare con cautela. Si noti anche che
-quest'opzione potrebbe non essere pi@`u disponibile in una futura versione di
-@command{gawk}.
-@end quotation
-
-@item @option{-N}
-@itemx @option{--use-lc-numeric}
-@cindex @option{-N}, opzione
-@cindex @option{--use-lc-numeric}, opzione
-Forza l'uso del carattere di separazione decimale della localizzazione
-quando analizza i dati in input
-(@pxref{Localizzazioni}).
-
-@item @option{-o}[@var{file}]
-@itemx @option{--pretty-print}[@code{=}@var{file}]
-@cindex @option{-o}, opzione
-@cindex @option{--pretty-print}, opzione
-Consente la stampa di una versione formattata elegantemente dei programmi
-@command{awk}. Implica l'opzione @option{--no-optimize}.
-Per default il programma di output viene creato in un file
-chiamato @file{awkprof.out} (@pxref{Profilare}).
-L'argomento opzionale @var{file} consente di specificare un
-@value{FN} differente per l'output.
-Non sono consentiti spazi tra @option{-o} e @var{file}, se
-@var{file} viene indicato.
-
-@quotation NOTA
-Nel passato, quest'opzione eseguiva anche il programma.
-Ora non @`e pi@`u cos@`{@dotless{i}}.
-@end quotation
-
-@item @option{-O}
-@itemx @option{--optimize}
-@cindex @option{--optimize}, opzione
-@cindex @option{-O}, opzione
-Abilita le ottimizzazioni di default nella rappresentazione interna del
-programma. Attualmente, questo comprende delle semplificazioni nell'uso
-di costanti e l'eliminazione delle code di chiamata nelle funzioni
-ricorsive [sostituzione della chiamata di funzione con dei salti
-diretti alla funzione].
-
-Queste ottimizzazioni sono abilitate per default.
-Quest'opzione rimane disponibile per compatibilit@`a all'indietro.
-Tuttavia pu@`o essere usata per annullare l'effetto di una precedente
-opzione @option{-s} (si veda pi@`u sotto in questa lista).
-
-@item @option{-p}[@var{file}]
-@itemx @option{--profile}[@code{=}@var{file}]
-@cindex @option{-p}, opzione
-@cindex @option{--profile}, opzione
-@cindex @command{awk}, profilatura, abilitare la
-Abilita la creazione del profilo di esecuzione di programmi @command{awk}
-(@pxref{Profilare}).
-Implicitamente viene forzata l'opzione @option{--no-optimize}.
-Per default, i profili vengono creati in un file chiamato @file{awkprof.out}.
-L'argomento opzionale @var{file} consente di specificare un altro
-@value{FN} per il file del profilo.
-Non sono consentiti spazi tra @option{-p} e @var{file}, se
-viene indicato un @var{file}.
-
-Il profilo contiene il numero di esecuzioni di ogni istruzione sul margine
-sinistro e il conteggio delle chiamate di funzione per ogni funzione.
-
-@item @option{-P}
-@itemx @option{--posix}
-@cindex @option{-P}, opzione
-@cindex @option{--posix}, opzione
-@cindex POSIX, modalit@`a
-@cindex @command{gawk}, estensioni@comma{} disabilitare
-Opera in modalit@`a POSIX rigorosa. Disabilita tutte le estensioni di
-@command{gawk} (proprio come @option{--traditional}) e
-disabilita tutte le estensioni non consentite da POSIX.
-
-@xref{Estensioni comuni}, per un sommario delle estensioni
-di @command{gawk} che sono disabilitate da quest'opzione.
-Inoltre,
-vengono applicate le seguenti
-restrizioni:
-
-@itemize @value{BULLET}
-
-@cindex ritorno a capo
-@cindex spazi vuoti, ritorno a capo invece che
-@item
-I ritorni a capo non sono consentiti dopo @samp{?} o @samp{:}
-(@pxref{Espressioni condizionali}).
-
-
-@cindex @code{FS}, variabile, come carattere TAB
-@item
-Specificando @samp{-Ft} sulla riga di comando non si imposta il valore
-della variabile @code{FS} a un singolo carattere TAB
-(@pxref{Separatori di campo}).
-
-@cindex localizzazione, separatore decimale della
-@cindex separatore decimale, carattere, specifico della localizzazione
-@item
-Il carattere di separatore decimale della localizzazione @`e usato per analizzare
-i dati di input
-(@pxref{Localizzazioni}).
-@end itemize
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex @option{--traditional}, opzione, e opzione @code{--posix}
-@cindex @option{--posix}, opzione, e opzione @code{--traditional}
-Se si forniscono entrambe le opzioni @option{--traditional} e @option{--posix}
-sulla riga di comando, @option{--posix} ha la precedenza. Se vengono fornite
-entrambe le opzioni @command{gawk} emette un avviso.
-
-@item @option{-r}
-@itemx @option{--re-interval}
-@cindex @option{-r}, opzione
-@cindex @option{--re-interval}, opzione
-@cindex espressioni regolari, espressioni di intervallo e
-Consente le espressioni di intervallo
-(@pxref{Operatori di espressioni regolari})
-nelle espressioni regolari.
-Questo @`e ora il comportamento di default di @command{gawk}.
-Tuttavia, quest'opzione rimane (sia per retrocompatibilit@`a
-che per l'uso in combinazione con @option{--traditional}).
-
-@item @option{-s}
-@itemx @option{--no-optimize}
-@cindex @option{--no-optimize}, opzione
-@cindex opzione @option{--no-optimize}
-@cindex @option{-s}, opzione,
-@cindex opzione @option{-s}
-Disabilita le opzioni di ottimizzazione di default di @command{gawk}
-effettuate sulla rappresentazione interna del programma.
-
-@item @option{-S}
-@itemx @option{--sandbox}
-@cindex @option{-S}, opzione
-@cindex @option{--sandbox}, opzione
-@cindex sandbox, modalit@`a
-@cindex prova, modalit@`a di
-Disabilita la funzione @code{system()},
-la ridirezione dell'input con @code{getline},
-la ridirezione dell'output con @code{print} e @code{printf},
-e le estensioni dinamiche.
-@`E particolarmente utile quando si vogliono eseguire @dfn{script} @command{awk}
-da sorgenti dubbie e si vuol essere ricuri che gli @dfn{script} non abbiano
-accesso al sistema (oltre al @value{DF} di input specificato).
-
-@item @option{-t}
-@itemx @option{--lint-old}
-@cindex @option{-L}, opzione
-@cindex @option{--lint-old}, opzione
-Avvisa su costrutti che non sono disponibili nella versione originale di
-@command{awk} dalla versione 7 di Unix
-(@pxref{V7/SVR3.1}).
-
-@item @option{-V}
-@itemx @option{--version}
-@cindex @option{-V}, opzione
-@cindex @option{--version}, opzione
-@cindex @command{gawk}, versioni di, informazioni su@comma{} stampa
-Stampa informazioni sulla versione di questa specifica copia di @command{gawk}.
-Consente di determinare se la copia di @command{gawk} in uso @`e aggiornata
-rispetto a quello che @`e attualmente in distribuzione da parte della Free
-Software Foundation.
-@`E utile anche per la segnalazione di bug
-(@pxref{Bug}).
-@end table
-
-Ogni altra opzione, se @`e stato specificato il testo di un programma
-@`e contrassegnata come non valida con un messaggio di avvertimento,
-altrimenti @`e ignorata.
-
-@cindex @option{-F}, opzione, opzione @option{-Ft} imposta @code{FS} a TAB
-In modalit@`a di compatibilit@`a, come caso particolare, se il valore di @var{fs}
-fornito all'opzione @option{-F} @`e @samp{t}, @code{FS} @`e impostata al carattere
-TAB (@code{"\t"}). Questo @`e vero solo per @option{--traditional} e non
-per @option{--posix}
-(@pxref{Separatori di campo}).
-
-@cindex @option{-f}, opzione, usi multipli
-L'opzione @option{-f} pu@`o essere usata pi@`u di una volta nella riga di comando.
-In questo caso, @command{awk} legge il sorgente del suo programma da tutti i
-file indicati, come se fossere concatenati assieme a formare un unico grande
-file.
-Questo @`e utile per creare librerie di funzioni di @command{awk}. Queste
-funzioni possono venir scritte una volta e in seguito recuperate da una
-posizione standard, invece di doverle includere in ogni singolo programma.
-L'opzione @option{-i} @`e simile in questo senso.
-(Come indicato in
-@ref{Sintassi delle definizioni},
-i nomi di funzione devono essere univoci).
-
-Con @command{awk} standard, le funzioni di libreria si possono ancora usare,
-anche se il programma @`e immesso dalla tastiera,
-specificando @samp{-f /dev/tty}. Dopo aver scritto il programma,
-premere @kbd{Ctrl-d} (il carattere di fine file) per terminarlo.
-(Si potrebbe anche usare @samp{-f -} per leggere il sorgente del programma
-dallo standard input, ma poi non si potr@`a usare lo standard input come sorgente
-di dati).
-
-Siccome @`e scomodo usare il meccanismo di @command{awk} standard per combinare
-file sorgenti e programmi @command{awk} da riga di comando, @command{gawk}
-fornisce l'opzione @option{-e}. Questo non richiede di evitare l'uso dello
-standard input per immettere codice sorgente; consente di combinare
-facilmente codice sorgente da riga di comando e da libreria
-(@pxref{AWKPATH (Variabile)}).
-Come per @option{-f}, le opzioni @option{-e} e @option{-i}
-si possono usare pi@`u volte nella riga di comando.
-
-@cindex @option{-e}, opzione
-Se non sono specificate opzioni @option{-f} o @option{-e}, @command{gawk}
-usa il primo argomento che non @`e un'opzione come testo del
-codice sorgente del programma.
-
-@cindex @env{POSIXLY_CORRECT}, variabile d'ambiente
-@cindex @dfn{lint}, controlli, variabile d'ambiente @env{POSIXLY_CORRECT}
-@cindex POSIX, modalit@`a
-Se la variabile d'ambiente @env{POSIXLY_CORRECT} esiste,
-@command{gawk} si comporta in modalit@`a POSIX rigorosa, esattamente come se
-fosse stata fornita l'opzione @option{--posix}.
-Molti programi GNU cercano questa variabile d'ambiente per eliminare
-estensioni che confliggono con POSIX, ma @command{gawk} si comporta in modo
-diverso: sopprime tutte le estensioni, anche quelle che non confliggono con
-POSIX, e funziona rigorosamente in modalit@`a POSIX.
-Se viene fornita l'opzione @option{--lint} sulla riga di comando e
-@command{gawk} passa alla modalit@`a POSIX a causa di @env{POSIXLY_CORRECT},
-viene emesso un messaggio di avvertimento indicando che @`e attiva la
-modalit@`a POSIX. Normalmente questa variabile si imposta nel file di avvio
-della shell a livello utente.
-Per una shell compatibile con Bourne (come Bash), queste righe andranno
-aggiunte nel file @file{.profile} della directory "home" dell'utente:
-
-@example
-POSIXLY_CORRECT=true
-export POSIXLY_CORRECT
-@end example
-
-@cindex @command{csh}, comando, variabile d'ambiente @env{POSIXLY_CORRECT}
-Per una shell compatibile con C,@footnote{Non raccomandato.}
-questa riga andr@`a aggiunta nel file @file{.login} nella directory "home"
-dell'utente:
-
-@example
-setenv POSIXLY_CORRECT true
-@end example
-
-@cindex portabilit@`a, variabile d'ambiente @env{POSIXLY_CORRECT}
-Avere @env{POSIXLY_CORRECT} impostata non @`e raccomandato per l'uso quotidiano,
-ma @`e utile per provare la portabilit@`a dei programmi su altri
-ambienti.
-
-@node Altri argomenti
-@section Altri argomenti della riga di comando
-@cindex riga di comando, argomenti
-@cindex argomenti, riga di comando
-
-Qualsiasi altro argomento sulla riga di comando @`e trattato normalmente come
-file in input da elaborare nell'ordine con cui @`e specificato. Comunque, un
-argomento che ha la forma @code{@var{var}=@var{valore}}, assegna
-il valore @var{valore} alla variabile @var{var}---non specifica affatto
-un file. (Si veda @ref{Opzioni di assegnamento}.) Nel seguente esempio,
-@var{count=1} @`e un assegnamento di variabile, non un @value{FN}:
-
-@example
-awk -f programma.awk file1 count=1 file2
-@end example
-
-@cindex @command{gawk}, variabile @code{ARGIND} in
-@cindex @code{ARGIND}, variabile, argomenti da riga di comando
-@cindex @code{ARGV}, vettore, indicizzare all'interno di
-@cindex @code{ARGC}/@code{ARGV}, variabili, argomenti da riga di comando
-Tutti gli argomenti da riga di comando sono resi disponibili al programma
-@command{awk} nel vettore @code{ARGV} (@pxref{Variabili predefinite}). Opzioni da
-riga di comando e il testo del programma (se presente) sono esclusi da
-@code{ARGV}. Tutti gli altri argomenti, compresi gli assegnamenti di
-variabile, sono inclusi. Come ogni elemento di @code{ARGV} viene elaborato,
-@command{gawk} imposta @code{ARGIND} all'indice in @code{ARGV}
-dell'elemento corrente.
-
-@c FIXME: One day, move the ARGC and ARGV node closer to here.
-La modifica di @code{ARGC} e @code{ARGV} nel proprio programma @command{awk}
-consente di controllare come @command{awk} elabora i file in input; questo @`e
-descritto pi@`u dettagliatamente in @ref{ARGC e ARGV}.
-
-@cindex file in input, assegnamenti di variabile e
-@cindex assegnamenti di variabile e file in input
-La distinzione tra argomenti che sono @value{FN} e argomenti di assegnamento
-di variabili vien fatta quando @command{awk} deve aprire il successivo file di
-input.
-A quel punto dell'esecuzione, controlla la variabile @value{FN} per vedere se
-@`e piuttosto un assegnamento di variabile; se cos@`{@dotless{i}} @`e, @command{awk} imposta la
-variabile invece di leggere un file.
-
-Dunque, le variabili ricevono effettivamente i valori loro assegnati dopo che
-tutti i file precedentemente specificati sono stati letti. In particolare, i
-valori delle variabili assegnati in questo modo @emph{non} sono disponibili
-all'interno di una regola @code{BEGIN}
-(@pxref{BEGIN/END}),
-poich@'e tali regole vengono eseguite prima che @command{awk} cominci a
-esaminare la lista degli argomenti.
-
-@cindex angolo buio, sequenze di protezione
-I valori delle variabili dati sulla riga di comando sono elaborati per
-rimuovere sequenze di protezione (@pxref{Sequenze di protezione}).
-@value{DARKCORNER}
-
-In alcune implementazioni di @command{awk} molto vecchie, quando un
-assegnamento di variabile capitava prima di un qualsiasi @value{FN},
-l'assegnamento avveniva @emph{prima} che fosse stata eseguita la regola
-@code{BEGIN}. Il comportamento di @command{awk} era in questo modo
-ambiguo; alcuni assegnamenti da riga di comando erano disponibili
-all'interno della regola @code{BEGIN}, mentre altri no. Sfortunatamente,
-alcune applicazioni finivano per essere dipendenti da questa
-``funzionalit@`a''. Quando @command{awk} fu modificato per essere pi@`u
-coerente, fu aggiunta l'opzione @option{-v} a beneficio delle
-applicazioni che dipendevano dal vecchio comportamento.
-
-La funzionalit@`a dell'assegnamento di variabile @`e molto utile per assegnare
-valori a variabili come @code{RS}, @code{OFS}, e @code{ORS}, che controllano i
-formati di input e di output, prima di effettuare la scansione dei @value{DF}.
-@`E utile anche per effettuare passaggi multipli su un o stesso
-@value{DF}. Per esempio:
-
-@cindex file, passaggi multipli su
-@example
-awk 'pass == 1 @{ @var{pass 1 stuff} @}
- pass == 2 @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata
-@end example
-
-Una volta disponibile la funzionalit@`a per assegnare una variabile, l'opzione
-@option{-F} per impostare il valore di @code{FS} non @`e pi@`u strettamente
-necessaria. Rimane per compatibilit@`a all'indietro.
-
-@node Specificare lo standard input
-@section Come specificare lo standard input insieme ad altri file
-
-Capita spesso di voler leggere lo standard input assieme ad altri file.
-Per esempio, leggere un file, leggere lo standard input derivante da una
-@dfn{pipe}, e poi leggere un altro file.
-
-Il modo di indicare lo standard input, con tutte le versioni di @command{awk},
-@`e quello di usare un segno meno o trattino da solo, @samp{-}. Per esempio:
-
-@example
-@var{qualche_comando} | awk -f ilmioprogramma.awk file1 - file2
-@end example
-
-@noindent
-In questo caso, @command{awk} legge prima @file{file1}, poi legge
-l'output di @var{qualche_comando}, e infile legge
-@file{file2}.
-
-Si pu@`o anche usare @code{"-"} per indicare lo standard input quando si leggono
-i file con @code{getline} (@pxref{Getline file}).
-
-In aggiunta, @command{gawk} consente di specificare il
-@value{FN} speciale @file{/dev/stdin}, sia sulla riga di comando che
-quando si usa @code{getline}.
-Anche qualche altra versione di @command{awk} include questa funzionalit@`a,
-ma non @`e standard.
-(Alcuni sistemi operativi prevedono un file @file{/dev/stdin}
-nel filesystem; comunque, @command{gawk} elabora sempre
-questo @value{FN} per conto suo [ossia non importa se il sistema
-operativo rende disponibile il file o no].)
-
-@node Variabili d'ambiente
-@section Le variabili d'ambiente usate da @command{gawk}
-@cindex variabili d'ambiente usate da @command{gawk}
-
-Diverse variabili d'ambiente influiscono sul comportamento
-di @command{gawk}.
-
-@menu
-* AWKPATH (Variabile):: Ricerca di programmi @command{awk}
- in una lista di directory.
-* AWKLIBPATH (Variabile):: Ricerca di librerie condivise
- @command{awk} su varie directory.
-* Altre variabili d'ambiente:: Le variabili d'ambiente.
-@end menu
-
-@node AWKPATH (Variabile)
-@subsection Ricerca di programmi @command{awk} in una lista di directory.
-@cindex @env{AWKPATH}, variabile d'ambiente
-@cindex directory, ricerca di file sorgente
-@cindex percorso di ricerca per file sorgente
-@cindex ricerca, percorso di, per file sorgente
-@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @env{AWKPATH}
-@ifinfo
-Il precedente @value{SECTION} ha descritto come i file di programma di
-@command{awk} possono essere specificati sulla riga di comando con
-l'opzione @option{-f}.
-@end ifinfo
-Nella maggior parte delle implementazioni di @command{awk} si deve indicare il
-percorso completo di ogni file di programma, a meno che il file non
-sia nella directory corrente. Con @command{gawk}, invece, se la
-variabile @value{FN} impostata con le opzioni @option{-f} o @option{-i} non
-contiene un separatore di directory @samp{/}, @command{gawk} cerca un file con
-quel nome in un elenco di directory (chiamato @dfn{percorso di ricerca}),
-scorrendole una per una.
-
-Il percorso di ricerca @`e una stringa di nomi di directory separati da due
-punti@footnote{Punti e virgola in MS-Windows.}. @command{gawk} prende
-il percorso di ricerca dalla variabile d'ambiente @env{AWKPATH}. Se questa
-variabile non esiste, o se ha un come valore la stringa nulla,
-@command{gawk} usa un percorso di default (descritto tra poco).
-
-La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire
-librerie di funzioni di @command{awk}. I file di libreria possono essere messi
-in una directory standard inclusa nel percorso di ricerca
-e richiamati sulla riga di comando con un
-@value{FN} breve. Altrimenti, si dovrebbe scrivere l'intero @value{FN} per
-ciascun file.
-
-Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di
-@command{awk} scritti sulla riga di comando possono usare le funzionalit@`a
-contenute nei file di libreria di @command{awk}
-@iftex
-(@pxrefil{Funzioni di libreria}).
-@end iftex
-@ifnottex
-(@pxref{Funzioni di libreria}).
-@end ifnottex
-La ricerca del percorso non viene eseguita se @command{gawk} @`e in modalit@`a di
-compatibilit@`a, sia con l'opzione @option{--traditional} che con l'opzione
-@option{--posix}.
-@xref{Opzioni}.
-
-Se il file del codice sorgente non viene trovato con una prima ricerca,
-il percorso viene cercato di nuovo dopo aver aggiunto il suffisso
-@samp{.awk} al @value{FN}.
-
-Il meccanismo di ricerca del percorso di @command{gawk} @`e simile a quello
-della shell.
-(Si veda @uref{http://www.gnu.org/software/bash/manual/,
-@cite{The Bourne-Again SHell manual}}.)
-Un elemento nullo nel percorso indica la directory corrente.
-(Un elemento nullo @`e indicato iniziando o terminando il percorso con un segno
-di @samp{:} oppure mettendo due @samp{:} consecutivi [@samp{::}].)
-
-@quotation NOTA
-Per includere la directory corrente nel percorso di ricerca, si pu@`o
-aggiungere @file{.} come un elemento del percorso di ricerca, oppure
-inserire un elemento nullo.
-
-Diverse passate versioni di @command{gawk} avrebbero effettuato anche una
-ricerca esplicita nella directory corrente, prima o dopo aver esaminato il
-percorso di ricerca. A partire dalla @value{PVERSION} 4.1.2, questo non
-vale pi@`u; se si desidera una ricerca nella directory corrente, @`e
-necessario aggiungere @file{.} esplicitamente, oppure aggiungendo un
-elemento nullo al percorso di ricerca.
-@end quotation
-
-Il valore di default di @env{AWKPATH} @`e
-@samp{.:/usr/local/share/awk}.@footnote{La versione di @command{gawk}
-che state usando potrebbe usare una directory diversa; ci@`o dipende da come
-@command{gawk} @`e stato compilato e installato. La directory effettiva @`e il
-valore di @code{$(datadir)} generato quando @`e stato configurato
-@command{gawk}. Non @`e comunque il caso di preoccuparsi per questo.}
-Poich@'e @file{.} @`e incluso all'inizio, @command{gawk} cerca dapprima nella
-directory corrente, e poi in @file{/usr/local/share/awk}.
-In pratica, questo vuol dire che solo raramente ci sar@`a bisogno di cambiare
-il valore di @env{AWKPATH}.
-
-@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
-essere di aiuto per gestire la variabile @env{AWKPATH}.
-
-@command{gawk} memorizza il valore del percorso di ricerca in uso in
-@code{ENVIRON["AWKPATH"]}. Questo consente di aver accesso al valore del
-percorso di ricerca in uso all'interno di un programma @command{awk}.
-
-Sebbene la variabile @code{ENVIRON["AWKPATH"]} possa
-essere cambiata anche all'interno di
-un programma @command{awk}, questo non modifica il comportamento del
-programma in esecuzione. Questo comportamento ha una sua logica: la variabile
-d'ambiente @env{AWKPATH} @`e usata per trovare i file sorgenti del programma; una
-volta che il programma @`e in esecuzione, tutti i file sono stati trovati,
-e @command{gawk} non ha pi@`u bisogno di usare @env{AWKPATH}.
-
-@node AWKLIBPATH (Variabile)
-@subsection Ricerca di librerie condivise @command{awk} su varie directory.
-@cindex @env{AWKLIBPATH}, variabile d'ambiente
-@cindex directory, ricerca di estensioni caricabili
-@cindex percorso di ricerca per estensioni
-@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @code{AWKLIBPATH}
-
-La variabile d'ambiente @env{AWKLIBPATH} @`e simile alla variabile @env{AWKPATH},
-ma @`e usata per ricercare estensioni caricabili (memorizzate come
-librerie condivise di sistema) specificate con l'opzione @option{-l},
-anzich@'e file sorgenti. Se l'estensione non viene trovata, il percorso viene
-cercato nuovamente dopo aver aggiunto il suffisso per la libreria condivisa
-appropriato per la piattaforma. Per esempio, sui sistemi GNU/Linux viene usato
-il suffisso @samp{.so}. Il percorso di ricerca specificato @`e usato anche
-attraverso la direttiva @code{@@load}
-(@pxref{Caricare librerie condivise}).
-
-Se la variabile d'ambiente @env{AWKLIBPATH} non esiste, o se ha come valore
-la stringa nulla, @command{gawk} usa un percorso di ricerca di default;
-questo normalmente vale @samp{/usr/local/lib/gawk}, anche se il suo valore
-pu@`o essere diverso, a seconda di come @`e stato installato @command{gawk}.
-
-@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
-essere di aiuto per gestire la variabile @env{AWKPATH}.
-
-@command{gawk} memorizza il valore del percorso di ricerca in uso in
-@code{ENVIRON["AWKLIBPATH"]}. Questo consente di aver accesso al valore del
-percorso di ricerca in uso all'interno di un programma @command{awk}.
-
-@node Altre variabili d'ambiente
-@subsection Le variabili d'ambiente.
-
-Molte altre variabili d'ambiente influenzano il comportamento di
-@command{gawk}, ma esse sono pi@`u specializzate. Quelle dell'elenco seguente
-sono quelle pi@`u utili agli utenti normali:
-
-@table @env
-@item GAWK_MSEC_SLEEP
-Specifica l'intervallo tra due tentativi di riconnessione,
-in millisecondi. Sui sistemi che non prevedono
-la chiamata di sistema @code{usleep()},
-il valore @`e arrotondato a un numero intero di secondi .
-
-@item GAWK_READ_TIMEOUT
-Specifica per quanto tempo, in millisecondi, @command{gawk}
-aspetta l'input prima di emettere un messaggio di errore.
-
-@item GAWK_SOCK_RETRIES
-Controlla il numero di volte che @command{gawk} cerca di
-ristabilire una connessione bidirezionale TCP/IP (@dfn{socket}) prima di
-rinunciare a farlo.
-@xref{Reti TCP/IP}.
-Si noti che quando @`e attiva l'opzione di continuazione dopo errori di I/O
-(@pxref{Continuazione dopo errori}),
-@command{gawk} tenta di aprire un @dfn{socket} TCP/IP soltanto una volta.
-
-@item POSIXLY_CORRECT
-Provoca il passaggio di @command{gawk} alla modalit@`a di compatibilit@`a POSIX,
-disabilitando tutte le estensioni tradizionali e GNU.
-@xref{Opzioni}.
-@end table
-
-Le variabili d'ambiente nell'elenco che segue sono utili
-soprattutto agli sviluppatori di @command{gawk} per il collaudo e la messa
-a punto del programma. Sono soggette a cambiamenti. Le variabili sono:
-
-@table @env
-@item AWKBUFSIZE
-Questa variabile riguarda solo @command{gawk} installato su sistemi
-conformi a POSIX.
-Col valore di @samp{exact}, @command{gawk} usa la dimensione di ogni file di
-input come dimensione del buffer di memoria da allocare per I/O. Altrimenti,
-il valore dovrebbe essere un numero, e @command{gawk} usa questo numero come
-dimensione del buffer da allocare. (Quando questa variabile non @`e impostata,
-@command{gawk} usa la pi@`u piccola tra le dimensioni del file e la dimensione
-del blocco di ``default'', che normalmente @`e la dimensione del blocco I/O
-del filesystem).
-
-@item AWK_HASH
-Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk}
-usa la funzione hash di GNU Smalltalk per gestire i vettori.
-Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard.
-@item AWKREADFUNC
-Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per
-volta, anzich@'e a blocchi. Questa variabile @`e presente
-per problemi di debug su filesystem di sistemi operativi non POSIX,
-dove l'I/O @`e elaborato a record, non a blocchi.
-
-@item GAWK_MSG_SRC
-Se questa variabile esiste, @command{gawk} include il @value{FN} e il
-numero di riga all'interno del codice sorgente @command{gawk}
-dal quale sono stati generati i messaggi di avvertimento o
-i messaggi di errore grave. Il suo intento @`e quello di aiutare a isolare
-l'origine di un messaggio, poich@'e ci possono essere pi@`u righe di codice che
-producono lo stesso messaggio di avvertimento o di errore.
-
-@item GAWK_LOCALE_DIR
-Specifica la posizione dei file oggetto compilati contenenti la traduzione dei
-messaggi emessi da @command{gawk} stesso. Questa variabile @`e passata alla
-funzione @code{bindtextdomain()} nella fase di partenza di @command{gawk}.
-
-@item GAWK_NO_DFA
-Se questa variabile esiste, @command{gawk} non usa il riconoscitore di
-espressioni regolari ASFD [automa a stati finiti deterministico] per i tipi di
-test di corrispondenza. Questo pu@`o causare un rallentamento di @command{gawk}.
-Il suo intento @`e quello di aiutare a isolare le differenze tra i due
-riconoscitori di espressioni regolari che @command{gawk} usa internamente (non
-dovrebbero esserci differenze, ma a volte la teoria non coincide con la
-pratica).
-
-@item GAWK_STACKSIZE
-Specifica di quanto @command{gawk} dovrebbe accrescere il suo stack di
-valutazione interno, all'occorrenza.
-
-@item INT_CHAIN_MAX
-Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
-su una catena hash per gestire i vettori indicizzati da numeri interi.
-
-@item STR_CHAIN_MAX
-Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
-su una catena hash per gestire i vettori indicizzati da stringhe.
-
-@item TIDYMEM
-Se questa variabile esiste, @command{gawk} usa le chiamate di libreria
-@code{mtrace()} della @dfn{GNU C library} per aiutare a scoprire
-possibili sprechi di memoria.
-@end table
-
-@node Codice di ritorno
-@section Il codice di ritorno all'uscita da @command{gawk}
-
-@cindex codice di ritorno, di @command{gawk}
-@cindex stato d'uscita, di @command{gawk}
-Se l'istruzione @code{exit} viene usata con un valore
-(@pxref{Istruzione exit}), @command{gawk} termina l'esecuzione con il valore
-numerico specificato.
-
-Altrimenti, se non ci sono stati problemi durante l'esecuzione,
-@command{gawk} esce col valore della costante C
-@code{EXIT_SUCCESS}, che normalmente @`e zero.
-
-Se si verifica un errore, @command{gawk} esce col valore della
-costante C @code{EXIT_FAILURE}, che normalmente @`e uguale a uno.
-
-Se @command{gawk} esce a causa di un errore grave, il codice di ritorno
-@`e due. Sui sistemi non POSIX questo valore pu@`o essere mappato
-a @code{EXIT_FAILURE}.
-
-@node Includere file
-@section Come includere altri file nel proprio programma
-
-@c Panos Papadopoulos <panos1962@gmail.com> contributed the original
-@c text for this section.
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-@cindex @code{@@include}, direttiva
-@cindex direttiva @code{@@include}
-@cindex includere file, direttiva @code{@@include}
-La direttiva @code{@@include} pu@`o essere usata per leggere file sorgenti
-di @command{awk} esterni. Questo d@`a la possibilit@`a di suddividere file
-sorgenti di @command{awk} di grandi dimensioni in porzioni pi@`u piccole e pi@`u
-maneggevoli, e anche di riutilizzare codice @command{awk} di uso comune
-da diversi @dfn{script} @command{awk}. In altre parole, si possono
-raggruppare funzioni di @command{awk} usate per eseguire determinati compiti
-all'interno di file esterni. Questi file possono essere usati proprio come
-librerie di funzioni, usando la direttiva @code{@@include} assieme alla
-variabile d'ambiente @env{AWKPATH}. Si noti che i file sorgenti possono
-venire inclusi anche usando l'opzione @option{-i}.
-
-Vediamolo con un esempio.
-Iniziamo con due @dfn{script} @command{awk} (banali), che chiameremo
-@file{test1} e @file{test2}. Questo @`e lo @dfn{script} @file{test1}:
-
-@example
-BEGIN @{
- print "Questo @`e lo script test1."
-@}
-@end example
-
-@noindent
-e questo @`e @file{test2}:
-
-@example
-@@include "test1"
-BEGIN @{
- print "Questo @`e lo script test2."
-@}
-@end example
-
-L'esecuzione di @command{gawk} con @file{test2}
-produce il seguente risultato:
-
-@example
-$ @kbd{gawk -f test2}
-@print{} Questo @`e lo script test1.
-@print{} Questo @`e lo script test2.
-@end example
-
-@command{gawk} esegue lo @dfn{script} @file{test2}, il quale include
-@file{test1}, usando la direttiva @code{@@include}.
-Cos@`{@dotless{i}}, per includere file sorgenti di @command{awk} esterni, basta usare
-@code{@@include} seguito dal nome del file da includere,
-racchiuso tra doppi apici.
-
-@quotation NOTA
-Si tenga presente che questo @`e un costrutto del linguaggio e che @value{FN}
-non pu@`o essere una variabile di tipo stringa, ma solo una costante di tipo
-letterale racchiusa tra doppi apici.
-@end quotation
-
-I file da includere possono essere nidificati; p.es., dato un terzo
-@dfn{script}, che chiameremo @file{test3}:
-
-@example
-@@include "test2"
-BEGIN @{
- print "Questo @`e lo script test3."
-@}
-@end example
-
-@noindent
-L'esecuzione di @command{gawk} con lo @dfn{script} @file{test3} produce i
-seguenti risultati:
-
-@example
-$ @kbd{gawk -f test3}
-@print{} Questo @`e lo script test1.
-@print{} Questo @`e lo script test2.
-@print{} Questo @`e lo script test3.
-@end example
-
-Il @value{FN}, naturalmente, pu@`o essere un nome di percorso.
-Per esempio:
-
-@example
-@@include "../funzioni_di_i_o"
-@end example
-
-@noindent
-e:
-
-@example
-@@include "/usr/awklib/network"
-@end example
-
-@noindent
-sono entrambi percorsi validi. La variabile d'ambiente @env{AWKPATH} pu@`o
-rivestire grande importanza quando si usa @code{@@include}. Le stesse
-regole per l'uso della variabile d'ambiente @env{AWKPATH} nelle ricerche
-da riga di comando
-(@pxref{AWKPATH (Variabile)}) si applicano anche a
-@code{@@include}.
-
-Questo @`e di grande aiuto nella costruzione di librerie di funzioni di
-@command{gawk}. Se si ha uno @dfn{script} di grandi dimensioni contenente
-utili funzioni @command{awk} di uso comune, lo si pu@`o suddividere in file
-di libreria e mettere questi file in una directory dedicata. In seguito si
-possono includere queste ``librerie'' usando il percorso completo dei
-file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e
-quindi usando @code{@@include} con la sola parte del percorso completo che
-designa il file. Naturalmente,
-si possono tenere i file di libreria in pi@`u di una directory;
-pi@`u @`e complesso l'ambiente di lavoro, pi@`u
-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.
-In particolare, @code{@@include} @`e molto utile per scrivere @dfn{script} CGI
-eseguibili da pagine web.
-
-Come @`e stato detto in @ref{AWKPATH (Variabile)}, i file sorgenti vengono
-sempre cercati nella directory corrente, prima di eseguire la ricerca in
-@env{AWKPATH}; questo si applica anche ai file indicati con
-@code{@@include}.
-
-@node Caricare librerie condivise
-@section Caricare librerie condivise nel proprio programma
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-@cindex @code{@@load}, direttiva
-@cindex direttiva @code{@@load}
-@cindex caricare estensioni, direttiva @code{@@load}
-@cindex estensioni, caricamento, direttiva @code{@@load}
-La direttiva @code{@@load} pu@`o essere usata per leggere estensioni di
-@command{awk} esterne (memorizzate come librerie condivise di sistema).
-Questo consente di collegare del codice compilato che pu@`o offrire prestazioni
-migliori o dare l'accesso a funzionalit@`a estese non incluse nel linguaggio
-@command{awk}. La variabile @env{AWKLIBPATH} viene usata per ricercare
-l'estensione. Usare @code{@@load} @'e del tutto equivalente a usare l'opzione da
-riga di comando @option{-l}.
-
-Se l'estensione non viene trovata in @env{AWKLIBPATH}, viene effettuata
-un'altra ricerca dopo aver aggiunto al @value{FN} il suffisso della
-libreria condivisa comunemente in uso per la piattaforma corrente. Per
-esempio, sui sistemi GNU/Linux viene usato il suffisso @samp{.so}:
-
-@example
-$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
-@print{} A
-@end example
-
-@noindent
-Questo @`e equivalente all'esempio seguente:
-
-@example
-$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
-@print{} A
-@end example
-
-@noindent
-Per l'uso da riga di comando @`e pi@`u conveniente l'opzione @option{-l},
-ma @code{@@load} @`e utile da inserire all'interno di un file sorgente di
-@command{awk} che richieda l'accesso a un'estensione.
-
-@ref{Estensioni dinamiche}, descrive come scrivere estensioni (in C or C++)
-che possono essere caricate sia con @code{@@load} che con l'opzione
-@option{-l}. @`E anche descritta l'estensione @code{ordchr}.
-
-@node Parti obsolete
-@section Opzioni e/o funzionalit@`a obsolete
-
-@c update this section for each release!
-
-@cindex opzioni deprecate
-@cindex funzionalit@`a deprecate
-@cindex obsolete, funzionalit@`a
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive funzionalit@`a o opzioni 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 nella prossima
-versione).
-
-I file speciali relativi ai processi @file{/dev/pid}, @file{/dev/ppid},
-@file{/dev/pgrpid} e @file{/dev/user} erano deprecati, ma ancora disponibili,
-in @command{gawk} 3.1. A partire dalla @value{PVERSION} 4.0, non sono
-pi@`u interpretati da @command{gawk} in modo speciale (al loro posto usare
-invece @code{PROCINFO}; si veda @ref{Variabili auto-assegnate}).
-
-@ignore
-This @value{SECTION}
-is thus essentially a place holder,
-in case some option becomes obsolete in a future version of @command{gawk}.
-@end ignore
-
-@node Non documentato
-@section Opzioni e funzionalit@`a non documentate
-@cindex non documentate, funzionalit@`a
-@cindex funzionalit@`a non documentate
-@cindex Skywalker, Luke
-@cindex Kenobi, Obi-Wan
-@cindex Jedi, Cavalieri
-@cindex Cavalieri Jedi
-@quotation
-@i{Usa il codice sorgente, Luke!}
-@author Obi-Wan
-@end quotation
-
-@cindex conchiglie, mare
-@ifnotinfo
-Questa @value{SECTION} @`e stata lasciata intenzionalmente vuota.
-@end ifnotinfo
-@ifinfo
-Questo @value{SECTION} @`e stato lasciato intenzionalmente vuoto.
-@end ifinfo
-
-@ignore
-@c If these came out in the Info file or TeX document, then they wouldn't
-@c be undocumented, would they?
-
-@command{gawk} ha un'opzione non documentata:
-
-@table @code
-@item -W nostalgia
-@itemx --nostalgia
-Stampa il messaggio @samp{awk: bailing out near line 1} e termina
-con un errore grave.
-Quest'opzione @`e stata ispirata dal comportamento comune delle primissime
-versioni di @command{awk} Unix e da una maglietta [con la scritta].
-Il messaggio @emph{NON} viene tradotto in ambienti non inglesi.
-@c so there! nyah, nyah.
-@end table
-
-Le prime versioni di @command{awk} non richiedevano alcun separatore (a capo
-
-o @samp{;}) tra le regole nei programmi @command{awk}. Quindi,
-era normale vedere programmi di una riga come:
-
-@example
-awk '@{ sum += $1 @} END @{ print sum @}'
-@end example
-
-@command{gawk} in realt@`a consente questo stile, ma la cosa non @`e
-documentata per non incoraggiare la pratica. Il modo corretto per scrivere
-quel programma @`e uno dei
-seguenti:
-
-@example
-awk '@{ sum += $1 @} ; END @{ print sum @}'
-@end example
-
-@noindent
-oppure:
-
-@example
-awk '@{ sum += $1 @}
- END @{ print sum @}' data
-@end example
-
-@noindent
-@xref{Istruzioni/Righe}, per una spiegazione pi@`u ampia.
-
-Si possono inserire righe bianche dopo @samp{;} nei cicli @code{for}.
-Questa sembre essere stata una funzionalit@`a a lungo non documentata in
-@command{awk} Unix.
-
-Analogamente, si possono usare istruzioni @code{print} o @code{printf}
-nelle parti @var{valore-iniziale} e @var{incremento} di un ciclo
-@code{for}. Questa @`e un'altra funzionalit@`a a lungo non documentata in
-@command{awk} Unix.
-
-@command{gawk} consente di usare come nomi di parametro dei
-nomi di funzioni predefinite che facciano parte delle estensioni
-@command{gawk}, all'interno di funzioni definite dall'utente.
-Questo avviene per ``salvaguardare per il futuro'' vecchi programmi che
-utilizzino nomi di funzioni aggiunte da @command{gawk} dopo che questi
-programmi erano stati scritti.
-Le funzioni predefinite standard di command{awk}, per esempio
-@code{sin()} o @code{substr()} @emph{non} ammettono questa possibilit@`a.
-
-Il vettore @code{PROCINFO["argv"]} contiene tutti gli argomenti della
-riga di comando (una volta espansi i metacaratteri ed elaborata la
-ridirezione, nelle piattaforme in cui ci@`o dev'essere fatto manualmente
-dal programma), con indici che vanno da 0 as @code{argc} @minus{} 1.
-Per esempio, @code{PROCINFO["argv"][0]} conterr@`a il nome con cui @`e
-stato invocato @command{gawk}. L'esempio seguente mostra come @`e
-possibile usare questa funzionalit@`a:
-
-@example
-awk '
-BEGIN @{
- for (i = 0; i < length(PROCINFO["argv"]); i++)
- print i, PROCINFO["argv"][i]
-@}'
-@end example
-
-@`E da tener presente che questo vettore @`e diverso dal vettore
-standard @code{ARGV} che non comprende quegli argomenti della riga di
-comando che sono gi@`a stati elaborati da
-@command{gawk} (@pxref{ARGC e ARGV}).
-
-@end ignore
-
-@node Sommario invocazione
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Per eseguire @command{awk} usare, o
-@samp{awk '@var{programma}' @var{file}}
-o
-@samp{awk -f @var{file-del-programma} @var{file}}.
-
-@item
-Le tre opzioni standard per tutte le versioni di @command{awk} sono
-@option{-f}, @option{-F} e @option{-v}. @command{gawk} fornisce queste e
-molte altre, come pure le opzioni estese corrispondenti scritte in stile GNU.
-
-@item
-Gli argomenti da riga di comando che non sono opzioni sono trattati normalmente
-come @value{FNS}, a meno che non abbiano la forma @samp{@var{var}=@var{valore}};
-nel qual caso vengono riconosciuti come assegnamenti di variabile da eseguire
-in quel punto
-nell'elaborazione dell'input.
-
-@item
-Tutti gli argomenti da riga di comando che non sono opzioni, escluso il testo
-del programma, vengono messe nel vettore @code{ARGV}. Modifiche a @code{ARGC}
-e @code{ARGV} influiscono su come @command{awk} elabora l'input.
-
-@item
-Si pu@`o usare un segno meno a s@'e stante (@samp{-}) per designare lo standard
-input sulla riga di comando. @command{gawk} consente anche di usare il
-@value{FN} speciale @file{/dev/stdin}.
-
-
-@item
-@command{gawk} tiene conto di diverse variabili d'ambiente;
-@env{AWKPATH}, @env{AWKLIBPATH} e @env{POSIXLY_CORRECT} sono le
-pi@`u importanti.
-
-@item
-Lo stato d'uscita di @command{gawk} invia informazioni al programma che lo
-ha invocato. Usare l'istruzione @code{exit} dall'interno di un programma
-@command{awk} per impostare il codice di ritorno.
-
-@item
-@command{gawk} consente di includere nel proprio programma file sorgenti di
-@command{awk} con la direttiva @code{@@include} o con le opzioni da riga di
-comando @option{-i} e @option{-f}.
-
-@item
-@command{gawk} consente di caricare funzioni aggiuntive scritte in C
-o C++ con la direttiva @code{@@load} e/o con l'opzione @option{-l}
-(questa funzionalit@`a avanzata @`e descritta pi@`u avanti, in
-@ref{Estensioni dinamiche}).
-@end itemize
-@node Espressioni regolari
-@chapter Espressioni regolari
-@cindex @dfn{regexp}
-@cindex espressioni regolari
-
-Una @dfn{espressione regolare}, o @dfn{regexp}, @`e un modo per descrivere un
-insieme di stringhe.
-Poich@'e le espressioni regolari sono una parte fondamentale della
-programmazione in @command{awk}, il loro formato e il loro uso meritano un
-@value{CHAPTER} a s@'e stante.
-
-@cindex barra (@code{/}), per delimitare le espressioni regolari
-@cindex @code{/} (barra), per delimitare le espressioni regolari
-Un'espressione regolare racchiusa tra barre (@samp{/})
-@`e un modello di ricerca @command{awk} che individua tutti i record in input
-il cui testo corrisponde al modello stesso.
-L'espressione regolare pi@`u semplice @`e una sequenza di lettere o di numeri, o
-di entrambi. Una tale @dfn{regexp} individua ogni stringa che contenga quella
-particolare sequenza.
-Quindi, la @dfn{regexp} @samp{pippo} individua ogni stringa che contenga
-@samp{pippo}. In altre parole, al modello di ricerca @code{/pippo/} corrisponde
-ogni record in input che contiene i cinque caratteri consecutivi @samp{pippo}
-@emph{in qualsiasi parte} del record. Altri tipi di @dfn{regexp} permettono
-di specificare classi di stringhe molto pi@`u complesse.
-
-@ifnotinfo
-All'inizio, gli esempi in questo @value{CHAPTER} sono semplici.
-Man mano che entriamo nei dettagli su
-come funzionano le espressioni regolari utilizzeremo formulazioni pi@`u
-complesse.
-@end ifnotinfo
-
-@menu
-* Uso di @dfn{regexp}:: Come usare le espressioni regolari.
-* Sequenze di protezione:: Come scrivere caratteri non stampabili.
-* Operatori di espressioni regolari:: Operatori di espressioni regolari.
-* Espressioni tra parentesi quadre:: Cosa possono contenere @samp{[...]}.
-* Pi@`u lungo da sinistra:: Quanto @`e lungo il testo individuato.
-* Espressioni regolari calcolate:: Usare @dfn{regexp} dinamiche.
-* Operatori di @dfn{regexp} GNU:: Operatori propri del software GNU.
-* Maiuscolo-Minuscolo:: Fare confronti ignorando
- maiuscolo/minuscolo.
-* Sommario espressioni regolari:: Sommario delle espressioni regolari.
-@end menu
-
-@node Uso di @dfn{regexp}
-@section Uso di espressioni regolari
-
-@cindex espressioni regolari, come criteri di ricerca
-Un'espressione regolare pu@`o essere usata come modello di ricerca
-racchiudendola tra barre. L'espressione regolare @`e quindi confrontata
-con tutto il testo di ogni record (normalmente, basta che corrisponda a
-una parte qualsiasi del testo per risultare soddisfatta). Per esempio,
-il seguente programma stampa il secondo campo di ogni record in cui compaia
-la stringa @samp{li}, in qualsiasi parte del record:
-
-@example
-$ @kbd{awk '/li/ @{ print $2 @}' mail-list}
-@print{} 555-5553
-@print{} 555-0542
-@print{} 555-6699
-@print{} 555-3430
-@end example
-
-@cindex espressioni regolari, operatori
-@cindex operatori, ricerca in stringhe
-@c @cindex operators, @code{~}
-@cindex ricerca in stringhe, operatori
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@c @cindex operatori, @code{!~}
-@cindex @code{if}, istruzione, uso di espressioni regolari in
-@cindex @code{while}, istruzione, uso di espressioni regolari in
-@cindex @code{do}-@code{while}, istruzione, uso di espressioni regolari in
-@c @cindex istruzione @code{if}
-@c @cindex istruzione @code{while}
-@c @cindex istruzione @code{do}
-Espressioni regolari possono anche essere usate in espressioni di confronto.
-Queste espressioni consentono di specificare le stringhe da riconoscere;
-non devono necessariamente comprendere l'intero record corrente. I due
-operatori @samp{~} e @samp{!~} confrontano espressioni regolari. Le
-espressioni che usano questi operatori possono essere usate come modelli di
-ricerca, o nelle istruzioni @code{if}, @code{while}, @code{for}, e @code{do}.
-(@xref{Istruzioni}.)
-Per esempio:
-
-@example
-@var{exp} ~ /@var{regexp}/
-@end example
-
-@noindent
-@`e verificata se l'espressione @var{exp} (intesa come stringa)
-corrisponde a @var{regexp}. L'esempio che segue individua, o sceglie,
-tutti i record in input in cui la lettera maiuscola @samp{J} @`e presente da
-qualche parte nel primo campo:
-
-@example
-$ @kbd{awk '$1 ~ /J/' inventory-shipped}
-@print{} Jan 13 25 15 115
-@print{} Jun 31 42 75 492
-@print{} Jul 24 34 67 436
-@print{} Jan 21 36 64 620
-@end example
-
-Lo stesso risultato si pu@`o ottenere anche cos@`{@dotless{i}}:
-
-@example
-awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
-@end example
-
-Il prossimo esempio chiede che l'espressione @var{exp}
-(intesa come stringa)
-@emph{NON} corrisponda a @var{regexp}:
-
-@example
-@var{exp} !~ /@var{regexp}/
-@end example
-
-L'esempio che segue individua o sceglie tutti i record in input il cui
-primo campo @emph{NON} contiene
-la lettera maiuscola @samp{J}:
-
-@example
-$ @kbd{awk '$1 !~ /J/' inventory-shipped}
-@print{} Feb 15 32 24 226
-@print{} Mar 15 24 34 228
-@print{} Apr 31 52 63 420
-@print{} May 16 34 29 208
-@dots{}
-@end example
-
-@cindex @dfn{regexp}, costanti
-@cindex costanti @dfn{regexp}
-@cindex espressioni regolari, costanti, si veda costanti @dfn{regexp}
-Quando una @dfn{regexp} @`e racchiusa tra barre, come @code{/pippo/}, la chiamiamo
-una @dfn{costante regexp}, proprio come @code{5.27} @`e una costante
-numerica e @code{"pippo"} @`e una costante [di tipo] stringa.
-
-@node Sequenze di protezione
-@section Sequenze di protezione
-
-@cindex sequenze di protezione, in stringhe
-@cindex barra inversa (@code{\}), in sequenze di protezione
-@cindex @code{\} (barra inversa), in sequenze di protezione
-Alcuni caratteri non possono essere inclusi letteralmente in costanti
-stringa (@code{"pippo"}) o in costanti @dfn{regexp} (@code{/pippo/}).
-Vanno invece rappresentati usando @dfn{sequenze di protezione},
-ossia sequenze di caratteri preceduti da una barra inversa (@samp{\}).
-Una sequenza di protezione pu@`o essere usata per includere un carattere di
-"doppio apice" in una costante stringa. Poich@'e un semplice doppio apice
-termina la stringa, va usato @samp{\"} per richiedere che un doppio apice sia
-presente all'interno di una stringa. Per esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{ print "Egli le disse \"ciao!\"." @}'}
-@print{} Egli le disse "ciao!".
-@end example
-
-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{"\"\\"}.
-
-Altre sequenze di protezione rappresentano caratteri non stampabili
-come TAB o il ritorno a capo. Anche se @`e possibile immettere la maggior parte dei
-caratteri non stampabili direttamente in una costante stringa o
-@dfn{regexp}, essi possono non essere di facile comprensione.
-
-La seguente lista elenca
-tutte le sequenze di protezione usate in @command{awk} e
-cosa rappresentano. Se non @`e detto altrimenti, tutte queste sequenze di
-protezione valgono sia per costanti stringa che per costanti @dfn{regexp}:
-
-@table @code
-@item \\
-Barra inversa letterale, @samp{\}.
-
-@c @cindex @command{awk} language, V.4 version
-@cindex @code{\} (barra inversa), @code{\a}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\a}, sequenza di protezione
-@item \a
-Il carattere ``campanello'', @kbd{Ctrl-g}, codice ASCII 7 (BEL).
-(Spesso genera qualche tipo di segnale sonoro udibile.)
-
-@cindex @code{\} (barra inversa), @code{\b}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\b}, sequenza di protezione
-@item \b
-Barra inversa, @kbd{Ctrl-h}, codice ASCII 8 (BS).
-
-@cindex @code{\} (barra inversa), @code{\f}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\f}, sequenza di protezione
-@item \f
-Nuova pagina, @kbd{Ctrl-l}, codice ASCII 12 (FF).
-
-@cindex @code{\} (barra inversa), @code{\n}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\n}, sequenza di protezione
-@item \n
-A capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
-
-@cindex @code{\} (barra inversa), @code{\r}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\r}, sequenza di protezione
-@item \r
-Ritorno del carrello, @kbd{Ctrl-m}, codice ASCII 13 (CR).
-
-@cindex @code{\} (barra inversa), @code{\t}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\t}, sequenza di protezione
-@item \t
-Tabulazione orizzontale, @kbd{Ctrl-i}, codice ASCII 9 (HT).
-
-@c @cindex @command{awk} language, V.4 version
-@cindex @code{\} (barra inversa), @code{\v}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\v}, sequenza di protezione
-@item \v
-Tabulazione verticale, @kbd{Ctrl-k}, codice ASCII 11 (VT).
-
-@cindex @code{\} (barra inversa), @code{\}@var{nnn}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\}@var{nnn}, sequenza di protezione
-@item \@var{nnn}
-Il valore ottale @var{nnn}, dove @var{nnn} pu@`o essere da 1 a 3 cifre ottali,
-tra @samp{0} e @samp{7}. Per esempio, il codice per il carattere ASCII ESC
-(escape) @`e @samp{\033}.
-
-@c @cindex @command{awk} language, V.4 version
-@c @cindex @command{awk} language, POSIX version
-@cindex @code{\} (barra inversa), @code{\x}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\x}, sequenza di protezione
-@cindex comuni, estensioni@comma{} @code{\x}, sequenza di protezione
-@cindex estensioni comuni, @code{\x}, sequenza di protezione
-@item \x@var{hh}@dots{}
-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}
-(La sequenza di protezione @samp{\x} non @`e permessa in POSIX awk.)
-
-@quotation ATTENZIONE
-In ISO C, la sequenza di protezione continua fino a raggiungere il primo
-carattere che non sia una cifra esadecimale.
-In passato, @command{gawk} avrebbe continuato ad aggiungere
-cifre esadecimali al valore finch@'e non trovava una cifra non esadecimale
-oppure fino a raggiungere la fine della stringa.
-Comunque usare pi@`u di due cifre esadecimali produceva risultati indefiniti.
-Dalla @value{PVERSION} 4.2,
-vengono elaborate solo due cifre.
-@end quotation
-
-@cindex @code{\} (barra inversa), @code{\/}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\/}, sequenza di protezione
-@item \/
-Una barra (necessario solo per costanti @dfn{regexp}).
-Questa sequenza si usa per inserire una costante @dfn{regexp}
-che contiene una barra
-(come @code{/.*:\/home\/[[:alnum:]]+:.*/}; la notazione @samp{[[:alnum:]]}
-verr@`a spiegata pi@`u avanti,
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Espressioni tra parentesi quadre}).
-Poich@'e una @dfn{regexp} @`e racchiusa tra
-barre, si deve proteggere ogni barra che sia parte dell'espressione, per dire
-ad @command{awk} di andare avanti a scandire il resto della @dfn{regexp}.
-
-@cindex @code{\} (barra inversa), @code{\"}, sequenza di protezione
-@cindex barra inversa (@code{\}), @code{\"}, sequenza di protezione
-@item \"
-Un doppio apice (necessario solo per costanti stringa).
-Questa sequenza si usa per inserire in una costante stringa il carattere
-doppio apice
-(come @code{"Egli le disse \"ciao!\"."}).
-Poich@'e la stringa @`e racchiusa tra
-doppi apici, si deve proteggere ogni doppio apice che sia parte della stringa
-per dire ad @command{awk} di andare avanti a elaborare il resto della stringa.
-@end table
-
-In @command{gawk}, parecchie altre sequenze di due caratteri inizianti con
-con una barra inversa hanno un significato speciale nelle @dfn{regexp}.
-@ref{Operatori di @dfn{regexp} GNU}.
-
-In una @dfn{regexp}, una barra inversa che preceda un carattere non presente
-nella lista precedente, e non elencato in
-@ref{Operatori di @dfn{regexp} GNU},
-significa che il carattere seguente dovrebbe essere preso letteralmente,
-anche se normalmente sarebbe un operatore di @dfn{regexp}. Per esempio,
-@code{/a\+b/} individua i tre caratteri @samp{a+b}.
-
-@cindex barra inversa (@code{\}), in sequenze di protezione
-@cindex @code{\} (barra inversa), in sequenze di protezione
-@cindex portabilit@`a
-Per una completa portabilit@`a, non usare una barra inversa prima di qualsiasi
-carattere non incluso nella lista precedente, o che non sia un operatore.
-@c 11/2014: Moved so as to not stack sidebars
-@cindex sidebar, Barra inversa prima di un carattere normale
-@ifdocbook
-@docbook
-<sidebar><title>Barra inversa prima di un carattere normale</title>
-@end docbook
-
-@cindex portabilit@`a, barra inversa in sequenze di protezione
-@cindex POSIX @command{awk}, barre inverse in costanti stringa
-@cindex barra inversa (@code{\}), in sequenze di protezione, POSIX e
-@cindex @code{\} (barra inversa), in sequenze di protezione, POSIX e
-
-@cindex risoluzione di problemi, barra inversa prima di caratteri non speciali
-@cindex problemi, risoluzione di, barra inversa prima di caratteri non speciali
-Se si mette una barra inversa in una costante stringa prima di qualcosa che
-non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
-lascia indefinito il comportamento. Ci sono due possibilit@`a:
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex Brian Kernighan, @command{awk} di
-@table @asis
-@item Togliere la barra inversa
-Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
-Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
-(Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
-probabilit@`a, @command{gawk} lo segnala).
-Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
-ossia delle barre verticali precedute e seguite da almeno uno spazio,
-occorre mettere due barre inverse nella stringa:
-@samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
-@c I did this! This is why I added the warning.
-
-@cindex @command{gawk}, sequenze di protezione
-@cindex Unix @command{awk}, barre inverse in sequenze di protezione
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
-Alcune altre implementazioni di @command{awk} fanno questo.
-In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
-@code{"a\\qc"}.
-@end table
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Barra inversa prima di un carattere normale}
-
-
-@cindex portabilit@`a, barra inversa in sequenze di protezione
-@cindex POSIX @command{awk}, barre inverse in costanti stringa
-@cindex barra inversa (@code{\}), in sequenze di protezione, POSIX e
-@cindex @code{\} (barra inversa), in sequenze di protezione, POSIX e
-
-@cindex risoluzione di problemi, barra inversa prima di caratteri non speciali
-@cindex problemi, risoluzione di, barra inversa prima di caratteri non speciali
-Se si mette una barra inversa in una costante stringa prima di qualcosa che
-non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
-lascia indefinito il comportamento. Ci sono due possibilit@`a:
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex Brian Kernighan, @command{awk} di
-@table @asis
-@item Togliere la barra inversa
-Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
-Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
-(Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
-probabilit@`a, @command{gawk} lo segnala).
-Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
-ossia delle barre verticali precedute e seguite da almeno uno spazio,
-occorre mettere due barre inverse nella stringa:
-@samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
-@c I did this! This is why I added the warning.
-
-@cindex @command{gawk}, sequenze di protezione
-@cindex Unix @command{awk}, barre inverse in sequenze di protezione
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
-Alcune altre implementazioni di @command{awk} fanno questo.
-In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
-@code{"a\\qc"}.
-@end table
-@end cartouche
-@end ifnotdocbook
-Ricapitolando:
-
-@itemize @value{BULLET}
-@item
-Le sequenze di protezione nella lista di cui sopra sono sempre elaborate
-per prime, sia per le costanti stringa che per le costanti @dfn{regexp}. Questo
-viene fatto quasi subito, non appena @command{awk} legge il programma.
-
-@item
-@command{gawk} elabora sia costanti @dfn{regexp} che @dfn{regexp} dinamiche
-(@pxref{Espressioni regolari calcolate}),
-per gli operatori speciali elencati in
-@ref{Operatori di @dfn{regexp} GNU}.
-
-@item
-Una barra inversa prima di ogni altro carattere richiede di trattare quel
-carattere letteralmente.
-@end itemize
-
-@cindex sidebar, Sequenze di protezione per metacaratteri
-@ifdocbook
-@docbook
-<sidebar><title>Sequenze di protezione per metacaratteri</title>
-@end docbook
-
-@cindex metacaratteri, sequenze di protezione per
-
-Supponiamo che si usi una protezione ottale o esadecimale
-per rappresentare un metacarattere di @dfn{regexp}
-(si veda @ref{Operatori di espressioni regolari}).
-@command{awk} considera il carattere come un carattere letterale o
-come un operatore di @dfn{regexp}?
-
-@cindex angolo buio, sequenze di protezione, per metacaratteri
-Storicamente, tali caratteri erano considerati letteralmente.
-@value{DARKCORNER}
-Invece, lo standard POSIX richiede che siano considerati
-come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
-In modalit@`a compatibile (@pxref{Opzioni}),
-@command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
-letteramente, quando sono usati in costanti @dfn{regexp}. Quindi,
-@code{/a\52b/} @`e equivalente a @code{/a\*b/}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Sequenze di protezione per metacaratteri}
-
-
-@cindex metacaratteri, sequenze di protezione per
-
-Supponiamo che si usi una protezione ottale o esadecimale
-per rappresentare un metacarattere di @dfn{regexp}
-(si veda @ref{Operatori di espressioni regolari}).
-@command{awk} considera il carattere come un carattere letterale o
-come un operatore di @dfn{regexp}?
-
-@cindex angolo buio, sequenze di protezione, per metacaratteri
-Storicamente, tali caratteri erano considerati letteralmente.
-@value{DARKCORNER}
-Invece, lo standard POSIX richiede che siano considerati
-come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
-In modalit@`a compatibile (@pxref{Opzioni}),
-@command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
-letteramente, quando sono usati in costanti @dfn{regexp}. Quindi,
-@code{/a\52b/} @`e equivalente a @code{/a\*b/}.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di espressioni regolari
-@section Operatori di espressioni regolari
-@cindex espressioni regolari, operatori
-@cindex metacaratteri in espressioni regolari
-
-@`E possibile inserire in espressioni regolari dei caratteri speciali,
-detti @dfn{operatori di espressioni regolari} o @dfn{metacaratteri}, per
-aumentarne il potere e la versatilit@`a.
-
-Le sequenze di protezione descritte
-@ifnotinfo
-prima
-@end ifnotinfo
-in @ref{Sequenze di protezione}
-sono valide all'interno di una @dfn{regexp}. Sono precedute da una @samp{\} e
-sono riconosciute e convertite nei caratteri reali corrispondenti nella
-primissima fase dell'elaborazione delle @dfn{regexp}.
-
-Ecco una lista dei metacaratteri. Tutti i caratteri che non sono sequenze
-di protezione e che non sono elencati qui rappresentano se stessi:
-
-@c Use @asis so the docbook comes out ok. Sigh.
-@table @asis
-@cindex barra inversa (@code{\}), operatore @dfn{regexp}
-@cindex barra inversa (@code{\}), operatore @dfn{regexp}
-@cindex @code{\} (barra inversa), operatore @dfn{regexp}
-@item @code{\}
-Si usa per togliere il significato speciale a un carattere quando si effettuano
-confronti. Per esempio, @samp{\$}
-individua il carattere @samp{$}.
-
-@cindex espressioni regolari, ancore nelle
-@cindex Texinfo, inizi di capitolo nei file
-@cindex @code{^} (circonflesso), operatore @dfn{regexp}
-@cindex circonflesso (@code{^}), operatore @dfn{regexp}
-@item @code{^}
-Si usa per indicare l'inizio di una stringa. Per esempio, @samp{^@@chapter}
-individua @samp{@@chapter} all'inizio di una stringa e si pu@`o usare per
-identificare inizi di capitoli in file sorgenti Texinfo.
-Il simbolo @samp{^} @`e conosciuto come @dfn{@`ancora}, perch@'e @`ancora la ricerca
-solo all'inizio della stringa.
-
-@`E importante notare che @samp{^} non individua un inizio di riga
-(il punto subito dopo un ritorno a capo @samp{\n}) che si trovi all'interno
-di una stringa. La condizione non @`e verificata nell'esempio seguente:
-
-@example
-if ("riga1\nRIGA 2" ~ /^R/) @dots{}
-@end example
-
-@cindex @code{$} (dollaro), operatore @dfn{regexp}
-@cindex dollaro (@code{$}), operatore @dfn{regexp}
-@item @code{$}
-Simile a @samp{^}, ma serve a indicare la fine di una stringa.
-Per esempio, @samp{p$}
-individua un record che termina con la lettera @samp{p}. Il @samp{$} @`e
-un'@`ancora e non individua una fine di riga (il punto immediatamente prima
-di un carattere di ritorno a capo @samp{\n})
-contenuta in una stringa.
-La condizione nell'esempio seguente non @`e verificata:
-
-@example
-if ("riga1\nRIGA 2" ~ /1$/) @dots{}
-@end example
-
-@cindex @code{.} (punto), operatore @dfn{regexp}
-@cindex punto (@code{.}), operatore @dfn{regexp}
-@item @code{.} (punto)
-Individua un qualsiasi carattere,
-@emph{incluso} il carattere di ritorno a capo. Per esempio, @samp{.P}
-individua ogni carattere in una stringa che sia seguito da una @samp{P}.
-Usando la concatenazione, si pu@`o formare un'espressione regolare come
-@samp{U.A}, che individua qualsiasi sequenza di tre caratteri che inizia con
-@samp{U} e finisce con @samp{A}.
-
-@cindex POSIX @command{awk}, uso del punto (@code{.})
-In modalit@`a POSIX stretta (@pxref{Opzioni}),
-@samp{.} non individua il carattere @sc{nul},
-ossia il carattere con tutti i bit uguali a zero.
-In altri contesti, @sc{nul} @`e solo un carattere qualsiasi. Altre versioni
-di @command{awk} possono non essere in grado di individuare il carattere
-@sc{nul}.
-
-@cindex @code{[]} (parentesi quadre), operatore @dfn{regexp}
-@cindex parentesi quadre (@code{[]}), operatore @dfn{regexp}
-@cindex espressioni tra parentesi
-@cindex insiemi di caratteri, si veda anche espressioni tra parentesi quadre
-@cindex liste di caratteri, si veda espressioni tra parentesi quadre
-@cindex classi di caratteri, si veda espressioni tra parentesi quadre
-@item @code{[}@dots{}@code{]}
-Questa @`e chiamata una @dfn{espressione tra parentesi quadre}.@footnote{In
-altri testi, un'espressione tra parentesi quadre potrebbe essere
-definita come @dfn{insieme di caratteri}, @dfn{classe di caratteri} o
- @dfn{lista di caratteri}.}
-Individua @emph{uno} qualsiasi dei caratteri racchiusi tra
-parentesi quadre. Per esempio, @samp{[MVX]} individua uno qualsiasi
-dei caratteri @samp{M}, @samp{V}, o @samp{X} in una stringa. Una spiegazione
-esauriente di quel che si pu@`o mettere all'interno di un'espressione tra
-parentesi quadre @`e data in
-@ref{Espressioni tra parentesi quadre}.
-
-@cindex espressioni tra parentesi quadre, complementate
-@item @code{[^}@dots{}@code{]}
-Questa @`e una @dfn{espressione tra parentesi quadre complementata}. Il primo
-carattere dopo la @samp{[} @emph{deve} essere un @samp{^}. Individua
-qualsiasi carattere
-@emph{tranne} quelli tra parentesi quadre. Per esempio, @samp{[^awk]}
-individua qualsiasi carattere che non sia una @samp{a}, @samp{w}, o @samp{k}.
-
-@cindex @code{|} (barra verticale)
-@cindex barra verticale (@code{|})
-@item @code{|}
-Questo @`e un @dfn{operatore alternativa} ed @`e usato per specificare delle
-alternative. La @samp{|} ha la precedenza pi@`u bassa tra tutti gli operatori
-di espressioni regolari. Per esempio, @samp{^P|[aeiouy]} individua tutte le
-stringhe corrispondenti a @samp{^P} oppure a @samp{[aeiouy]}. Ci@`o significa
-che individua qualsiasi stringa che inizi con @samp{P} o contenga (in
-qualsiasi posizione al suo interno) una vocale inglese minuscola.
-
-L'alternativa si applica alle @dfn{regexp} pi@`u ampie individuabili in ogni
-lato.
-
-@cindex @code{()} (parentesi), operatore @dfn{regexp}
-@cindex parentesi (@code{()}), operatore @dfn{regexp}
-@item @code{(}@dots{}@code{)}
-Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia
-in quelle aritmetiche. Si possono usare per concatenare espressioni regolari
-che contengono l'operatore alternativa, @samp{|}. Per esempio,
-@samp{@@(samp|code)\@{[^@}]+\@}} individua sia @samp{@@code@{pippo@}} sia
-@samp{@@samp@{pluto@}}.
-(Queste sono sequenze in linguaggio Texinfo per controllare la formattazione.
-Il significato di @samp{+} @`e
-spiegato pi@`u avanti in questa lista.)
-
-@cindex @code{*} (asterisco), operatore @code{*}, come operatore @dfn{regexp}
-@cindex asterisco (@code{*}), operatore @code{*}, come operatore @dfn{regexp}
-@item @code{*}
-Questo simbolo richiede che la precedente espressione regolare sia
-ripetuta tante volte quanto serve per trovare una corrispondenza. Per
-esempio, @samp{ph*} applica il simbolo
-@samp{*} al carattere @samp{h} che lo precede immediatamente e ricerca
-corrispondenze costituite da una @samp{p} seguita da un numero qualsiasi di
-@samp{h}. Viene individuata anche solo la @samp{p}, se non ci sono
-@samp{h}.
-
-Ci sono due sfumature da capire sul funzionamento di @samp{*}.
-Primo, @samp{*} tiene conto solo del singolo componente dell'espressione
-regolare che lo precede (p.es., in @samp{ph*} vale solo per @samp{h}).
-Per fare s@`{@dotless{i}} che @samp{*} si applichi a una sottoespressione pi@`u estesa,
-occorre metterla tra parentesi:
-@samp{(ph)*} individua @samp{ph}, @samp{phph}, @samp{phphph} e cos@`{@dotless{i}} via.
-
-Secondo, @samp{*} trova quante pi@`u ripetizioni siano possibili. Se il testo
-da ricercare @`e @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} individua tutte le
-@samp{h}.
-
-@cindex @code{+} (pi@`u), operatore @dfn{regexp}
-@cindex pi@`u (@code{+}), 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
-@samp{wh+y} individuerebbe @samp{why} e @samp{whhy}, ma non @samp{wy}, mentre
-@samp{wh*y} li troverebbe tutti e tre.
-
-@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
-@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
-@item @code{?}
-Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione che
-precede pu@`o essere trovata una volta sola oppure non trovata
-affatto. Per esempio, @samp{fe?d}
-individua @samp{fed} e @samp{fd}, ma nient'altro.
-
-@cindex espressioni di intervallo, (@dfn{regexp})
-@item @code{@{}@var{n}@code{@}}
-@itemx @code{@{}@var{n}@code{,@}}
-@itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
-Uno o due numeri tra parentesi graffe rappresentano una
-@dfn{espressione di intervallo}.
-Se c'@`e un numero tra graffe, la @dfn{regexp} precedente @`e ripetuta
-@var{n} volte.
-Se ci sono due numeri separati da una virgola, la @dfn{regexp} precedente @`e
-ripetuta da @var{n} a @var{m} volte.
-Se c'@`e un numero seguito da una virgola, allora la @dfn{regexp} precedente
-@`e ripetuta almeno @var{n} volte:
-
-@table @code
-@item wh@{3@}y
-Riconosce @samp{whhhy}, ma non @samp{why} o @samp{whhhhy}.
-
-@item wh@{3,5@}y
-Riconosce soltanto @samp{whhhy}, @samp{whhhhy}, o @samp{whhhhhy}.
-
-@item wh@{2,@}y
-Riconosce @samp{whhy}, @samp{whhhy} e cos@`{@dotless{i}} via.
-@end table
-
-@cindex POSIX @command{awk}, espressioni di intervallo in
-Le espressioni di intervallo non erano tradizionalmente disponibili in
-@command{awk}. Sono state aggiunte come parte dello standard POSIX per
-rendere @command{awk} ed @command{egrep} coerenti tra di loro.
-
-@cindex @command{gawk}, espressioni di intervallo e
-In passato, poich@'e vecchi programmi possono usare @samp{@{} e @samp{@}} in
-costanti @dfn{regexp},
-@command{gawk} @emph{non} riconosceva espressioni di intervallo
-nelle @dfn{regexp}.
-
-Comunque, a partire dalla @value{PVERSION} 4.0,
-@command{gawk} riconosce espressioni di intervallo per default.
-Ci@`o accade perch@'e la compatibilit@`a con POSIX @`e ritenuta pi@`u
-importante da molti utenti @command{gawk} rispetto alla compatibilit@`a con
-dei vecchi programmi.
-
-Per programmi che usano @samp{@{} e @samp{@}} in costanti @dfn{regexp},
-@`e buona pratica proteggerli sempre con una barra inversa. Allora le
-costanti @dfn{regexp} sono valide e si comportano come desiderato, usando
-qualsiasi versione di @command{awk}.@footnote{@`E meglio usare due barre inverse
-se si sta usando una costante stringa con un operatore @dfn{regexp} o una
-funzione.}
-
-Infine, quando @samp{@{} e @samp{@}} appaiono in costanti @dfn{regexp}
-in un modo non interpretabile come espressione di intervallo
-(come in @code{/q@{a@}/}), allora sono prese letteralmente.
-@end table
-
-@cindex precedenza, operatore @dfn{regexp}
-@cindex espressioni regolari, operatori, precedenza di
-Nelle espressioni regolari, gli operatori @samp{*}, @samp{+}, e @samp{?},
-come pure le parentesi graffe @samp{@{} e @samp{@}},
-hanno
-la precedenza pi@`u alta, seguiti dalla concatenazione, e infine da @samp{|}.
-Come nell'algebra, le parentesi possono cambiare il raggruppamento degli
-operatori.
-@cindex POSIX @command{awk}, espressioni regolari e
-@cindex @command{gawk}, espressioni regolari, precedenza
-In POSIX @command{awk} e in @command{gawk}, gli operatori @samp{*},
-@samp{+}, e @samp{?} rappresentano se stessi quando non c'@`e nulla
-nella @dfn{regexp} che li precede. Per esempio, @code{/+/} individua un
-semplice segno pi@`u. Comunque, molte altre versioni di @command{awk}
-trattano una simile notazione come un errore di sintassi.
-
-Se @command{gawk} @`e in modalit@`a compatibile (@pxref{Opzioni}), le espressioni
-di intervallo non si possono usare nelle espressioni regolari.
-
-@node Espressioni tra parentesi quadre
-@section Usare espressioni tra parentesi quadre
-@cindex espressioni tra parentesi quadre
-@cindex espressioni tra parentesi quadre, espressioni di intervallo
-@cindex espressioni di intervallo, (@dfn{regexp})
-@cindex elenchi di caratteri in un'espressione regolare
-@cindex caratteri, elenchi di, in un'espressione regolare
-
-Come detto sopra, un'espressione tra parentesi quadre individua qualsiasi
-carattere incluso tra le parentesi quadre aperta e chiusa.
-
-All'interno di un'espressione tra parentesi quadre, una
-@dfn{espressione di intervallo} @`e formata da due caratteri separati da un
-trattino. Individua ogni singolo carattere compreso tra i due caratteri,
-ordinati secondo l'insieme di caratteri in uso nel sistema. Per esempio,
-@samp{[0-9]} @`e equivalente a @samp{[0123456789]}.
-(Si veda @ref{Intervalli e localizzazione} per una spiegazione di come
-lo standard POSIX e @command{gawk} sono cambiati nel corso degli anni.
-La cosa ha un interesse principalmente storico.)
-
-Con la crescente popolarit@`a dello
-@uref{http://www.unicode.org, standard di caratteri Unicode},
-c'@`e un'ulteriore dettaglio da tenere in conto. Le sequenze di
-protezione ottali ed esadecimali utilizzabili per inserire
-valori all'interno di espressioni tra parentesi quadre
-sono considerate contenere solo caratteri
-che occupano un unico byte (caratteri il cui valore stia
-nell'intervallo 0--256). Per individuare un intervallo di
-caratteri in cui i punti di inizio e fine dell'intervello
-abbiano valori maggiori di 256, occorre immettere direttamente
-le codifiche multi-byte dei caratteri in questione.
-
-@cindex @code{\} (barra inversa), in espressioni tra parentesi quadre
-@cindex barra inversa (@code{\}), in espressioni tra parentesi quadre
-@cindex @code{^} (circonflesso), in espressioni tra parentesi quadre
-@cindex circonflesso (@code{^}), in espressioni tra parentesi quadre
-@cindex @code{-} (meno), in espressioni tra parentesi quadre
-@cindex meno (@code{-}), in espressioni tra parentesi quadre
-Per includere uno dei caratteri @samp{\}, @samp{]}, @samp{-}, o @samp{^} in
-un'espressione tra parentesi quadre, occorre inserire un @samp{\} prima del
-carattere stesso. Per esempio:
-
-@example
-[d\]]
-@end example
-
-@noindent
-individua sia @samp{d} che @samp{]}.
-Inoltre, se si mette una @samp{]} subito dopo la
-@samp{[} aperta, la parentesi quadra chiusa @`e considerata come uno dei
-caratteri da individuare.
-
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e
-@cindex espressioni regolari estese (ERE)
-@cindex ERE (espressioni regolari estese)
-@cindex @command{egrep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{egrep}
-L'utilizzo di @samp{\} nelle espressioni tra parentesi quadre
-@`e compatibile con altre implementazioni di @command{awk} ed @`e anche richiesto
-da POSIX.
-Le espressioni regolari in @command{awk} sono un insieme pi@`u esteso delle
-specificazioni POSIX per le espressioni regolari estese (ERE).
-Le ERE POSIX sono basate sulle espressioni regolari accettate dal
-tradizionale programma di utilit@`a @command{egrep}.
-
-@cindex espressioni tra parentesi quadre, classi di caratteri
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
-Le @dfn{classi di caratteri} sono una funzionalit@`a introdotta nello standard
-POSIX. Una classe di caratteri @`e una particolare notazione per descrivere
-liste di caratteri cha hanno un attributo specifico, ma i caratteri
-veri e propri possono variare da paese a paese e/o
-da insieme di caratteri a insieme di caratteri. Per esempio, la nozione di
-cosa sia un carattere alfabetico @`e diversa tra gli Stati Uniti e la Francia.
-
-Una classe di caratteri @`e valida solo in una @dfn{regexp} @emph{contenuta}
-tra le parentesi quadre di un'espressione tra parentesi quadre. Le classi di
-caratteri consistono di @samp{[:},
-una parola chiave che segnala la classe, e @samp{:]}. La
-@ref{tabella-caratteri-classe} elenca le classi di caratteri definite dallo
-standard POSIX.
-
-@float Tabella,tabella-caratteri-classe
-@caption{classi di caratteri POSIX}
-@multitable @columnfractions .15 .85
-@headitem Classe @tab Significato
-@item @code{[:alnum:]} @tab Caratteri alfanumerici.
-@item @code{[:alpha:]} @tab Caratteri alfabetici.
-@item @code{[:blank:]} @tab Caratteri spazio e TAB.
-@item @code{[:cntrl:]} @tab Caratteri di controllo.
-@item @code{[:digit:]} @tab Caratteri numerici.
-@item @code{[:graph:]} @tab Caratteri che sono stampabili e visibili.
-(Uno @dfn{spazio} @`e stampabile ma non visibile, mentre una @samp{a} @`e l'uno e
-l'altro.)
-@item @code{[:lower:]} @tab Caratteri alfabetici minuscoli.
-@item @code{[:print:]} @tab Caratteri stampabili (caratteri che non sono
-caratteri di controllo).
-@item @code{[:punct:]} @tab Caratteri di punteggiatura (caratteri che non
-sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
-@item @code{[:space:]} @tab Caratteri di spazio (come @dfn{spazio}, TAB, e
-@dfn{formfeed}, per citarne alcuni).
-@item @code{[:upper:]} @tab Caratteri alfabetici maiuscoli.
-@item @code{[:xdigit:]} @tab Caratteri che sono cifre esadecimali.
-@end multitable
-@end float
-
-Per esempio, prima dello standard POSIX, si doveva scrivere
-@code{/[A-Za-z0-9]/} per individuare i
-caratteri alfanumerici. Se l'insieme
-di caratteri in uso comprendeva altri caratteri alfabetici, l'espressione
-non li avrebbe individuati.
-Con le classi di caratteri POSIX si pu@`o scrivere
-@code{/[[:alnum:]]/} per designare i caratteri alfabetici e numerici
-dell'insieme di caratteri in uso.
-
-@c Thanks to
-@c Date: Tue, 01 Jul 2014 07:39:51 +0200
-@c From: Hermann Peifer <peifer@gmx.eu>
-Alcuni programmi di utilit@`a che cercano espressioni regolari prevedono
-una classe di caratteri, non standard,
-@samp{[:ascii:]}; @command{awk} non la prevede. Tuttavia, @`e possibile ottenere
-lo stesso risultato utilizzando @samp{[\x00-\x7F]}. Quest'espressione
-individua tutti i valori numerici tra zero e 127, che @`e l'intervallo definito
-dell'insieme di caratteri ASCII. Usando una lista di caratteri che esclude
-(@samp{[^\x00-\x7F]}) si individuano tutti i caratteri mono-byte che non
-sono nell'intervallo ASCII.
-
-@cindex espressioni tra parentesi quadre, elementi di collazione
-@cindex espressioni tra parentesi quadre, non-ASCII
-@cindex elementi di collazione
-In espressioni tra parentesi quadre possono apparire due ulteriori sequenze
-speciali. Riguardano insiemi di caratteri non-ASCII, che possono avere
-simboli singoli (chiamati @dfn{elementi di collazione}) che sono rappresentati
-con pi@`u di un carattere. Possono designare anche parecchi caratteri che sono
-equivalenti tra loro ai fini della @dfn{collazione}, o dell'ordinamento.
-(Per esempio, in francese, la semplice ``e'' e la sua versione con accento grave ``@`e''
-sono equivalenti). Queste sequenze sono:
-
-@table @asis
-@cindex espressioni tra parentesi quadre, elementi di collazione
-@cindex elementi di collazione
-@item elementi di collazione
-Elementi di collazione multi-byte racchiusi fra
-@samp{[.} e @samp{.]}. Per esempio, se @samp{ch} @`e un elemento di collazione,
-@samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di
-collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere
-@samp{c} o @samp{h}.
-
-@cindex espressioni tra parentesi quadre, classi di equivalenza
-@item classi di equivalenza
-Sono nomi, specifici a una particolare localizzazione, per una lista di
-caratteri equivalenti tra loro. Il nome @`e racchiuso fra
-@samp{[=} e @samp{=]}.
-Per esempio, il nome @samp{e} potrebbe essere usato per designare
-``e'', ``@^e'', ``@`e'', e ``@'e''. In questo caso, @samp{[[=e=]]} @`e una @dfn{regexp}
-che corrisponde a @samp{e}, @samp{@^e}, @samp{@`e} e @samp{@'e}.
-@end table
-
-Queste funzionalit@`a sono molto utili in localizzazioni non inglesi.
-
-@cindex internazionalizzazione, localizzazione, classi di caratteri
-@cindex @command{gawk}, classi di caratteri e
-@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
-@quotation ATTENZIONE
-Le funzioni di libreria che @command{gawk} usa per individuare le espressioni
-regolari per ora riconoscono solo le classi di caratteri POSIX;
-non riconoscono simboli di collazione o classi di equivalenza.
-@end quotation
-@c maybe one day ...
-
-In un'espressione tra parentesi quadre, una parentesi aperta (@samp{[})
-che non costituisca l'inizio della specificazione di una classe di
-caratteri, di simboli di collazione o di una classe di equivalenza
-@`e interpretata letteralmente. Questo vale anche per @samp{.} e @samp{*}.
-
-@node Pi@`u lungo da sinistra
-@section Quanto @`e lungo il testo individuato?
-
-@cindex espressioni regolari, corrispondenza pi@`u a sinistra
-@c @cindex matching, leftmost longest
-Si consideri il caso seguente:
-
-@example
-echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
-@end example
-
-Questo esempio usa la funzione @code{sub()} per modificare il record in input.
-(@code{sub()} sostituisce la prima ricorrenza in ogni testo individuato dal
-primo argomento con la stringa fornita come secondo argomento;
-@pxref{Funzioni per stringhe}.) Qui, la @dfn{regexp} @code{/a+/} richiede
-``uno o pi@`u caratteri @samp{a},'' e il testo da sostituire @`e @samp{<A>}.
-
-L'input contiene quattro caratteri @samp{a}.
-Le espressioni regolari @command{awk} (e POSIX) individuano sempre
-la sequenza @emph{pi@`u lunga}, partendo da sinistra, di caratteri in input che
-corrispondono. Quindi, tutti e quattro i caratteri @samp{a} sono
-rimpiazzati con @samp{<A>} in questo esempio:
-
-@example
-$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
-@print{} <A>bcd
-@end example
-
-Per semplici test corrisponde/non corrisponde, la cosa ha poca importanza.
-Ma se si sta controllando un testo o si fanno sostituzioni usando le funzioni
-@code{match()}, @code{sub()}, @code{gsub()} e @code{gensub()},
-@`e invece molto importante.
-@ifinfo
-@xref{Funzioni per stringhe},
-Per maggiori informazioni su queste funzioni.
-@end ifinfo
-Tenere in conto questo principio @`e importante anche quando si suddividono
-record e campi usando delle @dfn{regexp} (@pxref{Record},
-e anche @pxref{Separatori di campo}).
-
-@node Espressioni regolari calcolate
-@section Usare @dfn{regexp} dinamiche
-
-@cindex espressioni regolari calcolate
-@cindex espressioni regolari dinamiche
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@c @cindex operators, @code{~}
-@c @cindex operators, @code{!~}
-L'espressione a destra di un operatore @samp{~} o @samp{!~} non deve
-necessariamente essere una costante @dfn{regexp} (cio@`e, una stringa di
-caratteri tra barre). Pu@`o essere una qualsiasi
-espressione. L'espressione @`e valutata e convertita in una stringa
-se necessario; il contenuto della stringa @`e poi usato come una @dfn{regexp}.
-Una @dfn{regexp} calcolata in questo modo @`e detta una @dfn{regexp dinamica}
-o una @dfn{regexp calcolata}:
-
-@example
-BEGIN @{ @dfn{regexp}_numerica = "[[:digit:]]+" @}
-$0 ~ @dfn{regexp}_numerica @{ print @}
-@end example
-
-@noindent
-Questo @dfn{script} imposta @code{regexp_numerica} come una @dfn{regexp} che
-descrive una o pi@`u cifre, e poi controlla se un record in input corrisponde a
-questa regexp.
-
-@quotation NOTA
-Usando gli operatori @samp{~} e @samp{!~}, si tenga presente che c'@`e
-una differenza tra una costante @dfn{regexp} racchiusa tra barre e una
-costante stringa racchiusa tra doppi apici.
-Se si intende utilizzare una costante stringa, occorre comprendere che
-la stringa @`e, in sostanza, scandita @emph{due volte}: la prima volta quando
-@command{awk} legge il programma, e la seconda volta quando va a
-confrontare la stringa a sinistra dell'operatore con il modello che sta
-alla sua destra. Questo vale per ogni espressione (come la
-@code{regexp_numerica}, vista nel precedente esempio), non solo per le
-costanti stringa.
-@end quotation
-
-@cindex costanti @dfn{regexp}, barre vs.@: doppi apici
-@cindex @code{\} (barra inversa), in costanti @dfn{regexp}
-@cindex barra inversa (@code{\}), in costanti @dfn{regexp}
-@cindex @code{"} (doppio apice), in costanti @dfn{regexp}
-@cindex doppio apice (@code{"}), in costanti @dfn{regexp}
-Che differenza fa la doppia scansione di una stringa?
-La risposta ha a che vedere con le sequenze di protezione e particolarmente
-con le barre inverse. Per inserire una barra inversa in un'espressione
-regolare all'interno di una stringa, occorre inserire @emph{due} barre
-inverse.
-
-Per esempio, @code{/\*/} @`e una costante @dfn{regexp} per designare un @samp{*}
-letterale.
-@`E richiesta una sola barra inversa. Per fare lo stesso con una stringa,
-occorre immettere @code{"\\*"}. La prima barra inversa protegge la
-seconda in modo che la stringa in realt@`a contenga i
-due caratteri @samp{\} e @samp{*}.
-
-@cindex risoluzione di problemi, costanti @dfn{regexp} vs.@: costanti stringa
-@cindex problemi, risoluzione di, costanti @dfn{regexp} vs.@: costanti stringa
-@cindex costanti @dfn{regexp}, vs.@: costanti stringa
-@cindex costanti stringa, vs.@: costanti @dfn{regexp}
-Dato che si possono usare sia costanti @dfn{regexp} che costanti stringa per
-descrivere espressioni regolari, qual @`e da preferire? La risposta @`e
-``costanti @dfn{regexp}'', per molti motivi:
-
-@itemize @value{BULLET}
-@item
-Le costanti stringa sono pi@`u complicate da scrivere e pi@`u difficili
-da leggere. Usare costanti @dfn{regexp} rende i programmi
-meno inclini all'errore. Non comprendere la differenza tra i due tipi di
-costanti @`e una fonte frequente di errori.
-
-@item
-@`E pi@`u efficiente usare costanti @dfn{regexp}. @command{awk} pu@`o accorgersi
-che @`e stata fornita una @dfn{regexp} e memorizzarla internamente in una forma
-che rende la ricerca di corrispondenze pi@`u efficiente. Se si usa una costante
-stringa, @command{awk} deve prima convertire la stringa nel suo formato
-interno e quindi eseguire la ricerca di corrispondenze.
-
-@item
-Usare costanti @dfn{regexp} @`e la forma migliore; lascia comprendere
-chiaramente che si vuole una corrispondenza con una @dfn{regexp}.
-@end itemize
-
-@cindex sidebar, Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche
-@ifdocbook
-@docbook
-<sidebar><title>Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche</title>
-@end docbook
-
-@cindex espressioni regolari dinamiche, contenenti dei ritorni a capo
-@cindex ritorno a capo, in @dfn{regexp} dinamiche
-
-Alcune delle prime versioni di @command{awk} non consentono di usare il
-carattere di ritorno
-a capo all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
-dinamiche:
-
-@example
-$ @kbd{awk '$0 ~ "[ \t\n]"'}
-@error{} awk: newline in character class [
-@error{} ]...
-@error{} source line number 1
-@error{} context is
-@error{} $0 ~ "[ >>> \t\n]" <<<
-@end example
-
-@cindex ritorno a capo, in costanti @dfn{regexp}
-Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
-
-@example
-$ @kbd{awk '$0 ~ /[ \t\n]/'}
-@kbd{ecco una riga di esempio}
-@print{} ecco una riga di esempio
-@kbd{Ctrl-d}
-@end example
-
-@command{gawk} non ha questo problema, e non dovrebbe accadere spesso
-in pratica, ma val la pena di notarlo a futura memoria.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche}
-
-
-@cindex espressioni regolari dinamiche, contenenti dei ritorni a capo
-@cindex ritorno a capo, in @dfn{regexp} dinamiche
-
-Alcune delle prime versioni di @command{awk} non consentono di usare il
-carattere di ritorno
-a capo all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
-dinamiche:
-
-@example
-$ @kbd{awk '$0 ~ "[ \t\n]"'}
-@error{} awk: newline in character class [
-@error{} ]...
-@error{} source line number 1
-@error{} context is
-@error{} $0 ~ "[ >>> \t\n]" <<<
-@end example
-
-@cindex ritorno a capo, in costanti @dfn{regexp}
-Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
-
-@example
-$ @kbd{awk '$0 ~ /[ \t\n]/'}
-@kbd{ecco una riga di esempio}
-@print{} ecco una riga di esempio
-@kbd{Ctrl-d}
-@end example
-
-@command{gawk} non ha questo problema, e non dovrebbe accadere spesso
-in pratica, ma val la pena di notarlo a futura memoria.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di @dfn{regexp} GNU
-@section Operatori @dfn{regexp} propri di @command{gawk}
-
-@c This section adapted (long ago) from the regex-0.12 manual
-
-@cindex espressioni regolari, operatori, @command{gawk}
-@cindex @command{gawk}, espressioni regolari, operatori
-@cindex operatori, specifici per GNU
-@cindex espressioni regolari, operatori, per parole
-@cindex parola, definizione in @dfn{regexp}
-Il software GNU che ha a che fare con espressioni regolari comprende alcuni
-operatori @dfn{regexp} aggiuntivi. Questi
-operatori sono descritti in
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION} e sono specificamente
-per @command{gawk}; non sono disponibili in altre implementazioni di
-@command{awk}.
-La maggior parte degli operatori aggiuntivi riguarda l'identificazione di
-parole. Ai nostri fini, una @dfn{parola} @`e una sequenza di uno o pi@`u lettere,
-cifre, o trattini bassi (@samp{_}):
-
-@table @code
-@c @cindex operatori, @code{\s} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\s}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\s}, operatore (@command{gawk})
-@item \s
-Corrisponde a ogni carattere bianco.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[[:space:]]}}.
-
-@c @cindex operatori, @code{\S} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\S}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\S}, operatore (@command{gawk})
-@item \S
-Corrisponde a ogni carattere che non @`e uno spazio bianco.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[^[:space:]]}}.
-
-@c @cindex operatori, @code{\w} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\w}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\w}, operatore (@command{gawk})
-@item \w
-Corrisponde a ogni carattere che componga una parola; ovvero, corrisponde a
-ogni lettera, cifra, o trattino basso.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[[:alnum:]_]}}.
-
-@c @cindex operatori, @code{\W} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\W}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\W}, operatore (@command{gawk})
-@item \W
-Corrisponde a ogni carattere che non @`e parte di una parola.
-Lo si pu@`o pensare come un'abbreviazione di
-@w{@samp{[^[:alnum:]_]}}.
-
-@c @cindex operatori, @code{\<} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\<}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\<}, operatore (@command{gawk})
-@item \<
-Individua la stringa nulla all'inizio di una parola.
-Per esempio, @code{/\<via/} individua @samp{via} ma non
-@samp{funivia}.
-
-@c @cindex operatori, @code{\>} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\>}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\>}, operatore (@command{gawk})
-@item \>
-Individua la stringa nulla alla fine di una parola.
-Per esempio, @code{/via\>/} individua @samp{via} ma non @samp{viadotto}.
-
-@c @cindex operatori, @code{\y} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\y}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\y}, operatore (@command{gawk})
-@cindex limite-di-parola, individuare il
-@item \y
-Individua la stringa nulla o alla fine o all'inizio di una parola.
-(cio@`e, il limite di una parola - @dfn{boundar@strong{y}} in inglese).
-Per esempio, @samp{\yradar?\y}
-individua sia @samp{rada} che @samp{radar}, come parole separate.
-
-@c @cindex operatori, @code{\B} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\B}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\B}, operatore (@command{gawk})
-@item \B
-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}.
-@end table
-
-@cindex buffer, operatori per
-@cindex espressioni regolari, operatori, per buffer
-@cindex operatori, ricerca in stringhe, per buffer
-Ci sono due altri operatori che operano sui buffer. In Emacs un
-@dfn{buffer} @`e, naturalmente, un buffer di Emacs. In altri programmi GNU,
-fra cui @command{gawk}, le routine di libreria delle @dfn{regexp} considerano
-come buffer l'intera stringa su cui effettuare il confronto.
-Gli operatori sono:
-
-@table @code
-@item \`
-@c @cindex operatori, @code{\`} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\`}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\`}, operatore (@command{gawk})
-Individua la stringa nulla che occorre all'inizio di un buffer
-(di una stringa)
-
-@c @cindex operatori, @code{\'} (@command{gawk})
-@cindex barra inversa (@code{\}), @code{\'}, operatore (@command{gawk})
-@cindex @code{\} (barra inversa), @code{\'}, operatore (@command{gawk})
-@item \'
-Individua la stringa nulla che occorre alla fine di un buffer
-(di una stringa)
-@end table
-
-@cindex @code{^} (circonflesso), operatore @dfn{regexp}
-@cindex circonflesso (@code{^}), operatore @dfn{regexp}
-@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
-@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
-Poich@'e @samp{^} e @samp{$} si riferiscono sempre all'inizio e alla
-fine di stringhe, questi operatori non aggiungono nuove funzionalit@`a
-ad @command{awk}. Sono inclusi per compatibilit@`a con altro
-software GNU.
-
-@cindex @command{gawk}, operatore limite-di-parola
-@cindex limite-di-parola, operatore (@command{gawk})
-@cindex operatori, limite-di-parola (@command{gawk})
-In altro software GNU, l'operatore di limite-di-parola @`e @samp{\b}. Questo,
-comunque, @`e in conflitto con la definizione, nel linguaggio @command{awk},
-di @samp{\b} come
-backspace, quindi @command{gawk} usa una lettera differente.
-Un metodo alternativo sarebbe stato di richiedere due barre inverse negli
-operatori GNU, ma questo @`e stato ritenuto troppo arzigogolato. Il metodo
-corrente di usare @samp{\y} al posto del @samp{\b} di GNU sembra essere
-il male minore.
-
-@cindex espressioni regolari, @command{gawk}, opzioni sulla riga di comando
-@cindex @command{gawk}, opzioni sulla riga di comando, ed espressioni regolari
-Le varie opzioni sulla riga di comando
-(@pxref{Opzioni})
-controllano come @command{gawk} interpreta i caratteri nelle @dfn{regexp}:
-
-@table @asis
-@item Nessuna opzione
-Per default, @command{gawk} fornisce tutte le funzionalit@`a delle
-regexp POSIX e gli
-operatori @dfn{regexp} GNU
-@ifnotinfo
-predecentemente descritti.
-@end ifnotinfo
-@ifnottex
-@ifnotdocbook
-Sono descritti
-in @ref{Operatori di espressioni regolari}.
-@end ifnotdocbook
-@end ifnottex
-
-@item @code{--posix}
-Sono ammesse solo le @dfn{regexp} POSIX; gli operatori GNU non sono
-speciali (p.es., @samp{\w} individua una semplice lettera @samp{w}).
-Le espressioni di intervallo sono ammesse.
-
-@cindex Brian Kernighan, @command{awk} di
-@item @code{--traditional}
-Le @dfn{regexp} Unix tradizionali di @command{awk} sono ammesse. Gli
-operatori GNU non sono speciali, e le espressioni
-di intervallo non sono ammesse.
-Le classi di caratteri POSIX (@samp{[[:alnum:]]}, etc.) sono ammesse,
-poich@'e BWK @command{awk} le prevede.
-I caratteri descritti usando sequenze di protezione ottali ed esadecimali sono
-trattati letteralmente, anche se rappresentano metacaratteri di @dfn{regexp}.
-
-@item @code{--re-interval}
-Sono consentite espressioni di intervallo in @dfn{regexp},
-se @option{--traditional} @`e stata specificata.
-Altrimenti, le espressioni di intervallo sono disponibili per default.
-@end table
-
-@node Maiuscolo-Minuscolo
-@section Fare confronti ignorando maiuscolo/minuscolo
-
-@cindex espressioni regolari, maiuscolo/minuscolo
-@cindex @dfn{regexp}, maiuscolo/minuscolo
-@cindex maiuscolo/minuscolo e @dfn{regexp}
-Il tipo di carattere (maiuscolo/minuscolo) @`e normalmente rilevante nelle
-espressioni regolari, sia nella ricerca di
-caratteri normali (cio@`e, non metacaratteri), sia all'interno di espressioni
-fra parentesi. Quindi, una @samp{w} in un'espressione regolare individua
-solo una @samp{w} e non la corrispondente maiuscola @samp{W}.
-
-Il modo pi@`u semplice per richiedere una ricerca non sensibile al
-maiuscolo/minuscolo @`e di usare un'espressione tra parentesi quadre, per
-esempio @samp{[Ww]}. Comunque, questo pu@`o essere pesante se si usa spesso,
-e pu@`o rendere le espressioni regolari di difficile lettura.
-Ci sono due alternative che potrebbero essere preferibili.
-
-Un modo per fare un confronto non sensibile a maiuscolo/minuscolo in un
-particolare punto del programma
-@`e di convertire i dati in un solo tipo (o minuscole o maiuscole),
-usando le funzioni di stringa
-predefinite @code{tolower()} o @code{toupper()} (che non
-abbiamo ancora introdotto;
-@pxref{Funzioni per stringhe}).
-Per esempio:
-
-@example
-tolower($1) ~ /foo/ @{ @dots{} @}
-@end example
-
-@noindent
-converte il primo campo in minuscole, prima di fare un confronto.
-Questo funziona in ogni @command{awk} conforme allo standard POSIX.
-
-@cindex @command{gawk}, espressioni regolari, differenza maiuscolo/minuscolo
-@cindex distinzione maiuscolo/minuscolo, @command{gawk}
-@cindex differenze tra @command{awk} e @command{gawk}, espressioni regolari
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@cindex @code{IGNORECASE}, variabile, con operatori @code{~} e @code{!~}
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@c @cindex variables, @code{IGNORECASE}
-Un altro metodo, proprio di @command{gawk}, @`e di impostare la variabile
-@code{IGNORECASE} a un valore diverso da zero (@pxref{Variabili predefinite}).
-Quando @code{IGNORECASE} @`e diverso da zero, @emph{tutte} le operazioni con
-regexp e stringhe ignorano la distinzione maiuscolo/minuscolo.
-
-Il cambio del valore di @code{IGNORECASE} controlla dinamicamente la
-sensibilit@`a a maiuscolo/minuscolo del programma quando @`e in esecuzione.
-Il tipo di carattere (maiuscolo/minuscolo) @`e rilevante per default,
-poich@'e @code{IGNORECASE} (come la maggior parte delle variabili) @`e
-inizializzata a zero:
-
-@example
-x = "aB"
-if (x ~ /ab/) @dots{} # questo test non risulter@`a verificato
-
-IGNORECASE = 1
-if (x ~ /ab/) @dots{} # adesso sar@`a verificato
-@end example
-
-In generale, non @`e possibile usare @code{IGNORECASE} per rendere certe regole
-non sensibili a maiuscolo/minuscolo e altre regole invece s@`{@dotless{i}}, perch@'e non c'@`e
-una maniera diretta per impostare
-@code{IGNORECASE} solo per l'espressione di
-una particolare regola.@footnote{Programmatori esperti in C e C++ noteranno
-che questo @`e possible, usando qualcosa come
-@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
-e
-@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
-Comunque, questo @`e un po' tortuoso e non @`e raccomandato.}
-Per fare questo, si usino espressioni tra parentesi quadre oppure
-@code{tolower()}. Comunque, una cosa che si pu@`o fare con @code{IGNORECASE}
-soltanto @`e di utilizzare o di ignorare la sensibilit@`a a maiuscolo/minuscolo
-per tutte le regole contemporaneamente.
-
-@code{IGNORECASE} @`e impostabile dalla riga di comando o in una regola
-@code{BEGIN} (@pxref{Altri argomenti}; e
-@pxref{Usare BEGIN/END}).
-Impostare @code{IGNORECASE} dalla riga di comando @`e un modo per rendere
-un programma insensibile a maiuscolo/minuscolo senza doverlo modificare.
-
-@c @cindex ISO 8859-1
-@c @cindex ISO Latin-1
-In localizzazioni multibyte,
-le equivalenze tra caratteri maiuscoli
-e minuscoli sono controllate usando i valori in formato esteso
-dell'insieme di caratteri della localizzazione.
-Per il resto, i caratteri sono controllati usando l'insieme di caratteri
-ISO-8859-1 (ISO Latin-1).
-Questo insieme di caratteri @`e un'estensione del tradizionale insieme con 128
-caratteri ASCII, che include anche molti caratteri adatti
-per le lingue europee.@footnote{Se questo sembra oscuro,
-non c'@`e ragione di preoccuparsi; significa solo che @command{gawk} fa
-la cosa giusta.}
-
-Il valore di @code{IGNORECASE} non ha effetto se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}).
-Il tipo di carattere (maiuscolo o minuscolo) @`e sempre rilevante in modalit@`a
-compatibile.
-
-@node Sommario espressioni regolari
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Le espressioni regolari descrivono insiemi di stringhe da confrontare.
-In @command{awk}, le costanti @dfn{regexp} sono scritte racchiuse
-fra barre: @code{/}@dots{}@code{/}.
-
-@item
-Le costanti @dfn{regexp} possono essere usate da sole in modelli di ricerca e
-in espressioni condizionali, o come parte di espressioni di ricerca
-usando gli operatori @samp{~} e @samp{!~}.
-
-@item
-Le sequenze di protezione consentono di rappresentare caratteri non stampabili
-e consentono anche di rappresentare metacaratteri @dfn{regexp} come caratteri
-letterali per i quali cercare corrispondenze.
-
-@item
-Gli operatori @dfn{regexp} consentono raggruppamento, alternativa e
-ripetizione.
-
-@item
-Le espressioni tra parentesi quadre sono delle notazioni abbreviate per
-specificare insiemi di caratteri che possono avere corrispondenze in un
-punto particolare di una @dfn{regexp}.
-All'interno di espressioni tra parentesi quadre, le classi di caratteri POSIX
-consentono di specificare certi gruppi di caratteri in maniera indipendente
-dalla localizzazione.
-
-@item
-Le espressioni regolari individuano il testo pi@`u lungo possibile, a partire
-da sinistra nella stringa in esame. Questo ha importanza nei casi in cui
-serve conoscere la lunghezza della corrispondenza, come nella sostituzione di
-testo e quando il separatore di record sia una @dfn{regexp}.
-
-@item
-Espressioni di ricerca possono usare @dfn{regexp} dinamiche, ossia, i valori
-delle stringhe sono considerato come espressioni regolari.
-
-@item
-La variabile @command{gawk} @code{IGNORECASE} consente di controllare la
-differenza maiuscolo/minuscolo nel confronto mediante @dfn{regexp}. In altre
-versioni di @command{awk}, vanno usate invece le funzioni @code{tolower()} o
-@code{toupper()}.
-
-@end itemize
-
-@node Leggere file
-@chapter Leggere file in input
-
-@cindex leggere file in input
-@cindex file in input, leggere
-@cindex file in input
-@cindex @code{FILENAME}, variabile
-@cindex variabile @code{FILENAME}
-Nel tipico programma @command{awk},
-@command{awk} legge tutto l'input sia dallo standard input
-(per default @`e la tastiera, ma spesso @`e una @dfn{pipe} da un altro comando)
-o da file i cui nomi vengono specificati sulla riga di comando di
-@command{awk}. Se si specificano file in input, @command{awk} li legge
-nell'ordine, elaborando tutti i dati di uno prima di passare al successivo.
-Il nome del file in input corrente si trova nella variabile predefinita
-@code{FILENAME}
-(@pxref{Variabili predefinite}).
-
-@cindex record
-@cindex campi
-L'input @`e letto in unit@`a chiamate @dfn{record}, e viene elaborato, secondo le
-regole del programma, un record alla volta.
-Per default, ogni record @`e una riga. Ogni
-record @`e suddiviso automaticamente in "pezzi" chiamati @dfn{campi}.
-Questo rende pi@`u pratico far lavorare i programmi sulle parti di un record.
-
-@cindex @code{getline}, comando
-In rare occasioni, si potrebbe aver bisogno di usare il comando
-@code{getline}. Il comando @code{getline} @`e utile sia perch@'e pu@`o procurare
-un input esplicito da un numero indeterminato di file, sia perch@'e non vanno
-specificati sulla riga di comando di @command{awk} i nomi dei file usati con
-getline (@pxref{Getline}).
-
-@menu
-* Record:: Controllare come i dati sono suddivisi
- in record.
-* Campi:: Un'introduzione ai campi.
-* Campi non costanti:: Numeri di campo variabili.
-* Cambiare i campi:: Cambiare il contenuto di un campo.
-* Separatori di campo:: I separatori di campo, e come
- cambiarli.
-* Dimensione costante:: Leggere campi di larghezza costante.
-* Separazione in base al contenuto:: Definire campi dal loro contenuto.
-* Righe multiple:: Leggere record che sono su pi@`u righe.
-* Getline:: Leggere file sotto il controllo del
- programma, usando la funzione
- @code{getline}.
-* Timeout in lettura:: Leggere input entro un tempo limite.
-* Proseguire dopo errore in input:: Elaborare ulteriore input dopo certi
- errori di I/O.
-* Directory su riga di comando:: Cosa succede mettendo una directory
- sulla riga di comando.
-* Sommario di Input:: Sommario di Input.
-* Esercizi su Input:: Esercizi.
-@end menu
-
-@node Record
-@section Controllare come i dati sono suddivisi in record
-
-@cindex input, suddividere in record
-@cindex record, suddividere l'input in
-@cindex @code{NR}, variabile
-@cindex @code{FNR}, variabile
-@command{awk} suddivide l'input per il programma in record e campi.
-Tiene traccia del numero di record gi@`a letti dal
-file in input corrente. Questo valore @`e memorizzato in una variabile
-predefinita chiamata @code{FNR} che @`e reimpostata a zero ogni volta che si
-inizia un nuovo file. Un'altra variabile predefinita, @code{NR}, registra il
-numero totale di record in input gi@`a letti da tutti i @value{DF}.
-Il suo valore iniziale @`e zero ma non viene mai reimpostata a zero
-automaticamente.
-
-@menu
-* awk divisione record:: Come @command{awk} standard divide i record.
-* gawk divisione record:: Come @command{gawk} divide i record.
-@end menu
-
-@node awk divisione record
-@subsection Come @command{awk} standard divide i record.
-
-@cindex separatori di record
-@cindex record, separatori di
-I record sono separati da un carattere chiamato @dfn{separatore di record}.
-Per default, il separatore di record @`e il carattere di ritorno a capo.
-Questo @`e il motivo per cui i record sono, per default, righe singole.
-Per usare un diverso carattere come separatore di record
-basta assegnare quel carattere alla variabile predefinita @code{RS}.
-
-@cindex ritorno a capo, come separatore di record
-@cindex a capo, come separatore di record
-@cindex @code{RS}, variabile
-Come per ogni altra variabile,
-il valore di @code{RS} pu@`o essere cambiato nel programma @command{awk}
-con l'operatore di assegnamento, @samp{=}
-(@pxref{Operatori di assegnamento}).
-Il nuovo separatore di record dovrebbe essere racchiuso tra doppi apici,
-per indicare una costante di stringa. Spesso il momento giusto per far questo
-@`e all'inizio dell'esecuzione, prima che sia elaborato qualsiasi input,
-in modo che il primo record sia letto col separatore appropriato.
-Per far ci@`o, si usa il criterio speciale @code{BEGIN}
-(@pxref{BEGIN/END}).
-Per esempio:
-
-@example
-awk 'BEGIN @{ RS = "u" @}
- @{ print $0 @}' mail-list
-@end example
-
-@noindent
-cambia il valore di @code{RS} in @samp{u}, prima di leggere qualsiasi input.
-Il nuovo valore @`e una stringa il cui primo carattere @`e la lettera ``u''; come
-risultato, i record sono separati dalla lettera ``u''. Poi viene letto il
-file in input, e la seconda regola nel programma @command{awk} (l'azione
-eseguita se non si specifica un criterio)
-stampa ogni record. Poich@'e ogni istruzione @code{print} aggiunge
-un ritorno a capo alla fine del suo output, questo programma
-@command{awk} copia l'input con ogni @samp{u} trasformato in un ritorno
-a capo. Qui vediamo il risultato dell'esecuzione del programma sul file
-@file{mail-list}:
-
-@example
-$ @kbd{awk 'BEGIN @{ RS = "u" @}}
-> @kbd{@{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiac
-@print{} sq
-@print{} e@@gmail.com F
-@print{} Anthony 555-3412 anthony.assert
-@print{} ro@@hotmail.com A
-@print{} Becky 555-7685 becky.algebrar
-@print{} m@@gmail.com A
-@print{} Bill 555-1675 bill.drowning@@hotmail.com A
-@print{} Broderick 555-0542 broderick.aliq
-@print{} otiens@@yahoo.com R
-@print{} Camilla 555-2912 camilla.inf
-@print{} sar
-@print{} m@@skynet.be R
-@print{} Fabi
-@print{} s 555-1234 fabi
-@print{} s.
-@print{} ndevicesim
-@print{} s@@
-@print{} cb.ed
-@print{} F
-@print{} J
-@print{} lie 555-6699 j
-@print{} lie.perscr
-@print{} tabor@@skeeve.com F
-@print{} Martin 555-6480 martin.codicib
-@print{} s@@hotmail.com A
-@print{} Sam
-@print{} el 555-3430 sam
-@print{} el.lanceolis@@sh
-@print{} .ed
-@print{} A
-@print{} Jean-Pa
-@print{} l 555-2127 jeanpa
-@print{} l.campanor
-@print{} m@@ny
-@print{} .ed
-@print{} R
-@print{}
-@end example
-
-@noindent
-Si noti che la voce relativa al nome @samp{Bill} non @`e divisa.
-Nel @value{DF} originale
-(@pxref{File dati di esempio}),
-la riga appare in questo modo:
-
-@example
-Bill 555-1675 bill.drowning@@hotmail.com A
-@end example
-
-@noindent
-Essa non contiene nessuna @samp{u}, per cui non c'@`e alcun motivo di dividere
-il record, diversamente dalle altre, che hanno una o pi@`u ricorrenze della
-@samp{u}. Infatti, questo record @`e trattato come parte del record precedente;
-il ritorno a capo che li separa nell'output @`e l'originale ritorno a capo nel
-@value{DF}, non quella aggiunta da @command{awk} quando ha stampato il record!
-
-@cindex separatori di record, cambiare i
-@cindex record, separatori di
-Un altro modo per cambiare il separatore di record @`e sulla riga di comando,
-usando la funzionalit@`a dell'assegnamento di variabile
-(@pxref{Altri argomenti}):
-
-@example
-awk '@{ print $0 @}' RS="u" mail-list
-@end example
-
-@noindent
-Questo imposta @code{RS} a @samp{u} prima di elaborare @file{mail-list}.
-
-Usando un carattere alfabetico come @samp{u} come separatore di record
-@`e molto probabile che si ottengano risultati strani.
-Usando un carattere insolito come @samp{/} @`e pi@`u probabile
-che si ottenga un comportamento corretto nella maggioranza dei casi, ma non
-c'@`e nessuna garanzia. La morale @`e: conosci i tuoi dati!
-
-Quando si usano caratteri normali come separatore di record,
-c'@`e un caso insolito che capita quando @command{gawk}
-@`e reso completamente conforme a POSIX (@pxref{Opzioni}).
-In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente
-@samp{1}:
-
-@example
-$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'
-@print{} 1
-@end example
-
-C'@`e un solo campo, consistente in un ritorno a capo. Il valore della
-variabile predefinita @code{NF} @`e il numero di campi nel record corrente.
-(Normalmente @command{gawk} tratta il ritorno a capo come uno spazio
-vuoto, stampando @samp{0} come risultato. Anche molte altre versioni di
-@command{awk} agiscono in questo modo.)
-
-@cindex angolo buio, file in input
-Il raggiungimento della fine di un file in input fa terminare il record di
-input corrente, anche se l'ultimo carattere nel file non @`e il carattere in
-@code{RS}. @value{DARKCORNER}
-
-@cindex stringhe vuote
-@cindex stringhe nulle
-@c @cindex strings, empty, see null strings
-La stringa nulla @code{""} (una stringa che non contiene alcun carattere)
-ha un significato particolare come
-valore di @code{RS}. Significa che i record sono separati
-soltanto da una o pi@`u righe vuote.
-@xref{Righe multiple} per maggiori dettagli.
-
-Se si cambia il valore di @code{RS} nel mezzo di un'esecuzione di
-@command{awk}, il nuovo valore @`e usato per delimitare i record successivi, ma
-non riguarda il record in corso di elaborazione e neppure quelli gi@`a
-elaborati.
-
-@cindex @command{gawk}, variabile @code{RT} in
-@cindex @code{RT}, variabile
-@cindex record, fine dei
-@cindex differenze tra @command{awk} e @command{gawk}, separatori di record
-@cindex espressioni regolari, come separatori di record
-@cindex record, separatori di, espressioni regolari come
-@cindex separatori di record, espressioni regolari come
-Dopo che @`e stata determinata la fine di un record, @command{gawk}
-imposta la variabile @code{RT} al testo nell'input che corrisponde a
-@code{RS}.
-
-@node gawk divisione record
-@subsection Divisione dei record con @command{gawk}
-
-@cindex estensioni comuni, @code{RS} come espressione regolare
-@cindex comuni, estensioni@comma{} @code{RS} come espressione regolare
-Quando si usa @command{gawk},
-il valore di @code{RS} non @`e limitato a una stringa costituita da un solo
-carattere, ma pu@`o essere qualsiasi espressione regolare
-@iftex
-(@pxrefil{Espressioni regolari}). @value{COMMONEXT}
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}). @value{COMMONEXT}
-@end ifnottex
-In generale, ogni record termina alla stringa pi@`u vicina che corrisponde
-all'espressione regolare; il record successivo inizia alla fine della stringa
-che corrisponde. Questa regola generale @`e in realt@`a applicata anche nel caso
-normale, in cui @code{RS} contiene solo un ritorno a capo: un record
-termina all'inizio della prossima stringa che corrisponde (il prossimo
-ritorno a capo nell'input), e il record seguente inizia subito dopo la
-fine di questa stringa (al primo carattere della riga seguente).
-Il ritorno a capo, poich@'e corrisponde a @code{RS}, non appartiene a
-nessuno dei due record.
-
-Quando @code{RS} @`e un singolo carattere, @code{RT}
-contiene lo stesso singolo carattere. Peraltro, quando @code{RS} @`e
-un'espressione regolare, @code{RT} contiene l'effettivo testo in input
-corrispondente all'espressione regolare.
-
-Se il file in input termina senza che vi sia un testo che corrisponda a
-@code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
-
-Il seguente esempio illustra entrambe queste caratteristiche.
-In quest'esempio @code{RS} @`e impostato a un'espressione regolare che
-cerca sia un ritorno a capo che una serie di una o pi@`u lettere
-maiuscole con uno spazio vuoto opzionale iniziale e/o finale:
-
-@example
-$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
-> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
-> @kbd{@{ print "Record =", $0,"e RT = [" RT "]" @}'}
-@print{} Record = record 1 e RT = [ AAAA ]
-@print{} Record = record 2 e RT = [ BBBB ]
-@print{} Record = record 3 e RT = [
-@print{} ]
-@end example
-
-@noindent
-Le parentesi quadre racchiudono il contenuto di @code{RT}, rendendo visibile
-lo spazio vuoto iniziale e quello finale. L'ultimo valore di
-@code{RT} @`e un ritorno a capo.
-@xref{Programma sed semplice} per un esempio pi@`u utile
-su @code{RS} come espressione regolare e su @code{RT}.
-
-Se si imposta @code{RS} a un'espressione regolare che consente del testo
-finale opzionale, come @samp{RS = "abc(XYZ)?"} @`e possibile, per via di
-limitazioni dell'implementazione, che @command{gawk} possa trovare la parte
-iniziale dell'espressione regolare, ma non la parte finale, in modo
-particolare se il testo di input che potrebbe avere una corrispondenza con la
-parte finale @`e piuttosto lungo. @command{gawk} cerca di evitare questo
-problema, ma al momento non ci sono garanzie che questo funzioni sempre.
-
-@quotation NOTA
-Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e
-@samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la
-fine di una @emph{riga}. Come risultato, qualcosa come
-@samp{RS = "^[[:upper:]]"} pu@`o solo corrispondere all'inizio di un file.
-Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa
-in cui possono essere presenti dei caratteri di ritorno a capo.
-@`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}.
-@end quotation
-
-@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
-L'uso di @code{RS} come espressione regolare e la variabile @code{RT} sono
-estensioni @command{gawk}; non sono disponibili in
-modalit@`a compatibile
-(@pxref{Opzioni}).
-In modalit@`a compatibile, solo il primo carattere del valore di
-@code{RS} determina la fine del record.
-
-@cindex sidebar, @code{RS = "\0"} non @`e portabile
-@ifdocbook
-@docbook
-<sidebar><title>@code{RS = "\0"} non @`e portabile</title>
-@end docbook
-
-@cindex portabilit@`a, file di dati come un unico record
-Ci sono casi in cui capita di dover trattare un intero @value{DF} come
-un record unico. L'unico modo di far questo @`e quello di dare a @code{RS}
-un valore che non ricorre nel file in input. Ci@`o @`e difficile da fare in modo
-generale, cos@`{@dotless{i}} che un programma possa
-funzionare con file in input arbitrari.
-
-Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
-consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
-usare per @code{RS} in questo caso:
-
-@example
-BEGIN @{ RS = "\0" @} # l'intero file diventa un record?
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe, memorizzazione
-@command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
-come separatore di record.
-Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
-GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
-Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
-implementazioni di @command{awk}.
-
-@cindex angolo buio, stringhe, memorizzazione
-Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
-che ci sono note.} memorizzano internamente le stringhe come stringhe
-in stile C. Le stringhe in stile C usano il carattere @sc{NUL} come
-terminatore di stringa. In effetti, questo significa che
-@samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
-@value{DARKCORNER}
-
-Capita che recenti versioni di @command{mawk} possano usare i carattere
-@sc{NUL} come separatore di record. Comunque questo @`e un caso particolare:
-@command{mawk} non consente di includere caratteri @sc{NUL} nelle stringhe.
-(Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
-
-@cindex record, trattare un file come un solo
-@cindex trattare un file, come un solo record
-@xref{Funzione readfile} per un modo interessante di leggere
-file interi. Se si usa @command{gawk}, si veda
-@ref{Esempio di estensione Readfile} per un'altra opzione.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@code{RS = "\0"} non @`e portabile}
-
-
-@cindex portabilit@`a, file di dati come un unico record
-Ci sono casi in cui capita di dover trattare un intero @value{DF} come
-un record unico. L'unico modo di far questo @`e quello di dare a @code{RS}
-un valore che non ricorre nel file in input. Ci@`o @`e difficile da fare in modo
-generale, cos@`{@dotless{i}} che un programma possa
-funzionare con file in input arbitrari.
-
-Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
-consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
-usare per @code{RS} in questo caso:
-
-@example
-BEGIN @{ RS = "\0" @} # l'intero file diventa un record?
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe, memorizzazione
-@command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
-come separatore di record.
-Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
-GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
-Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
-implementazioni di @command{awk}.
-
-@cindex angolo buio, stringhe, memorizzazione
-Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
-che ci sono note.} memorizzano internamente le stringhe come stringhe
-in stile C. Le stringhe in stile C usano il carattere @sc{NUL} come
-terminatore di stringa. In effetti, questo significa che
-@samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
-@value{DARKCORNER}
-
-Capita che recenti versioni di @command{mawk} possano usare i carattere
-@sc{NUL} come separatore di record. Comunque questo @`e un caso particolare:
-@command{mawk} non consente di includere caratteri @sc{NUL} nelle stringhe.
-(Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
-
-@cindex record, trattare un file come un solo
-@cindex trattare un file, come un solo record
-@xref{Funzione readfile} per un modo interessante di leggere
-file interi. Se si usa @command{gawk}, si veda
-@ref{Esempio di estensione Readfile} per un'altra opzione.
-@end cartouche
-@end ifnotdocbook
-
-@node Campi
-@section Un'introduzione ai campi
-
-@cindex esaminare i campi
-@cindex campi
-@cindex accesso ai campi
-@cindex campi, esame dei
-Quando @command{awk} legge un record in input, il record @`e
-automaticamente @dfn{analizzato} o separato da @command{awk} in "pezzi"
-chiamati @dfn{campi}. Per default, i campi sono separati da
-@dfn{spazi vuoti}, come le parole in una riga stampata.
-Uno spazio vuoto in @command{awk} @`e qualsiasi stringa composta da uno o pi@`u
-spazi, segni di tabulazione o ritorni a capo;
-altri caratteri, come interruzione di pagina, tabulazione verticale, etc., che
-sono considerati spazi vuoti in altri linguaggi, @emph{non} sono considerati
-tali da @command{awk}.
-
-Lo scopo dei campi @`e quello di rendere pi@`u conveniente per l'utente far
-riferimento a questi frammenti dei record. Non @`e necessario usarli---si pu@`o
-operare sull'intero record, se si vuole---ma i campi sono ci@`o che rende
-cos@`{@dotless{i}} potenti dei semplici programmi @command{awk}.
-
-@cindex operatore di campo @code{$}
-@cindex @code{$} (dollaro), operatore di campo @code{$}
-@cindex dollaro (@code{$}), operatore di campo @code{$}
-@cindex operatore di campo, dollaro come
-Si usa il simbolo del dollaro (@samp{$})
-per far riferimento a un campo in un programma @command{awk},
-seguito dal numero del campo desiderato. Quindi, @code{$1}
-si riferisce al primo campo, @code{$2} al secondo, e cos@`{@dotless{i}} via.
-(Diversamente che nelle shell Unix, i numeri di campo non sono limitati a una
-sola cifra; @code{$127} @`e il centoventisettesimo campo nel record.)
-Per esempio, supponiamo che la seguente sia una riga in input:
-
-@example
-Questo pare essere un esempio proprio carino.
-@end example
-
-@noindent
-Qui il primo campo, o @code{$1}, @`e @samp{Questo}, il secondo campo, o
-@code{$2}, @`e @samp{pare}, e via dicendo. Si noti che l'ultimo campo,
-@code{$7}, @`e @samp{carino.}. Poich@'e non ci sono spazi tra la
-@samp{o} e il @samp{.}, il punto @`e considerato parte del settimo
-campo.
-
-@cindex @code{NF}, variabile
-@cindex campi, numero dei
-@code{NF} @`e una variabile predefinita il cui valore @`e il numero di campi nel
-record corrente. @command{awk} aggiorna automaticamente il valore di
-@code{NF} ogni volta che legge un record. Indipendentemente da quanti campi
-ci possano essere, l'ultimo campo in un record pu@`o essere rappresentato da
-@code{$NF}. Cos@`{@dotless{i}}, @code{$NF} @`e lo stesso di @code{$7}, che @`e @samp{carino.}.
-Se si cerca di far riferimento a un campo oltre l'ultimo
-(come @code{$8} quando il record ha solo sette campi), si ottiene
-la stringa nulla. (Se usato in un'operazione numerica si ottiene zero.)
-
-L'uso di @code{$0}, che sarebbe come un riferimento al campo ``numero zero'',
-@`e un caso particolare: rappresenta l'intero record in input. Si usa quando
-non si @`e interessati a un campo specifico. Vediamo qualche altro esempio:
-
-@example
-$ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@end example
-
-@noindent
-Questo esempio stampa ogni record del file @file{mail-list} il cui primo campo
-contiene la stringa @samp{li}.
-
-Per converso, il seguente esempio cerca @samp{li} @emph{nell'intero record} e
-stampa il primo e l'ultimo campo di ogni record in input per cui @`e stata
-trovata una corrispondenza:
-
-@example
-$ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
-@print{} Amelia F
-@print{} Broderick R
-@print{} Julie F
-@print{} Samuel A
-@end example
-
-@node Campi non costanti
-@section Numeri di campo variabili
-@cindex campi, numero dei
-@cindex numeri di campo
-
-Un numero di campo non @`e necessario che sia una costante. Nel linguaggio
-@command{awk} si pu@`o usare qualsiasi espressione dopo @samp{$} per far
-riferimento a un campo. Il valore dell'espressione specifica il numero di
-campo. Se il valore @`e una stringa, piuttosto che un numero, viene convertito
-in un numero. Consideriamo questo esempio:
-
-@example
-awk '@{ print $NR @}'
-@end example
-
-@noindent
-Ricordiamo che @code{NR} @`e il numero dei record letti fino a questo punto: uno
-nel primo record, due nel secondo, etc. Cos@`{@dotless{i}} quest'esempio stampa il primo
-campo del primo record, il secondo campo del secondo record, e cos@`{@dotless{i}} via.
-Per il ventesimo record, @`e stampato il campo numero 20; molto probabilmente il
-record ha meno di 20 campi, perci@`o stampa una riga vuota.
-Questo @`e un altro esempio sull'uso di espressioni come numeri di campo:
-
-@example
-awk '@{ print $(2*2) @}' mail-list
-@end example
-
-@command{awk} calcola l'espressione @samp{(2*2)} e usa il suo valore come
-numero del campo da stampare. Qui @samp{*} rappresenta la
-moltiplicazione, quindi l'espressione @samp{2*2} ha il valore quattro. Le
-parentesi vengono usate affinch@'e la moltiplicazione sia eseguita prima
-dell'operazione @samp{$}; sono necessarie ogni volta che c'@`e un operatore
-binario@footnote{A un @dfn{operatore binario}, come @samp{*} per la
-moltiplicazione, servono due operandi. La distinzione @`e necessaria poich@'e
-@command{awk} ha anche operatori unari (un operando) e ternari (tre
-operandi).}
-nell'espressione del numero di campo. Questo esempio, dunque, stampa il
-tipo di relazione (il quarto campo) per ogni riga del file
-@file{mail-list}. (Tutti gli operatori di @command{awk} sono elencati, in
-ordine decrescente di precedenza, in
-@ref{Precedenza}.)
-
-Se il numero di campo calcolato @`e zero, si ottiene l'intero record.
-Quindi, @samp{$(2-2)} ha lo stesso valore di @code{$0}. Numeri di campo
-negativi non sono consentiti; tentare di far riferimento a uno di essi
-normalmente fa terminare il programma. (Lo standard POSIX non chiarisce
-cosa succede quando si fa riferimento a un numero di campo negativo.
-@command{gawk} avvisa di questo e fa terminare il programma. Altre
-implementazioni di @command{awk} possono comportarsi in modo diverso.)
-
-Come accennato in @ref{Campi},
-@command{awk} memorizza il numero di campi del record corrente nella variabile
-predefinita @code{NF} (@pxref{Variabili predefinite}). Quindi,
-l'espressione @code{$NF} non @`e una funzionalit@`a speciale---@`e la diretta
-conseguenza della valutazione di @code{NF} e dell'uso di questo valore come
-numero di campo.
-
-@node Cambiare i campi
-@section Cambiare il contenuto di un campo
-
-@cindex campi, cambiare il contenuto dei
-Il contenuto di un campo, cos@`{@dotless{i}} come @`e visto da @command{awk}, pu@`o essere
-cambiato all'interno di un programma @command{awk}; questo cambia quello che
-@command{awk} percepisce come record in input corrente. (Il reale file in
-input non viene toccato; @command{awk} non modifica @emph{mai} il file in
-input).
-Si consideri il seguente esempio e il suo output:
-
-@example
-$ @kbd{awk '@{ numero_pacchi = $3 ; $3 = $3 - 10}
-> @kbd{print numero_pacchi, $3 @}' inventory-shipped}
-@print{} 25 15
-@print{} 32 22
-@print{} 24 14
-@dots{}
-@end example
-
-@noindent
-Il programma per prima cosa salva il valore originale del campo tre nella
-variabile @code{numero_pacchi}.
-Il segno @samp{-} rappresenta la sottrazione, cos@`{@dotless{i}} questo programma riassegna
-il campo tre, @code{$3}, come il valore originale del campo meno dieci:
-@samp{$3 - 10}. (@xref{Operatori aritmetici}.)
-Poi stampa il valore originale e quello nuovo del campo tre.
-(Qualcuno nel magazzino ha fatto un errore ricorrente nell'inventariare le
-scatole rosse.)
-
-Perch@'e questo funzioni, il testo in @code{$3} deve poter essere riconosciuto
-come un numero; la stringa di caratteri dev'essere convertita in un numero
-affich@'e il computer possa eseguire operazioni aritmetiche su di essa. Il
-numero che risulta dalla sottrazione viene nuovamente convertito in
-una stringa di caratteri che quindi diventa il campo tre.
-@xref{Conversione}.
-
-Quando il valore di un campo @`e cambiato (come percepito da @command{awk}), il
-testo del record in input viene ricalcolato per contenere il nuovo campo al
-posto di quello vecchio. In altre parole, @code{$0} cambia per riflettere il
-campo modificato. Questo programma
-stampa una copia del file in input, con 10 sottratto dal secondo campo di ogni
-riga:
-
-@example
-$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
-@print{} Jan 3 25 15 115
-@print{} Feb 5 32 24 226
-@print{} Mar 5 24 34 228
-@dots{}
-@end example
-
-@`E possibile inoltre assegnare contenuti a campi che sono fuori
-intervallo. Per esempio:
-
-@example
-$ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
-> @kbd{ print $6 @}' inventory-shipped}
-@print{} 168
-@print{} 297
-@print{} 301
-@dots{}
-@end example
-
-@cindex aggiungere, campi
-@cindex campi, aggiungere
-@noindent
-Abbiamo appena creato @code{$6}, il cui valore @`e la somma dei campi
-@code{$2}, @code{$3}, @code{$4} e @code{$5}. Il segno @samp{+}
-rappresenta l'addizione. Per il file @file{inventory-shipped}, @code{$6}
-rappresenta il numero totale di pacchi spediti in un determinato mese.
-
-La creazione di un nuovo campo cambia la copia interna di @command{awk} nel
-record in input corrente, che @`e il valore di @code{$0}. Cos@`{@dotless{i}}, se si scrive
-@samp{print $0} dopo aver aggiunto un campo, il record stampato include il
-nuovo campo, col numero di separatori di campo appropriati tra esso e i
-campi originariamente presenti.
-
-@cindex @code{OFS}, variabile
-@cindex output, separatore di campo, si veda @code{OFS}, variabile
-@cindex campo, separatori di, si veda anche @code{OFS}
-@cindex separatori di campo, si veda anche @code{OFS}
-Questa ridefinizione influenza ed @`e influenzata da
-@code{NF} (il numero dei campi; @pxref{Campi}).
-Per esempio, il valore di @code{NF} @`e impostato al numero del campo pi@`u
-elevato che @`e stato creato.
-Il formato preciso di @code{$0} @`e influenzato anche da una funzionalit@`a che
-non @`e ancora stata trattata: il @dfn{separatore di campo di output},
-@code{OFS}, usato per separare i campi (@pxref{Separatori di output}).
-
-Si noti, comunque, che il mero @emph{riferimento} a un campo fuori
-intervallo @emph{non} cambia il valore di @code{$0} o di @code{NF}.
-Far riferimento a un campo fuori intervallo produce solo una stringa nulla.
-Per esempio:
-
-@example
-if ($(NF+1) != "")
- print "non @`e possibile"
-else
- print "@`e tutto normale"
-@end example
-
-@noindent
-dovrebbe stampare @samp{@`e tutto normale}, perch@'e @code{NF+1} @`e certamente
-fuori intervallo. (@xref{Istruzione if}
-per maggiori informazioni sulle istruzioni @code{if-else} di @command{awk}.
-@xref{Tipi di variabile e confronti}
-per maggiori informazioni sull'operatore @samp{!=}.)
-
-@`E importante notare che facendo un assegnamento a un campo esistente cambia
-il valore di @code{$0} ma non cambia il valore di @code{NF},
-anche qualora si assegni a un campo la stringa nulla. Per esempio:
-
-@example
-$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
-> @kbd{print $0; print NF @}'}
-@print{} a::c:d
-@print{} 4
-@end example
-
-@noindent
-Il campo @`e ancora l@`{@dotless{i}}; ha solo un valore vuoto, delimitato dai due "due punti"
-tra @samp{a} e @samp{c}.
-Questo esempio mostra cosa succede se si crea un nuovo campo:
-
-@example
-$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "nuovo"}
-> @kbd{print $0; print NF @}'}
-@print{} a::c:d::nuovo
-@print{} 6
-@end example
-
-@noindent
-Il campo intermedio, @code{$5}, @`e creato con un valore vuoto
-(indicato dalla seconda coppia di due punti adiacenti),
-e @code{NF} @`e aggiornato col valore sei.
-
-@cindex angolo buio, variabile @code{NF}, decremento
-@cindex @code{NF}, variable, decremento
-Decrementando @code{NF} si eliminano i campi
-dopo il nuovo valore di @code{NF} e si ricalcola @code{$0}.
-@value{DARKCORNER}
-Vediamo un esempio:
-
-@example
-$ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
-> @kbd{ NF = 3; print $0 @}'}
-@print{} NF = 6
-@print{} a b c
-@end example
-
-@cindex portabilit@`a, variabile @code{NF}@comma{} decremento
-@quotation ATTENZIONE
-Alcune versioni di @command{awk} non
-ricostruiscono @code{$0} quando @code{NF} viene diminuito.
-@end quotation
-
-Infine, ci sono casi in cui conviene forzare
-@command{awk} a ricostruire l'intero record, usando i valori correnti
-dei campi e @code{OFS}. Per far ci@`o, si usa
-l'apparentemente innocuo assegnamento:
-
-@example
-$1 = $1 # forza la ricostruzione del record
-print $0 # o qualsiasi altra cosa con $0
-@end example
-
-@noindent
-Questo forza @command{awk} a ricostruire il record. Aggiungere un commento
-rende tutto pi@`u chiaro, come abbiamo appena visto.
-
-C'@`e un rovescio della medaglia nella relazione tra @code{$0} e
-i campi. Qualsiasi assegnamento a @code{$0} fa s@`{@dotless{i}} che il record sia
-rianalizzato (sintatticamente) e ridiviso in campi usando il valore
-@emph{corrente} di @code{FS}. Questo si applica anche a qualsiasi funzione
-predefinita che aggiorna @code{$0}, come @code{sub()} e @code{gsub()}
-(@pxref{Funzioni per stringhe}).
-
-@cindex sidebar, Comprendere @code{$0}
-@ifdocbook
-@docbook
-<sidebar><title>Comprendere @code{$0}</title>
-@end docbook
-
-
-@`E importante ricordare che @code{$0} @`e @emph{l'intero}
-record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
-vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
-separa i campi.
-
-@`E un errore comune tentare di cambiare il separatore di campo in un record
-semplicemente impostando @code{FS} e @code{OFS}, e poi
-aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
-modificato.
-
-Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
-stesso record. Invece, si deve forzare la ricostruzione del record,
-tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
-in precedenza.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Comprendere @code{$0}}
-
-
-
-@`E importante ricordare che @code{$0} @`e @emph{l'intero}
-record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
-vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
-separa i campi.
-
-@`E un errore comune tentare di cambiare il separatore di campo in un record
-semplicemente impostando @code{FS} e @code{OFS}, e poi
-aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
-modificato.
-
-Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
-stesso record. Invece, si deve forzare la ricostruzione del record,
-tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
-in precedenza.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Separatori di campo
-@section Specificare come vengono separati i campi
-
-@menu
-* Separatori di campo di default:: Come di solito sono separati i campi.
-* Separare campi con @dfn{regexp}:: Usare @dfn{regexp} come separatori.
-* Campi di un solo carattere:: Fare di ogni carattere un campo
- separato.
-* 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
- campo solo.
-* Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
- sommario.
-@end menu
-
-@cindex @code{FS}, variabile
-@cindex campi, separare
-@cindex campo, separatori di
-Il @dfn{separatore di campo}, che @`e un carattere singolo o un'espressione
-regolare, controlla il modo in cui @command{awk} suddivide un record in input
-in campi. @command{awk} fa una scansione del record in input per trovare i
-caratteri che individuano il separatore; i campi sono il testo compreso tra i
-separatori trovati.
-
-Nell'esempio che segue, usiamo il simbolo del punto elenco (@bullet{}) per
-rappresentare gli spazi nell'output.
-Se il separatore di campo @`e @samp{oo}, la seguente riga:
-
-@example
-moo goo gai pan
-@end example
-
-@noindent
-@`e suddivisa in tre campi: @samp{m}, @samp{@bullet{}g}, e
-@samp{@bullet{}gai@bullet{}pan}.
-Notare gli spazi iniziali nei valori del secondo e del terzo campo.
-
-@cindex risoluzione di problemi, @command{awk} usa @code{FS} anzich@'e @code{IFS}
-@cindex problemi, risoluzione di, @command{awk} usa @code{FS} anzich@'e @code{IFS}
-Il separatore di campo @`e rappresentato dalla variable predefinita @code{FS}.
-I programmatori di shell notino: @command{awk} @emph{non} usa il
-nome @code{IFS} che @`e usato dalle shell conformi a POSIX (come
-la Unix Bourne shell, @command{sh}, o Bash).
-
-@cindex @code{FS}, variabile, cambiare il valore di una
-Il valore di @code{FS} si pu@`o cambiare nel programma @command{awk} con
-l'operatore di assegnamento, @samp{=} (@pxref{Operatori di assegnamento}).
-Spesso il momento giusto per far ci@`o @`e all'inizio dell'esecuzione
-prima che sia stato elaborato qualsiasi input, cos@`{@dotless{i}} che il primo record
-sia letto col separatore appropriato. Per far questo, si usa il modello di
-ricerca speciale
-@code{BEGIN}
-(@pxref{BEGIN/END}).
-Per esempio, qui impostiamo il valore di @code{FS} alla stringa
-@code{","}:
-
-@example
-awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca
-@noindent
-Data la riga in input:
-
-@example
-John Q. Smith, 29 Oak St., Walamazoo, MI 42139
-@end example
-
-@noindent
-questo programma @command{awk} estrae e stampa la stringa
-@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
-
-@cindex separatori di campo, scelta dei
-@cindex espressioni regolari come separatori di campo
-@cindex separatori di campo, espressioni regolari come
-A volte i dati in input contengono caratteri separatori che non
-separano i campi nel modo in cui ci si sarebbe atteso. Per esempio, il
-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
-@end example
-
-@noindent
-Lo stesso programma estrarrebbe @samp{@bullet{}LXIX} invece di
-@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
-Se ci si aspetta che il programma stampi l'indirizzo,
-si rimarr@`a sorpresi. La morale @`e quella di scegliere la struttura dei dati
-e i caratteri di separazione attentamente per evitare questi problemi.
-(Se i dati non sono in una forma facile da elaborare, pu@`o darsi che
-si possano manipolare con un programma @command{awk} separato.)
-
-
-@node Separatori di campo di default
-@subsection Lo spazio vuoto normalmente separa i campi
-
-@cindex spazi vuoti, come separatori 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
-di campo @code{FS} @`e una stringa contenente un singolo spazio, @w{@code{" "}}.
-Se @command{awk} interpretasse questo valore nel modo usuale, ogni carattere
-di spazio separerebbe campi, quindi due spazi in una riga creerebbero un campo
-vuoto tra di essi. Il motivo per cui questo non succede @`e perch@'e un singolo
-spazio come valore di @code{FS} @`e un caso particolare: @`e preso per specificare
-il modo di default di delimitare i campi.
-
-Se @code{FS} @`e qualsiasi altro carattere singolo, come @code{","}, ogni
-ricorrenza di quel carattere separa due campi. Due ricorrenze consecutive
-delimitano un campo vuoto. Se il carattere si trova all'inizio o alla fine
-della riga, anche quello delimita un campo vuoto. Il carattere di spazio @`e
-il solo carattere singolo che non segue queste
-regole.
-
-@node Separare campi con @dfn{regexp}
-@subsection Usare @dfn{regexp} come separatori di campo
-
-@cindex espressioni regolari, come separatori di campo
-@cindex separatori di campo, espressioni regolari come
-La precedente @value{SUBSECTION}
-ha illustrato l'uso di caratteri singoli o di stringhe semplici come
-valore di @code{FS}.
-Pi@`u in generale, il valore di @code{FS} pu@`o essere una stringa contenente
-qualsiasi espressione regolare. Se questo @`e il caso, ogni corrispondenza nel
-record con l'espressione regolare separa campi. Per esempio, l'assegnamento:
-
-@example
-FS = ", \t"
-@end example
-
-@noindent
-trasforma ogni parte di una riga in input che consiste di una virgola seguita
-da uno spazio e una tabulazione in un separatore di campo.
-@ifinfo
-(@samp{\t}
-@`e una @dfn{sequenza di protezione} che sta per un segno di tabulazione;
-@pxref{Sequenze di protezione},
-per l'elenco completo di sequenze di protezione simili.)
-@end ifinfo
-
-Per un esempio meno banale di espressione regolare, si provi a usare spazi
-singoli per separare campi nel modo in cui sono usate le virgole. @code{FS}
-pu@`o essere impostato a @w{@code{"[@ ]"}} (parentesi quadra sinistra, spazio,
-parentesi quadra destra). Quest'espressione regolare corrisponde a uno spazio
-@iftex
-singolo e niente pi@`u. (@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-singolo e niente pi@`u. (@pxref{Espressioni regolari}).
-@end ifnottex
-C'@`e una differenza importante tra i due casi di @samp{FS = @w{" "}}
-(uno spazio singolo) e @samp{FS = @w{"[ \t\n]+"}}
-(un'espressione regolare che individua uno o pi@`u spazi, tabulazioni o
-ritorni a capo). Per entrambi i valori di @code{FS}, i campi sono
-separati da @dfn{serie} (ricorrenze adiacenti multiple) di spazi, tabulazioni
-e/o ritorni a capo. Comunque, quando il valore di @code{FS} @`e
-@w{@code{" "}}, @command{awk} prima toglie lo spazio vuoto iniziale e finale
-dal record e poi stabilisce dove sono i campi.
-Per esempio, la seguente @dfn{pipeline} stampa @samp{b}:
-
-@example
-$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
-@print{} b
-@end example
-
-@noindent
-Invece la @dfn{pipeline} che segue stampa @samp{a} (notare lo spazio extra
-intorno a ogni lettera):
-
-@example
-$ @kbd{echo ' a b c d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
-> @kbd{@{ print $2 @}'}
-@print{} a
-@end example
-
-@noindent
-@c @cindex null strings
-@cindex stringhe nulle
-@cindex stringhe vuote, si veda stringhe nulle
-In questo caso, il primo campo @`e nullo, o vuoto.
-Il taglio degli spazi vuoti iniziale e finale ha luogo anche
-ogniqualvolta @code{$0} @`e ricalcolato.
-Per esempio, si consideri questa @dfn{pipeline}:
-
-@example
-$ @kbd{echo ' a b c d' | awk '@{ print; $2 = $2; print @}'}
-@print{} a b c d
-@print{} a b c d
-@end example
-
-@noindent
-La prima istruzione @code{print} stampa il record cos@`{@dotless{i}} come @`e stato letto,
-con lo spazio vuoto intatto. L'assegnamento a @code{$2} ricostruisce
-@code{$0} concatenando insieme @code{$1} fino a @code{$NF},
-separati dal valore di @code{OFS} (che @`e uno spazio per default).
-Poich@'e lo spazio vuoto iniziale @`e stato ignorato quando si @`e trovato
-@code{$1}, esso non fa parte del nuovo @code{$0}. Alla fine, l'ultima
-istruzione @code{print} stampa il nuovo @code{$0}.
-
-@cindex @code{FS}, contenente @code{^}
-@cindex @code{^} (circonflesso), in @code{FS}
-@cindex angolo buio, @code{^}, in @code{FS}
-C'@`e un'ulteriore sottigliezza da considerare quando si usano le espressioni
-regolari per separare i campi.
-Non @`e ben specificato nello standard POSIX, n@'e altrove, cosa
-significhi @samp{^} nella divisione dei campi. Il @samp{^} cerca
-corrispondenze solo all'inizio dell'intero record? Oppure ogni separatore di
-campo @`e una nuova stringa? Di fatto versioni differenti di @command{awk}
-rispondono a questo quesito in modo diverso, e non si dovrebbe far affidamento
-su alcun comportamento specifico nei propri programmi.
-@value{DARKCORNER}
-
-@cindex Brian Kernighan, @command{awk} di
-Di sicuro, BWK @command{awk} individua con @samp{^}
-solo l'inizio del record. Anche @command{gawk}
-funziona in questo modo. Per esempio:
-
-@example
-$ @kbd{echo 'xxAA xxBxx C' |}
-> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
-> @kbd{ printf "-->%s<--\n", $i @}'}
-@print{} --><--
-@print{} -->AA<--
-@print{} -->xxBxx<--
-@print{} -->C<--
-@end example
-
-@node Campi di un solo carattere
-@subsection Fare di ogni carattere un campo separato
-
-@cindex estensioni comuni, campi di un solo carattere
-@cindex comuni, estensioni, campi di un solo carattere
-@cindex differenze tra @command{awk} e @command{gawk}, campi di un solo carattere
-@cindex singolo carattere, campi
-@cindex campi di un solo carattere
-Ci sono casi in cui si abbia la necessit@`a di analizzare ciascun carattere di un
-record separatamente. Questo si pu@`o fare in @command{gawk} semplicemente
-assegnando la stringa nulla (@code{""}) a @code{FS}. @value{COMMONEXT}
-In questo caso,
-ogni singolo carattere nel record diventa un campo separato.
-Per esempio:
-
-@example
-$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
-> @kbd{@{}
-> @kbd{for (i = 1; i <= NF; i = i + 1)}
-> @kbd{print "Il campo", i, "@`e", $i}
-> @kbd{@}'}
-@print{} Il campo 1 @`e a
-@print{} Il campo 2 @`e
-@print{} Il campo 3 @`e b
-@end example
-
-@cindex angolo buio, @code{FS} come stringa nulla
-@cindex @code{FS}, variabile, come stringa nulla
-Tradizionalmente, il comportamento di @code{FS} quando @`e impostato a
-@code{""} non @`e stato definito. In questo caso, la maggior parte delle
-versioni UNIX di @command{awk} trattano l'intero record come se avesse un
-unico campo.
-@value{DARKCORNER}
-In modalit@`a di compatibilit@`a
-(@pxref{Opzioni}),
-se @code{FS} @`e la stringa nulla, anche @command{gawk}
-si comporta in questo modo.
-
-@node Separatori campo da riga di comando
-@subsection Impostare @code{FS} dalla riga di comando
-@cindex @option{-F}, opzione sulla riga di comando
-@cindex separatore di campo, specificare sulla riga di comando
-@cindex riga di comando, impostare @code{FS} sulla
-@cindex @code{FS}, variabile, impostare da riga di comando
-
-@code{FS} pu@`o essere impostata sulla riga di comando. Per far questo si usa
-l'opzione @option{-F}. Per esempio:
-
-@example
-awk -F, '@var{programma}' @var{i-file-di-input}
-@end example
-
-@noindent
-imposta @code{FS} al carattere @samp{,}. Si noti che l'opzione richiede
-un carattere maiuscolo @samp{F} anzich@'e minuscolo @samp{f}. Quest'ultima
-opzione (@option{-f}) serve a specificare il file contenente un programma
-@command{awk}.
-
-Il valore usato per l'argomento di @option{-F} @`e elaborato esattamente nello
-stesso modo degli assegnamenti alla variabile predefinita @code{FS}. Qualsiasi
-carattere speciale nel separatore di campo dev'essere protetto in modo
-appropriato. Per esempio, per usare un @samp{\} come separatore di campo
-sulla riga di comando, si dovrebbe battere:
-
-@example
-# equivale a FS = "\\"
-awk -F\\\\ '@dots{}' file @dots{}
-@end example
-
-@noindent
-@cindex @code{\} (barra inversa), come separatore di campo
-@cindex barra inversa (@code{\}), come separatore di campo
-Poich@'e @samp{\} @`e usato nella shell per proteggere caratteri, a @command{awk}
-arriva @samp{-F\\}. Quindi @command{awk} elabora @samp{\\} per caratteri di
-protezione (@pxref{Sequenze di protezione}), producendo alla fine
-un unico @samp{\} da usare come separatore di campo.
-
-@c @cindex historical features
-Come caso particolare, in modalit@`a di compatibilit@`a
-(@pxref{Opzioni}),
-se l'argomento di @option{-F} @`e @samp{t}, @code{FS} @`e impostato al
-carattere di tabulazione. Se si immette @samp{-F\t} nella
-shell, senza che sia tra apici, @samp{\} viene cancellata,
-cos@`{@dotless{i}} @command{awk}
-conclude che si vuole realmente che i campi siano separati da tabulazioni e
-non da delle @samp{t}. Si usi @samp{-v FS="t"} o @samp{-F"[t]"} sulla riga di
-comando se si vuole separare i campi con delle @samp{t}.
-Quando non si @`e in modalit@`a di compatibilit@`a si deve usare @samp{-F '\t'} per
-specificare che le tabulazioni separano i campi.
-
-Come esempio, usiamo un file di programma @command{awk} chiamato
-@file{edu.awk} che contiene il criterio di ricerca @code{/edu/} e l'azione
-@samp{print $1}:
-
-@example
-/edu/ @{ print $1 @}
-@end example
-
-Impostiamo inoltre @code{FS} al carattere @samp{-} ed eseguiamo il programma
-sul file @file{mail-list}. Il seguente comando stampa un elenco dei nomi
-delle persone che lavorano all'universit@`a o che la frequentano, e le prime tre
-cifre dei loro numeri di telefono:
-
-@example
-$ @kbd{awk -F- -f edu.awk mail-list}
-@print{} Fabius 555
-@print{} Samuel 555
-@print{} Jean
-@end example
-
-@noindent
-Si noti la terza riga di output. La terza riga
-nel file originale @`e simile a questa:
-
-@example
-Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-Il @samp{-} che fa parte del nome della persona @`e stato usato come
-separatore di campo, al posto del @samp{-} presente nel numero di telefono,
-che ci si aspettava venisse usato.
-Questo lascia intuire il motivo per cui si deve stare attenti nella scelta
-dei separatori di campo e di record.
-
-@cindex Unix @command{awk}, file di password, separatori di campo e
-Forse l'uso pi@`u comune di un solo carattere come separatore di campo avviene
-quando si elabora il file delle password di un sistema Unix. Su molti sistemi
-Unix, ogni utente @`e descritto da un elemento nel file delle password del
-sistema, che contiene una riga singola per ogni utente. In queste righe le
-informazioni sono separate da dei caratteri ":". Il
-primo campo @`e il nome di login dell'utente e il secondo @`e la password
-dell'utente criptata o oscurata (una password oscurata @`e indicata dalla
-presenza di una sola @samp{x} nel secondo campo). Una riga nel file delle
-password potrebbe essere simile a questa:
-
-@cindex Robbins, Arnold
-@example
-arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
-@end example
-
-Il seguente programma esamina il file delle password di sistema e stampa le
-voci relative agli utenti il cui nome completo non @`e presente nel file:
-
-@example
-awk -F: '$5 == ""' /etc/passwd
-@end example
-
-@node Campo intera riga
-@subsection Fare di una riga intera un campo solo
-
-Occasionalmente, @`e utile trattare l'intera riga in input come un solo campo.
-Questo si pu@`o fare facilmente e in modo portabile semplicemente impostando
-@code{FS} a @code{"\n"} (un ritorno a capo).@footnote{Grazie ad
-Andrew Schorr per questo suggerimento.}
-
-@example
-awk -F'\n' '@var{programma}' @var{file @dots{}}
-@end example
-
-@noindent
-In questo caso, @code{$1} coincide con @code{$0}.
-
-
-@cindex sidebar, Cambiare @code{FS} non incide sui campi
-@ifdocbook
-@docbook
-<sidebar><title>Cambiare @code{FS} non incide sui campi</title>
-@end docbook
-
-
-@cindex POSIX @command{awk}, separatori di campo e
-@cindex separatore di campo, POSIX e il
-Secondo lo standard POSIX, si suppone che @command{awk} si comporti
-come se ogni record sia stato diviso in campi nel momento in cui @`e stato
-letto. In particolare, ci@`o vuol dire che se si cambia il valore di
-@code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
-la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
-valore di @code{FS}, non quello nuovo.
-
-@cindex angolo buio, separatori di campo
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
-funzionano in questo modo. Invece, rimandano la divisione dei campi
-fino a quando si fa effettivamente riferimento a un campo. I campi sono
-divisi usando il valore @emph{corrente} di @code{FS}!
-@value{DARKCORNER}
-Questo comportamento pu@`o essere di difficile
-identificazione. Il seguente esempio illustra la differenza
-tra i due metodi. Lo script
-
-@example
-sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
-@end example
-
-@noindent
-normalmente stampa:
-
-@example
-@print{} root
-@end example
-
-@noindent
-su un'implementazione non standard di @command{awk}, mentre @command{gawk}
-stampa l'intera prima riga del file, qualcosa come:
-
-@example
-root:x:0:0:Root:/:
-@end example
-
-(Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
-``editore di flusso''. Anche il suo comportamento @`e definito dallo standard
-POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Cambiare @code{FS} non incide sui campi}
-
-
-
-@cindex POSIX @command{awk}, separatori di campo e
-@cindex separatore di campo, POSIX e il
-Secondo lo standard POSIX, si suppone che @command{awk} si comporti
-come se ogni record sia stato diviso in campi nel momento in cui @`e stato
-letto. In particolare, ci@`o vuol dire che se si cambia il valore di
-@code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
-la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
-valore di @code{FS}, non quello nuovo.
-
-@cindex angolo buio, separatori di campo
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
-funzionano in questo modo. Invece, rimandano la divisione dei campi
-fino a quando si fa effettivamente riferimento a un campo. I campi sono
-divisi usando il valore @emph{corrente} di @code{FS}!
-@value{DARKCORNER}
-Questo comportamento pu@`o essere di difficile
-identificazione. Il seguente esempio illustra la differenza
-tra i due metodi. Lo script
-
-@example
-sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
-@end example
-
-@noindent
-normalmente stampa:
-
-@example
-@print{} root
-@end example
-
-@noindent
-su un'implementazione non standard di @command{awk}, mentre @command{gawk}
-stampa l'intera prima riga del file, qualcosa come:
-
-@example
-root:x:0:0:Root:/:
-@end example
-
-(Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
-``editore di flusso''. Anche il suo comportamento @`e definito dallo standard
-POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
-@end cartouche
-@end ifnotdocbook
-
-@node Sommario sulla separazione campi
-@subsection Sommario sulla separazione dei campi
-
-@`E importante ricordare che quando si assegna una costante stringa
-come valore di @code{FS}, questa subisce una normale elaborazione di stringa
-da parte di @command{awk}. Per esempio, con Unix @command{awk} e
-@command{gawk}, l'assegnamento @samp{FS = "\.."} assegna la stringa di
-caratteri @code{".."}
-a @code{FS} (la barra inversa @`e tolta). Questo crea un'espressione regolare
-che significa ``i campi sono separati da ricorrenze di due caratteri
-qualsiasi''. Se invece si vuole che i campi siano separati da un punto
-seguito da un qualsiasi carattere singolo, si deve usare @samp{FS = "\\.."}.
-
-Il seguente elenco riassume come i campi vengono divisi, in base al valore
-di @code{FS} (@samp{==} significa ``@`e uguale a''):
-
-@table @code
-@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.
-
-@item FS == @var{qualsiasi altro carattere singolo}
-I campi sono separati da ogni ricorrenza del carattere. Ricorrenze
-successive multiple delimitano campi vuoti, e lo stesso fanno le ricorrenze
-iniziali e finali del carattere.
-Il carattere pu@`o essere anche un metacarattere di espressione regolare, che
-non @`e necessario proteggere.
-
-@item FS == @var{espressione regolare}
-I campi sono separati da ricorrenze di caratteri che corrispondono alla
-@var{espressione regolare}. Corrispondenze iniziali e finali della
-@dfn{regexp} delimitano campi vuoti.
-@item FS == ""
-Ogni sinngolo carattere nel record diventa un campo separato.
-(Questa @`e un'estensione comune; non @`e specificata dallo standard POSIX.)
-@end table
-
-@cindex sidebar, @code{FS} e @code{IGNORECASE}
-@ifdocbook
-@docbook
-<sidebar><title>@code{FS} e @code{IGNORECASE}</title>
-@end docbook
-
-La variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente})
-influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
-@`e un'espressione regolare. Non ha nessun effetto quando @code{FS} @`e un
-singolo carattere, anche se quel carattere @`e una lettera. Quindi, nel
-seguente codice:
-
-@example
-FS = "c"
-IGNORECASE = 1
-$0 = "aCa"
-print $1
-@end example
-
-@noindent
-L'output @`e @samp{aCa}. Se si vuol veramente dividere i campi su un carattere
-alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
-regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}). In questo
-caso, @code{IGNORECASE} avr@`a effetto.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@code{FS} e @code{IGNORECASE}}
-
-
-La variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente})
-influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
-@`e un'espressione regolare. Non ha nessun effetto quando @code{FS} @`e un
-singolo carattere, anche se quel carattere @`e una lettera. Quindi, nel
-seguente codice:
-
-@example
-FS = "c"
-IGNORECASE = 1
-$0 = "aCa"
-print $1
-@end example
-
-@noindent
-L'output @`e @samp{aCa}. Se si vuol veramente dividere i campi su un carattere
-alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
-regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}). In questo
-caso, @code{IGNORECASE} avr@`a effetto.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Dimensione costante
-@section Leggere campi di larghezza costante
-
-
-@cindex campi di larghezza costante
-@cindex larghezza costante, campi di
-@cindex funzionalit@`a avanzate, campi di larghezza costante
-@c O'Reilly doesn't like it as a note the first thing in the section.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta una funzionalit@`a avanzata
-di @command{gawk}. Se si @`e un utente alle prime armi di @command{awk},
-la si pu@`o saltare in prima lettura.
-
-@command{gawk} fornisce una funzionalit@`a per il trattamento di campi
-a larghezza fissa senza un separatore di campo distintivo. Per esempio,
-dati di questo tipo si trovano nell'input per vecchi programmi Fortran dove
-dei numeri sono elencati uno dopo l'altro, o nell'output di programmi che
-non prevedono che il loro output sia dato in input ad altri programmi.
-
-Un esempio di quest'ultimo caso @`e una tabella dove tutte le colonne sono
-allineate usando un numero variabile di spazi e dove @emph{i campi vuoti
-sono solo spazi}. Chiaramente, la normale divisione in campi di
-@command{awk} basata su @code{FS} non funziona bene in questa situazione.
-Sebbene un programma @command{awk}
-portabile possa usare una serie di chiamate @code{substr()} su @code{$0}
-(@pxref{Funzioni per stringhe}),
-questo @`e scomodo e inefficiente se il numero dei campi @`e elevato.
-
-@cindex risoluzione di problemi, errori fatali, specificare larghezza dei campi
-@cindex problemi, risoluzione di, errori fatali, specificare larghezza dei campi
-@cindex @command{w}, programma di utilit@`a
-@cindex programma di utilit@`a @command{w}
-@cindex @code{FIELDWIDTHS}, variabile
-@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
-La suddivisione di un record in input in campi a larghezza fissa viene
-specificata assegnando una stringa contenente numeri separati da spazi alla
-variabile predefinita @code{FIELDWIDTHS}. Ogni numero specifica la larghezza
-del campo, @emph{comprese} le colonne tra i campi. Se si vogliono ignorare le
-colonne tra i campi si pu@`o specificare la loro larghezza come un campo
-separato che verr@`a poi ignorato.
-@`E un errore fatale definire una larghezza di campo che abbia un valore
-negativo. I dati seguenti costituiscono l'output del programma di utilit@`a
-Unix @command{w}. @`E utile per spiegare l'uso di @code{FIELDWIDTHS}:
-
-@example
-@group
- 10:06pm up 21 days, 14:04, 23 users
-User tty login@ idle JCPU PCPU what
-hzuo ttyV0 8:58pm 9 5 vi p24.tex
-hzang ttyV3 6:37pm 50 -csh
-eklye ttyV5 9:53pm 7 1 em thes.tex
-dportein ttyV6 8:17pm 1:47 -csh
-gierd ttyD3 10:00pm 1 elm
-dave ttyD4 9:47pm 4 4 w
-brent ttyp0 26Jun91 4:46 26:46 4:41 bash
-dave ttyq4 26Jun9115days 46 46 wnewmail
-@end group
-@end example
-
-Il seguente programma prende l'input sopra mostrato, converte il tempo di
-inattivit@`a
-in numero di secondi, e stampa i primi due campi e il tempo di inattivit@`a
-calcolato:
-
-@example
-BEGIN @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
-NR > 2 @{
- inat = $4
- sub(/^ +/, "", inat) # togli spazi prima del valore
- if (inat == "")
- inat = 0
- if (inat ~ /:/) @{
- split(inat, t, ":")
- inat = t[1] * 60 + t[2]
- @}
- if (inat ~ /days/)
- inat *= 24 * 60 * 60
-
- print $1, $2, inat
-@}
-@end example
-
-@quotation NOTA
-Questo programma usa diverse funzionalit@`a di @command{awk} non
-ancora trattate.
-@end quotation
-
-L'esecuzione del programma sui dati produce il seguente risultato:
-
-@example
-hzuo ttyV0 0
-hzang ttyV3 50
-eklye ttyV5 0
-dportein ttyV6 107
-gierd ttyD3 1
-dave ttyD4 0
-brent ttyp0 286
-dave ttyq4 1296000
-@end example
-
-Un altro esempio (forse pi@`u pratico) di dati di input con larghezza costante @`e
-l'input da un mazzo di schede elettorali. In alcune parti degli Stati Uniti,
-i votanti marcano le loro scelte perforando delle schede elettroniche.
-
-Queste schede vengono poi elaborate per contare i voti espressi per ogni
-singolo candidato o su ogni determinato quesito. Siccome un votante pu@`o
-scegliere di non votare su alcune questioni, qualsiasi colonna della scheda
-pu@`o essere vuota. Un programma @command{awk} per elaborare tali dati potrebbe
-usare la funzionalit@`a @code{FIELDWIDTHS} per semplificare la lettura dei dati.
-(Naturalmente, riuscire a eseguire @command{gawk} su un sistema con lettori di
-schede @`e un'altra storia!)
-
-@cindex @command{gawk}, separazione in campi e
-L'assegnazione di un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} usi @code{FS}
-per separare nuovamente i campi. Si pu@`o usare @samp{FS = FS} per ottenere
-questo effetto, senza dover conoscere il valore corrente di @code{FS}.
-Per vedere quale tipo di separazione sia in atto,
-si pu@`o usare @code{PROCINFO["FS"]}
-(@pxref{Variabili auto-assegnate}).
-Il suo valore @`e @code{"FS"} se si usa la normale separazione in campi,
-o @code{"FIELDWIDTHS"} se si usa la separazione in campi a larghezza fissa:
-
-@example
-if (PROCINFO["FS"] == "FS")
- @var{separazione in campi normale}@dots{}
-else if (PROCINFO["FS"] == "FIELDWIDTHS")
- @var{separazione in campi a larghezza fissa}@dots{}
-else
- @var{separazione dei campi in base al contenuto}@dots{} @ii{(si veda
-@ifnotinfo
-la @value{SECTION} successiva)}
-@end ifnotinfo
-@ifinfo
-il @value{SECTION} successivo)}
-@end ifinfo
-@end example
-
-Quest'informazione @`e utile quando si scrive una funzione che
-necessita di cambiare temporaneamente @code{FS} o @code{FIELDWIDTHS},
-leggere alcuni record, e poi ripristinare le impostazioni originali
-(@pxref{Funzioni Passwd},
-per un esempio di tale funzione).
-
-@node Separazione in base al contenuto
-@section Definire i campi in base al contenuto
-
-@c O'Reilly doesn't like it as a note the first thing in the section.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta una funzionalit@`a avanzata
-di @command{gawk}. Se si @`e un utente alle prime armi di @command{awk},
-la si pu@`o saltare in prima lettura.
-
-@cindex funzionalit@`a avanzate, specificare il contenuto dei campi
-Normalmente, quando si usa @code{FS}, @command{gawk} definisce i campi come
-le parti del record che si trovano tra due separatori di campo. In altre
-parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa
-@emph{@`e}.
-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.
-
-Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated
-value} (CSV). Molti fogli elettronici, per esempio, possono esportare i dati
-in file di testo, dove ogni record termina con un ritorno a capo e i campi
-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
-contiene una virgola @emph{al suo interno}.
-In queste situazioni, la maggioranza dei programmi include il campo fra
-doppi apici.@footnote{Il formato CSV non ha avuto, per molti anni, una
-definizione standard formale.
-@uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
-standardizza le pratiche pi@`u comuni.}
-Cos@`{@dotless{i}}, potremmo avere dei dati di questo tipo:
-
-@example
-@c file eg/misc/addresses.csv
-Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
-@c endfile
-@end example
-
-@cindex @command{gawk}, variabile @code{FPAT} in
-@cindex @code{FPAT}, variabile
-La variabile @code{FPAT} offre una soluzione per casi come questo.
-Il valore di @code{FPAT} dovrebbe essere una stringa formata da un'espressione
-regolare. L'espressione regolare descrive il contenuto di ciascun campo.
-
-Nel caso dei dati CSV visti prima, ogni campo @`e ``qualsiasi cosa che non
-sia una virgola,'' oppure ``doppi apici, seguiti da qualsiasi cosa che non
-siano doppi apici, e doppi apici di chiusura''. Se fosse scritta come una
-costante @dfn{regexp}
-@iftex
-(@pxrefil{Espressioni regolari}),
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}),
-@end ifnottex
-sarebbe @code{/([^,]+)|("[^"]+")/}.
-Dovendola scrivere come stringa si devono proteggere i doppi apici,
-e quindi si deve scrivere:
-
-@example
-FPAT = "([^,]+)|(\"[^\"]+\")"
-@end example
-
-Come esempio pratico, si pu@`o vedere questo semplice programma che analizza
-e divide i dati:
-
-@example
-@c file eg/misc/simple-csv.awk
-BEGIN @{
- FPAT = "([^,]+)|(\"[^\"]+\")"
-@}
-
-@{
- print "NF = ", NF
- for (i = 1; i <= NF; i++) @{
- printf("$%d = <%s>\n", i, $i)
- @}
-@}
-@c endfile
-@end example
-
-Eseguendolo, avendo in input la riga vista sopra, si ottiene:
-
-@example
-$ @kbd{gawk -f simple-csv.awk addresses.csv}
-NF = 7
-$1 = <Robbins>
-$2 = <Arnold>
-$3 = <"1234 A Pretty Street, NE">
-$4 = <MyTown>
-$5 = <MyState>
-$6 = <12345-6789>
-$7 = <USA>
-@end example
-
-Si noti la virgola contenuta nel valore del campo @code{$3}.
-
-Un semplice miglioramento se si elaborano dati CSV di questo tipo potrebbe
-essere quello di rimuovere i doppi apici, se presenti, con del codice di
-questo tipo:
-
-@example
-if (substr($i, 1, 1) == "\"") @{
- len = length($i)
- $i = substr($i, 2, len - 2) # Ottiene il testo tra doppi apici
-@}
-@end example
-
-Come per @code{FS}, la variabile @code{IGNORECASE}
-(@pxref{Variabili modificabili dall'utente}) ha effetto sulla separazione dei
-campi con @code{FPAT}.
-
-Se si assegna un valore a @code{FPAT} la divisione in campi non viene
-effettuata utilizzando @code{FS} o @code{FIELDWIDTHS}.
-Analogamente a @code{FIELDWIDTHS}, il valore di @code{PROCINFO["FS"]}
-sar@`a @code{"FPAT"} se @`e in uso la suddivisione in campi in base al contenuto.
-
-@quotation NOTA
-Alcuni programmi esportano dei dati CSV che contengono dei ritorni a capo al
-loro interno in campi rinchiusi tra doppi apici. @command{gawk} non @`e in
-grado di trattare questi dati. Malgrado esista una specifica ufficiale
-per i dati CSV, non c'@`e molto da fare; il meccanismo di @code{FPAT} fornisce
-una soluzione elegante per la maggioranza dei casi, e per gli sviluppatori di
-@command{gawk} ci@`o pu@`o bastare.
-@end quotation
-
-Come visto, l'espressione regolare usata per @code{FPAT} richiede
-che ogni campo contenga almeno un carattere. Una semplice modifica
-(cambiare il primo @samp{+} con @samp{*}) permette che siano presenti dei
-campi vuoti:
-
-@example
-FPAT = "([^,]*)|(\"[^\"]+\")"
-@end example
-
-@c FIXME: 4/2015
-@c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
-@c (star in latter part of value) to allow quoted strings to be empty.
-@c Per email from Ed Morton <mortoneccc@comcast.net>
-
-Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile
-per suddividere normali stringhe (@pxref{Funzioni per stringhe}).
-
-Per ricapitolare, @command{gawk} fornisce tre metodi indipendenti per
-suddividere in campi i record in input.
-Il meccanismo usato @`e determinato da quella tra le tre
-variabili---@code{FS}, @code{FIELDWIDTHS}, o @code{FPAT}---a cui
-sia stato assegnato un valore pi@`u recentemente.
-
-@node Righe multiple
-@section Record su righe multiple
-
-@cindex righe multiple, record su
-@cindex record multiriga
-@cindex input, record multiriga
-@cindex file, lettura dei record multiriga
-@cindex input, file in, si veda file in input
-In alcune banche-dati, una sola riga non pu@`o contenere in modo adeguato
-tutte le informazioni di una voce. In questi casi si possono usare record
-multiriga.
-Il primo passo @`e quello di scegliere il formato dei dati.
-
-@cindex separatori di record, per record multiriga
-Una tecnica @`e quella di usare un carattere o una stringa non usuali per
-separare i record. Per esempio, si pu@`o usare il carattere di interruzione di
-pagina (scritto @samp{\f} sia in @command{awk} che in C) per separarli,
-rendendo ogni record una pagina del file. Per far ci@`o, basta impostare la
-variabile @code{RS} a @code{"\f"} (una stringa contenente il carattere di
-interruzione di pagina). Si potrebbe ugualmente usare qualsiasi altro
-carattere, sempre che non faccia parte dei dati di un record.
-
-@cindex @code{RS}, variabile, record multiriga e
-Un'altra tecnica @`e quella di usare righe vuote per separare i record.
-Per una particolare
-convenzione, una stringa nulla come valore di @code{RS} indica che i record
-sono separati da una o pi@`u righe vuote. Quando @code{RS} @`e impostato alla
-stringa nulla, ogni record termina sempre alla prima riga vuota che @`e stata
-trovata. Il record successivo non inizia prima della successiva riga non
-vuota. Indipendentemente dal numero di righe vuote presenti in successione,
-esse costituiscono sempre un unico separatore di record.
-(Le righe vuote devono essere completamente vuote; righe che contengono
-spazi bianchi @emph{non} sono righe vuote.)
-
-@cindex stringa pi@`u lunga da sinistra, individuare la
-@cindex individuare la stringa pi@`u lunga da sinistra
-Si pu@`o ottenere lo stesso effetto di @samp{RS = ""} assegnando la stringa
-@code{"\n\n+"} a @code{RS}. Quest'espressione regolare individua
-il ritorno a capo alla fine del record e una o pi@`u righe vuote dopo il
-record. In aggiunta, un'espressione regolare individua sempre la sequenza pi@`u
-lunga possibile quando una tale stringa sia presente.
-(@pxref{Pi@`u lungo da sinistra}).
-Quindi, il record successivo non inizia prima della successiva riga non
-vuota; indipendentemente dal numero di righe vuote presenti in una voce di
-banca-dati, esse sono considerate come un unico separatore di record.
-
-@cindex angolo buio, record multiriga
-Comunque, c'@`e una sostanziale differenza tra @samp{RS = ""} e @samp{RS =
-"\n\n+"}. Nel primo caso, i ritorni a capo iniziali nel @value{DF} di
-input vengono ignorati, e se un file termina senza righe vuote aggiuntive dopo
-l'ultimo record, il ritorno a capo viene rimosso dal record. Nel secondo
-caso, questa particolare elaborazione non viene fatta.
-@value{DARKCORNER}
-
-@cindex separatore di campo, nei record multiriga
-@cindex @code{FS}, nei record multiriga
-Ora che l'input @`e separato in record, il secondo passo @`e quello di separare i
-campi all'interno dei record. Un modo per farlo @`e quello di dividere in
-campi ognuna delle righe in input
-nel modo solito. Questo viene fatto per default tramite una
-speciale funzionalit@`a. Quando @code{RS} @`e impostato alla stringa nulla
-@emph{e} @code{FS} @`e impostato a un solo carattere, il carattere di
-ritorno a capo agisce @emph{sempre} come separatore di campo.
-Questo in aggiunta a tutte le separazioni di campo che risultano da
-@code{FS}.@footnote{Quando @code{FS} @`e la stringa nulla (@code{""}), o
-un'espressione regolare, questa particolare funzionalit@`a di @code{RS} non
-viene applicata; si applica al separatore di campo quando @`e costituito da un
-solo spazio:
-@samp{FS = @w{" "}}.}
-
-La motivazione originale per questa particolare eccezione probabilmente era
-quella di prevedere un comportamento che fosse utile nel caso di default
-(cio@`e, @code{FS} uguale a @w{@code{" "}}). Questa funzionalit@`a pu@`o
-costituire un problema se non si vuole che il carattere di ritorno a capo
-faccia da separatore tra i campi, perch@'e non c'@`e alcun modo per impedirlo.
-Tuttavia, si pu@`o aggirare il problema usando la funzione @code{split()}
-per spezzare i record manualmente.
-(@pxref{Funzioni per stringhe}).
-Se si ha un separatore di campo costituito da un solo carattere, si pu@`o
-aggirare la funzionalit@`a speciale in modo diverso, trasformando @code{FS}
-in un'espressione regolare contenente
-quel carattere singolo. Per esempio, se il separatore di campo @`e
-un carattere di percentuale, al posto di
-@samp{FS = "%"}, si pu@`o usare @samp{FS = "[%]"}.
-
-Un altro modo per separare i campi @`e quello di
-mettere ciascun campo su una riga separata: per far questo basta impostare la
-variabile @code{FS} alla stringa @code{"\n"}.
-(Questo separatore di un solo carattere individua un singolo ritorno a capo.)
-Un esempio pratico di un @value{DF} organizzato in questo modo potrebbe essere
-un elenco di indirizzi, in cui delle righe vuote fungono da separatore fra
-record. Si consideri un elenco di indirizzi in un file chiamato
-@file{indirizzi}, simile a questo:
-
-@example
-Jane Doe
-123 Main Street
-Anywhere, SE 12345-6789
-
-John Smith
-456 Tree-lined Avenue
-Smallville, MW 98765-4321
-@dots{}
-@end example
-
-@noindent
-Un semplice programma per elaborare questo file @`e il seguente:
-
-@example
-# addrs.awk --- semplice programma per una lista di indirizzi postali
-
-# I record sono separati da righe bianche
-# Ogni riga @`e un campo.
-BEGIN @{ RS = "" ; FS = "\n" @}
-
-@{
- print "Il nome @`e:", $1
- print "L'indirizzo @`e:", $2
- print "Citt@`a e Stato sono:", $3
- print ""
-@}
-@end example
-
-L'esecuzione del programma produce questo output:
-
-@example
-$ @kbd{awk -f addrs.awk addresses}
-@print{} Il nome @`e: Jane Doe
-@print{} L'indirizzo @`e: 123 Main Street
-@print{} Citt@`a e Stato sono: Anywhere, SE 12345-6789
-@print{}
-@print{} Il nome @`e: John Smith
-@print{} L'indirizzo @`e: 456 Tree-lined Avenue
-@print{} Citt@`a e Stato sono: Smallville, MW 98765-4321
-@print{}
-@dots{}
-@end example
-
-@xref{Programma labels}, per un programma pi@`u realistico per gestire
-elenchi di indirizzi. Il seguente elenco riassume come sono divisi i record,
-a seconda del valore assunto da
-@ifinfo
-@code{RS}.
-(@samp{==} significa ``@`e uguale a.'')
-@end ifinfo
-@ifnotinfo
-@code{RS}:
-@end ifnotinfo
-
-@table @code
-@item RS == "\n"
-I record sono separati dal carattere di ritorno a capo (@samp{\n}). In
-effetti, ogni riga nel @value{DF} @`e un record separato, comprese le righe
-vuote. Questo @`e il comportamento di default.
-
-@item RS == @var{qualsiasi carattere singolo}
-I record sono separati da ogni ricorrenza del carattere specificato. Pi@`u
-ricorrenze adiacenti delimitano record vuoti.
-
-@item RS == ""
-I record sono separati da una o pi@`u righe vuote.
-Quando @code{FS} @`e un carattere singolo,
-il carattere di ritorno a capo
-serve sempre come separatore di campo, in aggiunta a qualunque valore possa
-avere @code{FS}. I ritorni a capo all'inizio e alla fine del file sono
-ignorati.
-
-@item RS == @var{regexp}
-I record sono separati da ricorrenze di caratteri corrispondenti a
-@var{regexp}. Le corrispondenze iniziali e finali di
-@var{regexp} designano record vuoti.
-(Questa @`e un'estensione di @command{gawk}; non @`e specificata dallo
-standard POSIX.)
-@end table
-
-@cindex @command{gawk}, @code{RT} variabile in
-@cindex @code{RT}, variabile
-Se non @`e eseguito in modalit@`a di compatibilit@`a (@pxref{Opzioni}),
-@command{gawk} imposta @code{RT} al testo di input corrispondente
-al valore specificato da @code{RS}.
-Ma se al termine del file in input non @`e stato trovato un testo che
-corrisponde a @code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
-
-@node Getline
-@section Richiedere input usando @code{getline}
-
-@cindex @code{getline}, comando, input esplicito con
-@cindex input esplicito
-Finora abbiamo ottenuto i dati di input dal flusso di input principale di
-@command{awk}: lo standard input (normalmente la tastiera, a volte
-l'output di un altro programma) o i
-file indicati sulla riga di comando. Il linguaggio @command{awk} ha uno
-speciale comando predefinito chiamato @code{getline} che
-pu@`o essere usato per leggere l'input sotto il diretto controllo dell'utente.
-
-Il comando @code{getline} @`e usato in molti modi diversi e
-@emph{non} dovrebbe essere usato dai principianti.
-L'esempio che segue alla spiegazione del comando @code{getline}
-comprende del materiale che ancora non @`e stato trattato. Quindi, @`e meglio
-tornare indietro e studiare il comando @code{getline} @emph{dopo} aver rivisto
-il resto
-@ifinfo
-di questo @value{DOCUMENT}
-@end ifinfo
-@ifhtml
-di questo @value{DOCUMENT}
-@end ifhtml
-@ifnotinfo
-@ifnothtml
-delle Parti I e II
-@end ifnothtml
-@end ifnotinfo
-e avere acquisito una buona conoscenza di come funziona @command{awk}.
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile, con comando @command{getline}
-@cindex differenze tra @command{awk} e @command{gawk}, comando @code{getline}
-@cindex @code{getline}, comando, valori di ritorno
-@cindex @option{--sandbox}, opzione, ridirezione dell'input con @code{getline}
-
-Il comando @code{getline} restituisce 1 se trova un record e 0 se
-trova la fine del file. Se si verifica qualche errore cercando di leggere
-un record, come un file che non pu@`o essere aperto, @code{getline}
-restituisce @minus{}1. In questo caso, @command{gawk} imposta la variabile
-@code{ERRNO} a una stringa che descrive l'errore in questione.
-
-Se il messaggio di errore @code{ERRNO} indica che l'operazione di I/O pu@`o
-essere ritentata e la variabile @code{PROCINFO["@var{input}", "RETRY"]} @`e
-impostata a 1, @code{getline} restituisce un codice di ritorno @minus{}2
-invece che @minus{}1, e si pu@`o provare a chiamare ulterioriormente
-@code{getline}. @xref{Proseguire dopo errore in input} per ulteriori
-informazioni riguardo a questa funzionalit@`a.
-
-Negli esempi seguenti, @var{comando} sta per un valore di stringa che
-rappresenta un comando della shell.
-
-@quotation NOTA
-Quando @`e stata specificata l'opzione @option{--sandbox} (@pxref{Opzioni}),
-la lettura di input da file, @dfn{pipe} e coprocessi non @`e possibile.
-@end quotation
-
-@menu
-* Getline semplice:: Usare @code{getline} senza argomenti.
-* Getline variabile:: Usare @code{getline} in una variabile.
-* Getline file:: Usare @code{getline} da un file.
-* Getline variabile file:: Usare @code{getline} in una variabile da un
- file.
-* Getline @dfn{pipe}:: Usare @code{getline} da una @dfn{pipe}.
-* Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile da una
- @dfn{pipe}.
-* Getline coprocesso:: Usare @code{getline} da un coprocesso.
-* Getline variabile coprocesso:: Usare @code{getline} in una variabile da un
- coprocesso.
-* Note su getline:: Cose importanti da sapere su @code{getline}.
-* Sommario di getline:: Sommario delle varianti di @code{getline}.
-@end menu
-
-@node Getline semplice
-@subsection Usare @code{getline} senza argomenti
-
-Il comando @code{getline} pu@`o essere usato senza argomenti per leggere l'input
-dal file in input corrente. Tutto quel che fa in questo caso @`e leggere il
-record in input successivo e dividerlo in campi. Questo @`e utile se @`e
-finita l'elaborarezione del record corrente, e si vogliono fare delle
-elaborazioni particolari sul record successivo @emph{proprio adesso}.
-Per esempio:
-
-@example
-# rimuovere il testo tra /* e */, compresi
-@{
- if ((i = index($0, "/*")) != 0) @{
- prima = substr($0, 1, i - 1) # la parte iniziale della stringa
- dopo = substr($0, i + 2) # ... */ ...
- j = index(dopo, "*/") # */ @`e nella parte finale?
- if (j > 0) @{
- dopo = substr(dopo, j + 2) # rimozione del commento
- @} else @{
- while (j == 0) @{
- # passa ai record seguenti
- if (getline <= 0) @{
- print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
- exit
- @}
- # incrementare la riga usando la concatenazione di stringhe
- dopo = dopo $0
- j = index(dopo, "*/") # @`e */ nella parte finale?
- if (j != 0) @{
- dopo = substr(dopo, j + 2)
- break
- @}
- @}
- @}
- # incrementare la riga di output usando la concatenazione
- # di stringhe
- $0 = prima dopo
- @}
- print $0
-@}
-@end example
-
-@c 8/2014: Here is some sample input:
-@ignore
-mon/*comment*/key
-rab/*commen
-t*/bit
-horse /*comment*/more text
-part 1 /*comment*/part 2 /*comment*/part 3
-no comment
-@end ignore
-
-Questo programma @command{awk} cancella i commenti in stile C
-(@samp{/* @dots{} */}) dall'input.
-Usa diverse funzionalit@`a che non sono ancora state trattate, incluse la
-concatenazione di stringhe
-(@pxref{Concatenazione})
-e le funzioni predefinite @code{index()} e @code{substr()}
-(@pxref{Funzioni per stringhe}).
-Sostituendo @samp{print $0} con altre
-istruzioni, si possono effettuare elaborazioni pi@`u complesse sull'input
-decommentato, come ricercare corrispondenze di un'espressione regolare.
-(Questo programma ha un piccolo problema: non funziona se c'@`e pi@`u di un
-commento che inizia e finisce
-sulla stessa riga.)
-
-Questa forma del comando @code{getline} imposta @code{NF},
-@code{NR}, @code{FNR}, @code{RT} e il valore di @code{$0}.
-
-@quotation NOTA
-Il nuovo valore di @code{$0} @`e usato per verificare
-le espressioni di ricerca di ogni regola successiva. Il valore originale
-di @code{$0} che ha attivato la regola che ha eseguito la @code{getline}
-viene perso.
-A differenza di @code{getline}, l'istruzione @code{next} legge un nuovo record
-ma inizia a elaborarlo normalmente, a partire dalla prima
-regola presente nel programma. @xref{Istruzione next}.
-@end quotation
-
-@node Getline variabile
-@subsection Usare @code{getline} in una variabile
-@cindex @code{getline} in una variabile
-@cindex variabili, usare in comando @code{getline}
-
-Si pu@`o usare @samp{getline @var{var}} per leggere il record successivo
-in input ad @command{awk} nella variabile @var{var}. Non vien fatta
-nessun'altra elaborazione.
-Per esempio, supponiamo che la riga successiva sia un commento o una stringa
-particolare, e la si voglia leggere senza innescare nessuna regola. Questa
-forma di @code{getline} permette di leggere quella riga e memorizzarla in una
-variabile in modo che il ciclo principale di @command{awk} che "legge una riga
-e controlla ogni regola" non la veda affatto.
-L'esempio seguente inverte tra loro a due a due le righe in input:
-
-@example
-@{
- if ((getline tmp) > 0) @{
- print tmp
- print $0
- @} else
- print $0
-@}
-@end example
-
-@noindent
-Prende la seguente lista:
-
-@example
-wan
-tew
-free
-phore
-@end example
-
-@noindent
-e produce questo risultato:
-
-@example
-tew
-wan
-phore
-free
-@end example
-
-Il comando @code{getline} usato in questo modo imposta solo le variabili
-@code{NR}, @code{FNR} e @code{RT} (e, naturalmente, @var{var}).
-Il record non viene
-suddiviso in campi, e quindi i valori dei campi (compreso @code{$0}) e
-il valore di @code{NF} non cambiano.
-
-@node Getline file
-@subsection Usare @code{getline} da un file
-
-@cindex @code{getline} da un file
-@cindex input, ridirezione dell'
-@cindex ridirezione dell'input
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<} (I/O)
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<} (I/O)
-@cindex operatori di input/output
-Si usa @samp{getline < @var{file}} per leggere il record successivo da
-@var{file}. Qui, @var{file} @`e un'espressione di tipo stringa che
-specifica il @value{FN}. @samp{< @var{file}} @`e una cosidetta
-@dfn{ridirezione} perch@'e richiede che l'input provenga da un posto
-differente. Per esempio, il seguente programma
-legge il suo record in input dal file @file{secondary.input} quando
-trova un primo campo con un valore uguale a 10 nel file in input
-corrente:
-
-@example
-@{
- if ($1 == 10) @{
- getline < "secondary.input"
- print
- @} else
- print
-@}
-@end example
-
-Poich@'e non viene usato il flusso principale di input, i valori di @code{NR} e
-@code{FNR} restano immutati. Comunque, il record in input viene diviso in
-modo normale, per cui vengono cambiati i valori di @code{$0} e degli altri
-campi, producendo un nuovo valore di @code{NF}.
-Viene impostato anche @code{RT}.
-
-@cindex POSIX @command{awk}, operatore @code{<} e
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{getline < @var{espressione}} @`e ambiguo se
-@var{espressione} contiene operatori che non sono all'interno di parentesi,
-ad esclusione di @samp{$}; per esempio, @samp{getline < dir "/" file} @`e
-ambiguo perch@'e l'operatore di concatenazione (non ancora trattato;
-@pxref{Concatenazione}) non @`e posto tra parentesi.
-Si dovrebbe scrivere invece @samp{getline < (dir "/" file)}, se il
-programma dev'essere portabile su tutte le implementazioni di @command{awk}.
-
-@node Getline variabile file
-@subsection Usare @code{getline} in una variabile da un file
-@cindex variabili, usare in comando @code{getline}
-
-Si usa @samp{getline @var{var} < @var{file}} per leggere l'input
-dal file
-@var{file}, e metterlo nella variabile @var{var}. Come prima, @var{file}
-@`e un'espressione di tipo stringa che specifica il file dal quale
-legggere.
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
-cambiata e il record non @`e diviso in campi. La sola variabile cambiata @`e
-@var{var}.@footnote{Questo non @`e completamente vero. @code{RT} pu@`o essere
-cambiato se @code{RS} @`e un'espressione regolare.}
-Per esempio, il seguente programma copia tutti i file in input nell'output, ad
-eccezione dei record che dicono @w{@samp{@@include @var{nomefile}}}.
-Tale record @`e sostituito dal contenuto del file
-@var{nomefile}:
-
-@example
-@{
- if (NF == 2 && $1 == "@@include") @{
- while ((getline line < $2) > 0)
- print line
- close($2)
- @} else
- print
-@}
-@end example
-
-Si noti come il nome del file in input aggiuntivo non compaia all'interno del
-programma; @`e preso direttamente dai dati, e precisamente dal secondo campo
-della riga di @code{@@include}.
-
-La funzione @code{close()} viene chiamata per assicurarsi che se nell'input
-appaiono due righe @code{@@include} identiche, l'intero file specificato sia
-incluso ogni volta.
-@xref{Chiusura file e @dfn{pipe}}.
-
-Una carenza di questo programma @`e che non gestisce istruzioni
-@code{@@include} nidificate
-(cio@`e, istruzioni @code{@@include} contenute nei file inclusi)
-nel modo in cui ci si aspetta che funzioni un vero preelaboratore di macro.
-@xref{Programma igawk} per un programma
-che gestisce le istruzioni @code{@@include} nidificate.
-
-@node Getline @dfn{pipe}
-@subsection Usare @code{getline} da una @dfn{pipe}
-
-@c From private email, dated October 2, 1988. Used by permission, March 2013.
-@cindex Kernighan, Brian
-@quotation
-@i{L'onniscienza ha molti aspetti positivi.
-Se non si pu@`o ottenerla, l'attenzione ai dettagli pu@`o aiutare.}
-@author Brian Kernighan
-@end quotation
-
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
-@cindex input, @dfn{pipeline}
-@cindex @dfn{pipe}, input
-@cindex operatori, input/output
-L'output di un comando pu@`o anche essere convogliato in @code{getline}, usando
-@samp{@var{comando} | getline}. In
-questo caso, la stringa @var{comando} viene eseguita come comando di shell e
-il suo output @`e passato ad @command{awk} per essere usato come input.
-Questa forma di @code{getline} legge un record alla volta dalla @dfn{pipe}.
-Per esempio, il seguente programma copia il suo input nel suo output,
-ad eccezione delle righe che iniziano con @samp{@@execute}, che sono
-sostituite dall'output prodotto dall'esecuzione del resto della riga
-costituito da un comando di shell.
-
-@example
-@{
- if ($1 == "@@execute") @{
- tmp = substr($0, 10) # Rimuove "@@execute"
- while ((tmp | getline) > 0)
- print
- close(tmp)
- @} else
- print
-@}
-@end example
-
-@noindent
-La funzione @code{close()} viene chiamata per assicurarsi che, se appaiono
-nell'input due righe @samp{@@execute} identiche, il comando sia eseguito per
-ciascuna di esse.
-@ifnottex
-@ifnotdocbook
-@xref{Chiusura file e @dfn{pipe}}.
-@end ifnotdocbook
-@end ifnottex
-@c This example is unrealistic, since you could just use system
-Dato l'input:
-
-@example
-pippo
-pluto
-paperino
-@@execute who
-gastone
-@end example
-
-@noindent
-il programma potrebbe produrre:
-
-@cindex Robbins, Bill
-@cindex Robbins, Miriam
-@cindex Robbins, Arnold
-@example
-pippo
-pluto
-paperino
-arnold ttyv0 Jul 13 14:22
-miriam ttyp0 Jul 13 14:23 (murphy:0)
-bill ttyp1 Jul 13 14:23 (murphy:0)
-gastone
-@end example
-
-@noindent
-Si osservi che questo programma ha eseguito @command{who} e stampato il
-risultato. (Eseguendo questo programma, @`e chiaro che ciascun utente otterr@`a
-risultati diversi, a seconda di chi @`e collegato al sistema.)
-
-Questa variante di @code{getline} divide il record in campi, imposta il valore
-di @code{NF}, e ricalcola il valore di @code{$0}. I valori di
-@code{NR} e @code{FNR} non vengono cambiati.
-Viene impostato @code{RT}.
-
-@cindex POSIX @command{awk}, operatore I/O @code{|} e
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{@var{espressione} | getline} @`e ambiguo se
-@var{espressione} contiene operatori che non sono all'interno di parentesi,
-ad esclusione di @samp{$}. Per esempio,
-@samp{@w{"echo "} "date" | getline} @`e ambiguo perch@'e
-l'operatore di concatenazione non @`e tra parentesi. Si dovrebbe scrivere
-invece @samp{(@w{"echo "} "date") | getline}, se il programma dev'essere
-portabile su tutte le implementazioni di @command{awk}.
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@quotation NOTA
-Sfortunatamente, @command{gawk} non ha un comportamento uniforme nel
-trattare un costrutto come @samp{@w{"echo "} "date" | getline}.
-La maggior parte delle versioni, compresa la versione corrente, lo tratta
-come @samp{@w{("echo "} "date") | getline}.
-(Questo @`e anche il comportamento di BWK @command{awk}.)
-Alcune versioni invece lo trattano come
-@samp{@w{"echo "} ("date" | getline)}.
-(Questo @`e il comportamento di @command{mawk}.)
-In breve, per evitare problemi, @`e @emph{sempre} meglio usare parentesi
-esplicite.
-@end quotation
-
-@node Getline variabile @dfn{pipe}
-@subsection Usare @code{getline} in una variabile da una @dfn{pipe}
-@cindex variabili, usare in comando @code{getline}
-
-Quando si usa @samp{@var{comando} | getline @var{var}},
-l'output di @var{comando} @`e inviato tramite una @dfn{pipe} a
-@code{getline} ad una variabile @var{var}. Per esempio, il
-seguente programma legge la data e l'ora corrente nella variabile
-@code{current_time}, usando il programma di utilit@`a @command{date}, e poi lo
-stampa:
-
-@example
-BEGIN @{
- "date" | getline current_time
- close("date")
- print "Report printed on " current_time
-@}
-@end example
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
-cambiata e il record non @`e diviso in campi. In ogni caso, @code{RT} viene
-impostato.
-
-@ifinfo
-@c Thanks to Paul Eggert for initial wording here
-Per lo standard POSIX, @samp{@var{espressione} | getline @var{var}} @`e ambiguo
-se @var{espressione} contiene operatori che non sono all'interno di parentesi
-ad esclusione di @samp{$}; per esempio,
-@samp{@w{"echo "} "date" | getline @var{var}} @`e ambiguo
-perch@'e l'operatore di concatenazione non @`e tra parentesi. Si dovrebbe
-scrivere invece @samp{(@w{"echo "} "date") | getline @var{var}} se il
-programma dev'essere portabile su tutte le implementazioni di @command{awk}.
-@end ifinfo
-
-@node Getline coprocesso
-@subsection Usare @code{getline} da un coprocesso
-@cindex coprocessi, @code{getline} da
-@cindex @code{getline}, comando, coprocessi@comma{} usare dal
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
-
-Leggere dell'input in @code{getline} da una @dfn{pipe} @`e un'operazione
-unidirezionale.
-Il comando avviato con @samp{@var{comando} | getline} invia dati
-@emph{al} programma @command{awk}.
-
-Occasionalmente, si potrebbe avere la necessit@`a di inviare dei dati a un altro
-programma che li elabori, per poi leggere il risultato che esso genera.
-@command{gawk} permette di avviare un @dfn{coprocesso}, col quale sono
-possibili comunicazioni bidirezionali. Questo vien fatto con l'operatore
-@samp{|&}.
-Tipicamente, dapprima si inviano dati al coprocesso e poi si leggono
-i risultati da esso prodotto, come mostrato di seguito:
-
-@example
-print "@var{some query}" |& "db_server"
-"db_server" |& getline
-@end example
-
-@noindent
-esso invia una richiesta a @command{db_server} e poi legge i risultati.
-
-I valori di @code{NR} e
-@code{FNR} non vengono cambiati,
-perch@'e non @`e cambiato il flusso principale.
-In ogni caso, il record @`e diviso in campi
-nel solito modo, cambiando cos@`{@dotless{i}} i valori di @code{$0}, degli altri campi,
-e di @code{NF} e @code{RT}.
-
-I coprocessi sono una funzionalit@`a avanzata. Vengono trattati qui solo perch@'e
-@ifnotinfo
-questa @`e la
-@end ifnotinfo
-@ifinfo
-questo @`e il
-@end ifinfo
-@value{SECTION} su @code{getline}.
-@xref{I/O bidirezionale},
-dove i coprocessi vengono trattati pi@`u dettagliatamente.
-
-@node Getline variabile coprocesso
-@subsection Usare @code{getline} in una variabile da un coprocesso
-@cindex variabili, usare in comando @code{getline}
-
-Quando si usa @samp{@var{comando} |& getline @var{var}}, l'output dal
-coprocesso @var{comando} viene inviato tramite una @dfn{pipe} bidirezionale a
-@code{getline} e nella variabile @var{var}.
-
-In questa versione di @code{getline}, nessuna delle variabili predefinite
-viene cambiata e il record non viene diviso in campi. La sola variabile che
-cambia @`e @var{var}.
-In ogni caso, @code{RT} viene impostato.
-
-@ifinfo
-I coprocessi sono una funzionalit@`a avanzata. Vengono trattati qui solo perch@'e
-questo @`e il @value{SECTION} su @code{getline}.
-@xref{I/O bidirezionale},
-dove i coprocessi vengono trattati pi@`u dettagliatamente.
-@end ifinfo
-
-@node Note su getline
-@subsection Cose importanti da sapere riguardo a @code{getline}
-Qui sono elencate diverse considerazioni su @code{getline}
-da tener presenti:
-
-@itemize @value{BULLET}
-@item
-Quando @code{getline} cambia il valore di @code{$0} e @code{NF},
-@command{awk} @emph{non} salta automaticamente all'inizio del
-programma per iniziare a provare il nuovo record su ogni criterio di ricerca.
-Comunque, il nuovo record viene provato su ogni regola successiva.
-
-@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
-@cindex implementazione, problemi, @command{gawk}, limiti
-@cindex @command{awk}, implementazioni, limiti
-@cindex @command{gawk}, problemi di implementazioni, limiti
-@item
-Alcune tra le prime implementazioni di @command{awk} limitano a una sola il
-numero di @dfn{pipeline} che un programma @command{awk} pu@`o tenere aperte.
-In @command{gawk}, non c'@`e questo limite.
-Si possono aprire tante @dfn{pipeline} (e coprocessi) quante ne permette il
-sistema operativo in uso.
-
-@cindex effetti collaterali, variabile @code{FILENAME}
-@cindex @code{FILENAME}, variabile, impostare con @code{getline}
-@cindex angolo buio, variabile @code{FILENAME}
-@cindex @code{getline}, comando, variabile @code{FILENAME} e
-@cindex @code{BEGIN}, criterio di ricerca, @code{getline} e
-@item
-Un interessante effetto collaterale si ha se si usa @code{getline}, senza
-una ridirezione, all'interno di una regola @code{BEGIN}. Poich@'e una
-@code{getline} non ridiretta legge dai @value{DF} specificati nella riga di
-comando, il primo comando @code{getline} fa s@`{@dotless{i}} che @command{awk} imposti
-il valore di @code{FILENAME}. Normalmente, @code{FILENAME} non ha ancora un
-valore all'interno delle regole @code{BEGIN}, perch@'e non si @`e ancora
-iniziato a elaborare il
-@value{DF} della riga di comando.
-@value{DARKCORNER}
-(Si veda @ref{BEGIN/END};
-e @pxref{Variabili auto-assegnate}.)
-
-@item
-Usare @code{FILENAME} con @code{getline}
-(@samp{getline < FILENAME})
-pu@`o essere fonte di
-confusione. @command{awk} apre un flusso separato di input, diverso dal
-file in input corrente. Comunque, poich@'e non si usa una variabile,
-@code{$0} e @code{NF} vengono aggiornati. Se si sta facendo questo, @`e
-probabilmente per sbaglio, e si dovrebbe rivedere quello che si sta cercando
-di fare.
-
-@item
-@ifdocbook
-La prossima @value{SECTION}
-@end ifdocbook
-@ifnotdocbook
-@ref{Sommario di getline},
-@end ifnotdocbook
-contiene una tabella che sintetizza le
-varianti di @code{getline} e le variabili da esse modificate.
-@`E degno di nota che le varianti che non usano la ridirezione
-possono far s@`{@dotless{i}} che @code{FILENAME} venga aggiornato se chiedono ad
-@command{awk} di iniziare a leggere un nuovo file in input.
-
-@item
-@cindex Moore, Duncan
-Se la variabile assegnata @`e un'espressione con effetti collaterali, versioni
-differenti di @command{awk} si comportano in modo diverso quando trovano la
-fine-del-file [EOF]. Alcune versioni non valutano l'espressione; molte
-versioni (compreso @command{gawk}) lo fanno. Si veda un esempio, gentilmente
-fornito da Duncan Moore:
-
-@ignore
-Date: Sun, 01 Apr 2012 11:49:33 +0100
-From: Duncan Moore <duncan.moore@@gmx.com>
-@end ignore
-
-@example
-BEGIN @{
- system("echo 1 > f")
- while ((getline a[++c] < "f") > 0) @{ @}
- print c
-@}
-@end example
-
-@noindent
-Qui l'effetto secondario @`e @samp{++c}. Se viene trovata la fine del file
-@emph{prima} di assegnare l'elemento @code{a}, @code{c} @`e incrementato o no?
-
-@command{gawk} tratta @code{getline} come una chiamata di funzione, e valuta
-l'espressione @samp{a[++c]} prima di cercare di leggere da @file{f}.
-Comunque, alcune versioni di @command{awk} valutano l'espressione solo
-se c'@`e un valore di stringa da assegnare.
-@end itemize
-
-@node Sommario di getline
-@subsection Sommario delle varianti di @code{getline}
-@cindex @code{getline}, comando, varianti
-
-La @ref{tabella-varianti-getline}
-riassume le otto varianti di @code{getline},
-elencando le variabili predefinite che sono impostate da ciascuna di esse,
-e se la variante @`e standard o @`e un'estensione di @command{gawk}.
-Nota: per ogni variante, @command{gawk} imposta la variabile predefinita
-@code{RT}.
-
-@float Tabella,tabella-varianti-getline
-@caption{Varianti di @code{getline} e variabili impostate da ognuna}
-@multitable @columnfractions .33 .38 .27
-@headitem Variante @tab Effetto @tab @command{awk} / @command{gawk}
-@item @code{getline} @tab Imposta @code{$0}, @code{NF}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
-@item @code{getline} @var{var} @tab Imposta @var{var}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
-@item @code{getline <} @var{file} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
-@item @code{getline @var{var} < @var{file}} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
-@item @var{comando} @code{| getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
-@item @var{comando} @code{| getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
-@item @var{comando} @code{|& getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{gawk}
-@item @var{comando} @code{|& getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{gawk}
-@end multitable
-@end float
-
-@node Timeout in lettura
-@section Leggere input entro un tempo limite
-@cindex tempo limite, leggere input
-@cindex @dfn{timeout}, si veda tempo limite
-
-@cindex differenze tra @command{awk} e @command{gawk}, tempo limite per lettura
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@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
-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}
-(@pxref{Variabili auto-assegnate}):
-
-@example
-PROCINFO["nome_input", "READ_TIMEOUT"] = @var{tempo limite in millisecondi}
-@end example
-
-Se @`e impostato, @command{gawk} smette di attendere una risposta e restituisce
-insuccesso se non sono disponibili dati da leggere entro il limite di tempo
-specificato. Per esempio, un cliente TCP pu@`o decidere di abbandonare se
-non riceve alcuna risposta dal server dopo un certo periodo di tempo:
-
-@example
-Service = "/inet/tcp/0/localhost/daytime"
-PROCINFO[Service, "READ_TIMEOUT"] = 100
-if ((Service |& getline) > 0)
- print $0
-else if (ERRNO != "")
- print ERRNO
-@end example
-
-Qui vediamo come ottenere dati interattivamente dall'utente@footnote{Questo
-presuppone che lo standard input provenga dalla tastiera.} aspettando per
-non pi@`u di cinque secondi:
-
-@example
-PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
-while ((getline < "/dev/stdin") > 0)
- print $0
-@end example
-
-@command{gawk} termina l'operazione di lettura se l'input non
-arriva entro il periodo di tempo limite, restituisce insuccesso
-e imposta @code{ERRNO} a una stringa di valore adeguato.
-Un valore del tempo limite negativo o pari a zero equivale a non specificare
-affatto un tempo limite.
-
-Si pu@`o impostare un tempo limite anche per leggere dalla tastiera nel ciclo
-implicito che legge i record in input e li confronta coi criteri di ricerca,
-come:
-
-@example
-$ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
-> @kbd{@{ print "You entered: " $0 @}'}
-@kbd{gawk}
-@print{} You entered: gawk
-@end example
-
-In questo caso, la mancata risposta entro cinque secondi d@`a luogo al seguente
-messaggio di errore:
-
-@example
-@c questo @`e l'output effettivo - Antonio
-@error{} gawk: linea com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
-@error{} file in input `-': Connessione scaduta
-@end example
-
-Il tempo limite pu@`o essere impostato o cambiato in qualsiasi momento, e avr@`a
-effetto al tentativo successivo di leggere dal dispositivo di input. Nel
-seguente esempio, partiamo con un valore di tempo limite di un secondo e
-lo riduciamo progressivamente di un decimo di secondo finch@'e l'attesa
-per l'input diventa illimitata.
-
-@example
-PROCINFO[Service, "READ_TIMEOUT"] = 1000
-while ((Service |& getline) > 0) @{
- print $0
- PROCINFO[Service, "READ_TIMEOUT"] -= 100
-@}
-@end example
-
-@quotation NOTA
-Non si deve dare per scontato che l'operazione di lettura si blocchi
-esattamente dopo che @`e stato stampato il decimo record. @`E possibile che
-@command{gawk} legga e tenga in memoria i dati di pi@`u di un record
-la prima volta. Per questo, cambiare il valore del tempo
-limite come nell'esempio appena visto non @`e molto utile.
-@end quotation
-
-Se l'elemento di @code{PROCINFO} non @`e presente e la variabile d'ambiente
-@env{GAWK_READ_TIMEOUT} esiste,
-@command{gawk} usa il suo valore per inizializzare il valore di tempo limite.
-L'uso esclusivo della variabile d'ambiente per specificare il tempo limite
-ha lo svantaggio di non essere
-adattabile per ogni comando o per ogni connessione.
-
-@command{gawk} considera errore un superamento di tempo limite anche se
-il tentativo di leggere dal dispositivo sottostante potrebbe riuscire
-in un tentativo successivo. Questa @`e una limitazione, e inoltre
-significa che non @`e possibile usarlo per ottenere input multipli,
-provenienti da due o pi@`u sorgenti. @xref{Proseguire dopo errore in input}
-per una modalit@`a che consente di tentare ulteriori operazioni di I/O.
-
-Assegnare un valore di tempo limite previene un blocco a tempo indeterminato
-legato a operazioni di lettura. Si tenga per@`o presente che ci sono altre
-situazioni in cui @command{gawk} pu@`o restare bloccato in attesa che un
-dispositivo di input sia pronto. Un cliente di rete a volte pu@`o impiegare
-molto tempo per stabilire una
-connessione prima di poter iniziare a leggere qualsiasi dato,
-oppure il tentativo di aprire un file speciale FIFO in lettura pu@`o bloccarsi
-indefinitamente in attesa che qualche altro processo lo apra in scrittura.
-
-@node Proseguire dopo errore in input
-@section Elaborare ulteriore input dopo certi errori di I/O
-@cindex proseguire dopo errore in input
-@cindex errore in input, possibilit@`a di proseguire
-
-@cindex differenze tra @command{awk} e @command{gawk}, proseguire dopo errore in input
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-Qualora @command{gawk} incontri un errore durante la lettura dell'input,
-per default @code{getline} ha come codice di ritorno @minus{}1, e i
-successivi tentativi di leggere dallo stesso file restituiscono una
-indicazione di fine-file. @`E tuttavia possibile chiedere a
-@command{gawk} di consentire un ulteriore tentativo di lettura in presenza
-di certi errori, impostando uno speciale elemento del vettore
-@code{PROCINFO} (@pxref{Variabili auto-assegnate}):
-
-@example
-PROCINFO["@var{nome_input_file}", "RETRY"] = 1
-@end example
-
-Quando un tale elemento esiste, @command{gawk} controlla il valore della
-variabile di sistema
-(nel linguaggio C)
-@code{errno} quando si verifica un errore di I/O.
-Se @code{errno} indica che un ulteriore tentativo di lettura pu@`o
-terminare con successo, @code{getline} ha come codice di ritorno @minus{}2
-e ulteriori chiamate a @code{getline} possono terminare correttamente.
-Questo vale per i seguenti valori di @code{errno}: @code{EAGAIN},
-@code{EWOULDBLOCK}, @code{EINTR}, e @code{ETIMEDOUT}.
-
-Questa funzionalit@`a @`e utile quando si assegna un valore all'elemento
-@code{PROCINFO["@var{nome_input_file}", "READ_TIMEOUT"]} o in situazioni
-in cui un descrittore di file sia stato configurato per comportarsi in
-modo non bloccante.
-
-@node Directory su riga di comando
-@section Directory sulla riga di comando
-@cindex differenze tra @command{awk} e @command{gawk}, directory sulla riga di comando
-@cindex directory, riga di comando
-@cindex riga di comando, directory su
-
-Per lo standard POSIX, i file che compaiono sulla riga di comando di
-@command{awk} devono essere file di testo; @`e un errore fatale se non lo sono.
-La maggior parte delle versioni di @command{awk} genera un errore fatale
-quando trova una directory sulla riga di comando.
-
-Per default, @command{gawk} emette un avvertimento se c'@`e una directory sulla
-riga di comando, e in ogni caso la ignora. Questo rende pi@`u facile usare
-metacaratteri di shell col proprio programma @command{awk}:
-
-@example
-$ @kbd{gawk -f whizprog.awk *} @ii{Le directory potrebbero far fallire il programma}
-@end example
-
-Se viene data una delle opzioni @option{--posix}
-o @option{--traditional}, @command{gawk} considera invece
-una directory sulla riga di comando come un errore fatale.
-
-@xref{Esempio di estensione Readdir} per un modo di trattare le directory
-come dati usabili da un programma @command{awk}.
-
-@sp 2
-@node Sommario di Input
-@section Sommario di Input
-
-@itemize @value{BULLET}
-@item
-L'input @`e diviso in record in base al valore di @code{RS}.
-Le possibilit@`a sono le seguenti:
-
-@multitable @columnfractions .28 .45 .40
-@headitem Valore di @code{RS} @tab Record separati da @dots{} @tab @command{awk} / @command{gawk}
-@item Un carattere singolo @tab Quel carattere @tab @command{awk}
-@item La stringa nulla (@code{""}) @tab Serie di due o pi@`u ritorni a capo @tab @command{awk}
-@item Un'espressione regolare @tab Testo corrispondente alla @dfn{regexp} @tab @command{gawk}
-@end multitable
-
-@item
-@code{FNR} indica quanti record sono stati letti dal file in input corrente;
-@code{NR} indica quanti record sono stati letti in totale.
-
-@item
-@command{gawk} imposta @code{RT} al testo individuato da @code{RS}.
-
-@item
-Dopo la divisione dell'input in record, @command{awk} divide
-i record in singoli campi, chiamati @code{$1}, @code{$2} e cos@`{@dotless{i}}
-via. @code{$0} @`e l'intero record, e @code{NF} indica quanti campi
-contiene. Il metodo di default per dividere i campi utilizza i
-caratteri di spazio vuoto.
-
-@item Si pu@`o far riferimento ai campi usando una variabile, come in @code{$NF}.
-Ai campi possono anche essere assegnati dei valori, e questo implica che il
-valore di @code{$0} sia ricalcolato se ad esso si fa riferimento in seguito.
-Fare un assegnamento a un campo con un numero maggiore di @code{NF} crea il
-campo e ricostruisce il record, usando @code{OFS} per separare i campi.
-Incrementare @code{NF} fa la stessa cosa. Decrementare @code{NF} scarta dei
-campi e ricostruisce il record.
-
-@item
-Separare i campi @`e pi@`u complicato che separare i record.
-
-@multitable @columnfractions .40 .40 .20
-@headitem Valore del separatore di campo @tab Campi separati @dots{} @tab @command{awk} / @command{gawk}
-@item @code{FS == " "} @tab Da serie di spazi vuoti @tab @command{awk}
-@item @code{FS == @var{un solo carattere}} @tab Da quel carattere @tab @command{awk}
-@item @code{FS == @var{espr. reg.}} @tab Dal testo che corrisponde alla @dfn{regexp} @tab @command{awk}
-@item @code{FS == ""} @tab Cos@`{@dotless{i}} ogni singolo carattere @`e un campo separato @tab @command{gawk}
-@item @code{FIELDWIDTHS == @var{lista di colonne}} @tab Basata sulla posizione del carattere @tab @command{gawk}
-@item @code{FPAT == @var{regexp}} @tab Dal testo attorno al testo corrispondente alla @dfn{regexp} @tab @command{gawk}
-@end multitable
-
-@item
-Usando @samp{FS = "\n"} l'intero record sar@`a un unico campo
-(nell'ipotesi che i record siano separati da caratteri di ritorno a capo).
-
-@item
-@code{FS} pu@`o essere impostato dalla riga di comando con l'opzione
-@option{-F}.
-Si pu@`o fare la stessa cosa usando un assegnamento di variabile da riga di
-comando.
-
-@item
-@code{PROCINFO["FS"]} permette di sapere come i campi sono separati.
-
-@item
-@code{getline} nelle sue diverse forme serve per leggere record aggiuntivi
-provenienti dal flusso di input di default, da un file, o da una @dfn{pipe}
-o da un coprocesso.
-
-@item
-@code{PROCINFO[@var{file}, "READ_TIMEOUT"]} si pu@`o usare per impostare un
-tempo limite alle operazioni di lettura da @var{file}.
-
-@item
-Le directory sulla riga di comando generano un errore fatale per
-@command{awk} standard;
-@command{gawk} le ignora se non @`e in modalit@`a POSIX.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi su Input
-@section Esercizi
-
-@enumerate
-@item
-Usando la variabile @code{FIELDWIDTHS} (@pxref{Dimensione costante}),
-scrivere un programma per leggere i dati delle elezioni, dove ogni record
-rappresenta i voti di un votante. Trovare un modo per definire quali colonne
-sono associate a ogni quesito elettorale, e stampare i voti totali,
-comprese le astensioni, per ciascun quesito.
-@item
-La @ref{Getline semplice}, ha illustrato un programma per rimuovere i commenti
-in stile C (@samp{/* @dots{} */}) dall'input. Quel programma
-non funziona se un commento termina in una riga e il successivo commento
-inizia nella stessa riga.
-Il problema si pu@`o risolvere con una semplice modifica. Quale?
-
-@end enumerate
-@c EXCLUDE END
-
-@node Stampare
-@chapter Stampare in output
-
-@cindex stampare
-@cindex output, stampare, si veda stampare
-Una delle azioni che un programma fa pi@`u comunemente, @`e quella di produrre
-@dfn{stampe}, ossia scrivere in output l'input letto, tutto o in parte.
-Si pu@`o usare l'istruzione @code{print} per una stampa semplice, e l'istruzione
-@code{printf} per una formattazione dell'output pi@`u sofisticata.
-L'istruzione @code{print} non ha un limite al numero di elementi quando
-calcola @emph{quali} valori stampare. Peraltro, con due eccezioni,
-non @`e possibile specificare @emph{come} stamparli: quante
-colonne, se usare una notazione esponenziale o no, etc.
-(Per le eccezioni, @pxref{Separatori di output} e
-la @ref{OFMT}.)
-Per stampare fornendo delle specifiche, @`e necessario usare
-l'istruzione @code{printf}
-(@pxref{Printf}).
-
-@cindex istruzione @code{print}
-@cindex istruzione @code{printf}
-Oltre alla stampa semplice e formattata, questo @value{CHAPTER}
-esamina anche le ridirezioni di I/O verso file e @dfn{pipe}, introduce
-i @value{FNS} speciali che @command{gawk} elabora internamente,
-e parla della funzione predefinita @code{close()}.
-
-@menu
-* Print:: L'istruzione @code{print}.
-* Esempi su print:: Semplici esempi di
- istruzioni @code{print}.
-* Separatori di output:: I separatori di output e come
- modificarli.
-* OFMT:: Controllare l'output di numeri con
- @code{print}.
-* Printf:: l'istruzione @code{printf}.
-* Ridirezione:: Come ridirigere l'output a diversi
- file e @dfn{pipe}.
-* FD speciali:: I/O con FD [Descrittori File]
- speciali.
-* File speciali:: Interpretazione nomi file in
- @command{gawk}. @command{gawk}
- Permette di accedere a descrittori
- file gi@`a aperti a inizio esecuzione
-* Chiusura file e @dfn{pipe}:: Chiudere file in input e di output e
- @dfn{pipe}.
-* Continuazione dopo errori:: Abilitare continuazione dopo errori
- in output.
-* Sommario di Output:: Sommario di Output.
-* Esercizi su Output:: Esercizi.
-@end menu
-
-@node Print
-@section L'istruzione @code{print}
-
-L'istruzione @code{print} si usa per produrre dell'output formattato in
-maniera semplice, standardizzata. Si
-specificano solo le stringhe o i numeri
-da stampare, in una lista separata da virgole. Questi elementi sono stampati,
-separati tra loro da spazi singoli, e alla fine viene stampato un ritorno a
-capo. L'istruzione @`e simile a questa:
-
-@example
-print @var{elemento1}, @var{elemento2}, @dots{}
-@end example
-
-@noindent
-L'intera lista di elementi pu@`o facoltativamente essere racchiusa fra
-parentesi. Le parentesi sono obbligatorie se qualche espressione presente
-in uno degli elementi usa l'operatore relazionale @samp{>}, che potrebbe
-essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
-
-Gli elementi da stampare possono essere stringhe costanti o numeri, campi
-del record corrente (come @code{$1}), variabili, o quasiasi espressione
-@command{awk}. I valori numerici sono convertiti in stringhe prima di essere
-stampati.
-
-@cindex record, stampare
-@cindex righe, vuote, stampare
-@cindex testo, stampare
-Una semplice istruzione @samp{print} senza specificare elementi equivale a
-@samp{print $0}: stampa l'intero record corrente. Per stampare una riga
-vuota, si usa @samp{print ""}.
-Per stampare un testo che non cambia, si usi come elemento una costante
-stringa, per esempio @w{@code{"Non v'allarmate"}}. Dimenticandosi di mettere
-i doppi apici, il testo @`e preso per un'espressione @command{awk},
-e probabilmente verr@`a emesso un messaggio di errore. Occorre tener presente
-che tra ogni coppia di elementi viene stampato uno spazio.
-
-Si noti che l'istruzione @code{print} @`e un'istruzione, e non
-un'espressione: non @`e possibile usarla nella parte modello [di ricerca] di
-un'istruzione @dfn{criterio di ricerca--azione}, per esempio.
-
-@node Esempi su print
-@section Esempi di istruzioni @code{print}
-
-Ogni istruzione @code{print} produce almeno una riga in output. Comunque,
-non @`e limitata a una sola riga. Se il valore di un elemento @`e una stringa
-che contiene un ritorno a capo, il ritorno a capo @`e stampato insieme al
-resto della stringa. Una
-singola istruzione @code{print} pu@`o in questo modo generare un numero
-qualsiasi di righe.
-
-@cindex ritorno a capo, stampare un
-Quel che segue @`e un esempio di stampa di una stringa che contiene al suo
-interno dei
-@ifinfo
-ritorni a capo
-(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
-carattere di ritorno a capo; @pxref{Sequenze di protezione}):
-@end ifinfo
-@ifhtml
-ritorni a capo
-(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
-carattere di ritorno a capo; @pxref{Sequenze di protezione}):
-@end ifhtml
-@ifnotinfo
-@ifnothtml
-ritorni a capo:
-@end ifnothtml
-@end ifnotinfo
-
-@example
-$ @kbd{awk 'BEGIN @{ print "riga uno\nriga due\nriga tre" @}'}
-@print{} riga uno
-@print{} riga due
-@print{} riga tre
-@end example
-
-@cindex campi, stampare
-Il prossimo esempio, eseguito sul file @file{inventory-shipped},
-stampa i primi due campi di ogni record in input, separandoli con uno
-spazio:
-
-@example
-$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
-@print{} Jan 13
-@print{} Feb 15
-@print{} Mar 15
-@dots{}
-@end example
-
-@cindex istruzione @code{print}, virgole, omettere
-@cindex debug, istruzione @code{print}@comma{} omissione virgole
-Un errore frequente usando l'istruzione @code{print} @`e quello di tralasciare
-la virgola tra due elementi. Questo ha spesso come risultato la stampa di
-elementi attaccati tra loro, senza lo spazio di separazione. Il motivo per
-cui ci@`o accade @`e che la scrittura di due
-espressioni di stringa in @command{awk} ne indica la concatenazione. Qui si
-vede l'effetto dello stesso programma,
-senza le virgole:
-
-@example
-$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
-@print{} Jan13
-@print{} Feb15
-@print{} Mar15
-@dots{}
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, intestazioni, aggiungere
-Per chi non conosce il file @file{inventory-shipped} nessuno
-dei due output di esempio risulta molto comprensibile. Una riga iniziale di
-intestazione li renderebbe pi@`u chiari.
-Aggiungiamo qualche intestazione alla nostra tabella dei mesi
-(@code{$1}) e dei contenitori verdi spediti (@code{$2}). Lo facciamo usando
-una regola @code{BEGIN} (@pxref{BEGIN/END}) in modo che le intestazioni siano
-stampate una volta sola:
-
-@example
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, $2 @}' inventory-shipped
-@end example
-
-@noindent
-Una volta eseguito, il programma stampa questo:
-
-@example
-Mese Contenitori
------ -----------
-Jan 13
-Feb 15
-Mar 15
-@dots{}
-@end example
-
-@noindent
-Il solo problema, in effetti, @`e che le intestazioni e i dati della tabella
-non sono allineati! Possiamo provvedere stampando alcuni spazi tra i due
-campi:
-
-@example
-@group
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, " ", $2 @}' inventory-shipped
-@end group
-@end example
-
-@cindex istruzione @code{printf}, colonne@comma{} allineamento
-@cindex colonne, allineamento
-Allineare le colonne in questo modo pu@`o diventare piuttosto
-complicato, quando ci sono parecchie colonne da tenere allineate. Contare gli
-spazi per due o tre colonne @`e semplice, ma oltre questo limite comincia a
-volerci molto tempo. Ecco perch@'e @`e disponibile l'istruzione @code{printf}
-(@pxref{Printf});
-una delle possibilit@`a che offre @`e quella di allineare colonne di dati.
-
-@cindex continuazione di riga, in istruzione @code{print}
-@cindex istruzione @code{print}, continuazione di riga e
-@cindex @code{print}, istruzione, continuazione di riga e
-@quotation NOTA
-Si pu@`o continuare su pi@`u righe sia l'istruzione @code{print} che l'istruzione
-@code{printf} semplicemente mettendo un ritorno a capo dopo una virgola
-qualsiasi
-(@pxref{Istruzioni/Righe}).
-@end quotation
-
-@node Separatori di output
-@section I separatori di output e come modificarli
-
-@cindex variabile @code{OFS}
-Come detto sopra, un'istruzione @code{print} contiene una lista di elementi
-separati da virgole. Nell'output, gli elementi sono solitamente separati
-da spazi singoli. Non @`e detto tuttavia che debba sempre essere cos@`{@dotless{i}}; uno
-spazio singolo @`e semplicemnte il valore di default. Qualsiasi stringa di
-caratteri pu@`o essere usata come
-@dfn{separatore di campo in output} impostando la variabile
-predefinita @code{OFS}. Il valore iniziale di questa variabile @`e
-la stringa @w{@code{" "}} (cio@`e, uno spazio singolo).
-
-L'output di un'istruzione @code{print} completa @`e detto un @dfn{record di
-output}. Ogni istruzione @code{print} stampa un record di output, e alla fine
-ci aggiunge una stringa detta @dfn{separatore record in output} (o
-@code{ORS}). Il valore iniziale di @code{ORS} @`e la stringa @code{"\n"}
-(cio@`e, un carattere di ritorno a capo). Quindi, ogni istruzione
-@code{print} normalmente genera [almeno] una riga a s@'e stante.
-
-@cindex output, record
-@cindex separatore di record in output, si veda @code{ORS}, variabile
-@cindex @code{ORS}, variabile
-@cindex @code{BEGIN}, criterio di ricerca, variabili @code{OFS}/@code{ORS}, assegnare valori a
-Per cambiare il tipo di separazione in output di campi e record, si impostano
-valori differenti alle variabili @code{OFS} e @code{ORS}. Il posto pi@`u
-indicato per farlo @`e nella regola @code{BEGIN}
-(@pxref{BEGIN/END}), in modo che l'assegnazione abbia effetto prima
-dell'elaborazione di ogni record in input. Questi valori si possono
-anche impostare dalla riga di comando, prima della lista dei file in input,
-oppure usando l'opzione della riga di comando @option{-v}
-(@pxref{Opzioni}).
-L'esempio seguente stampa il primo e il secondo campo di ogni record in input,
-separati da un punto e virgola, con una riga vuota aggiunta dopo ogni
-ritorno a capo:
-
-
-@example
-$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
-> @kbd{@{ print $1, $2 @}' mail-list}
-@print{} Amelia;555-5553
-@print{}
-@print{} Anthony;555-3412
-@print{}
-@print{} Becky;555-7685
-@print{}
-@print{} Bill;555-1675
-@print{}
-@print{} Broderick;555-0542
-@print{}
-@print{} Camilla;555-2912
-@print{}
-@print{} Fabius;555-1234
-@print{}
-@print{} Julie;555-6699
-@print{}
-@print{} Martin;555-6480
-@print{}
-@print{} Samuel;555-3430
-@print{}
-@print{} Jean-Paul;555-2127
-@print{}
-@end example
-
-Se il valore di @code{ORS} non contiene un ritorno a capo, l'output del
-programma viene scritto tutto su un'unica riga.
-
-@node OFMT
-@section Controllare l'output di numeri con @code{print}
-@cindex numerico, formato di output
-@cindex formati numerici di output
-Quando si stampano valori numerici con l'istruzione @code{print},
-@command{awk} converte internamente ogni numero in una stringa di caratteri
-e stampa quella stringa. @command{awk} usa la funzione @code{sprintf()}
-per effettuare questa conversione
-(@pxref{Funzioni per stringhe}).
-Per ora, basta dire che la funzione @code{sprintf()}
-accetta una @dfn{specifica di formato} che indica come formattare
-i numeri (o le stringhe), e che ci sono svariati modi per formattare i
-numeri. Le differenti specifiche di formato sono trattate pi@`u
-esaurientemente
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Lettere di controllo}.
-
-@cindexawkfunc{sprintf}
-@cindex @code{OFMT}, variabile
-@cindex output, specificatore di formato@comma{} @code{OFMT}
-La variabile predefinita @code{OFMT} contiene la specifica di formato
-che @code{print} usa con @code{sprintf()} per convertire un numero in
-una stringa per poterla stampare.
-Il valore di default di @code{OFMT} @`e @code{"%.6g"}.
-Il modo in cui @code{print} stampa i numeri si pu@`o cambiare
-fornendo una specifica di formato differente
-per il valore di @code{OFMT}, come mostrato nell'esempio seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{OFMT = "%.0f" # Stampa numeri come interi (arrotonda)}
-> @kbd{print 17.23, 17.54 @}'}
-@print{} 17 18
-@end example
-
-@noindent
-@cindex angolo buio, variabile @code{OFMT}
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex variabile @code{OFMT}, POSIX @command{awk} e
-Per lo standard POSIX, il comportamento di @command{awk} @`e indefinito
-se @code{OFMT} contiene qualcosa di diverso da una specifica di conversione
-di un numero a virgola mobile.
-@value{DARKCORNER}
-
-@node Printf
-@section Usare l'istruzione @code{printf} per stampe sofisticate
-
-@cindex istruzione @code{printf}
-@cindex @code{printf}, istruzione
-@cindex output, formattato
-@cindex formattare l'output
-Per un controllo pi@`u ampio sul formato di output di quello fornito da
-@code{print}, si pu@`o usare @code{printf}.
-Con @code{printf} si pu@`o
-specificare lo spazio da utilizzare per ogni elemento, e anche le varie
-scelte di formattazione disponibile per i numeri (come la base da usare in
-output, se stampare con notazione esponenziale, se inserire un segno, e quante
-cifre stampare dopo il separatore decimale).
-
-@menu
-* Printf Fondamenti:: Sintassi dell'istruzione
- @code{printf}.
-* Lettere di controllo:: Lettere di controllo del formato.
-* Modificatori di formato:: Modificatori specifiche di formato.
-* Esempi su printf:: Numerosi esempi.
-@end menu
-
-@node Printf Fondamenti
-@subsection Sintassi dell'istruzione @code{printf}
-
-@cindex istruzione @code{printf}, sintassi dell'
-@cindex @code{printf}, sintassi dell'istruzione
-Una semplice istruzione @code{printf} @`e qualcosa di simile a questo:
-
-@example
-printf @var{formato}, @var{elemento1}, @var{elemento2}, @dots{}
-@end example
-
-@noindent
-Come nel caso di @code{print}, l'intera lista degli argomenti pu@`o
-facoltativamente essere racchiusa fra
-parentesi. Anche qui, le parentesi sono obbligatorie se l'espressione di
-qualche elemento usa l'operatore
-relazionale @samp{>}, che potrebbe
-essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
-
-@cindex specificatori di formato
-La differenza tra @code{printf} e @code{print} @`e l'argomento @var{formato}.
-Questo @`e un'espressione il cui valore @`e visto come una stringa;
-specifica come scrivere in output ognuno degli altri argomenti. @`E chiamata
-@dfn{stringa di formato}.
-
-La stringa di formato @`e molto simile a quella usata dalla funzione di
-libreria ISO C @code{printf()}. Buona parte del @var{formato} @`e testo da
-stampare cos@`{@dotless{i}} come @`e scritto.
-All'interno di questo testo ci sono degli @dfn{specificatori di formato},
-uno per ogni elemento da stampare.
-Ogni specificatore di formato richiede di stampare l'elemento successivo
-nella lista degli argomenti
-in quella posizione del formato.
-
-L'istruzione @code{printf} non aggiunge in automatico un ritorno a capo
-al suo output. Scrive solo quanto specificato dalla stringa di formato.
-Quindi, se serve un ritorno a capo, questo va incluso nella stringa di formato.
-Le variabili di separazione dell'output @code{OFS} e @code{ORS} non hanno
-effetto sulle istruzioni @code{printf}.
-Per esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{ORS = "\nAHI!\n"; OFS = "+"}
-> @kbd{msg = "Non v\47allarmate!"}
-> @kbd{printf "%s\n", msg}
-> @kbd{@}'}
-@print{} Non v'allarmate!
-@end example
-
-@noindent
-Qui, n@'e il @samp{+} n@'e l'esclamazione @samp{AHI!} compaiono nel messaggio
-in output.
-
-@node Lettere di controllo
-@subsection Lettere di controllo del formato
-@cindex istruzione @code{printf}, lettere di controllo del formato
-@cindex @code{printf}, istruzione, lettere di controllo del formato
-@cindex specificatori di formato, istruzione @code{printf}
-
-Uno specificatore di formato inizia col carattere @samp{%} e termina con
-una @dfn{lettera di controllo del formato}; e dice all'istruzione
-@code{printf} come stampare un elemento. La lettera di controllo del
-formato specifica che @emph{tipo}
-di valore stampare. Il resto dello specificatore di formato @`e costituito da
-@dfn{modificatori} facoltativi che controllano @emph{come} stampare il valore,
-per esempio stabilendo la larghezza del campo. Ecco una lista delle
-lettere di controllo del formato:
-
-@c @asis for docbook to come out right
-@table @asis
-@item @code{%c}
-Stampa un numero come un carattere; quindi, @samp{printf "%c",
-65} stampa la lettera @samp{A}. L'output per un valore costituito da una
-stringa @`e il primo carattere della stringa stessa.
-
-@cindex angolo buio, caratteri di controllo del formato
-@cindex @command{gawk}, caratteri di controllo del formato
-@quotation NOTA
-Lo standard POSIX richiede che il primo carattere di una stringa sia stampato.
-In localizzazioni con caratteri multibyte, @command{gawk} tenta di
-convertire i primi byte della stringa in un carattere multibyte valido
-e poi di stampare la codifica multibyte di quel carattere.
-Analogamente, nella stampa di un valore numerico, @command{gawk} ammette che
-il valore appartenga all'intervallo numerico di valori che possono essere
-contenuti in un carattere multibyte.
-Se la conversione alla codifica multibyte non riesce, @command{gawk}
-usa gli ultimi otto bit della cifra (quelli meno significativi) come
-carattere da stampare.
-
-Altre versioni di @command{awk} generalmente si limitano a stampare
-il primo byte di una stringa o i valori numerici che possono essere
-rappresentati in un singolo byte (0--255).
-@end quotation
-
-
-@item @code{%d}, @code{%i}
-Stampa un numero intero in base decimale.
-Le due lettere di controllo sono equivalenti.
-(La specificazione @samp{%i} @`e ammessa per compatibilit@`a con ISO C.)
-
-@item @code{%e}, @code{%E}
-Stampa un numero nella notazione scientifica (con uso di esponente).
-Per esempio:
-
-@example
-printf "%4.3e\n", 1950
-@end example
-
-@noindent
-stampa @samp{1.950e+03}, con un totale di quattro cifre significative, tre
-delle quali
-seguono il punto che separa la parte intera da quella decimale
-[in Italia si usa la virgola al posto del punto]
-(L'espressione @samp{4.3} rappresenta due modificatori,
-introdotti nella prossima @value{SUBSECTION}).
-@samp{%E} usa @samp{E} invece di @samp{e} nell'output.
-
-@item @code{%f}
-Stampa un numero in notazione a virgola mobile.
-Per esempio:
-
-@example
-printf "%4.3f", 1950
-@end example
-
-@noindent
-stampa @samp{1950.000}, con un totale di quattro cifre significative, tre
-delle quali vengono dopo il punto decimale.
-(L'espressione @samp{4.3} rappresenta due modificatori,
-introdotti nella prossima @value{SUBSECTION}).
-
-In sistemi che implementano il formato a virgola mobile, come specificato
-dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come
-@samp{-inf} o @samp{-infinity},
-e l'infinito positivo come
-@samp{inf} o @samp{infinity}.
-Il valore speciale ``not a number'' [non @`e un numero] viene scritto come
-@samp{-nan} o @samp{nan}
-(@pxref{Definizioni matematiche}).
-
-@item @code{%F}
-Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti
-in lettere maiuscole.
-
-Il formato @samp{%F} @`e un'estensione POSIX allo standard ISO C; non tutti
-i sistemi lo prevedono. In tali casi,
-@command{gawk} usa il formato @samp{%f}.
-
-@item @code{%g}, @code{%G}
-Stampa un numero usando o la notazione scientifica o quella a virgola
-mobile, scegliendo la forma pi@`u concisa; se il risultato @`e stampato usando la
-notazione scientifica, @samp{%G} usa @samp{E} invece di @samp{e}.
-
-@item @code{%o}
-Stampa un numero intero in ottale, senza segno
-(@pxref{Numeri non-decimali}).
-
-@item @code{%s}
-Stampa una stringa.
-
-@item @code{%u}
-Stampa un numero intero decimale, senza segno.
-(Questo formato @`e poco usato, perch@'e tutti i numeri in @command{awk}
-sono a virgola mobile; @`e disponibile principalmente per compatibilit@`a col
-linguaggio C.)
-
-@item @code{%x}, @code{%X}
-Stampa un intero esadecimale senza segno;
-@samp{%X} usa le lettere da @samp{A} a @samp{F}
-invece che da @samp{a} a @samp{f}
-(@pxref{Numeri non-decimali}).
-
-@item @code{%%}
-Stampa un solo carattere @samp{%}.
-Questa notazione non serve per stampare alcun
-argomento e ignora eventuali modificatori.
-@end table
-
-@cindex angolo buio, caratteri di controllo del formato
-@cindex @command{gawk}, caratteri di controllo del formato
-@quotation NOTA
-Quando si usano lettere di controllo del formato per numeri interi
-per stampare valori esterni all'intervallo massimo disponibile nel
-linguaggio C per i numeri interi,
-@command{gawk} usa lo
-specificatore di formato @samp{%g}. Se si specifica l'opzione @option{--lint}
-sulla riga di comando (@pxref{Opzioni}), @command{gawk}
-emette un messaggio di avvertimento. Altre versioni di @command{awk} possono
-stampare valori non validi, o comportarsi in modo completamente differente.
-@value{DARKCORNER}
-@end quotation
-
-@node Modificatori di formato
-@subsection Modificatori per specifiche di formato @code{printf}
-
-@cindex istruzione @code{printf}, modificatori
-@cindex @code{printf}, istruzione, modificatori
-@cindex modificatori@comma{} in specificatori di formato
-Una specifica di formato pu@`o anche includere dei @dfn{modificatori} che
-possono controllare che parte stampare del valore dell'elemento, e anche
-quanto spazio utilizzare per stamparlo.
-I modificatori sono posizionati tra il @samp{%} e la lettera che controlla
-il formato.
-Negli esempi seguenti verr@`a usato il simbolo del punto elenco ``@bullet{}'' per
-rappresentare
-spazi nell'output. Questi sono i modificatori previsti, nell'ordine in
-cui possono apparire:
-
-@table @asis
-@cindex differenze tra @command{awk} e @command{gawk}, tra istruzioni @code{print} e @code{printf}
-@cindex istruzione @code{printf}, specificatori posizionali
-@cindex @code{printf}, istruzione, specificatori posizionali
-@c the code{} does NOT start a secondary
-@cindex specificatori posizionali, istruzione @code{printf}
-@item @code{@var{N}$}
-Una costante intera seguita da un @samp{$} @`e uno @dfn{specificatore posizionale}.
-Normalmente, le specifiche di formato sono applicate agli argomenti
-nell'ordine in cui appaiono nella stringa di formato. Con uno specificatore
-posizionale, la specifica di formato @`e applicata a un argomento
-indicato per numero, invece che a quello che
-sarebbe il prossimo argomento nella lista. Gli specificatori posizionali
-iniziano a contare partendo da uno. Quindi:
-
-@example
-printf "%s %s\n", "Non", "v'allarmate"
-printf "%2$s %1$s\n", "v'allarmate", "Non"
-@end example
-
-@noindent
-stampa per due volte il famoso consiglio amichevole.
-
-A prima vista, questa funzionalit@`a non sembra di grande utilit@`a.
-Si tratta in effetti di un'estensione @command{gawk}, pensata per essere
-usata nella traduzione di messaggi emessi in fase di esecuzione.
-@xref{Ordinamento di printf},
-che descrive come e perch@'e usare specificatori posizionali.
-Per ora li possiamo ignorare.
-
-@item - @code{-} (Segno meno)
-Il segno meno, usato prima del modificatore di larghezza (si veda pi@`u avanti
-in questa lista),
-richiede di allineare a sinistra
-l'argomento mantenendo la larghezza specificata. Normalmente, l'argomento
-@`e stampato allineato a destra, con la larghezza specificata. Quindi:
-
-@example
-printf "%-6s", "pippo"
-@end example
-
-@noindent
-stampa @samp{pippo@bullet{}}.
-
-@item @var{spazio}
-Applicabile a conversioni numeriche, richiede di inserire uno spazio prima
-dei valori positivi e un segno meno prima di quelli negativi.
-
-@item @code{+}
-Il segno pi@`u, usato prima del modificatore di larghezza (si veda pi@`u avanti
-in questa lista),
-richiede di mettere sempre un segno nelle conversioni numeriche, anche se
-il dato da formattare ha valore positivo. Il @samp{+} prevale sul
-modificatore @dfn{spazio}.
-
-@item @code{#}
-Richiede di usare una ``forma alternativa'' per alcune lettere di controllo.
-Per @samp{%o}, preporre uno zero.
-Per @samp{%x} e @samp{%X}, preporre @samp{0x} o @samp{0X} se il
-numero @`e diverso da zero.
-Per @samp{%e}, @samp{%E}, @samp{%f}, e @samp{%F}, il risultato deve contenere
-sempre un separatore decimale.
-Per @code{%g} e @code{%G}, gli zeri finali non significativi non sono
-tolti dal numero stampato.
-
-@item @code{0}
-Uno @samp{0} (zero) iniziale serve a richiedere che l'output sia
-riempito con zeri (invece che con spazi), prima delle cifre significative.
-Questo si applica solo ai formati di output di tipo numerico.
-Questo @dfn{flag} ha un effetto solo se la larghezza del campo @`e maggiore
-di quella del valore da stampare.
-
-@item @code{'}
-Un carattere di apice singolo o un apostrofo @`e un'estensione POSIX allo
-standard ISO C.
-Indica che la parte intera di un valore a virgola mobile, o la parte intera
-di un valore decimale intero, ha un carattere di separazione delle migliaia.
-Ci@`o @`e applicabile solo alle localizzazioni che prevedono un tale carattere.
-Per esempio:
-
-@example
-$ @kbd{cat migliaia.awk} @ii{Visualizza il programma sorgente}
-@print{} BEGIN @{ printf "%'d\n", 1234567 @}
-$ @kbd{LC_ALL=C gawk -f migliaia.awk}
-@print{} 1234567 @ii{Risultato nella localizzazione} "C"
-$ @kbd{LC_ALL=en_US.UTF-8 gawk -f migliaia.awk}
-@print{} 1,234,567 @ii{Risultato nella localizzazione UTF inglese americana}
-@end example
-
-@noindent
-Per maggiori informazioni relative a localizzazioni e internazionalizzazioni,
-si veda @ref{Localizzazioni}.
-
-@quotation NOTA
-Il @dfn{flag} @samp{'} @`e una funzionalit@`a interessante, ma utilizza un
-carattere che @`e fonte di complicazioni, perch@'e risulta difficila da usare nei
-programmi scritti direttamente sulla riga di comando. Per informazioni sui
-metodi appropriati per gestire la cosa, si veda @ref{Protezione}.
-@end quotation
-
-@item @var{larghezza}
-Questo @`e un numero che specifica la larghezza minima che deve occupare un
-campo. L'inserimento di un numero tra il segno @samp{%} e il carattere
-di controllo del formato fa s@`{@dotless{i}} che il campo si espanda a quella larghezza.
-Il modo di default per fare questo @`e di aggiungere degli spazi a
-sinistra. Per esempio:
-
-@example
-printf "%6s", "pippo"
-@end example
-
-@noindent
-stampa @samp{@bullet{}pippo}.
-
-il valore di @var{larghezza} indica la larghezza minima, non la massima. Se
-il valore dell'elemento richiede pi@`u caratteri della @var{larghezza}
-specificata, questa pu@`o essere aumentata secondo necessit@`a.
-Quindi, per esempio:
-
-@example
-printf "%6s", "pippo-pluto"
-@end example
-
-@noindent
-stampa @samp{pippo-pluto}.
-
-Anteponendo un segno meno alla @var{larghezza} si richiede che l'output sia
-esteso con spazi a destra, invece che a sinistra.
-
-@item @code{.@var{precisione}}
-Un punto, seguito da una costante intera
-specifica la precisione da usare nella stampa.
-Il tipo di precisione varia a seconda della lettera di controllo:
-
-@table @asis
-@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
-Minimo numero di cifre da stampare.
-
-@item @code{%e}, @code{%E}, @code{%f}, @code{%F}
-Numero di cifre alla destra del separatore decimale.
-
-@item @code{%g}, @code{%G}
-Massimo numero di cifre significative.
-
-@item @code{%s}
-Massimo numero di caratteri della stringa che possono essere stampati.
-@end table
-
-Quindi, l'istruzione:
-
-@example
-printf "%.4s", "foobar"
-@end example
-
-@noindent
-stampa @samp{foob}.
-@end table
-
-Le funzionalit@`a di @var{larghezza} e @var{precisione} dinamiche (cio@`e,
-@code{"%*.*s"}) disponibili nell'istruzione @code{printf} della libreria C sono
-utilizzabili.
-Invece che fornire esplicitamente una @var{larghezza} e/o una @var{precisione}
-nella stringa di formato, queste sono fornite come parte della lista degli
-argomenti. Per esempio:
-
-@example
-w = 5
-p = 3
-s = "abcdefg"
-printf "%*.*s\n", w, p, s
-@end example
-
-@noindent
-equivale esattamente a:
-
-@example
-s = "abcdefg"
-printf "%5.3s\n", s
-@end example
-
-@noindent
-Entrambi i programmi stampano @samp{@w{@bullet{}@bullet{}abc}}.
-Versioni pi@`u datate di @command{awk} non consentivano questa possibilit@`a.
-Dovendo usare una di queste versioni, @`e possibile simulare questa
-funzionalit@`a usando la concatenazione per costruire una stringa di formato,
-come per esempio:
-
-@example
-w = 5
-p = 3
-s = "abcdefg"
-printf "%" w "." p "s\n", s
-@end example
-
-@noindent
-Questo codice non @`e di facile lettura, ma funziona.
-
-@c @cindex controlli @command @{lint}
-@cindex debug, errori fatali, @code{printf}, stringhe di formato
-@cindex POSIX @command{awk}, stringhe di formato @code{printf} e
-Chi programma in C probabilmente @`e abituato a specificare modificatori
-addizionali (@samp{h}, @samp{j}, @samp{l}, @samp{L}, @samp{t} e @samp{z}) nelle
-stringhe di formato di @code{printf}. Questi modificatori non sono validi
-in @command{awk}. La maggior parte della implementazioni di @command{awk} li
-ignora senza emettere messaggi. Se si specifica l'opzione @option{--lint}
-sulla riga di comando (@pxref{Opzioni}), @command{gawk} emette un messaggio
-di avvertimento quando li si usa. Se si specifica l'opzione @option{--posix},
-il loro uso genera un errore fatale.
-
-@node Esempi su printf
-@subsection Esempi d'uso di @code{printf}
-
-Il seguente semplice esempio mostra
-come usare @code{printf} per preparare una tabella allineata:
-
-@example
-awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-@noindent
-Questo comando
-stampa i nomi delle persone (@code{$1}) nel file
-@file{mail-list} come una stringa di 10 caratteri allineati a sinistra.
-Stampa anche i numeri telefonici (@code{$2}) a fianco, sulla stessa riga.
-Il risultato @`e una tabella allineata, contenente due colonne, di nomi e numeri
-telefonici, come si pu@`o vedere qui:
-
-@example
-$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
-@print{} Amelia 555-5553
-@print{} Anthony 555-3412
-@print{} Becky 555-7685
-@print{} Bill 555-1675
-@print{} Broderick 555-0542
-@print{} Camilla 555-2912
-@print{} Fabius 555-1234
-@print{} Julie 555-6699
-@print{} Martin 555-6480
-@print{} Samuel 555-3430
-@print{} Jean-Paul 555-2127
-@end example
-
-In questo caso, i numeri telefonici debbono essere stampati come stringhe,
-poich@'e includono un trattino. Una stampa dei numeri telefonici come numeri
-semplici avrebbe visualizzato solo le prime tre cifre: @samp{555},
-e questo non sarebbe stato di grande utilit@`a.
-
-Non era necessario specificare una larghezza per i numeri telefonici poich@'e
-sono nell'ultima colonnna di ogni riga. Non c'@`e bisogno di avere un
-allineamento di spazi dopo di loro.
-
-La tabella avrebbe potuto essere resa pi@`u leggibile aggiungendo
-intestazioni in cima
-alle colonne. Questo si pu@`o fare usando una regola @code{BEGIN}
-(@pxref{BEGIN/END})
-in modo che le intestazioni siano stampate una sola volta, all'inizio del
-programma @command{awk}:
-
-@example
-awk 'BEGIN @{ print "Nome Numero"
- print "---- ------" @}
- @{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-L'esempio precedente usa sia l'istruzione @code{print} che l'istruzione
-@code{printf} nello stesso programma. Si possono ottenere gli stessi
-risultati usando solo istruzioni @code{printf}:
-
-@example
-awk 'BEGIN @{ printf "%-10s %s\n", "Nome", "Numero"
- printf "%-10s %s\n", "----", "------" @}
- @{ printf "%-10s %s\n", $1, $2 @}' mail-list
-@end example
-
-@noindent
-Stampare ogni intestazione di colonna con la stessa specifica di formato
-usata per gli elementi delle colonne ci d@`a la certezza che le intestazioni
-sono allineate esattamente come le colonne.
-
-Il fatto che usiamo per tre volte la stessa specifica di formato si pu@`o
-evidenziare memorizzandola in una variabile, cos@`{@dotless{i}}:
-
-@example
-awk 'BEGIN @{ format = "%-10s %s\n"
- printf format, "Nome", "Numero"
- printf format, "----", "------" @}
- @{ printf format, $1, $2 @}' mail-list
-@end example
-
-
-@node Ridirezione
-@section Ridirigere l'output di @code{print} e @code{printf}
-
-@cindex output, ridirezione
-@cindex ridirezione dell'output
-@cindex @option{--sandbox}, opzione, ridirezione dell'output con @code{print}, @code{printf}
-Finora, l'output di @code{print} e @code{printf} @`e stato diretto
-verso lo standard output,
-che di solito @`e lo schermo. Sia @code{print} che @code{printf} possono
-anche inviare il loro output in altre direzioni.
-@`E quel che si chiama @dfn{ridirezione}.
-
-@quotation NOTA
-Quando si specifica @option{--sandbox} (@pxref{Opzioni}),
-la ridirezione dell'output verso file, @dfn{pipe} e coprocessi non @`e
-consentita.
-@end quotation
-
-Una ridirezione @`e posta dopo l'istruzione @code{print} o @code{printf}.
-Le ridirezioni in @command{awk} sono scritte come le ridirezioni nei
-comandi della shell, l'unica differenza @`e che si trovano all'interno di
-un programma @command{awk}.
-
-@c the commas here are part of the see also
-@cindex istruzione @code{print}, si veda anche ridirezione dell'output
-@cindex istruzione @code{printf}, si veda anche ridirezione dell'output
-Ci sono quattro forme di ridirezione dell'output:
-output scritto su un file,
-output aggiunto in fondo a un file,
-output che fa da input a un altro comando (usando una @dfn{pipe}) e
-output diretto a un coprocesso.
-Vengono descritti per l'istruzione @code{print},
-ma funzionano allo stesso modo per @code{printf}:
-
-@table @code
-@cindex @code{>} (parentesi acuta destra), operatore @code{>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>} (I/O)
-@cindex operatori, input/output
-@item print @var{elementi} > @var{output-file}
-Questa ridirezione stampa gli elementi nel file di output chiamato
-@var{output-file}. Il @value{FN} @var{output-file} pu@`o essere
-una qualsiasi espressione. Il suo valore @`e trasformato in una stringa e
-quindi usato come
-@iftex
-@value{FN} (@pxrefil{Espressioni}).
-@end iftex
-@ifnottex
-@value{FN} (@pxref{Espressioni}).
-@end ifnottex
-Quando si usa questo tipo di ridirezione, il file @var{output-file} viene
-cancellato prima che su di esso sia stato scritto il primo record in uscita.
-Le successive scritture verso lo stesso file @var{output-file} non cancellano
-@var{output-file}, ma continuano ad aggiungervi record.
-(Questo comportamento @`e differente da quello delle ridirezioni usate negli
-script della shell.)
-Se @var{output-file} non esiste, viene creato. Per esempio, ecco
-come un programma @command{awk} pu@`o scrivere una lista di nomi di persone
-su un file di nome @file{lista-nomi}, e una lista di numeri telefonici
-su un altro file di nome @file{lista-telefoni}:
-
-@example
-$ @kbd{awk '@{ print $2 > "lista-telefoni"}
-> @kbd{print $1 > "lista-nomi" @}' mail-list}
-$ @kbd{cat lista-telefoni}
-@print{} 555-5553
-@print{} 555-3412
-@dots{}
-$ @kbd{cat lista-nomi}
-@print{} Amelia
-@print{} Anthony
-@dots{}
-@end example
-
-@noindent
-Ogni file in output contiene un nome o un numero su ogni riga.
-
-@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
-@item print @var{elementi} >> @var{output-file}
-Questa ridirezione stampa gli elementi in un file di output preesistente,
-di nome @var{output-file}. La differenza tra questa ridirezione e quella
-con un solo @samp{>} @`e che il precedente contenuto (se esiste) di
-@var{output-file} non viene cancellato. Invece, l'output di @command{awk} @`e
-aggiunto in fondo al file.
-Se @var{output-file} non esiste, viene creato.
-
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex @dfn{pipe}, output
-@cindex output, a @dfn{pipe}
-@item print @var{elementi} | @var{comando}
-@`E possibile inviare output a un altro programma usando una @dfn{pipe}
-invece di inviarlo a un file. Questa ridirezione apre una @dfn{pipe} verso
-@var{comando}, e invia i valori di @var{elementi}, tramite questa
-@dfn{pipe}, a un altro processo creato per eseguire @var{comando}.
-
-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,
-il seguente programma produce due file, una lista non ordinata di nomi di
-persone e una lista ordinata in ordine alfabetico inverso:
-
-@ignore
-10/2000:
-This isn't the best style, since COMMAND is assigned for each
-record. It's done to avoid overfull hboxes in TeX. Leave it
-alone for now and let's hope no-one notices.
-@end ignore
-
-@example
-awk '@{ print $1 > "nomi.non.ordinati"
- comando = "sort -r > nomi.ordinati"
- print $1 | comando @}' mail-list
-@end example
-
-La lista non ordinata @`e scritta usando una ridirezione normale, mentre
-la lista ordinata @`e scritta inviando una @dfn{pipe} in input al programma
-di utilit@`a @command{sort}.
-
-Il prossimo esempio usa la ridirezione per inviare un messaggio alla
-mailing list @code{bug-sistema}. Questo pu@`o tornare utile se si hanno
-problemi con uno script @command{awk} eseguito periodicamente per la
-manutenzione del sistema:
-
-@example
-report = "mail bug-sistema"
-print("Script awk in errore:", $0) | report
-print("al record numero", FNR, "di", NOME_FILE) | report
-close(report)
-@end example
-
-La funzione @code{close()} @`e stata chiamata perch@'e @`e una buona idea chiudere
-la @dfn{pipe} non appena tutto l'output da inviare alla @dfn{pipe} @`e stato
-inviato. @xref{Chiusura file e @dfn{pipe}}
-per maggiori informazioni.
-
-Questo esempio illustra anche l'uso di una variabile per rappresentare
-un @var{file} o un @var{comando}; non @`e necessario usare sempre
-una costante stringa. Usare una variabile @`e di solito una buona idea,
-perch@'e (se si vuole riusare lo stesso file o comando)
-@command{awk} richiede che il valore della stringa sia sempre scritto
-esattamente nello stesso modo.
-
-@cindex coprocessi
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
-@item print @var{elementi} |& @var{comando}
-Questa ridirezione stampa gli elementi nell'input di @var{comando}.
-La differenza tra questa ridirezione e quella
-con la sola @samp{|} @`e che l'output da @var{comando}
-pu@`o essere letto tramite @code{getline}.
-Quindi, @var{comando} @`e un @dfn{coprocesso}, che lavora in parallelo al
-programma @command{awk}, ma @`e al suo servizio.
-
-Questa funzionalit@`a @`e un'estensione @command{gawk}, e non @`e disponibile in
-POSIX @command{awk}.
-@ifnotdocbook
-@xref{Getline coprocesso},
-per una breve spiegazione.
-@ref{I/O bidirezionale}
-per un'esposizione pi@`u esauriente.
-@end ifnotdocbook
-@ifdocbook
-@xref{Getline coprocesso}
-per una breve spiegazione.
-@xref{I/O bidirezionale}
-per un'esposizione pi@`u esauriente.
-@end ifdocbook
-@end table
-
-Ridirigere l'output usando @samp{>}, @samp{>>}, @samp{|} o @samp{|&}
-richiede al sistema di aprire un file, una @dfn{pipe} o un coprocesso solo se
-il particolare @var{file} o @var{comando} che si @`e specificato non @`e gi@`a
-stato utilizzato in scrittura dal programma o se @`e stato chiuso
-dopo l'ultima scrittura.
-
-@cindex debug, stampare
-@`E un errore comune usare la ridirezione @samp{>} per la prima istruzione
-@code{print} verso un file, e in seguito usare @samp{>>} per le successive
-scritture in output:
-
-@example
-# inizializza il file
-print "Non v'allarmate" > "guida.txt"
-@dots{}
-# aggiungi in fondo al file
-print "Evitate generatori di improbabilit@`a" >> "guide.txt"
-@end example
-
-@noindent
-Questo @`e il modo in cui le ridirezioni devono essere usate lavorando
-con la shell. Ma in @command{awk} ci@`o non @`e necessario. In casi di questo
-genere, un programma dovrebbe
-usare @samp{>} per tutte le istruzioni @code{print}, perch@'e il file di
-output @`e aperto una sola volta.
-(Usando sia @samp{>} che @samp{>>} nello stesso programma, l'output @`e prodotto
-nell'ordine atteso.
-Tuttavia il mischiare gli operatori per lo stesso file @`e sintomo di uno
-stile di programmazione inelegante, e pu@`o causare confusione in chi legge
-il programma.)
-
-@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
-@cindex problemi di implementazione, @command{gawk}, limitazioni
-@cindex @command{awk}, problemi di implementazione, @dfn{pipe}
-@cindex @command{gawk}, problemi di implementazione, @dfn{pipe}
-@ifnotinfo
-Come visto in precedenza
-(@pxref{Note su getline}),
-molte
-@end ifnotinfo
-@ifnottex
-@ifnotdocbook
-@ifnothtml
-Molte
-@end ifnothtml
-@end ifnotdocbook
-@end ifnottex
-tra le pi@`u vecchie implementazioni di
-@command{awk} limitano il numero di @dfn{pipeline} che un programma
-@command{awk} pu@`o mantenere aperte a una soltanto! In @command{gawk}, non c'@`e
-un tale limite. @command{gawk} consente a un programma di
-aprire tante @dfn{pipeline} quante ne consente il sistema operativo su cui
-viene eseguito.
-
-@cindex sidebar, Inviare @dfn{pipe} alla @command{sh}
-@ifdocbook
-@docbook
-<sidebar><title>Inviare @dfn{pipe} alla @command{sh}</title>
-@end docbook
-
-@cindex shell, inviare comandi tramite @dfn{pipe} alla
-
-Una maniera particolarmente efficace di usare la ridirezione @`e quella di
-preparare righe di comando da passare
-come @dfn{pipe} alla shell,
-@command{sh}. Per esempio, si supponga di avere una lista di file provenienti
-da un sistema in cui tutti i
-@value{FNS} sono memorizzari in maiuscolo, e di volerli rinominare
-in modo da avere nomi tutti in
-minuscolo. Il seguente programma @`e
-sia semplice che efficiente:
-
-@c @cindex @command{mv} utility
-@example
-@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
-
-END @{ close("sh") @}
-@end example
-
-La funzione @code{tolower()} restituisce la stringa che gli viene passata
-come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
-(@pxref{Funzioni per stringhe}).
-Il programma costruisce una lista di righe di comando,
-usando il programma di utilit@`a @command{mv} per rinominare i file.
-Poi invia la lista alla shell per l'elaborazione.
-
-@xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
-righe di comando da passare alla shell.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Inviare @dfn{pipe} alla @command{sh}}
-
-
-@cindex shell, inviare comandi tramite @dfn{pipe} alla
-
-Una maniera particolarmente efficace di usare la ridirezione @`e quella di
-preparare righe di comando da passare
-come @dfn{pipe} alla shell,
-@command{sh}. Per esempio, si supponga di avere una lista di file provenienti
-da un sistema in cui tutti i
-@value{FNS} sono memorizzari in maiuscolo, e di volerli rinominare
-in modo da avere nomi tutti in
-minuscolo. Il seguente programma @`e
-sia semplice che efficiente:
-
-@c @cindex @command{mv} utility
-@example
-@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
-
-END @{ close("sh") @}
-@end example
-
-La funzione @code{tolower()} restituisce la stringa che gli viene passata
-come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
-(@pxref{Funzioni per stringhe}).
-Il programma costruisce una lista di righe di comando,
-usando il programma di utilit@`a @command{mv} per rinominare i file.
-Poi invia la lista alla shell per l'elaborazione.
-
-@xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
-righe di comando da passare alla shell.
-@end cartouche
-@end ifnotdocbook
-
-@node FD speciali
-@section File speciali per flussi standard di dati pre-aperti
-@cindex standard input
-@cindex input, standard
-@cindex standard output
-@cindex output, standard
-@cindex errore, output
-@cindex standard error
-@cindex descrittori di file
-@cindex file, descrittori, si veda descrittori di file
-
-I programmi in esecuzione hanno convenzionalmente tre flussi di input e
-output a disposizione, gi@`a aperti per la lettura e la scrittura.
-Questi sono noti come
-lo @dfn{standard input}, lo @dfn{standard output} e lo @dfn{standard
-error output}. A questi flussi aperti (e a tutti gli altri file aperti o
-@dfn{pipe}) si fa spesso riferimento usando il termine tecnico
-@dfn{descrittori di file} [FD].
-
-Questi flussi sono, per default, associati alla tastiera e allo schermo,
-ma spesso sono ridiretti, nella shell, utilizzando gli operatori
-@samp{<}, @samp{<<}, @samp{>}, @samp{>>}, @samp{>&} e @samp{|}.
-Lo standard error @`e tipicamente usato per scrivere messaggi di errore;
-la ragione per cui ci sono due flussi distinti,
-standard output e standard error, @`e per poterli ridirigere indipendentemente
-l'uno dall'altro.
-
-@cindex differenze tra @command{awk} e @command{gawk}, messaggi di errore
-@cindex gestione errori
-@cindex errori, gestione degli
-Nelle tradizionali implementazioni di @command{awk}, il solo modo per
-scrivere un messaggio di errore allo
-standard error in un programma @command{awk} @`e il seguente:
-
-@example
-print "Ho trovato un errore grave!" | "cat 1>&2"
-@end example
-
-@noindent
-Con quest'istruzione si apre una @dfn{pipeline} verso un comando della shell
-che @`e in grado di accedere al flusso di standard error che eredita dal
-processo @command{awk}.
-@c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
-Questo @`e molto poco elegante, e richiede anche di innescare un processo
-separato. Per questo chi scrive programmi @command{awk} spesso
-non usa questo metodo. Invece, invia i messaggi di errore allo
-schermo, in questo modo:
-
-@example
-print "Ho trovato un errore grave!" > "/dev/tty"
-@end example
-
-@noindent
-(@file{/dev/tty} @`e un file speciale fornito dal sistema operativo
-ed @`e connesso alla tastiera e allo schermo. Rappresenta il
-``terminale'',@footnote{``tty'' in @file{/dev/tty} @`e un'abbreviazione di
-``TeleTYpe'' [telescrivente], un terminale seriale.} che nei sistemi odierni
-@`e una tastiera e uno schermo, e non una @dfn{console} seriale).
-Questo ha generalmente lo stesso effetto, ma non @`e sempre detto: sebbene il
-flusso di standard error sia solitamente diretto allo schermo, potrebbe
-essere stato
-ridiretto; se questo @`e il caso, scrivere verso lo schermo non serve. In
-effetti, se @command{awk} @`e chiamato da un lavoro che non @`e eseguito
-interattivamente,
-pu@`o non avere a disposizione alcun terminale su cui scrivere.
-In quel caso, l'apertura di @file{/dev/tty} genera un errore.
-
-@command{gawk}, BWK @command{awk}, e @command{mawk} mettono a disposizione
-speciali @value{FNS} per accedere ai tre flussi standard.
-Se il @value{FN} coincide con uno di questi nomi speciali, quando
-@command{gawk} (o uno degli altri) ridirige l'input o l'output, usa
-direttamente il descrittore di file identificato dal @value{FN}. Questi
-@value{FNS} sono gestiti cos@`{@dotless{i}} in tutti i sistemi operativi nei quali
-@command{gawk} @`e disponibile, e non solo in quelli che aderiscono allo
-standard POSIX:
-
-@cindex estensioni comuni, file speciale @code{/dev/stdin}
-@cindex estensioni comuni, file speciale @code{/dev/stdout}
-@cindex estensioni comuni, file speciale @code{/dev/stderr}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdin}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdout}
-@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stderr}
-@cindex nomi di file, flussi standard in @command{gawk}
-@cindex @code{/dev/@dots{}}, file speciali
-@cindex file, file speciali @code{/dev/@dots{}}
-@cindex @code{/dev/fd/@var{N}}, file speciali (in @command{gawk})
-@table @file
-@item /dev/stdin
-Lo standard input (descrittore di file 0).
-
-@item /dev/stdout
-Lo standard output (descrittore di file 1).
-
-@item /dev/stderr
-Lo standard error output (descrittore di file 2).
-@end table
-
-Usando questa funzionalit@`a
-la maniera corretta di scrivere un messaggio di errore diviene quindi:
-
-@example
-print "Ho trovato un errore grave!" > "/dev/stderr"
-@end example
-
-@cindex debug, doppio apice con nomi di file
-Si noti l'uso di doppi apici per racchiudere il @value{FN}.
-Come per ogni altra ridirezione, il valore dev'essere una stringa.
-@`E un errore comune omettere i doppi apici, il che conduce a
-risultati inattesi.
-
-@command{gawk} non tratta questi @value{FNS} come speciali quando opera
-in modalit@`a di compatibilit@`a POSIX. Comunque, poich@'e BWK @command{awk}
-li prevede, @command{gawk} li ammette anche quando viene
-invocato con l'opzione @option{--traditional} (@pxref{Opzioni}).
-
-@node File speciali
-@section @value{FFNS} speciali in @command{gawk}
-@cindex @command{gawk}, nomi di file in
-
-Oltre all'accesso a standard input, standard output e standard error,
-@command{gawk} consente di accedere a ogni descrittore di file aperto.
-In pi@`u, ci sono dei @value{FNS} speciali riservati per accedere a
-reti TCP/IP.
-
-@menu
-* Altri file ereditati:: Accedere ad altri file aperti con
- @command{gawk}.
-* Reti speciali:: File speciali per comunicazioni con la rete.
-* Avvertimenti speciali:: Cose a cui prestare attenzione.
-@end menu
-
-@node Altri file ereditati
-@subsection Accedere ad altri file aperti con @command{gawk}
-
-Oltre ai valori speciali di @value{FNS}
-@code{/dev/stdin}, @code{/dev/stdout} e @code{/dev/stderr}
-gi@`a menzionati, @command{gawk} prevede una sintassi
-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}
-(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.
-@end table
-
-I @value{FNS} @file{/dev/stdin}, @file{/dev/stdout} e @file{/dev/stderr}
-sono essenzialmente alias per @file{/dev/fd/0}, @file{/dev/fd/1} e
-@file{/dev/fd/2}, rispettivamente. Comunque, i primi nomi sono pi@`u
-autoesplicativi.
-
-Si noti che l'uso di @code{close()} su un @value{FN} della forma
-@code{"/dev/fd/@var{N}"}, per numeri di descrittore di file
-oltre il due, effettivamente chiude il descrittore di file specificato.
-
-@node Reti speciali
-@subsection File speciali per comunicazioni con la rete
-@cindex reti, funzionalit@`a per
-@cindex TCP/IP, funzionalit@`a per
-
-I programmi @command{gawk}
-possono aprire una connessione bidirezionale
-TCP/IP, fungendo o da @dfn{client} o da @dfn{server}.
-Questo avviene usando uno speciale @value{FN} della forma:
-
-@example
-@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}
-@end example
-
-il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
-Il @var{protocollo} pu@`o essere @samp{tcp} o @samp{udp},
-e gli altri campi rappresentano gli altri dati essenziali
-necessari per realizzare una connessione di rete.
-Questi @value{FNS} sono usati con l'operatore @samp{|&} per comunicare
-con un coprocesso
-(@pxref{I/O bidirezionale}).
-Questa @`e una funzionalit@`a avanzata, qui riferita solo per completezza.
-Una spiegazione esauriente sar@`a fornita nella
-@ref{Reti TCP/IP}.
-
-@node Avvertimenti speciali
-@subsection Avvertimenti speciali sui @value{FNS}
-
-Sono qui elencate alcune cose da tener presente usando i
-@value{FNS} speciali forniti da @command{gawk}:
-
-@itemize @value{BULLET}
-@cindex modalit@`a compatibile di (@command{gawk}), nomi di file
-@cindex nomi di file, nella modalit@`a compatibile di @command{gawk}
-@item
-Il riconoscimento dei @value{FNS} per i tre file standard pre-aperti
-@`e disabilitato solo in modalit@`a POSIX.
-
-@item
-Il riconoscimento degli altri @value{FNS} speciali @`e disabilitato se
-@command{gawk} @`e in modalit@`a compatibile
-(o @option{--traditional} o @option{--posix};
-@pxref{Opzioni}).
-
-@item
-@command{gawk} interpreta @emph{sempre}
-questi @value{FNS} speciali.
-Per esempio, se si usa @samp{/dev/fd/4}
-per l'output, si scrive realmente sul descrittore di file 4, e non su un nuovo
-descrittore di file generato duplicando (con @code{dup()}) il descrittore
-file 4. Solitamente questo non ha importanza; comunque, @`e importante
-@emph{non} chiudere alcun file correlato ai descrittori di file 0, 1 e 2.
-Se lo si fa, il comportamente risultante @`e imprevedibile.
-@end itemize
-
-@node Chiusura file e @dfn{pipe}
-@section Chiudere ridirezioni in input e in output
-@cindex output, file in, si veda file in output
-@cindex input, file in, chiusura
-@cindex output, file in, chiusura
-@cindex @dfn{pipe}, chiusura
-@cindex coprocessi, chiusura
-@cindex @code{getline}, comando, coprocessi@comma{} usare dal
-
-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}),
-il file viene aperto (o il comando viene eseguito) solo la prima volta.
-A quel punto, il primo record in input @`e letto da quel file o comando.
-La prossima volta che lo stesso file o comando @`e usato con @code{getline},
-un altro record @`e letto da esso, e cos@`{@dotless{i}} via.
-
-Analogamente, quando un file o una @dfn{pipe} sono aperti in output,
-@command{awk} ricorda
-il @value{FN} o comando a essi associato, e le successive
-scritture verso lo stesso file o comando sono accodate alle precedenti
-scritture.
-Il file o la @dfn{pipe} rimangono aperti fino al termine dell'esecuzione
-di @command{awk}.
-
-@cindexawkfunc{close}
-Questo implica che sono necessari dei passi speciali per rileggere nuovamente
-lo stesso file dall'inizio, o per eseguire di nuovo un comando di shell
-(invece che leggere ulteriore output dal precedente comando). La funzione
-@code{close()} rende possibile fare queste cose:
-
-@example
-close(@var{NOME_FILE})
-@end example
-
-@noindent
-o:
-
-@example
-close(@var{comando})
-@end example
-
-l'argomento @var{NOME_FILE} o @var{comando} pu@`o essere qualsiasi espressione,
-il cui valore dev'essere @emph{esattamente} uguale alla stringa
-usata per aprire il file o eseguire il comando (spazi e altri caratteri
-``irrilevanti'' inclusi). Per esempio, se si apre una @dfn{pipe} cos@`{@dotless{i}}:
-
-@example
-"sort -r nomi" | getline pippo
-@end example
-
-@noindent
-essa va chiusa in questo modo:
-
-@example
-close("sort -r nomi")
-@end example
-
-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.
-Il precedente esempio cambia come segue:
-
-@example
-sortcom = "sort -r nomi"
-sortcom | getline pippo
-@dots{}
-close(sortcom)
-@end example
-
-@noindent
-Questo aiuta a evitare nei programmi @command{awk} errori di battitura
-difficili da scoprire. Queste sono alcune delle ragioni per cui @`e bene
-chiudere un file di output:
-
-@itemize @value{BULLET}
-@item
-Scrivere un file e rileggerlo in seguito all'interno dello stesso programma
-@command{awk}. Occorre chiudere il file dopo aver finito di scriverlo, e poi
-iniziare a rileggerlo con @code{getline}.
-
-@item
-Per scrivere numerosi file, uno dopo l'altro, nello stesso programma
-@command{awk}. Se i file non vengono chiusi, prima o poi @command{awk} pu@`o
-superare il limite di sistema per il numero di file aperti in un processo.
-@`E meglio chiudere ogni file quando il programma ha finito di scriverlo.
-
-@item
-Per terminare un comando. Quando l'output @`e ridiretto usando una @dfn{pipe},
-il comando che legge la @dfn{pipe} normalmente continua a tentare di leggere
-input finch@'e la @dfn{pipe} rimane aperta. Spesso questo vuol dire che
-il comando non pu@`o eseguire il compito a lui assegnato finch@'e la @dfn{pipe}
-non viene chiusa. Per esempio, se l'output @`e ridiretto al programma
-@command{mail}, il messaggio non @`e effettivamente inviato finch@'e la @dfn{pipe}
-non viene chiusa.
-
-@item
-Eseguire lo stesso programma una seconda volta, con gli stessi argomenti.
-Questo non equivale a fornire ulteriore input alla prima esecuzione!
-
-Per esempio, si supponga che una programma invii tramite una @dfn{pipe}
-dell'output al programma @command{mail}.
-Se invia parecchie linee ridirigendole a questa @dfn{pipe} senza chiuderla,
-queste costituiscono un solo messaggio di parecchie righe. Invece, se il
-programma chiude la @dfn{pipe} dopo ogni riga dell'output, allora ogni riga
-costituisce un messaggio separato.
-@end itemize
-
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex portabilit@`a, funzione @code{close()}
-@cindex funzione @code{close()}, portabilit@`a
-@cindex @code{close()}, funzione, portabilit@`a
-Se si usano file in numero superiore a quelli che il sistema permette
-di mantenere aperti,
-@command{gawk} tenta di riutilizzare i file aperti disponibili fra
-i @value{DF}. La possibilit@`a che @command{gawk} lo faccia dipende dalle
-funzionalit@`a del sistema operativo, e quindi non @`e detto che questo riesca
-sempre. @`E quindi sia una buona pratica
-che un buon suggerimento per la portabilit@`a quello di usare sempre
-@code{close()} sui file, una volta che si @`e finito di operare su di essi.
-In effetti, se si usano molte @dfn{pipe}, @`e fondamentale che i comandi
-vengano chiusi, una volta finita la loro elaborazione. Per esempio, si
-consideri qualcosa del tipo:
-
-@example
-@{
- @dots{}
- comando = ("grep " $1 " /qualche/file | un_mio_programma -q " $3)
- while ((comando | getline) > 0) @{
- @var{elabora output di} comando
- @}
- # qui serve close(comando)
-@}
-@end example
-
-Questo esempio crea una nuova @dfn{pipeline} a seconda dei dati contenuti in
-@emph{ogni} record.
-Senza la chiamata a @code{close()} indicata come commento, @command{awk}
-genera processi-figlio per eseguire i comandi, fino a che non finisce per
-esaurire i descrittori di file
-necessari per creare ulteriori @dfn{pipeline}.
-
-Sebbene ogni comando sia stato completato (come si deduce dal codice di
-fine-file restituito dalla @code{getline}), il processo-figlio non @`e
-terminato;@footnote{La terminologia tecnica @`e piuttosto macabra.
-Il processo-figlio terminato @`e chiamato ``zombie,'' e la pulizia alla fine
-dello stesso @`e chiamata ``reaping'' [mietitura].}
-@c Good old UNIX: give the marketing guys fits, that's the ticket
-inoltre, e questo @`e ci@`o che pi@`u ci interessa, il descrittore di file
-per la @dfn{pipe} non @`e chiuso e liberato finch@'e non si chiama
-@code{close()} o finch@'e il programma @command{awk} non termina.
-
-@code{close()} non fa nulla (e non emette messaggi) se le viene fornito come
-argomento una stringa che non rappresenta un file, una @dfn{pipe} o un
-coprocesso che sia stato aperto mediante una ridirezione. In quel caso,
-@code{close()} restituisce un valore di ritorno negativo, che indica un
-errore. Inoltre, @command{gawk} imposta @code{ERRNO}
-a una stringa che indica il tipo di errore.
-
-Si noti anche che @samp{close(NOME_FILE)} non ha effetti ``magici'' sul ciclo
-implicito che legge ogni record dei file indicati nella riga di comando.
-Si tratta, con ogni probabilit@`a, della chiusura di un file che non era mai
-stato aperto con una ridirezione,
-e per questo @command{awk} silenziosamente non fa nulla, tranne impostare un
-codice di ritorno negativo.
-
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O), @dfn{pipe}@comma{} chiusura
-Quando si usa l'operatore @samp{|&} per comunicare con un coprocesso,
-@`e talora utile essere in grado di chiudere un lato della @dfn{pipe}
-bidirezionale, senza chiudere l'altro lato.
-Questo @`e possibile fornendo un secondo argomento a @code{close()}.
-Come in ogni altra invocazione di @code{close()},
-il primo argomento @`e il nome del comando o file speciale usato
-per iniziare il coprocesso.
-Il secondo argomento dovrebbe essere una stringa, con uno dei due valori
-@code{"to"} [a] oppure @code{"from"} [da]. Maiuscolo/minuscolo non fa
-differenza. Poich@'e questa @`e una funzionalit@`a avanzata, la trattazione @`e
-rinviata alla
-@ref{I/O bidirezionale},
-che ne parla pi@`u dettagliatamente e fornisce un esempio.
-
-@cindex sidebar, Usare il valore di ritorno di @code{close()}
-@ifdocbook
-@docbook
-<sidebar><title>Usare il valore di ritorno di @code{close()}</title>
-@end docbook
-
-@cindex angolo buio, funzione @code{close()}
-@cindex funzione @code{close()}, valore di ritorno
-@cindex @code{close()}, funzione, valore di ritorno
-@cindex valore di ritorno@comma{} funzione @code{close()}
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex Unix @command{awk}, funzione @code{close()} e
-
-In molte versioni di Unix @command{awk}, la funzione @code{close()}
-@`e in realt@`a un'istruzione.
-@value{DARKCORNER}
-@`E un errore di sintassi tentare di usare il valore
-di ritorno da @code{close()}:
-
-@example
-comando = "@dots{}"
-comando | getline info
-retval = close(comando) # errore di sintassi in parecchi Unix awk
-@end example
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex variabile @code{ERRNO}, con funzione @command{close()}
-@cindex @code{ERRNO}, variabile, con funzione @command{close()}
-@command{gawk} gestisce @code{close()} come una funzione.
-Il valore di ritorno @`e @minus{}1 se l'argomento designa un file
-che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
-sistema nella chiusura del file o del processo.
-In tal caso, @command{gawk} imposta la variabile predefinita
-@code{ERRNO} a una stringa che descrive il problema.
-
-In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
-quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
-il valore di ritorno @`e quello restituito dal comando,
-come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
-della @value{PVERSION} 4.2, il valore di ritorno dopo la chiusura di
-una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
-contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
-Altrimenti, @`e il valore di ritorno dalla chiamata alle funzione
-di sistema @code{close()} o alla funzione C @code{fclose()}
-se si sta chiudendo un file in input o in output, rispettivamente.
-Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
-
-@float Tabella,table-close-pipe-return-values
-@caption{Valori di ritorno dalla @code{close()} di una @dfn{pipe}}
-@multitable @columnfractions .50 .50
-@headitem Situazione @tab Valore restituito da @code{close()}
-@item Uscita normale dal comando @tab Il codice di ritorno del comando
-@item Uscita dal comando per @dfn{signal} @tab 256 + numero del segnale assassino
-@item Uscita dal comando per @dfn{signal} con @dfn{dump} @tab 512 + numero del segnale assassino
-@item Errore di qualsiasi tipo @tab @minus{}1
-@end multitable
-@end float
-
-Lo standard POSIX @`e molto generico; dice che @code{close()}
-restituisce zero se @`e terminata correttamente, e un valore diverso da zero
-nell'altro caso. In generale,
-implementazioni differenti variano in quel che restituiscono chiudendo una
-@dfn{pipe}; quindi, il valore di ritorno non pu@`o essere usato in modo
-portabile.
-@value{DARKCORNER}
-In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
-quando chiude una @dfn{pipe}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Usare il valore di ritorno di @code{close()}}
-
-
-@cindex angolo buio, funzione @code{close()}
-@cindex funzione @code{close()}, valore di ritorno
-@cindex @code{close()}, funzione, valore di ritorno
-@cindex valore di ritorno@comma{} funzione @code{close()}
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
-@cindex Unix @command{awk}, funzione @code{close()} e
-
-In molte versioni di Unix @command{awk}, la funzione @code{close()}
-@`e in realt@`a un'istruzione.
-@value{DARKCORNER}
-@`E un errore di sintassi tentare di usare il valore
-di ritorno da @code{close()}:
-
-@example
-comando = "@dots{}"
-comando | getline info
-retval = close(comando) # errore di sintassi in parecchi Unix awk
-@end example
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex variabile @code{ERRNO}, con funzione @command{close()}
-@cindex @code{ERRNO}, variabile, con funzione @command{close()}
-@command{gawk} gestisce @code{close()} come una funzione.
-Il valore di ritorno @`e @minus{}1 se l'argomento designa un file
-che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
-sistema nella chiusura del file o del processo.
-In tal caso, @command{gawk} imposta la variabile predefinita
-@code{ERRNO} a una stringa che descrive il problema.
-
-In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
-quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
-il valore di ritorno @`e quello restituito dal comando,
-come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
-della @value{PVERSION} 4.2, il valore di ritorno dopo la chiusura di
-una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
-contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
-Altrimenti, @`e il valore di ritorno dalla chiamata alle funzione
-di sistema @code{close()} o alla funzione C @code{fclose()}
-se si sta chiudendo un file in input o in output, rispettivamente.
-Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
-
-@float Tabella,table-close-pipe-return-values
-@caption{Valori di ritorno dalla @code{close()} di una @dfn{pipe}}
-@multitable @columnfractions .50 .50
-@headitem Situazione @tab Valore restituito da @code{close()}
-@item Uscita normale dal comando @tab Il codice di ritorno del comando
-@item Uscita dal comando per @dfn{signal} @tab 256 + numero del segnale assassino
-@item Uscita dal comando per @dfn{signal} con @dfn{dump} @tab 512 + numero del segnale assassino
-@item Errore di qualsiasi tipo @tab @minus{}1
-@end multitable
-@end float
-
-Lo standard POSIX @`e molto generico; dice che @code{close()}
-restituisce zero se @`e terminata correttamente, e un valore diverso da zero
-nell'altro caso. In generale,
-implementazioni differenti variano in quel che restituiscono chiudendo una
-@dfn{pipe}; quindi, il valore di ritorno non pu@`o essere usato in modo
-portabile.
-@value{DARKCORNER}
-In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
-quando chiude una @dfn{pipe}.
-@end cartouche
-@end ifnotdocbook
-
-@node Continuazione dopo errori
-@section Abilitare continuazione dopo errori in output
-
-Questa @value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-In @command{awk} standard, l'output con @code{print} o @code{printf}
-a un file che non esiste, o qualche altro errore di I/O (come p.es.
-esaurire lo spazio disponibile su disco) @`e un errore fatale (termina
-l'esecuzione del programma).
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "ciao" > "/file/non/esistente" @}'}
-@error{} gawk: riga com.:1: fatale: non riesco a ri-dirigere a
-@error{} `/file/non/esistente' (/file o directory non esistente)
-@end example
-
-@command{gawk} rende possibile accorgersi che c'@`e stato un errore,
-permettendo di tentare di rimediare, o almeno di stampare un messaggio
-di errore prima di terminare il programma.
-@`E possibile fare questo in due modi differenti:
-
-@itemize @bullet
-@item
-Per tutti i file in output, assegnando un valore qualsiasi a
-@code{PROCINFO["NONFATAL"]}.
-
-@item
-Specificamente per un solo file, assegnando un valore qualsiasi a
-@code{PROCINFO[@var{nome_file}, "NONFATAL"]}.
-@var{nome_file} @`e il nome del file per il quale
-si desidera che l'errore di output non faccia terminare il programma.
-@end itemize
-
-Una volta abilitata la continuazione dopo un errore di output, si dovr@`a
-controllare la variabile @code{ERRNO} dopo ogni istruzione
-@code{print} o @code{printf} diretta a quel file, per controllare che
-tutto sia andato a buon fine. @`E anche una buona idea inizializzare
-@code{ERRNO} a zero prima di tentare l'operazione di scrittura.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ PROCINFO["NONFATAL"] = 1}
-> @kbd{ ERRNO = 0}
-> @kbd{ print "ciao" > "/file/non/esistente"}
-> @kbd{ if (ERRNO) @{}
-> @kbd{ print("Output non riuscito:", ERRNO) > "/dev/stderr"}
-> @kbd{ exit 1}
-> @kbd{ @}}
-> @kbd{@}'}
-@error{} Output non riuscito: No such file or directory
-@end example
-
-@command{gawk} non genera un errore fatale; permette invece
-al programma @command{awk} di rendersi conto del problema e di gestirlo.
-
-Questo meccanismo si applica anche allo standard output e allo standard error.
-Per lo standard output, si pu@`o usare @code{PROCINFO["-", "NONFATAL"]}
-o @code{PROCINFO["/dev/stdout", "NONFATAL"]}.
-Per lo standard error, occorre
-usare @code{PROCINFO["/dev/stderr", "NONFATAL"]}.
-
-Se si tenta di aprire un @dfn{socket} TCP/IP (@pxref{Reti TCP/IP}),
-@command{gawk} tenta di farlo per un certo numero di volte.
-La variabile d'ambiente @env{GAWK_SOCK_RETRIES}
-(@pxref{Altre variabili d'ambiente}) consente di alterare il numero di
-tentativi che @command{gawk} farebbe per default. Tuttavia,
-una volta abilitata la continuazione dopo un errore di I/O per un certo
-@dfn{socket}, @command{gawk} si limita a un solo tentativo,
-lasciando al codice del programma @command{awk} il compito di gestire
-l'eventuale problema.
-
-@node Sommario di Output
-@section Sommario.
-
-@itemize @value{BULLET}
-@item
-L'istruzione @code{print} stampa una lista di espressioni separate da virgole.
-Le espressioni sono separate tra loro dal valore di @code{OFS} e completate
-dal valore di @code{ORS}. @code{OFMT} fornisce il formato di conversione
-dei valori numerici per l'istruzione @code{print}.
-
-@item
-L'istruzione @code{printf} fornisce un controllo pi@`u preciso sull'output,
-con lettere di controllo del formato per diversi tipi di dati e vari
-modificatori
-che cambiano il comportamento delle lettere di controllo del formato.
-
-@item
-L'output sia di @code{print} che di @code{printf} pu@`o essere ridiretto a
-file, @dfn{pipe}, e coprocessi.
-
-@item
-@command{gawk} fornisce @value{FNS} speciali per accedere allo
-standard input, standard output e standard error, e per comunicazioni di rete.
-
-@item
-Usare @code{close()} per chiudere file aperti, @dfn{pipe} e ridirezioni a
-coprocessi.
-Per i coprocessi, @`e possibile chiudere anche soltanto una delle due
-direzioni di comunicazione.
-
-@item
-Normalmente se si verificano errori eseguendo istruzioni @code{print} o
-@code{printf}, questi causano la fine del programma.
-@command{gawk} consente di proseguire l'elaborazione anche in questo
-caso, o per un errore su qualsiasi file in output, o per un errore
-relativo a qualche file in particolare.
-Resta a carico del programma controllare se si sono verificati errori
-dopo l'esecuzione di ogni istruzione di output interessata.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi su Output
-@section Esercizi
-
-@enumerate
-@item
-Riscrivere il programma:
-
-@example
-awk 'BEGIN @{ print "Mese Contenitori"
- print "----- -----------" @}
- @{ print $1, $2 @}' inventory-shipped
-@end example
-
-@noindent
-come
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Separatori di output}, usando un nuovo valore per @code{OFS}.
-
-@item
-Usare l'istruzione @code{printf} per allineare le intestazioni e i dati
-della tabella
-per il file di esempio @file{inventory-shipped} utilizzato nella @ref{Print}.
-
-@item
-Spiegare cosa succede se si dimenticano i doppi apici ridirigendo l'output,
-come nel caso che segue:
-
-@example
-BEGIN @{ print "Ho trovato un errore grave!" > /dev/stderr @}
-@end example
-
-@end enumerate
-@c EXCLUDE END
-
-
-@node Espressioni
-@chapter Espressioni
-@cindex espressioni
-
-Le espressioni sono i mattoni fondamentali dei modelli di ricerca e delle
-azioni di @command{awk}. Un'espressione genera un valore che si
-pu@`o stampare, verificare o passare a una funzione. Oltre a ci@`o, un'espressione
-pu@`o assegnare un nuovo valore a una variabile o a un campo usando un operatore
-di assegnamento.
-
-Un'espressione pu@`o servire come modello di ricerca o istruzione di azione a
-s@'e stante. La maggior parte degli altri tipi di istruzione contengono una o
-pi@`u espressioni che specificano i dati sui quali operare. Come in altri
-linguaggi, le espressioni in @command{awk} possono includere variabili,
-riferimenti a vettori e a costanti, e chiamate di funzione, come pure
-combinazioni tra questi usando diversi operatori.
-
-@menu
-* Valori:: Costanti, variabili ed espressioni regolari.
-* Tutti gli operatori:: Gli operatori di @command{gawk}.
-* Valori e condizioni di verit@`a:: Determinare Vero/Falso.
-* Chiamate di funzione:: Una chiamata di funzione pu@`o essere
- un'espressione.
-* Precedenza:: Come si nidificano i vari operatori.
-* Localizzazioni:: Come la localizzazione influenza la
- gestione dati.
-* Sommario delle espressioni:: Sommario delle espressioni.
-@end menu
-
-@node Valori
-@section Costanti, variabili e conversioni
-
-Le espressioni sono costruite a partire da valori e dalle operazioni eseguite
-su di essi. Questa @value{SECTION} descrive gli oggetti elementari
-che forniscono i valori usati nelle espressioni.
-
-@menu
-* Costanti:: Costanti di tipo stringa, numeriche ed
- espressioni regolari
-* Usare le costanti @dfn{regexp}:: Quando e come usare una costante
- specificata tramite espressioni regolari
-* Variabili:: Le variabili permettono di
- definire valori da usare in seguito.
-* Conversione:: La conversione di stringhe in numeri
- e viceversa.
-@end menu
-
-@node Costanti
-@subsection Espressioni costanti
-
-@cindex costanti, tipi di
-
-Il tipo di espressione pi@`u semplice @`e una @dfn{costante}, che ha sempre lo
-stesso valore. Ci sono tre tipi di costanti: numeriche, di stringa e di
-espressione regolare.
-
-Ognuna di esse si usa nel contesto appropriato quando occorre assegnare ai
-dati un valore che non dovr@`a essere cambiato. Le costanti numeriche possono
-avere forme diverse, ma sono memorizzate internamente sempre allo stesso modo.
-
-@menu
-* Costanti scalari:: Costanti numeriche e stringhe.
-* Numeri non-decimali:: Cosa sono i numeri ottali ed esadecimali.
-* Costanti come espressioni regolari:: Costanti fornite tramite espressioni
- regolari.
-@end menu
-
-@node Costanti scalari
-@subsubsection Costanti numeriche e stringhe
-
-@cindex costanti numeriche
-@cindex numeriche, costanti
-Una @dfn{costante numerica} @`e un numero. Questo numero pu@`o essere un
-numero intero, una frazione decimale o un numero in notazione scientifica
-(esponenziale).@footnote{La rappresentazione interna di tutti i numeri,
-compresi gli interi, usa numeri in virgola mobile a doppia precisione.
-Sui sistemi pi@`u moderni, questi sono nel formato standard IEEE 754.
-@xref{Calcolo con precisione arbitraria}, per maggiori informazioni.}
-Ecco alcuni esempi di costanti numeriche che hanno tutte lo stesso
-valore:
-
-@example
-105
-1.05e+2
-1050e-1
-@end example
-
-@cindex costanti stringa
-Una @dfn{costante stringa} @`e formata da una sequenza di caratteri racchiusi tra
-doppi apici. Per esempio:
-
-@example
-"pappagallo"
-@end example
-
-@noindent
-@cindex differenze tra @command{awk} e @command{gawk}, stringhe
-@cindex stringhe, limitazioni della lunghezza
-rappresenta la stringa il cui contenuto @`e la parola @samp{pappagallo}.
-Le stringhe in
-@command{gawk} possono essere di qualsiasi lunghezza, e possono contenere
-tutti i possibili caratteri ASCII a otto bit, compreso il carattere ASCII
-@sc{nul} (carattere con codice zero).
-Altre implementazioni di @command{awk} possono avere difficolt@`a con alcuni
-particolari codici di carattere.
-
-@node Numeri non-decimali
-@subsubsection Numeri ottali ed esadecimali
-@cindex ottali, numeri
-@cindex esadecimali, numeri
-@cindex numeri ottali
-@cindex numeri esadecimali
-
-In @command{awk}, tutti i numeri sono espressi nel sistema decimale (cio@`e a
-base 10).
-Molti altri linguaggi di programmazione consentono di specificare i numeri in
-altre basi, spesso in ottale (base 8) e in esadecimale (base 16).
-Nel sistema ottale i numeri hanno la sequenza 0, 1, 2, 3, 4, 5, 6, 7, 10, 11,
-12, e cos@`{@dotless{i}} via. Come @samp{11} decimale @`e una volta 10 pi@`u 1, cos@`{@dotless{i}}
-@samp{11} ottale @`e una volta 8 pi@`u 1. Questo equivale a 9 nel sistema decimale.
-Nell'esadecimale ci sono 16 cifre. Poich@'e l'usuale sistema numerico decimale
-ha solo dieci cifre (@samp{0}--@samp{9}), le lettere da
-@samp{a} a @samp{f} rappresentano le cifre ulteriori.
-(normalmente @`e irrilevante se le lettere sono maiuscole o minuscole; gli
-esadecimali @samp{a} e @samp{A} hanno lo stesso valore).
-Cos@`{@dotless{i}}, @samp{11} esadecimale @`e 1 volta 16 pi@`u 1,
-il che equivale a 17 decimale.
-
-Guardando solamente un @samp{11} puro e semplice, non si capisce in quale base
-sia. Cos@`{@dotless{i}}, in C, C++, e in altri linguaggi derivati da C,
-@c such as PERL, but we won't mention that....
-c'@`e una speciale notazione per esprimere la base.
-I numeri ottali iniziano con uno @samp{0},
-e i numeri esadecimali iniziano con uno @samp{0x} o @samp{0X}:
-
-@table @code
-@item 11
-Valore decimale 11
-
-@item 011
-11 ottale, valore decimale 9
-
-@item 0x11
-11 esadecimale, valore decimale 17
-@end table
-
-Quest'esempio mostra le differenze:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'}
-@print{} 9, 11, 17
-@end example
-
-Poter usare costanti ottali ed esadecimali nei propri programmi @`e molto utile
-quando si lavora con dati che non possono essere rappresentati
-convenientemente come caratteri o come numeri regolari, come i dati binari di
-vario tipo.
-
-@cindex @command{gawk}, numeri ottali e
-@cindex @command{gawk}, numeri esadecimali e
-@command{gawk} permette l'uso di costanti ottali ed esadecimali nel testo di
-un programma. Comunque, se numeri non-decimali sono presenti tra i dati in
-input, essi non sono trattati in maniera speciale; trattarli in modo speciale
-per default significherebbe che vecchi programmi @command{awk} produrrebbero
-risultati errati.
-(Se si vuole che i numeri siano trattati in maniera speciale, si deve
-specificare l'opzione da riga di comando
-@option{--non-decimal-data};
-@pxref{Dati non decimali}.)
-Se si devono gestire dati ottali o esadecimali,
-si pu@`o usare la funzione @code{strtonum()}
-(@pxref{Funzioni per stringhe})
-per convertire i dati in numeri.
-La maggior parte delle volte, le costanti ottali o esadecimali si usano quando
-si lavora con le funzioni predefinite di manipolazione di bit;
-si veda @ref{Funzioni a livello di bit}
-per maggiori informazioni.
-
-Diversamente da alcune tra le prime implementazioni di C, @samp{8} e @samp{9}
-non sono cifre valide nelle costanti ottali. Per esempio, @command{gawk}
-tratta @samp{018} come un 18 decimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print "021 @`e", 021 ; print 018 @}'}
-@print{} 021 @`e 17
-@print{} 18
-@end example
-
-@cindex modalit@`a compatibile di (@command{gawk}), numeri ottali
-@cindex numeri ottali nella modalit@`a compatibile di (@command{gawk})
-@cindex modalit@`a compatibile di (@command{gawk}), numeri esadecimali
-@cindex numeri esadecimali nella modalit@`a compatibile di (@command{gawk})
-@cindex compatibile, modalit@`a (@command{gawk}), numeri ottali
-@cindex compatibile, modalit@`a (@command{gawk}), numeri esadecimali
-Le costanti ottali ed esadecimali nel codice sorgente sono un'estensione di
-@command{gawk}. Se @command{gawk} @`e in modalit@`a compatibile
-(@pxref{Opzioni}),
-non sono disponibili.
-
-@cindex sidebar, La base di una costante non influisce sul suo valore
-@ifdocbook
-@docbook
-<sidebar><title>La base di una costante non influisce sul suo valore</title>
-@end docbook
-
-
-Una volta che una costante numerica @`e stata
-convertita internamente in un numero [decimale],
-@command{gawk} non considera pi@`u
-la forma originale della costante; viene sempre usato il valore
-interno. Questo ha delle precise conseguenze per la conversione dei
-numeri in stringhe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "0x11 vale <%s>\n", 0x11 @}'}
-@print{} 0x11 vale <17>
-@end example
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{La base di una costante non influisce sul suo valore}
-
-
-
-Una volta che una costante numerica @`e stata
-convertita internamente in un numero [decimale],
-@command{gawk} non considera pi@`u
-la forma originale della costante; viene sempre usato il valore
-interno. Questo ha delle precise conseguenze per la conversione dei
-numeri in stringhe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "0x11 vale <%s>\n", 0x11 @}'}
-@print{} 0x11 vale <17>
-@end example
-@end cartouche
-@end ifnotdocbook
-
-@node Costanti come espressioni regolari
-@subsubsection Costanti fornite tramite espressioni regolari
-
-@cindex @dfn{regexp}, costanti
-@cindex costanti @dfn{regexp}
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-Una @dfn{costante regexp} @`e la descrizione di un'espressione regolare
-delimitata
-da barre, come @code{@w{/^inizio e fine$/}}. La maggior parte delle
-@dfn{regexp} usate nei programmi @command{awk} sono costanti, ma gli operatori
-di confronto @samp{~} e @samp{!~} possono confrontare anche @dfn{regexp}
-calcolate o dinamiche (che tipicamente sono solo stringhe ordinarie o
-variabili che contengono un'espressione regolare, ma potrebbero anche essere
-espressioni pi@`u complesse).
-
-@node Usare le costanti @dfn{regexp}
-@subsection Usare espressioni regolari come costanti
-
-Le costanti @dfn{regexp} sono costituite da testo che descrive un'espressione
-regolare, racchiusa fra barre (come p.e. @code{/la +risposta/}).
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta del comportamento di tali costanti in
-POSIX @command{awk} e in @command{gawk}, e prosegue descrivendo le
-@dfn{costanti @dfn{regexp} fortemente tipizzate}, che sono
-un'estensione @command{gawk}.
-
-@menu
-* Costanti @dfn{regexp} normali:: Costanti @dfn{regexp} normali in
- @command{awk}.
-* Costanti @dfn{regexp} forti:: Costanti @dfn{regexp} fortemente tipizzate.
-@end menu
-
-@node Costanti @dfn{regexp} normali
-@subsubsection Costanti @dfn{regexp} normali in @command{awk}.
-
-@cindex angolo buio, costanti @dfn{regexp}
-Quand'@`e usata a destra degli operatori @samp{~} o @samp{!~},
-una costante @dfn{regexp} rappresenta semplicemente l'espressione regolare che
-dev'essere confrontata. Comunque, le costanti @dfn{regexp} (come @code{/pippo/})
-possono essere usate come semplici espressioni.
-Quando una
-costante @dfn{regexp} compare da sola, ha lo stesso significato di quando
-compare in un criterio di ricerca (cio@`e @samp{($0 ~ /pippo/)}).
-@value{DARKCORNER}
-@xref{Espressioni come criteri di ricerca}.
-Ci@`o vuol dire che i due frammenti di codice seguenti:
-
-@example
-if ($0 ~ /barfly/ || $0 ~ /camelot/)
- print "trovato"
-@end example
-
-@noindent
-e:
-
-@example
-if (/barfly/ || /camelot/)
- print "trovato"
-@end example
-
-@noindent
-sono esattamente equivalenti.
-Una conseguenza piuttosto bizzarra di questa regola @`e che la seguente
-espressione booleana @`e valida, ma non fa quel che probabilmente l'autore
-si aspettava:
-
-@example
-# Notare che /pippo/ @`e alla @emph{sinistra} della ~
-if (/pippo/ ~ $1) print "trovato pippo"
-@end example
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex @command{gawk}, costanti @dfn{regexp} e
-@cindex costanti @dfn{regexp}, in @command{gawk}
-@noindent
-Questo codice ``ovviamente'' intende verificare se @code{$1} contiene
-l'espressione regolare @code{/pippo/}. Ma in effetti l'espressione
-@samp{/pippo/ ~ $1} significa realmente @samp{($0 ~ /pippo/) ~ $1}. In altre
-parole, prima confronta il record in input con l'espressione regolare
-@code{/pippo/}. Il risultato @`e zero o uno, a seconda che il confronto dia esito
-positivo o negativo. Questo risultato
-@`e poi confrontato col primo campo nel record.
-Siccome @`e improbabile che qualcuno voglia mai fare realmente questo genere di
-test, @command{gawk} emette un avvertimento quando vede questo costrutto in
-un programma.
-Un'altra conseguenza di questa regola @`e che l'istruzione di assegnamento:
-
-@example
-confronta = /pippo/
-@end example
-
-@noindent
-assegna zero o uno alla variabile @code{confronta}, a seconda
-del contenuto del record in input corrente.
-
-@cindex differenze tra @command{awk} e @command{gawk}, costanti @dfn{regexp}
-@cindex angolo buio, costanti @dfn{regexp}, come argomenti a funzioni definite dall'utente
-@cindexgawkfunc{gensub}
-@cindexawkfunc{sub}
-@cindexawkfunc{gsub}
-Le espressioni regolari costanti possono essere usate anche come primo
-argomento delle
-funzioni @code{gensub()}, @code{sub()}, e @code{gsub()}, come secondo argomento
-della funzione @code{match()},
-e come terzo argomento delle funzioni @code{split()} e @code{patsplit()}
-(@pxref{Funzioni per stringhe}).
-Le moderne implementazioni di @command{awk}, incluso @command{gawk}, permettono
-di usare come terzo argomento di @code{split()} una costante @dfn{regexp}, ma
-alcune implementazioni pi@`u vecchie non lo consentono.
-@value{DARKCORNER}
-Poich@'e alcune funzioni predefinite accettano costanti @dfn{regexp} come
-argomenti, pu@`o generare confusione l'uso di costanti @dfn{regexp} come
-argomenti di funzioni definite dall'utente
-(@pxref{Funzioni definite dall'utente}). Per esempio:
-
-@example
-function mysub(modello, sostituzione, stringa, globale)
-@{
- if (globale)
- gsub(modello, sostituzione, stringa)
- else
- sub(modello, sostituzione, stringa)
- return stringa
-@}
-
-@{
- @dots{}
- text = "salve! salve a te!"
- mysub(/salve/, "ciao", text, 1)
- @dots{}
-@}
-@end example
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-In quest'esempio, il programmatore vuol passare una costante @dfn{regexp} alla
-funzione definita dall'utente @code{mysub()}, che a sua volta la passa o a
-@code{sub()} o a @code{gsub()}. Comunque, quel che realmente succede @`e che
-al parametro @code{modello} @`e assegnato un valore di uno o zero, a seconda
-che @code{$0} corrisponda a @code{/salve/} o no.
-@command{gawk} emette un avvertimento quando vede una costante @dfn{regexp}
-usata come parametro di una funzione definita dall'utente, poich@'e
-passare un valore vero/falso in questo modo probabilmente non @`e quello che
-si intendeva fare.
-
-@node Costanti @dfn{regexp} forti
-@subsubsection Costanti @dfn{regexp} fortemente tipizzate
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-Come visto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ifdocbook
-@value{SECTION}
-@end ifdocbook
-precedente,
-le costanti @dfn{regexp} (@code{/@dots{}/}) hanno uno strano posto nel
-linguaggio @command{awk}. In molti contesti, si comportano come
-un'espressione:
-@samp{$0 ~ /@dots{}/}. In altri contesti, denotano solo una @dfn{regexp} da
-individuare. In nessun caso esse sono davvero ``cittadine di serie A'' del
-linguaggio. Ovvero, non @`e possibile definire una variabile scalare il cui
-tipo sia ``@dfn{regexp}'' nello stesso senso in cui si pu@`o definire una
-variabile che sia un numero o una stringa:
-
-@example
-num = 42 @ii{Variabile numerica}
-str = "hi" @ii{Variabile di tipo stringa}
-re = /pippo/ @ii{Errore!} re @ii{@`e il risultato di} $0 ~ /pippo/
-@end example
-
-Per alcuni casi di uso pi@`u avanzati,
-sarebbe bello poter avere costanti @dfn{regexp} che sono
-@dfn{fortemente tipizzate}; in altre parole, che sostituiscono
-una @dfn{regexp} utile per effettuare dei confronti,
-e non una semplice espressione regolare.
-
-@command{gawk} prevede questa funzionalit@`a. Un'espressione regolare
-fortemente tipizzata @`e molto simile a un'espressione regolare normale,
-tranne per il fatto di essere preceduta dal simbolo @samp{@@}:
-
-@example
-re = @@/foo/ @ii{variabile @dfn{regexp} fortemente tipizzata}
-@end example
-
-Le variabili @dfn{regexp} fortemente tipizzate @emph{non possono} essere
-usate in ogni istruzione in cui compare un'espressione regolare normale.
-perch@'e ci@`o renderebbe il linguaggio ancora pi@`u fuorviante.
-Queste espressioni possono essere usate solo in alcuni contesti:
-
-@itemize @bullet
-@item
-Sul lato destro degli operatori @samp{~} e @samp{!~}:
-@samp{qualche_variabile ~ @@/foo/}
-(@pxref{Uso di @dfn{regexp}}).
-
-@item
-Nella parte @code{case} di un'istruzione @code{switch}
-(@pxref{Istruzione switch}).
-
-@item
-Come argomento in una delle funzioni predefinite che possono utilizzare
-costanti @dfn{regexp}:
-@code{gensub()},
-@code{gsub()},
-@code{match()},
-@code{patsplit()},
-@code{split()}
-e
-@code{sub()}
-(@pxref{Funzioni per stringhe}).
-
-@item
-Come parametro in una chiamata a una funzione definita dall'utente
-(@pxref{Funzioni definite dall'utente}).
-
-@item
-Sul lato destro di un assegnamento di variabile:
-@samp{qualche_variabile = @@/foo/}.
-In tal caso, @code{qualche_variabile} @`e di tipo @dfn{regexp}.
-Inoltre, @code{qualche_variabile}
-pu@`o essere usata con gli operatori @samp{~} e @samp{!~}, passata a una
-delle funzioni predefinite sopra elencate o passata come parametro
-a una funzione definita dall'utente.
-@end itemize
-
-Si pu@`o usare la funzione predefinita @code{typeof()}
-(@pxref{Funzioni per i tipi})
-per determinare se un parametro passato a una funzione
-@`e una variabile di tipo @dfn{regexp}.
-
-La vera efficacia di questa funzionalit@`a consiste nella capacit@`a di creare
-variabili il cui tipo @`e @dfn{regexp}. Tali variabili possono essere passate
-a funzioni definite dall'utente, senza gli inconvenenti che si hanno usando
-espressioni regolari calcolate, a partire da stringhe o da costanti di tipo
-stringa. Queste variabili possono anche essere passate utilizzando chiamate
-indirette a funzioni (@pxref{Chiamate indirette}) e alle funzioni predefinite
-che accettano costanti di tipo @dfn{regesp}.
-
-Quando sono usate per effettuare conversioni numeriche, le variabili
-@dfn{regexp} fortemente tipizzate vengono convertite alla cifra zero.
-Quando sono usate per effettuare conversioni a stringhe, vengono convertite
-al valore di stringa del testo della @dfn{regexp} originale.
-
-@node Variabili
-@subsection Variabili
-
-@cindex variabili definite dall'utente
-@cindex definite dall'utente, variabili
-Le @dfn{variabili} consentono di memorizzare valori in un certo punto di un
-programma, per usarli pi@`u tardi in un'altra parte del programma. Le variabili
-possono essere gestite interamente all'interno del testo del programma, ma
-ad esse possono essere assegnati valori sulla riga di comando, in fase di
-invocazione di @command{awk}.
-
-@menu
-* Usare variabili:: Usare variabili nei propri programmi.
-* Opzioni di assegnamento:: Impostare variabili dalla riga di
- comando, e un sommario della sintassi
- della riga di comando.
- Questo @`e un metodo di input avanzato.
-@end menu
-
-@node Usare variabili
-@subsubsection Usare variabili in un programma
-
-Le variabili permettono di dare nomi ai valori e di far riferimento ad essi in
-un secondo momento. Alcune variabili sono gi@`a state usate in molti degli
-esempi.
-Il nome di una variabile dev'essere una sequenza di lettere, cifre o trattini
-bassi, e non deve iniziare con una cifra.
-Qui, una @dfn{lettera} @`e una qualsiasi delle 52 lettere maiuscole e minuscole
-dell'alfabeto inglese. Altri caratteri che possono essere definiti come
-lettere in localizzazioni non inglesi non sono validi nei nomi di variabile.
-Il maiuscolo o minuscolo sono significativi nei nomi di variabile;
-@code{a} e @code{A} sono variabili diverse.
-
-Un nome di variabile @`e un'espressione valida in se stessa; rappresenta il
-valore corrente della variabile. I valori delle variabili possono essere
-modificati tramite @dfn{operatori di assegnamento}, @dfn{operatori di
-incremento} e @dfn{operatori di decremento}
-(@xref{Operatori di assegnamento}).
-Inoltre, le funzioni @code{sub()} e @code{gsub()} possono cambiare il valore
-di una variabile e le funzioni
-@code{match()}, @code{split()}, e @code{patsplit()} possono cambiare il
-contenuto dei loro parametri che sono
-costituiti da vettori
-(@pxref{Funzioni per stringhe}).
-
-@cindex variabili, predefinite
-@cindex variabili, inizializzazione
-Alcune variabili hanno un significato speciale predefinito, come @code{FS}
-(il separatore di campo) e @code{NF} (il numero di campi nel record di input
-corrente). @xref{Variabili predefinite} per un elenco delle variabili
-predefinite. Queste variabili predefinite possono essere usate e possono
-ricevere assegnamenti come tutte le altre variabili, ma i loro valori sono
-anche usati o cambiati automaticamente da @command{awk}. Tutti i nomi delle
-variabili predefinite sono in caratteri maiuscoli.
-
-Alle variabili in @command{awk} possono essere assegnati valori numerici o
-valori di stringa. Il tipo di valore che una variabile contiene pu@`o cambiare
-durante la vita di un programma. Per default, le variabili sono inizializzate
-alla stringa nulla, che vale zero se viene convertita in un numero. Non c'@`e
-alcuna
-necessit@`a di inizializzare esplicitamente una variabile in @command{awk},
-come invece occorre fare in C e nella maggior parte dei linguaggi
-tradizionali.
-
-@node Opzioni di assegnamento
-@subsubsection Assegnare una variabile dalla riga di comando
-@cindex variabili, assegnare da riga di comando
-@cindex riga di comando, variabili@comma{} assegnare da
-
-Si pu@`o impostare qualsiasi variabile @command{awk} includendo un
-@dfn{assegnamento di variabile} tra gli argomenti sulla riga di comando quando
-viene invocato @command{awk} (@pxref{Altri argomenti}).
-Tale assegnamento ha la seguente forma:
-
-@example
-@var{variabile}=@var{testo}
-@end example
-
-@cindex @option{-v}, opzione
-@noindent
-Con questo assegnamento, una variabile viene impostata o all'inizio
-dell'esecuzione di @command{awk} o tra la lettura di un file in input e il
-successivo file in input.
-Quando l'assegnamento @`e preceduto dall'opzione @option{-v},
-come nel seguente esempio:
-
-@example
--v @var{variabile}=@var{testo}
-@end example
-
-@noindent
-la variabile @`e impostata proprio all'inizio, ancor prima che sia eseguita la
-regola @code{BEGIN}. L'opzione @option{-v} e il suo assegnamento
-deve precedere tutti gli argomenti @value{FN}, e anche il testo del programma.
-(@xref{Opzioni} per maggiori informazioni sull'opzione
-@option{-v}.)
-In alternativa, l'assegnamento di variabile @`e effettuata in un momento
-determinato
-dalla posizione dell'opzione tra gli argomenti "file in input", cio@`e dopo
-l'elaborazione del precedente argomento "file in input". Per esempio:
-
-@example
-awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list
-@end example
-
-@noindent
-stampa il valore del campo numero @code{n} per tutti i record in input. Prima
-che venga letto il primo file, la riga di comando imposta la variabile @code{n}
-al valore quattro. Questo fa s@`{@dotless{i}} che venga stampato il quarto campo delle righe
-del file @file{inventory-shipped}. Dopo la fine del primo file, ma prima
-che inizi il secondo file, @code{n} viene impostato a due, e quindi poi
-viene stampato il secondo campo delle righe di @file{mail-list}:
-
-@example
-$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list}
-@print{} 15
-@print{} 24
-@dots{}
-@print{} 555-5553
-@print{} 555-3412
-@dots{}
-@end example
-
-@cindex angolo buio, argomenti da riga di comando
-Gli argomenti da riga di comando sono resi disponibili dal programma
-@command{awk} nel vettore @code{ARGV} per poter essere esaminati esplicitamente
-(@pxref{ARGC e ARGV}).
-@command{awk} elabora i valori degli assegnamenti da riga di comando per
-sequenze di protezione
-(@pxref{Sequenze di protezione}).
-@value{DARKCORNER}
-
-@node Conversione
-@subsection Conversione di stringhe e numeri
-
-Le conversioni di numeri in stringhe e di stringhe in numeri sono generalmente
-semplici. Ci possono essere delle sottigliezze che bisogna tenere presenti;
-questa @value{SECTION} tratta di quest'importante sfaccettatura di @command{awk}.
-
-@menu
-* Stringhe e numeri:: Come @command{awk} converte tra
- stringhe e numeri.
-* Localizzazione e conversioni:: Come la localizzazione pu@`o influire
- sulle conversioni.
-@end menu
-
-@node Stringhe e numeri
-@subsubsection Come @command{awk} converte tra stringhe e numeri
-
-@cindex conversione da stringhe a numeri
-@cindex stringhe, conversione
-@cindex numeri, conversione in stringhe
-@cindex conversione da numeri a stringhe
-Le stringhe sono convertite in numeri e i numeri sono convertiti in stringhe,
-se il contesto del programma @command{awk} lo richiede. Per esempio, se il
-valore di @code{pippo} o @code{pluto} nell'espressione @samp{pippo + pluto}
-@`e una stringa, viene convertita in un numero prima di eseguire l'addizione.
-Se in una concatenazione di stringhe ci sono valori numerici, questi sono
-convertiti in stringhe. Si consideri il seguente esempio:
-
-@example
-due = 2; tre = 3
-print (due tre) + 4
-@end example
-
-@noindent
-Stampa il valore (numerico) di 27. I valori numerici delle
-variabili @code{due} e @code{tre} sono convertiti in stringhe e
-concatenati insieme. La stringa risultante @`e riconvertita nel
-numero 23, al quale poi viene aggiunto 4.
-
-@cindex stringhe nulle, conversione da tipo numerico a tipo stringa
-@cindex conversione di tipo variabile
-@cindex variabile, conversione di tipo
-Se, per qualche ragione, si vuole forzare la conversione di un numero in
-una stringa, basta concatenare a quel numero la stringa nulla, @code{""}.
-Per forzare la conversione di una stringa in un numero, basta aggiungere zero
-a quella stringa. Una stringa viene convertita in un numero interpretando
-qualsiasi prefisso numerico della stringa come numero:
-@code{"2.5"} si converte in 2.5, @code{"1e3"} si converte in 1000, e
-@code{"25fix"} ha un valore numerico di 25.
-Le stringhe che non possono essere interpretate come numeri validi vengono
-convertite al valore zero.
-
-@cindex @code{CONVFMT}, variabile
-Il modo esatto in cui i numeri sono convertiti in stringhe @`e controllato dalla
-variabile predefinita di @command{awk} @code{CONVFMT}
-(@pxref{Variabili predefinite}). I numeri vengono convertiti usando la
-funzione @code{sprintf()}
-con @code{CONVFMT} come specificatore di formato
-(@pxref{Funzioni per stringhe}).
-
-Il valore di default di @code{CONVFMT} @`e @code{"%.6g"}, che crea un valore con
-un massimo di sei cifre significative. Per alcune applicazioni potrebbe essere
-opportuno cambiare questo valore per ottenere una maggiore precisione.
-Sulla maggior parte delle macchine moderne
-normalmente bastano 17 cifre per esprimere esattamente il valore di un numero
-in virgola mobile.@footnote{Per casi eccezionali possono essere richieste fino
-a 752 cifre (!), non sembra che sia il caso di preoccuparsene qui.}
-
-@cindex angolo buio, variabile @code{CONVFMT}
-Si possono avere strani risultati se si imposta @code{CONVFMT} a una stringa
-che non indica a @code{sprintf()} come formattare i numeri in virgola mobile
-in un modo utile. Per esempio, se ci si dimentica la @samp{%} nel formato,
-@command{awk} converte tutti i numeri alla stessa stringa costante.
-
-Come caso particolare, per un numero intero, il risultato della conversione
-a una stringa @`e @emph{sempre} un numero intero, indipendentemente da quale
-sia il valore di @code{CONVFMT}. Dato il seguente fammento di codice:
-
-@example
-CONVFMT = "%2.2f"
-a = 12
-b = a ""
-@end example
-
-@noindent
-@code{b} ha valore @code{"12"}, non @code{"12.00"}.
-@value{DARKCORNER}
-
-@cindex sidebar, @command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe
-@ifdocbook
-@docbook
-<sidebar><title>@command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe</title>
-@end docbook
-
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex @code{OFMT}, variabile
-@cindex portabilit@`a, nuovo @command{awk} vs.@: vecchio @command{awk}
-@cindex @command{awk}, nuovo vs.@: vecchio, variabile @code{OFMT}
-Prima dello standard POSIX, @command{awk} usava il valore di @code{OFMT} per
-convertire i numeri in stringhe. @code{OFMT} specifica il formato di output da
-usare per la stampa dei numeri con @code{print}. @code{CONVFMT} fu introdotto
-per separare la semantica della conversione dalla semantica della stampa. Sia
-@code{CONVFMT} che @code{OFMT} hanno lo stesso valore di dafault:
-@code{"%.6g"}. Nella stragrande maggioranza dei casi, i vecchi programmi di
-@command{awk} non cambiano questo comportamento.
-@xref{Print} per maggiori informazioni sull'istruzione @code{print}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{@command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe}
-
-
-@cindex POSIX @command{awk}, variabile @code{OFMT} e
-@cindex @code{OFMT}, variabile
-@cindex portabilit@`a, nuovo @command{awk} vs.@: vecchio @command{awk}
-@cindex @command{awk}, nuovo vs.@: vecchio, variabile @code{OFMT}
-Prima dello standard POSIX, @command{awk} usava il valore di @code{OFMT} per
-convertire i numeri in stringhe. @code{OFMT} specifica il formato di output da
-usare per la stampa dei numeri con @code{print}. @code{CONVFMT} fu introdotto
-per separare la semantica della conversione dalla semantica della stampa. Sia
-@code{CONVFMT} che @code{OFMT} hanno lo stesso valore di dafault:
-@code{"%.6g"}. Nella stragrande maggioranza dei casi, i vecchi programmi di
-@command{awk} non cambiano questo comportamento.
-@xref{Print} per maggiori informazioni sull'istruzione @code{print}.
-@end cartouche
-@end ifnotdocbook
-
-@node Localizzazione e conversioni
-@subsubsection Le localizzazioni possono influire sulle conversioni
-
-Il luogo dove si @`e pu@`o avere importanza quando si tratta di convertire numeri e
-stringhe. La lingua e i caratteri---la @dfn{localizzazione}---possono
-influire sui formati numerici. In particolare, per i programmi @command{awk},
-influiscono sui caratteri separatore decimale e separatore delle migliaia.
-La localizzazione @code{"C"}, e la maggior parte delle localizzazioni inglesi,
-usano il punto (@samp{.}) come separatore decimale e non prevedono un
-separatore delle
-migliaia. Tuttavia, molte (se non la maggior parte) delle localizzazioni
-europee e non inglesi usano la virgola (@samp{,}) come separatore dei decimali.
-Le localizzazioni europee spesso usano o lo spazio o il punto come separatore
-delle migliaia, all'occorrenza.
-
-@cindex angolo buio, carattere di separazione dei decimali nelle localizzazioni
-Lo standard POSIX prevede che @command{awk} usi sempre il punto come separatore
-dei decimali nel codice sorgente del programma @command{awk}, e per
-gli assegnamenti di variabile da riga di comando (@pxref{Altri argomenti}).
-Tuttavia, nell'interpretazione dei dati in input, per l'output di
-@code{print} e @code{printf}, e per la conversione da numeri a stringhe,
-viene usato il
-separatore decimale locale. @value{DARKCORNER} In ogni caso, i numeri nel
-codice sorgente e nei dati di input non possono avere un separatore delle
-migliaia. Di seguito sono riportati alcuni esempi che illustrano la differenza
-di comportamento, su un sistema GNU/Linux:
-
-@example
-$ @kbd{export POSIXLY_CORRECT=1} @ii{Forzare aderenza a standard POSIX}
-$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
-@print{} 3.14159
-$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
-@print{} 3,14159
-$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'}
-@print{} 5
-$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'}
-@print{} 5,321
-@end example
-
-@noindent
-La localizzazione @code{en_DK.utf-8} @`e per l'inglese in Danimarca, dove
-le virgole fungono da separatore decimale. Nella localizzazione @code{"C"}
-normale, @command{gawk} tratta @samp{4,321} come 4, mentre nella localizzazione
-danese @`e trattato come numero completo comprendente la parte frazionaria,
-4.321.
-
-Alcune delle prime versioni di @command{gawk} si conformavano completamente con
-quest'aspetto dello standard. Tuttavia, molti utenti di localizzazioni non
-inglesi si lamentavano di questo comportamento, perch@'e i loro dati usavano il
-punto come separatore decimale, per cui fu ripristinato il comportamento di
-default che usava il punto come carattere di separazione decimale. Si pu@`o
-usare l'opzione @option{--use-lc-numeric} (@pxref{Opzioni}) per forzare
-@command{gawk} a usare il carattere separatore decimale della localizzazione.
-(@command{gawk} usa il separatore decimale della localizzazione anche quando
-@`e in modalit@`a POSIX, o con l'opzione @option{--posix} o con la variabile
-d'ambiente @env{POSIXLY_CORRECT}, come appena visto.)
-
-@ref{table-locale-affects} descrive i casi in cui si usa il separatore decimale
-locale e quando si usa il punto. Alcune di queste funzionalit@`a non sono state
-ancora descritte.
-
-@float Tabella,table-locale-affects
-@caption{Separatore decimale locale o punto}
-@multitable @columnfractions .15 .25 .45
-@headitem Funzione @tab Default @tab @option{--posix} o @option{--use-lc-numeric}
-@item @code{%'g} @tab Usa la localizzazione @tab Usa la localizzazione
-@item @code{%g} @tab Usa il punto @tab Usa la localizzazione
-@item Input @tab Usa il punto @tab Usa la localizzazione
-@item @code{strtonum()} @tab Usa il punto @tab Usa la localizzazione
-@end multitable
-@end float
-
-Infine, gli standard ufficiali correnti e la rappresentazione dei numeri
-in virgola mobile dello standard IEEE possono avere un effetto insolito ma
-importante sul modo in cui @command{gawk} converte alcuni valori di stringa
-speciali in
-numeri. I dettagli sono illustrati in @ref{Problemi virgola mobile POSIX}.
-
-@node Tutti gli operatori
-@section Operatori: fare qualcosa coi valori
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} introduce gli @dfn{operatori} che fanno uso
-dei valori forniti da costanti e variabili.
-
-@menu
-* Operatori aritmetici:: Operazioni aritmetiche (@samp{+}, @samp{-},
- etc.)
-* Concatenazione:: Concatenazione di stringhe.
-* Operatori di assegnamento:: Cambiare il valore di una variabile o di un
- campo.
-* Operatori di incremento:: Incrementare il valore numerico di una
- variabile.
-@end menu
-
-@node Operatori aritmetici
-@subsection Operatori aritmetici
-@cindex aritmetici, operatori
-@cindex operatori aritmetici
-@c @cindex addition
-@c @cindex subtraction
-@c @cindex multiplication
-@c @cindex division
-@c @cindex remainder
-@c @cindex quotient
-@c @cindex exponentiation
-
-Il linguaggio @command{awk} usa i comuni operatori aritmetici nella valutazione
-delle espressioni. Tutti questi operatori aritmetici seguono le normali regole
-di precedenza e funzionano come ci si aspetta.
-
-Il seguente esempio usa un file chiamato @file{grades}, che contiene
-una lista di nomi di studenti e anche i voti di tre verifiche per ogni studente
-(@`e una piccola classe):
-
-@example
-Pat 100 97 58
-Sandy 84 72 93
-Chris 72 92 89
-@end example
-
-@noindent
-Questo programma prende il file @file{grades} e stampa la media
-dei voti:
-
-@example
-$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3}
-> @kbd{print $1, avg @}' grades}
-@print{} Pat 85
-@print{} Sandy 83
-@print{} Chris 84.3333
-@end example
-
-La lista seguente elenca gli operatori aritmetici in @command{awk},
-in ordine di precedenza, da quella pi@`u alta a quella pi@`u bassa:
-
-@table @code
-@cindex estensioni comuni, operatore @code{**}
-@cindex POSIX @command{awk}, operatori aritmetici e
-@item @var{x} ^ @var{y}
-@itemx @var{x} ** @var{y}
-Elevamento a potenza; @var{x} elevato alla potenza @var{y}. @samp{2 ^ 3}
-ha il valore otto; la sequenza di caratteri @samp{**} @`e equivalente a
-@samp{^}. @value{COMMONEXT}
-
-@item - @var{x}
-Negazione.
-
-@item + @var{x}
-Pi@`u unario; l'espressione @`e convertita in un numero.
-
-@item @var{x} * @var{y}
-Moltiplicazione.
-
-@cindex risoluzione di problemi, divisione
-@cindex problemi, risoluzione di, divisione
-@cindex divisione
-@item @var{x} / @var{y}
-Divisione; poich@'e tutti i numeri in @command{awk} sono numeri in virgola
-mobile, il risultato @emph{non} @`e arrotondato all'intero---@samp{3 / 4} ha il
-valore di 0.75. (Un errore comune, specialmente tra i programmatori in C, @`e
-quello di dimenticare che @emph{tutti} i numeri in @command{awk} sono in virgola mobile,
-e che la divisione di costanti rappresentate da numeri interi produce un
-numero reale, non un numero intero.)
-
-@item @var{x} % @var{y}
-Resto della divisione; subito dopo questa lista, l'argomento viene
-ulteriormente dettagliato.
-
-@item @var{x} + @var{y}
-Addizione.
-
-@item @var{x} - @var{y}
-Sottrazione.
-@end table
-
-Il pi@`u e il meno unari hanno la stessa precedenza,
-gli operatori di moltiplicazione hanno tutti la stessa precedenza, e
-l'addizione e la sottrazione hanno la stessa precedenza.
-
-@cindex differenze tra @command{awk} e @command{gawk}, operazione di modulo-troncamento
-@cindex modulo-troncamento, operazione di
-Quando si calcola il resto di @samp{@var{x} % @var{y}},
-il quoziente @`e troncato all'intero e
-moltiplicato per @var{y}. Questo risultato @`e sottratto da @var{x};
-quest'operazione @`e nota anche come ``modulo''. La seguente
-relazione @`e sempre verificata:
-
-@example
-b * int(a / b) + (a % b) == a
-@end example
-
-Un possibile effetto indesiderato di questa definizione di resto @`e che
-@samp{@var{x} % @var{y}} sia negativo se @var{x} @`e negativo. Cos@`{@dotless{i}}:
-
-@example
--17 % 8 = -1
-@end example
-
-In altre implementazioni di @command{awk} il segno del resto
-pu@`o essere dipendente dalla macchina.
-@c FIXME !!! what does posix say?
-
-@cindex portabilit@`a, operatore @code{**}
-@cindex @code{*} (asterisco), operatore @code{**}
-@cindex asterisco (@code{*}), operatore @code{**}
-@quotation NOTA
-Lo standard POSIX specifica solo l'uso di @samp{^}
-per l'elevamento a potenza.
-Per garantire la massima portabilit@`a @`e meglio non usare l'operatore @samp{**}.
-@end quotation
-
-@node Concatenazione
-@subsection Concatenazione di stringhe
-@cindex Kernighan, Brian
-@quotation
-@i{Allora ci era sembrata una buona idea.}
-@author Brian Kernighan
-@end quotation
-
-@cindex operatori di stringa
-@cindex stringa, operatori di
-@cindex concatenare
-C'@`e una sola operazione di stringa: la concatenazione. Non ha un operatore
-specifico per rappresentarla. Piuttosto, la concatenazione @`e effettuata
-scrivendo le espressioni l'una vicino all'altra, senza alcun operatore.
-Per esempio:
-
-@example
-$ @kbd{awk '@{ print "Campo numero uno: " $1 @}' mail-list}
-@print{} Campo numero uno: Amelia
-@print{} Campo numero uno: Anthony
-@dots{}
-@end example
-
-Senza lo spazio nella costante stringa dopo @samp{:}, la riga
-rimane unita. Per esempio:
-
-@example
-$ @kbd{awk '@{ print "Campo numero uno:" $1 @}' mail-list}
-@print{} Campo numero uno:Amelia
-@print{} Campo numero uno:Anthony
-@dots{}
-@end example
-
-@cindex risoluzione di problemi, concatenazione di stringhe
-@cindex problemi, risoluzione di, concatenazione di stringhe
-Poich@'e la concatenazione di stringhe non ha un operatore esplicito, @`e spesso
-necessario assicurarsi che venga effettuata al momento giusto usando le
-parentesi per racchiudere gli elementi da concatenare. Per esempio, ci si
-potrebbe aspettare che il
-seguente fammento di codice concateni @code{nome} e @code{file}:
-
-@example
-nome = "nome"
-file = "file"
-print "qualcosa di significativo" > nome file
-@end example
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@noindent
-Questo produce un errore di sintassi in alcune versioni di
-@command{awk} per Unix.@footnote{Pu@`o capitare che BWK
-@command{awk}, @command{gawk} e @command{mawk} lo interpretino nel modo giusto,
-ma non ci si dovrebbe fare affidamento.}
-@`E necessario usare la seguente sintassi:
-
-@example
-print "qualcosa di significativo" > (nome file)
-@end example
-
-@cindex ordine di valutazione, concatenazione
-@cindex valutazione, ordine di, concatenazione
-@cindex effetti collaterali
-Si dovrebbero usare le parentesi attorno alle concatenazioni in tutti i
-contesti non comuni, come, per esempio, sul lato destro di @samp{=}.
-Bisogna stare attenti
-al tipo di espressioni usate nella concatenazione di stringhe. In particolare,
-l'ordine di valutazione di espressioni usate per la concatenazione non @`e
-definita nel linguaggio @command{awk}. Si consideri quest'esempio:
-
-@example
-BEGIN @{
- a = "Non"
- print (a " " (a = "v'allarmate"))
-@}
-@end example
-
-@noindent
-Non @`e definito se il secondo assegnamento ad @code{a} debba avvenire
-prima o dopo il recupero del valore di @code{a} per produrre il
-valore concatenato. Il risultato potrebbe essere sia @samp{Non v'allarmate},
-sia @samp{v'allarmate v'allarmate}.
-@c see test/nasty.awk for a worse example
-
-La precedenza della concatenazione, quando @`e in combinazione con altri
-operatori, @`e spesso controintuitiva. Si consideri questo esempio:
-
-@ignore
-> To: bug-gnu-utils@@gnu.org
-> CC: arnold@@gnu.org
-> Subject: gawk 3.0.4 bug with {print -12 " " -24}
-> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG>
-> Date: Tue, 8 Feb 2000 19:56:08 -0700
->
-> gawk 3.0.4 on NT gives me:
->
-> prompt> cat bad.awk
-> BEGIN { print -12 " " -24; }
->
-> prompt> gawk -f bad.awk
-> -12-24
->
-> when I would expect
->
-> -12 -24
->
-> I have not investigated the source, or other implementations. The
-> bug is there on my NT and DOS versions 2.15.6 .
-@end ignore
-
-@example
-$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'}
-@print{} -12-24
-@end example
-
-Quest'esempio, ``ovviamente'' concatena @minus{}12, uno spazio, e @minus{}24.
-Ma dov'@`e finito lo spazio?
-La risposta sta nella combinazione di precedenze di operatori e nelle regole di
-conversione automatica di @command{awk}. Per ottenere il risultato desiderato,
-si deve scrivere il programma in questo modo:
-
-@example
-$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'}
-@print{} -12 -24
-@end example
-
-Questo forza il trattamento, da parte di @command{awk}, del @samp{-} del
-@samp{-24} come operatore unario. Altrimenti @`e analizzato in questo modo:
-
-@display
- @minus{}12 (@code{"@ "} @minus{} 24)
-@result{} @minus{}12 (0 @minus{} 24)
-@result{} @minus{}12 (@minus{}24)
-@result{} @minus{}12@minus{}24
-@end display
-
-Come si @`e detto precedentemente,
-quando si usa la concatenazione insieme ad altri operatori, @`e necessario
-@emph{usare le parentesi}. Altrimenti, non si pu@`o essere mai completamente
-certi di quel che si ottiene.
-
-@node Operatori di assegnamento
-@subsection Espressioni di assegnamento
-@cindex operatori di assegnamento
-@cindex assegnamento, operatori di
-@cindex espressioni di assegnamento
-@cindex @code{=} (uguale), operatore @code{=}
-@cindex uguale (@code{=}), operatore @code{=}
-Un @dfn{assegnamento} @`e un'espressione che memorizza un valore (generalmente
-diverso da quello che la variabile aveva in precedenza) in una variabile.
-Per esempio, si assegni il valore uno alla variabile @code{z}:
-
-@example
-z = 1
-@end example
-
-Dopo l'esecuzione di quest'espressione, la variabile @code{z} ha il valore
-uno. Qualsiasi precedente valore di @code{z} prima dell'assegnamento
-viene dimenticato.
-
-Gli assegnamenti possono anche memorizzare valori di stringa. Il seguente
-esempio memorizza
-il valore @code{"questo cibo @`e buono"} nella variabile @code{messaggio}:
-
-@example
-cosa = "cibo"
-predicato = "buono"
-messaggio = "questo " cosa " @`e " predicato
-@end example
-
-@noindent
-@cindex effetti collaterali, espressioni di assegnamento
-Quest'esempio illustra anche la concatenazione di stringhe.
-Il segno @samp{=} @`e un @dfn{operatore di assegnamento}. @`E il pi@`u semplice
-fra gli operatori di assegnamento perch@'e il valore dell'operando di destra
-@`e memorizzato invariato.
-La maggior parte degli operatori (addizione, concatenazione e cos@`{@dotless{i}} via) non
-fanno altro che calcolare un valore. Se il valore non viene poi utilizzato non c'@`e alcun
-motivo per usare l'operatore. Un operatore di assegnamento @`e differente;
-produce un valore; anche se poi non lo si usa, l'assegnamento svolge ancora
-una funzione alterando la variabile. Chiamiamo questo
-un @dfn{effetto collaterale}.
-
-@cindex @dfn{lvalue/rvalue}
-@cindex @dfn{rvalue/lvalue}
-@cindex assegnamento, operatori di, @dfn{lvalue/rvalue}
-@cindex operatori di assegnamento
-L'operando di sinistra non dev'essere necessariamente una variabile
-(@pxref{Variabili}); pu@`o essere anche un campo
-(@pxref{Cambiare i campi}) o
-@iftex
-un elemento di un vettore (@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-un elemento di un vettore (@pxref{Vettori}).
-@end ifnottex
-Questi operandi sono chiamati @dfn{lvalue}, il
-che significa che possono apparire sul lato sinistro di un operatore di
-assegnamento. L'operando sul lato destro pu@`o essere qualsiasi espressione;
-produce un nuovo valore che l'assegnamento memorizza nella variabile, nel campo
-o nell'elemento di vettore specificati. Tali valori sono chiamati
-@dfn{rvalue}.
-
-@cindex variabili, tipi di
-@`E importante notare che le variabili @emph{non} hanno dei tipi permanenti.
-Il tipo di una variabile @`e semplicemente quello di qualsiasi valore le sia stato
-assegnato per ultimo. Nel seguente frammento di programma, la variabile
-@code{pippo} ha dapprima un valore numerico, e in seguito un valore di stringa:
-
-@example
-pippo = 1
-print pippo
-pippo = "pluto"
-print pippo
-@end example
-
-@noindent
-Quando il secondo assegnamento d@`a a @code{pippo} un valore di stringa, il fatto
-che avesse precedentemente un valore numerico viene dimenticato.
-
-Ai valori di stringa che non iniziano con una cifra viene assegnato il valore
-numerico zero. Dopo l'esecuzione del seguente codice, il valore di @code{pippo} @`e
-cinque:
-
-@example
-pippo = "una stringa"
-pippo = pippo + 5
-@end example
-
-@quotation NOTA
-Usare una variabile sia come numero che come stringa pu@`o originare confusione
-e denota uno stile di programmazione scadente. I due esempi precedenti
-illustrano come funziona @command{awk}, @emph{non} come si dovrebbero scrivere
-i programmi!
-@end quotation
-
-Un assegnamento @`e un'espressione, per cui ha un valore: lo stesso valore che
-le @`e stato assegnato. Cos@`{@dotless{i}}, @samp{z = 1} @`e un'espressione col valore uno.
-Una conseguenza di ci@`o @`e che si possono scrivere pi@`u assegnamenti insieme,
-come:
-
-@example
-x = y = z = 5
-@end example
-
-@noindent
-Quest'esempio memorizza il valore cinque in tutte e tre le variabili,
-(@code{x}, @code{y} e @code{z}).
-Questo perch@'e il
-valore di @samp{z = 5}, che @`e cinque, @`e memorizzato in @code{y} e poi
-il valore di @samp{y = z = 5}, che @`e cinque, @`e memorizzato in @code{x}.
-
-Gli assegnamenti possono essere usati ovunque sia prevista un'espressione. Per
-esempio, @`e valido scrivere @samp{x != (y = 1)} per impostare @code{y} a
-uno, e poi verificare se @code{x} @`e uguale a uno. Per@`o questo stile rende i
-programmi difficili da leggere; una tale nidificazione di assegnamenti dovrebbe
-essere evitata, eccetto forse in un programma usa-e-getta.
-
-@cindex @code{+} (pi@`u), operatore @code{+=}
-@cindex pi@`u (@code{+}), operatore @code{+=}
-Accanto a @samp{=}, ci sono diversi altri operatori di assegnamento che
-eseguono calcoli col vecchio valore di una variabile. Per esempio,
-l'operatore @samp{+=} calcola un nuovo valore aggiungendo il valore sul lato
-destro al vecchio valore di una variabile. Cos@`{@dotless{i}}, il seguente assegnamento
-aggiunge cinque al valore di @code{pippo}:
-
-@example
-pippo += 5
-@end example
-
-@noindent
-Questo @`e equivalente a:
-
-@example
-pippo = pippo + 5
-@end example
-
-@noindent
-Si usi la notazione che rende pi@`u chiaro il significato del programma.
-
-Ci sono situazioni in cui usare @samp{+=} (o qualunque operatore di
-assegnamento) @emph{non} @`e la stessa cosa che ripetere semplicemente l'operando
-di sinistra nell'espressione di destra. Per esempio:
-
-@cindex Rankin, Pat
-@example
-# Grazie a Pat Rankin per quest'esempio
-BEGIN @{
- pippo[rand()] += 5
- for (x in pippo)
- print x, pippo[x]
-
- pluto[rand()] = pluto[rand()] + 5
- for (x in pluto)
- print x, pluto[x]
-@}
-@end example
-
-@cindex operatori di assegnamento, ordine di valutazione
-@cindex assegnamento, operatori di, ordine di valutazione
-@noindent
-@`E praticamente certo che gli indici di @code{pluto} siano differenti, perch@'e
-@code{rand()} restituisce valori differenti ogni volta che viene chiamata.
-(I vettori e la funzione @code{rand()} non sono ancora stati trattati.
-@iftex
-@xrefil{Vettori},
-@end iftex
-@ifnottex
-@xref{Vettori},
-@end ifnottex
-e
-@ifnotdocbook
-@pxref{Funzioni numeriche}
-@end ifnotdocbook
-@ifdocbook
-@ref{Funzioni numeriche}
-@end ifdocbook
-per maggiori informazioni.)
-Quest'esempio illustra un fatto importante riguardo agli operatori di
-assegnamento: l'espressione di sinistra viene valutata @emph{una volta sola}.
-
-Dipende dall'implementazione stabilire quale espressione valutare per
-prima, se quella di sinistra o quella di destra.
-Si consideri quest'esempio:
-
-@example
-i = 1
-a[i += 2] = i + 1
-@end example
-
-@noindent
-Il valore di @code{a[3]} potrebbe essere sia due sia quattro.
-
-La @ref{table-assign-ops} elenca gli operatori di assegnamento aritmetici. In
-ogni caso, l'operando di destra @`e un'espressione il cui valore @`e convertito in
-un numero.
-
-@cindex @code{-} (meno), operatore @code{-=}
-@cindex meno (@code{-}), operatore @code{-=}
-@cindex @code{*} (asterisco), operatore @code{*=}
-@cindex asterisco (@code{*}), operatore @code{*=}
-@cindex @code{/} (barra), operatore @code{/=}
-@cindex barra (@code{/}), operatore @code{/=}
-@cindex @code{%} (percento), operatore @code{%=}
-@cindex percento (@code{%}), operatore @code{%=}
-@cindex @code{^} (circonflesso), operatore @code{^=}
-@cindex circonflesso (@code{^}), operatore @code{^=}
-@cindex @code{*} (asterisco), operatore @code{**=}
-@cindex asterisco (@code{*}), operatore @code{**=}
-@float Tabella,table-assign-ops
-@caption{Operatori di assegnamento aritmetici}
-@multitable @columnfractions .30 .70
-@headitem Operatore @tab Effetto
-@item @var{lvalue} @code{+=} @var{incremento} @tab Aggiunge @var{incremento} al valore di @var{lvalue}.
-@item @var{lvalue} @code{-=} @var{decremento} @tab Sottrae @var{decremento} dal valore di @var{lvalue}.
-@item @var{lvalue} @code{*=} @var{coefficiente} @tab Moltiplica il valore di @var{lvalue} per @var{coefficiente}.
-@item @var{lvalue} @code{/=} @var{divisore} @tab Divide il valore di @var{lvalue} per @var{divisore}.
-@item @var{lvalue} @code{%=} @var{modulo} @tab Imposta @var{lvalue} al resto della sua divisione per @var{modulo}.
-@cindex estensioni comuni, operatore @code{**=}
-@cindex estensioni comuni@comma{} operatore @code{**=}
-@cindex @command{awk}, linguaggio, versione POSIX
-@cindex POSIX @command{awk}
-@item @var{lvalue} @code{^=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}.
-@item @var{lvalue} @code{**=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}. @value{COMMONEXT}
-@end multitable
-@end float
-
-@cindex POSIX @command{awk}, operatore @code{**=} e
-@cindex portabilit@`a, operatore @code{**=}
-@quotation NOTA
-Soltanto l'operatore @samp{^=} @`e definito da POSIX.
-Per avere la massima portabilit@`a, non usare l'operatore @samp{**=}.
-@end quotation
-
-@cindex sidebar, Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari
-@ifdocbook
-@docbook
-<sidebar><title>Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari</title>
-@end docbook
-
-@cindex angolo buio, costanti @dfn{regexp}, operatore @code{/=} e
-@cindex @code{/} (barra), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex barra (@code{/}), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @dfn{regexp}, costanti, @code{/=@dots{}/}, operatore @code{/=} e
-
-@c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu>
-@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
-
-@cindex angolo buio, operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex sintattica, ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @code{/=}, operatore, vs. costante @dfn{regexp} @code{/=@dots{}/}
-C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=}
-e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}.
-@value{DARKCORNER}
-Questo @`e pi@`u evidente in alcune versioni commerciali di @command{awk}.
-Per esempio:
-
-@example
-$ @kbd{awk /==/ /dev/null}
-@error{} awk: syntax error at source line 1
-@error{} context is
-@error{} >>> /= <<<
-@error{} awk: bailing out at source line 1
-@end example
-
-@noindent
-Un espediente @`e:
-
-@example
-awk '/[=]=/' /dev/null
-@end example
-
-@command{gawk} non ha questo problema, e neppure lo hanno BWK @command{awk}
-e @command{mawk}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari}
-
-
-@cindex angolo buio, costanti @dfn{regexp}, operatore @code{/=} e
-@cindex @code{/} (barra), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex barra (@code{/}), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @dfn{regexp}, costanti, @code{/=@dots{}/}, operatore @code{/=} e
-
-@c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu>
-@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
-
-@cindex angolo buio, operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex sintattica, ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
-@cindex @code{/=}, operatore, vs. costante @dfn{regexp} @code{/=@dots{}/}
-C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=}
-e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}.
-@value{DARKCORNER}
-Questo @`e pi@`u evidente in alcune versioni commerciali di @command{awk}.
-Per esempio:
-
-@example
-$ @kbd{awk /==/ /dev/null}
-@error{} awk: syntax error at source line 1
-@error{} context is
-@error{} >>> /= <<<
-@error{} awk: bailing out at source line 1
-@end example
-
-@noindent
-Un espediente @`e:
-
-@example
-awk '/[=]=/' /dev/null
-@end example
-
-@command{gawk} non ha questo problema, e neppure lo hanno BWK @command{awk}
-e @command{mawk}.
-@end cartouche
-@end ifnotdocbook
-
-@node Operatori di incremento
-@subsection Operatori di incremento e di decremento
-
-@cindex incremento, operatori di
-@cindex operatori di decremento/incremento
-Gli @dfn{operatori di incremento} e @dfn{decremento} incrementano o riducono il
-valore di una variabile di uno. Un operatore di assegnamento pu@`o fare la
-stessa cosa, per cui gli operatori di incremento non aggiungono funzionalit@`a
-al inguaggio @command{awk}; in ogni caso, sono delle convenienti abbreviazioni
-per operazioni molto comuni.
-
-@cindex effetti collaterali
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@cindex effetti collaterali, operatori di decremento/incremento
-L'operatore per aggiungere uno @`e @samp{++}. Pu@`o essere usato per incrementare
-una variabile prima o dopo aver stabilito il suo valore. Per @dfn{preincrementare}
-una variabile @code{v}, si scrive @samp{++v}. Questo aggiunge uno al valore di
-@code{v}; questo nuovo valore @`e anche il valore dell'espressione.
-(L'espressione di assegnamento @samp{v += 1} @`e totalmente equivalente.)
-Scrivendo @samp{++} dopo la variabile si specifica un @dfn{postincremento}.
-Questo incrementa il valore della variabile nello stesso modo; la differenza @`e
-che il valore dell'espressione d'incremento @`e il @emph{vecchio} valore della
-variabile. Cos@`{@dotless{i}}, se @code{pippo} ha il valore quattro, l'espressione
-@samp{pippo++} ha il valore quattro, ma cambia il valore di @code{pippo} in cinque.
-In altre parole, l'operatore restituisce il vecchio valore della variabile, ma
-con l'effetto collaterale di incrementarlo.
-
-Il postincremento @samp{pippo++} @`e quasi come scrivere @samp{(pippo += 1) - 1}.
-Non @`e perfettamente equivalente perch@'e tutti i numeri in @command{awk} sono in
-virgola mobile. In virgola mobile, @samp{pippo + 1 - 1} non @`e necessariamente
-uguale a @code{pippo}, ma la differenza @`e molto piccola finch@'e si ha a che
-fare con numeri relativamente piccoli (inferiori a
-@iftex
-@math{10^{12}}).
-@end iftex
-@ifinfo
-10e12).
-@end ifinfo
-@ifnottex
-@ifnotinfo
-10@sup{12}).
-@end ifnotinfo
-@end ifnottex
-
-@cindex @code{$} (dollaro), incrementare campi e vettori
-@cindex dollaro (@code{$}), incrementare campi e vettori
-I campi di un record e gli elementi di un vettore vengono incrementati
-proprio come le
-variabili. (Si deve usare @samp{$(i++)} quando si deve fare un riferimento a
-un campo e incrementare una variabile allo stesso tempo. Le parentesi sono
-necessarie a causa della precedenza dell'operatore di riferimento @samp{$}.)
-
-@cindex decremento, operatori di
-L'operatore di decremento @samp{--} funziona proprio come @samp{++}, solo che
-sottrae uno anzich@'e aggiungerlo. Come @samp{++}, si pu@`o usare prima di
-@dfn{lvalue}
-per predecrementare o dopo per postdecrementare.
-Quel che segue @`e un sommario delle espressioni di incremento e di
-decremento:
-
-@table @code
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@item ++@var{lvalue}
-Incrementa @var{lvalue}, restituendo il nuovo valore come
-valore dell'espressione.
-
-@item @var{lvalue}++
-Incrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
-come valore dell'espressione.
-
-@cindex @code{-} (meno), operatore @code{--}
-@cindex meno (@code{-}), operatore @code{--}
-@item --@var{lvalue}
-Decrementa @var{lvalue}, restituendo il nuovo valore come
-valore dell'espressione.
-(Quest'espressione @`e come
-@samp{++@var{lvalue}}, ma invece di aggiungere, sottrae.)
-
-@item @var{lvalue}--
-Decrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
-come valore dell'espressione.
-(Quest'espressione @`e come
-@samp{@var{lvalue}++}, ma invece di aggiungere, sottrae.)
-@end table
-
-@cindex sidebar, Ordine di valutazione degli operatori
-@ifdocbook
-@docbook
-<sidebar><title>Ordine di valutazione degli operatori</title>
-@end docbook
-
-@cindex precedenza
-@cindex operatori, precedenza
-@cindex portabilit@`a, operatori
-@cindex valutazione, ordine di
-@cindex Marx, Groucho
-@quotation
-@i{Dottore, quando faccio cos@`{@dotless{i}} mi fa male!@*
-E allora non farlo!}
-@author Groucho Marx
-@end quotation
-
-@noindent
-Che cosa succede con qualcosa come questo?
-
-@example
-b = 6
-print b += b++
-@end example
-
-@noindent
-O con qualcosa di pi@`u strano ancora?
-
-@example
-b = 6
-b += ++b + b++
-print b
-@end example
-
-@cindex effetti collaterali
-In altre parole, quando hanno effetto i vari effetti collaterali previsti
-dagli operatori col suffisso (@samp{b++})? Quando gli effetti collaterali
-si verificano @`e @dfn{definito dall'implementazione}.
-Per dirla diversamente, questo @`e compito di ogni specifica versione di
-@command{awk}. Il risultato del primo esempio pu@`o essere 12 o 13, e del
-secondo pu@`o essere 22 o 23.
-
-In breve, @`e sconsigliato fare cose come questa e, in ogni caso,
-ogni cosa che possa incidere sulla portabilit@`a.
-Si dovrebbero evitare cose come queste nei programmi.
-@c You'll sleep better at night and be able to look at yourself
-@c in the mirror in the morning.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Ordine di valutazione degli operatori}
-
-
-@cindex precedenza
-@cindex operatori, precedenza
-@cindex portabilit@`a, operatori
-@cindex valutazione, ordine di
-@cindex Marx, Groucho
-@quotation
-@i{Dottore, quando faccio cos@`{@dotless{i}} mi fa male!@*
-E allora non farlo!}
-@author Groucho Marx
-@end quotation
-
-@noindent
-Che cosa succede con qualcosa come questo?
-
-@example
-b = 6
-print b += b++
-@end example
-
-@noindent
-O con qualcosa di pi@`u strano ancora?
-
-@example
-b = 6
-b += ++b + b++
-print b
-@end example
-
-@cindex effetti collaterali
-In altre parole, quando hanno effetto i vari effetti collaterali previsti
-dagli operatori col suffisso (@samp{b++})? Quando gli effetti collaterali
-si verificano @`e @dfn{definito dall'implementazione}.
-Per dirla diversamente, questo @`e compito di ogni specifica versione di
-@command{awk}. Il risultato del primo esempio pu@`o essere 12 o 13, e del
-secondo pu@`o essere 22 o 23.
-
-In breve, @`e sconsigliato fare cose come questa e, in ogni caso,
-ogni cosa che possa incidere sulla portabilit@`a.
-Si dovrebbero evitare cose come queste nei programmi.
-@c You'll sleep better at night and be able to look at yourself
-@c in the mirror in the morning.
-@end cartouche
-@end ifnotdocbook
-
-@node Valori e condizioni di verit@`a
-@section Valori e condizioni di verit@`a
-
-In certi contesti, i valori delle espressioni servono anche come
-``valori di verit@`a''; cio@`e, determinano quale sar@`a la direzione che il
-programma prender@`a durante la sua esecuzione. Questa
-@value{SECTION} descrive come @command{awk} definisce ``vero'' e ``falso''
-e come questi valori sono confrontati.
-
-@menu
-* Valori di verit@`a:: Cos'@`e ``vero'' e cos'@`e ``falso''.
-* Tipi di variabile e confronti:: Come alle variabili si assegna il tipo e
- l'effetto che questo ha sul confronto di
- numeri e stringhe con @samp{<}, etc.
-* Operatori booleani:: Combinare espressioni di confronto usando
- operatori booleani @samp{||} (``or''),
- @samp{&&} (``and'') e @samp{!} (``not'').
-* Espressioni condizionali:: Le espressioni condizionali scelgono una fra
- due sottoespressioni, a seconda del valore di
- una terza sottoespressione.
-@end menu
-
-@node Valori di verit@`a
-@subsection Vero e falso in @command{awk}
-@cindex valori di verit@`a
-@cindex logico, valore, vero/falso
-@cindex falso, valore logico (zero o stringa nulla)
-@cindex vero, valore logico (diverso da zero e da stringa nulla)
-
-@cindex nulle, stringhe
-Molti linguaggi di programmazione hanno una particolare rappresentazione per i
-concetti di ``vero'' e ``falso.'' Questi linguaggi usano normalmente le
-costanti speciali @code{true} e @code{false}, o forse i loro equivalenti
-maiuscoli.
-Per@`o @command{awk} @`e differente.
-Prende in prestito un concetto molto semplice di vero e falso dal linguaggio
-C. In @command{awk}, ogni valore numerico diverso da zero @emph{oppure}
-ogni valore di stringa non vuota @`e vero. Ogni altro valore (zero o la stringa
-nulla, @code{""}) @`e falso. Il seguente programma stampa @samp{Uno strano
-valore di verit@`a} tre volte:
-
-@example
-BEGIN @{
- if (3.1415927)
- print "Uno strano valore di verit@`a"
- if ("Ottanta e sette anni or sono")
- print "Uno strano valore di verit@`a"
- if (j = 57)
- print "Uno strano valore di verit@`a"
-@}
-@end example
-
-@cindex angolo buio, @code{"0"} @`e effettivamente vero
-C'@`e una conseguenza sorprendente della regola ``non zero o non nullo'':
-la costante di stringa @code{"0"} sta effettivamente per vero, perch@'e
-@`e non nulla.
-@value{DARKCORNER}
-
-@node Tipi di variabile e confronti
-@subsection Tipi di variabile ed espressioni di confronto
-@quotation
-@i{La Guida galattica @`e infallibile. @`E la realt@`a, spesso, a essere inesatta.}
-@author Douglas Adams, @cite{Guida galattica per autostoppisti}
-@end quotation
-@c 2/2015: Antonio Colombo points out that this is really from
-@c The Restaurant at the End of the Universe. But I'm going to
-@c leave it alone.
-
-@cindex confronto, espressioni di
-@cindex espressioni di confronto
-@cindex espressioni, ricerca di corrispondenze, si veda espressioni di confronto
-@cindex individuazione, espressioni di, si veda espressioni di confronto
-@cindex relazionali, operatori, si veda espressioni di confronto
-@cindex operatori relazionali, si veda espressioni di confronto
-@cindex variabile, tipi di
-@cindex variabili, tipi di, espressioni di confronto e
-Diversamente che in altri linguaggi di programmazione, le variabili di
-@command{awk} non hanno un tipo fisso. Possono essere sia un numero che una
-stringa, a seconda del valore loro assegnato.
-Vediamo ora come viene assegnato il tipo a una variabile, e come @command{awk}
-le confronta.
-
-@menu
-* Tipi di variabile:: Tipo stringa rispetto a tipo numero.
-* Operatori di confronto:: Gli operatori di confronto.
-* Confronto POSIX di stringhe:: Confronto tra stringhe usando le
- regole POSIX.
-@end menu
-
-@node Tipi di variabile
-@subsubsection Tipo stringa rispetto a tipo numero
-
-Per gli elementi scalari in @command{awk} (variabili, elementi di
-vettore e campi), il tipo degli stessi viene attribuito @emph{dinamicamente}.
-Ci@`o significa che il tipo di un elemento pu@`o cambiare nel corso
-dell'esecuzione di un programma, da @dfn{untyped} (non ancora tipizzata),
-valore assunto prima che la variabile sia utilizzata,@footnote{@command{gawk}
-chiama queste variabili @dfn{unassigned} (non ancora assegnate), come si
-vede dall'esempio che segue.} a stringa oppure a numero, e in seguito
-da stringa a numero o da numero a stringa, nel prosieguo del programma.
-(@command{gawk} prevede anche degli scalari di tipo @dfn{regexp}, ma
-per ora possiamo ignorarli;
-@pxref{Costanti @dfn{regexp} forti}.)
-
-Non si pu@`o fare molto riguardo alle variabili di tipo @dfn{untyped},
-oltre a constatare che ancora non @`e stato loro attribuito un tipo.
-Il seguente programma confronta la variabile @code{a} con i valori
-@code{""} e @code{0}; il confronto d@`a esito positivo se alla
-variabile @code{a} non @`e mai stato assegnato un valore.
-L'esempio usa la funzione predefinita @code{typeof()}
-(non ancora trattata; @pxref{Funzioni per i tipi}) per
-visualizzare il tipo della variabile @code{a}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print (a == "" && a == 0 ?}
-> @kbd{"a non ha un tipo" : "a ha un tipo!") ; print typeof(a) @}'}
-@print{} a non ha un tipo
-@print{} unassigned
-@end example
-
-Una variabile scalare diviene di tipo numerico quando le viene assegnato un
-valore numerico, per mezzo di una costante numerica, o tramite un'altra
-variabile scalare di tipo numerico:
-
-@example
-$ @kbd{gawk 'BEGIN @{ a = 42 ; print typeof(a)}
-> @kbd{b = a ; print typeof(b) @}'}
-number
-number
-@end example
-
-Analogamente, una variabile scalare diviene di tipo stringa quando le
-viene assegnato come valore una stringa, per mezzo di una costante stringa,
-o tramite un'altra variabile scalare di tipo stringa:
-
-@example
-$ @kbd{gawk 'BEGIN @{ a = "quarantadue" ; print typeof(a)}
-> @kbd{b = a ; print typeof(b) @}'}
-string
-string
-@end example
-
-Fin qui, tutto semplice e chiaro. Cosa succede, per@`o, quando
-@command{awk} deve trattare dati forniti dall'utente?
-Il primo caso da considerare @`e quello dei campi di dati in input.
-Quale dovrebbe essere l'output del seguente programma?
-
-@example
-echo ciao | awk '@{ printf("%s %s < 42\n", $1,
- ($1 < 42 ? "@`e" : "non @`e")) @}'
-@end example
-
-@noindent
-Poich@'e @samp{ciao} @`e un dato di tipo alfabetico, @command{awk} pu@`o solo
-effettuare un confronto di tipo stringa. Internamente, il numero @code{42}
-viene convertito in @code{"42"} e vengono confrontate le due stringhe di
-valore @code{"ciao"} e @code{"42"}. Questo @`e il risultato:
-
-@example
-$ @kbd{echo ciao | awk '@{ printf("%s %s < 42\n", $1,}
-> @kbd{ ($1 < 42 ? "@`e" : "non @`e")) @}'}
-@print{} ciao non @`e < 42
-@end example
-
-Tuttavia, cosa succede quando un dato utente @emph{assomiglia} a un
-numero?
-Da un lato, in realt@`a, il dato in input @`e formato da alcuni caratteri, non da
-valori numerici in formato binario. Ma, d'altro lato, il dato sembra
-numerico, e @command{awk} dovrebbe davvero trattarlo come tale. E in effetti
-questo @`e ci@`o che avviene:
-
-@example
-$ @kbd{echo 37 | awk '@{ printf("%s %s < 42\n", $1,}
-> @kbd{ ($1 < 42 ? "@`e" : "non @`e")) @}'}
-@print{} 37 is < 42
-@end example
-
-Queste sono le regole seguite per determinare quando @command{awk}
-tratta dei dati in input come numeri, e quando li considera stringhe.
-
-@cindex numeriche, stringhe
-@cindex stringhe, numeriche
-@cindex POSIX @command{awk}, stringhe numeriche e
-Lo standard POSIX usa il concetto di @dfn{stringa numerica}, per dei dati
-in input che appaiono essere numerici. Il @samp{37} nell'esempio precedente
-@`e una stringa numerica. Quindi, qual @`e il tipo di una stringa numerica?
-Risposta: numerico.
-
-Il tipo di una variabile @`e importante perch@'e il tipo di due variabili
-determina il modo con cui le stesse vengono confrontate.
-La determinazione del tipo di variabile segue queste regole:
-
-@itemize @value{BULLET}
-@item
-Una costante numerica o il risultato di un'operazione numerica ha l'attributo
-@dfn{numeric}.
-
-@item
-Una costante di stringa o il risultato di un'operazione di stringa ha
-l'attributo @dfn{string}.
-
-@item
-Campi, input tramite @code{getline}, @code{FILENAME}, elementi di
-@code{ARGV}, elementi di @code{ENVIRON}, e gli elementi di un vettore
-creato da @code{match()}, @code{split()} e @code{patsplit()} che sono
-stringhe numeriche hanno l'attributo @dfn{strnum}.@footnote{Quindi, una
-stringa numerica POSIX e una variabile tipo @dfn{strnum} di @command{gawk}
-sono equivalenti.}
-Altrimenti, hanno l'attributo @dfn{string}.
-Anche le variabili non inizializzate hanno l'attributo @var{strnum}.
-
-@item
-Gli attributi si trasmettono attraverso gli assegnamenti ma non vengono
-cambiati da nessun uso.
-@c (Although a use may cause the entity to acquire an additional
-@c value such that it has both a numeric and string value, this leaves the
-@c attribute unchanged.)
-@c This is important but not relevant
-@end itemize
-
-L'ultima regola @`e particolarmente importante. Nel seguente programma,
-@code{a} @`e di tipo numerico, anche se viene usata in un secondo momento in
-un'operazione di stringa:
-
-@example
-BEGIN @{
- a = 12.345
- b = a " @`e un numero carino"
- print b
-@}
-@end example
-
-Quando si confrontano due operandi, pu@`o essere usata sia il confronto come
-stringa che il confronto numerico, a seconda degli attributi degli operandi,
-secondo questa matrice simmetrica:
-
-@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables
-@tex
-\centerline{
-\vbox{\bigskip % space above the table (about 1 linespace)
-% Because we have vertical rules, we can't let TeX insert interline space
-% in its usual way.
-\offinterlineskip
-%
-% Define the table template. & separates columns, and \cr ends the
-% template (and each row). # is replaced by the text of that entry on
-% each row. The template for the first column breaks down like this:
-% \strut -- a way to make each line have the height and depth
-% of a normal line of type, since we turned off interline spacing.
-% \hfil -- infinite glue; has the effect of right-justifying in this case.
-% # -- replaced by the text (for instance, `STRNUM', in the last row).
-% \quad -- about the width of an `M'. Just separates the columns.
-%
-% The second column (\vrule#) is what generates the vertical rule that
-% spans table rows.
-%
-% The doubled && before the next entry means `repeat the following
-% template as many times as necessary on each line' -- in our case, twice.
-%
-% The template itself, \quad#\hfil, left-justifies with a little space before.
-%
-\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr
- &&STRING &NUMERIC &STRNUM\cr
-% The \omit tells TeX to skip inserting the template for this column on
-% this particular row. In this case, we only want a little extra space
-% to separate the heading row from the rule below it. the depth 2pt --
-% `\vrule depth 2pt' is that little space.
-\omit &depth 2pt\cr
-% This is the horizontal rule below the heading. Since it has nothing to
-% do with the columns of the table, we use \noalign to get it in there.
-\noalign{\hrule}
-% Like above, this time a little more space.
-\omit &depth 4pt\cr
-% The remaining rows have nothing special about them.
-STRING &&string &string &string\cr
-NUMERIC &&string &numeric &numeric\cr
-STRNUM &&string &numeric &numeric\cr
-}}}
-@end tex
-@ifnottex
-@ifnotdocbook
-@verbatim
- +----------------------------------------------
- | STRING NUMERIC STRNUM
---------+----------------------------------------------
- |
-STRING | string string string
- |
-NUMERIC | string numeric numeric
- |
-STRNUM | string numeric numeric
---------+----------------------------------------------
-@end verbatim
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<informaltable>
-<tgroup cols="4">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<colspec colname="3" align="left"/>
-<colspec colname="4" align="left"/>
-<thead>
-<row>
-<entry/>
-<entry>STRING</entry>
-<entry>NUMERIC</entry>
-<entry>STRNUM</entry>
-</row>
-</thead>
-
-<tbody>
-<row>
-<entry><emphasis role="bold">STRING</emphasis></entry>
-<entry>string</entry>
-<entry>string</entry>
-<entry>string</entry>
-</row>
-
-<row>
-<entry><emphasis role="bold">NUMERIC</emphasis></entry>
-<entry>string</entry>
-<entry>numeric</entry>
-<entry>numeric</entry>
-</row>
-
-<row>
-<entry><emphasis role="bold">STRNUM</emphasis></entry>
-<entry>string</entry>
-<entry>numeric</entry>
-<entry>numeric</entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-L'idea di base @`e che l'input dell'utente che appare come numerico---e
-@emph{solo} l'input dell'utente---dovrebbe essere trattato come numerico, anche
-se in realt@`a @`e un insieme di caratteri e quindi anche una stringa.
-Cos@`{@dotless{i}}, ad esempio, la costante di stringa @w{@code{" +3.14"}},
-quando appare nel codice sorgente di un programma,
-@`e una stringa---anche se sembra numerica---e non
-viene @emph{mai} trattato come numero
-ai fini di un confronto.
-
-In breve, quando un operando @`e una stringa ``pura'', come una costante di
-stringa, viene effettuato un confronto di stringa. In caso contrario viene
-effettuato un confronto numerico.
-(La differenza principale tra un numero e uno @dfn{strnum} @`e che per gli
-@dfn{strnum} @command{gawk} conserva anche il valore originale della stringa
-che la variabile scalare aveva al momento in cui @`e stata letta.
-
-Questo punto merita di essere ulteriormente ribadito:
-l'input che appare essere un numero @emph{@`e} numerico.
-Tutto il resto dell'input @`e considerato essere una stringa.
-
-Cos@`{@dotless{i}}, la stringa in input di sei caratteri @w{@samp{ +3.14}}
-riceve l'attributo @dfn{strnum}. Al contrario, la stringa di sei caratteri
-@w{@code{" +3.14"}} che compaia nel testo di un programma rimane una
-costante di stringa. I seguenti esempi stampano @samp{1} quando il confronto
-fra due diverse costanti @`e vero, altrimenti stampano @samp{0}:
-
-@c 22.9.2014: Tested with mawk and BWK awk, got same results.
-@example
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == " +3.14") @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == "+3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == "3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($0 == 3.14) @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == " +3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == "+3.14") @}'} @ii{Vero}
-@print{} 1
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == "3.14") @}'} @ii{Falso}
-@print{} 0
-$ @kbd{echo ' +3.14' | awk '@{ print($1 == 3.14) @}'} @ii{Vero}
-@print{} 1
-@end example
-
-Per controllare il tipo di un campo in input (o di altro input immesso
-dall'utente, si pu@`o usare @code{typeof()}:
-
-@example
-$ @kbd{echo salve 37 | gawk '@{ print typeof($1), typeof($2) @}'}
-@print{} string strnum
-@end example
-
-@node Operatori di confronto
-@subsubsection Operatori di confronto
-
-Le @dfn{espressioni di confronto} confrontano stringhe o numeri per metterli in
-relazione tra di loro, come ad esempio nella relazione di uguaglianza. Sono
-scritte usando @dfn{operatori di relazione}, che sono un superinsieme di quelli
-in C. Sono descritti nella @ref{table-relational-ops}.
-
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>}
-@cindex @code{=} (uguale), operatore @code{==}
-@cindex uguale (@code{=}), operatore @code{==}
-@cindex @code{!} (punto esclamativo), operatore @code{!=}
-@cindex punto esclamativo (@code{!}), operatore @code{!=}
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@cindex @code{in}, operatore
-@float Tabella,table-relational-ops
-@caption{Operatori di relazione}
-@multitable @columnfractions .23 .77
-@headitem Espressione @tab Risultato
-@item @var{x} @code{<} @var{y} @tab Vero se @var{x} @`e minore di @var{y}
-@item @var{x} @code{<=} @var{y} @tab Vero se @var{x} @`e minore o uguale a @var{y}
-@item @var{x} @code{>} @var{y} @tab Vero se @var{x} @`e maggiore di @var{y}
-@item @var{x} @code{>=} @var{y} @tab Vero se @var{x} @`e maggiore o uguale a @var{y}
-@item @var{x} @code{==} @var{y} @tab Vero se @var{x} @`e uguale a @var{y}
-@item @var{x} @code{!=} @var{y} @tab Vero se @var{x} @`e diverso da @var{y}
-@item @var{x} @code{~} @var{y} @tab Vero se la stringa @var{x} corrisponde alla @dfn{regexp} rappresentata da @var{y}
-@item @var{x} @code{!~} @var{y} @tab Vero se la stringa @var{x} non corrisponde alla @dfn{regexp} rappresentata da @var{y}
-@item @var{indice} @code{in} @var{vettore} @tab Vero se il vettore @var{vettore} ha un elemento con indice @var{indice}
-@end multitable
-@end float
-
-Le espressioni di confronto valgono uno se sono vere e zero se false.
-Quando si confrontano operandi di tipi diversi, gli operandi numerici sono
-convertiti in stringhe usando il valore di @code{CONVFMT}
-(@pxref{Conversione}).
-
-Il confronto tra stringhe avviene
-confrontando il primo carattere di ciascuna stringa, poi il secondo carattere,
-e cos@`{@dotless{i}} via. Quindi, @code{"10"} @`e minore di @code{"9"}. Se vi sono due
-stringhe di cui una @`e il prefisso dell'altra, la stringa pi@`u corta @`e minore di
-quella pi@`u lunga. Cos@`{@dotless{i}}, @code{"abc"} @`e minore di @code{"abcd"}.
-
-@cindex risoluzione di problemi, operatore @code{==}
-@cindex problemi, risoluzione di, operatore @code{==}
-@`E molto facile sbagliarsi scrivendo l'operatore @samp{==} e
-omettendo uno dei due caratteri @samp{=}. Il risultato @`e sempre un codice
-@command{awk} valido, ma il programma non fa quel che si voleva:
-
-@example
-if (a = b) # oops! dovrebbe essere == b
- @dots{}
-else
- @dots{}
-@end example
-
-@noindent
-A meno che @code{b} non sia zero o la stringa nulla, la parte @code{if}
-del test ha sempre successo. Poich@'e gli operatori sono molto simili,
-questo tipo di errore @`e molto difficile da individuare
-rileggendo il codice sorgente.
-
-Il seguente elenco di espressioni illustra il tipo di confronti
-che @command{awk} effettua e il risultato di ciascun confronto:
-
-@table @code
-@item 1.5 <= 2.0
-Confronto numerico (vero)
-
-@item "abc" >= "xyz"
-Confronto tra stringhe (falso)
-
-@item 1.5 != " +2"
-Confronto tra stringhe (vero)
-
-@item "1e2" < "3"
-Confronto tra stringhe (vero)
-
-@item a = 2; b = "2"
-@itemx a == b
-Confronto tra stringhe (vero)
-
-@item a = 2; b = " +2"
-@itemx a == b
-Confronto tra stringhe (falso)
-@end table
-
-In quest'esempio:
-
-@example
-$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "vero" : "falso" @}'}
-@print{} falso
-@end example
-
-@cindex espressioni di confronto, stringa vs.@: @dfn{regexp}
-@c @cindex string comparison vs.@: regexp comparison
-@c @cindex regexp comparison vs.@: string comparison
-@noindent
-il risultato @`e @samp{falso} perch@'e sia @code{$1} che @code{$2}
-sono immessi dall'utente. Sono stringhe numeriche---quindi hanno entrambe
-l'attributo @dfn{strnum}, che richiede un confronto di tipo numerico.
-Lo scopo delle regole di confronto e dell'uso di stringhe numeriche @`e quello
-di cercare di produrre il comportamento "meno inaspettato possibile",
-pur "facendo la cosa giusta".
-
-I confronti di stringhe e i confronti di espressioni regolari sono molto
-diversi. Per esempio:
-
-@example
-x == "att"
-@end example
-
-@noindent
-ha il valore uno, ossia @`e vero, se la variabile @code{x}
-@`e precisamente @samp{att}. Al contrario:
-
-@example
-x ~ /att/
-@end example
-
-@noindent
-ha il valore uno se @code{x} contiene @samp{att}, come
-@code{"Oh, che matto che sono!"}.
-
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-L'operando di destra degli operatori @samp{~} e @samp{!~} pu@`o essere sia una
-costante @dfn{regexp} (@code{/}@dots{}@code{/}) che un'espressione ordinaria.
-In quest'ultimo caso, il valore dell'espressione come stringa @`e usato come una
-@dfn{regexp} dinamica (@pxref{Uso di @dfn{regexp}}; e
-@pxref{Espressioni regolari calcolate}).
-
-@cindex @command{awk}, costanti @dfn{regexp} e
-@cindex costanti @dfn{regexp}
-@cindex @dfn{regexp}, costanti
-Un'espressione regolare costante tra due barre @`e di per s@'e anche
-un'espressione. @code{/@var{regexp}/} @`e un'abbreviazione per la seguente
-espressione di confronto:
-
-@example
-$0 ~ /@var{regexp}/
-@end example
-
-Una particolare posizione dove @code{/pippo/} @emph{non} @`e un'abbreviazione di
-@samp{$0 ~ /pippo/} @`e quella in cui @`e l'operando di destra di @samp{~} o
-@samp{!~}.
-@xref{Usare le costanti @dfn{regexp}},
-dove questo punto @`e trattato in maggiore dettaglio.
-
-@node Confronto POSIX di stringhe
-@subsubsection Confronto tra stringhe usando l'ordine di collazione locale
-
-Lo standard POSIX diceva che il confronto di stringhe viene effettuato secondo
-l'@dfn{ordine di collazione} locale. Questo @`e l'ordine secondo il quale sono
-disposti i caratteri, come definito dalla localizzazione (per una trattazione
-pi@`u dettagliata, @pxref{Localizzazioni}). Quest'ordine normalmente @`e molto
-diverso dal risultato ottenuto quando si esegue un confronto rigorosamente
-"carattere per carattere".@footnote{Tecnicamente, il confronto di stringhe
-dovrebbe funzionare come se le stringhe fossero confrontate usando la
-funzione @code{strcoll()} di C.}
-
-Poich@'e questo comportamento differisce sensibilmente dalla pratica corrente,
-@command{gawk} lo implementava solo quando eseguito in modalit@`a POSIX
-(@pxref{Opzioni}).
-Quest'esempio ilustra la differenza, in una localizzazione
-@code{en_US.UTF-8}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",}
-> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
-@print{} ABC < abc = TRUE
-$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",}
-> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
-@print{} ABC < abc = FALSE
-@end example
-Fortunatamente, dal mese di agosto 2016, un confronto basato sull'ordine
-di collazione locale non @`e pi@`u richiesto per gli operatori @code{==} e
-@code{!=}.@footnote{Si consulti il sito web
-@uref{http://austingroupbugs.net/view.php?id=1070,
-dell'Austin Group}.} Tuttavia, un confronto basato sull'ordine di
-collazione locale @`e ancora richiesto per gli operatori @code{<},
-@code{<=}, @code{>} e @code{>=}. POSIX, quindi, raccomanda quanto
-segue:
-
-@quotation
-Poich@'e l'operatore @code{==} controlla che se le stringhe sono identiche,
-e non se sono nell'ordine di collazione locale, le applicazioni che
-devono controllare se le stringhe sono nell'ordine di collazione locale
-possono usare:
-
-@example
-a <= b && a >= b
-@end example
-@end quotation
-
-A partire dalla @value{PVERSION} 4.2, @command{gawk} continua a usare
-l'ordine di collazione locale per @code{<}, @code{<=}, @code{>}
-e @code{>=} solo se eseguito nella modalit@`a POSIX.
-
-@node Operatori booleani
-@subsection Espressioni booleane
-@cindex @dfn{and}, operatore logico-booleano
-@cindex @dfn{or}, operatore logico-booleano
-@cindex @dfn{not}, operatore logico-booleano
-@cindex espressioni booleane
-@cindex booleane, espressioni
-@cindex operatori booleani, si veda espressioni booleane
-@cindex booleani, operatori, si veda espressioni booleane
-@cindex logici, operatori, si veda espressioni booleane
-@cindex operatori logici, si veda espressioni booleane
-
-Un'@dfn{espressione booleana} @`e una combinazione di espressioni di confronto o
-espressioni di ricerca, che usa gli operatori booleani "or"
-(@samp{||}), "and" (@samp{&&}), e "not" (@samp{!}), facendo uso di
-parentesi per controllare le nidificazioni. Il valore di verit@`a
-dell'espressione booleana @`e calcolato calcolando i valori di verit@`a delle
-espressioni componenti. Le espressioni booleane sono conosciute anche come
-@dfn{espressioni logiche}. I due termini sono equivalenti.
-
-Le espressioni booleane possono essere usate in tutti i casi in cui @`e possibile
-usare espressioni di confronto e di ricerca di corrispondenze. Si possono
-usare nelle istruzioni @code{if}, @code{while}, @code{do} e @code{for}
-(@pxref{Istruzioni}).
-Hanno valori numerici (uno se vero, zero se falso) che entrano in gioco
-se il risultato di un'espressione booleana @`e memorizzato in una variabile o
-se @`e usato nei calcoli.
-
-Inoltre, ogni espressione booleana @`e anche un modello di ricerca valido, cos@`{@dotless{i}}
-se ne pu@`o usare uno come modello di ricerca per controllare l'esecuzione di
-regole. Gli operatori booleani sono:
-
-@table @code
-@item @var{booleano1} && @var{booleano2}
-Vero se @var{booleano1} e @var{booleano2} sono entrambi veri. Per esempio,
-la seguente istruzione stampa il record in input corrente se contiene
-sia @samp{edu} che @samp{li}:
-
-@example
-if ($0 ~ /edu/ && $0 ~ /li/) print
-@end example
-
-@cindex effetti collaterali, operatori booleani
-La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
-@`e vero. Questo pu@`o comportare una differenza laddove @var{booleano2} contenga
-espressioni che hanno effetti collaterali. Nel caso di @samp{$0 ~ /pippo/ &&
-($2 == pluto++)}, la variabile @code{pluto} non viene incrementata se non c'@`e
-nessuna sottostringa @samp{pippo} nel record.
-
-@item @var{booleano1} || @var{booleano2}
-Vero se almeno uno tra @var{booleano1} e @var{booleano2} @`e vero.
-Per esempio, la seguente istruzione stampa tutti i record dell'input che
-contengono @samp{edu} @emph{oppure}
-@samp{li}:
-
-@example
-if ($0 ~ /edu/ || $0 ~ /li/) print
-@end example
-
-La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
-@`e falso. Questo pu@`o comportare una differenza quando @var{booleano2} contiene
-espressioni che hanno effetti collaterali.
-(Perci@`o, questo confronto non individua mai i record che contengono sia
-@samp{edu} che @samp{li}: non appena @samp{edu} viene trovato,
-l'intero confronto @`e concluso positivamente.)
-
-@item ! @var{booleano}
-Vero se @var{booleano} @`e falso. Per esempio,
-il seguente programma stampa @samp{nessuna home!} nel
-caso insolito che la variabile d'ambiente @env{HOME}
-non sia stata definita:
-
-@example
-BEGIN @{ if (! ("HOME" in ENVIRON))
- print "nessuna home!" @}
-@end example
-
-(L'operatore @code{in} @`e descritto in
-@ref{Visitare elementi}.)
-@end table
-
-@cindex cortocircuito, operatori
-@cindex operatori di cortocircuito
-@cindex @code{&} (e commerciale), operatore @code{&&}
-@cindex e commerciale (@code{&}), operatore @code{&&}
-@cindex @code{|} (barra verticale), operatore @code{||}
-@cindex barra verticale (@code{|}), operatore @code{||}
-Gli operatori @samp{&&} e @samp{||} sono chiamati operatori di
-@dfn{cortocircuito} per il modo in cui funzionano. La valutazione dell'intera
-espressione @`e "cortocircuitata" se il risultato pu@`o gi@`a essere determinato
-prima di aver completato interamente la valutazione.
-
-@cindex continuazione di riga
-Le istruzioni che finiscono con @samp{&&} o @samp{||} si possono continuare
-semplicemente mettendo un ritorno a capo dopo di esse. Per@`o non si pu@`o mettere
-un ritorno a capo @emph{prima} di questi operatori senza usare la
-continuazione tramite la barra inversa (@pxref{Istruzioni/Righe}).
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@cindex ritorno a capo
-@cindex variabili di tipo indicatore [@dfn{flag}]
-@cindex @dfn{flag} [indicatore], variabili
-Il valore reale di un'espressione che usa l'operatore @samp{!} @`e uno
-o zero, a seconda del valore di verit@`a dell'espressione a cui
-@`e applicato.
-L'operatore @samp{!} spesso @`e utile per cambiare il senso di una variabile
-indicatore [@dfn{flag}] da falso a vero e viceversa. Per esempio, il seguente
-programma @`e un modo per stampare righe poste tra due speciali righe
-delimitatrici:
-
-@example
-$1 == "START" @{ pertinente = ! pertinente; next @}
-pertinente @{ print @}
-$1 == "END" @{ pertinente = ! pertinente; next @}
-@end example
-
-@noindent
-La variabile @code{pertinente}, cos@`{@dotless{i}} come tutte le variabili di @command{awk},
-@`e inizializzata a zero, che vale anche "falso". Quando viene trovata
-una riga il cui primo campo @`e @samp{START}, il valore di @code{pertinente}
-viene commutato a vero, usando @samp{!}. La regola nella riga seguente stampa righe finch@'e
-@code{pertinente} resta vero. Quando viene trovata una riga il cui primo
-campo @`e @samp{END}, @code{pertinente} viene nuovamente commutata a
-falso.@footnote{Questo programma ha un bug; stampa righe che iniziano con
-@samp{END}. Come si pu@`o risolvere?}
-
-@ignore
-Scott Deifik points out that this program isn't robust against
-bogus input data, but the point is to illustrate the use of `!',
-so we'll leave well enough alone.
-@end ignore
-
-Pi@`u comunemente, l'operatore @samp{!} viene usato nelle condizioni delle
-istruzioni @code{if} e @code{while}, dove ha pi@`u senso formulare espressioni
-logiche in negativo:
-
-@example
-if (! @var{qualche condizione} || @var{qualche altra condizione}) @{
- @var{@dots{} fai un'operazione a piacere @dots{}}
-@}
-@end example
-
-@cindex @code{next}, istruzione
-@quotation NOTA
-L'istruzione @code{next} viene trattata in
-@ref{Istruzione next}.
-@code{next} dice ad @command{awk} di tralasciare il resto delle regole,
-leggere il record successivo, e iniziare a elaborare le regole partendo
-nuovamente dalla prima.
-Il motivo @`e quello di evitare di stampare le righe delimitatrici
-@samp{START} e @samp{END}.
-@end quotation
-
-@node Espressioni condizionali
-@subsection Espressioni condizionali
-@cindex condizionali, espressioni
-@cindex espressioni condizionali
-@cindex espressioni, selezionare
-
-Un'@dfn{espressione condizionale} @`e un tipo particolare di espressione che ha
-tre operandi. Consente di usare il primo valore dell'espressione per
-scegliere una o l'altra delle due ulteriori espressioni.
-L'espressione condizionale in @command{awk} @`e la stessa di quella del
-linguaggio C, ovvero:
-
-@example
-@var{selettore} ? @var{espr-se-vero} : @var{espr-se-falso}
-@end example
-
-@noindent
-Ci sono tre sottoespressioni. La prima, @var{selettore}, viene sempre
-calcolata per prima. Se @`e "vera" (non zero o non nulla), viene poi calcolata
-@var{espr-se-vero} e il suo valore diventa il valore dell'intera espressione.
-Altrimenti, la seconda espressione che viene calcolata @`e @var{espr-se-falso}
-e il suo valore diventa il valore dell'intera espressione.
-Per esempio, la seguente espressione produce il valore assoluto di @code{x}:
-
-@example
-x >= 0 ? x : -x
-@end example
-
-@cindex effetti collaterali, espressioni condizionali
-Ogni volta che viene calcolata un'espressione condizionale, solo una delle
-espressioni @var{espr-se-vero} e @var{espr-se-falso} viene usata; l'altra
-@`e ignorata. Questo @`e importante quando le espressioni hanno effetti
-collaterali. Per esempio, quest'espressione condizionale esamina l'elemento
-@code{i} del vettore @code{a} o del vettore @code{b}, e incrementa @code{i}:
-
-@example
-x == y ? a[i++] : b[i++]
-@end example
-
-@noindent
-Questa istruzione garantisce che @code{i} sia incrementato una volta sola
-per ogni esecuzione dell'istruzione stessa, perch@'e ogni volta viene eseguita
-solo una delle due espressioni di incremento, mentre l'altra viene
-ignorata.
-@iftex
-@xrefil{Vettori},
-@end iftex
-@ifnottex
-@xref{Vettori},
-@end ifnottex
-per maggiori informazioni sui vettori.
-
-@cindex differenze tra @command{awk} e @command{gawk}, continuazione di riga
-@cindex continuazione di riga, @command{gawk}
-@cindex @command{gawk}, continuazione di riga in
-Come estensione minore di @command{gawk},
-un'istruzione che usa @samp{?:} si pu@`o continuare mettendo
-semplicemente un ritorno a capo dopo i due caratteri.
-Tuttavia, se si mette un ritorno a capo @emph{prima} dei due
-caratteri, la continuazione non funziona, se non si aggiunge anche la barra inversa
-(@pxref{Istruzioni/Righe}).
-Se viene specificata l'opzione @option{--posix}
-(@pxref{Opzioni}), quest'estensione @`e disabilitata.
-
-@node Chiamate di funzione
-@section Chiamate di funzione
-@cindex chiamata di funzione
-
-Una @dfn{funzione} @`e un nome per richiedere un particolare calcolo.
-Il nome permette di richiamare
-la funzione da qualsiasi punto del programma.
-Per esempio, la funzione @code{sqrt()} calcola la radice quadrata di un numero.
-
-@cindex funzioni predefinite
-Un certo numero di funzioni sono @dfn{predefinite}, ossia sono
-disponibili in ogni programma @command{awk}. La funzione @code{sqrt()} @`e una
-di queste. @xref{Funzioni predefinite} per un elenco di funzioni
-predefinite e per le loro rispettive descrizioni. In aggiunta, l'utente pu@`o
-definire delle funzioni da usare nel proprio programma.
-@xref{Funzioni definite dall'utente}
-per istruzioni su come farlo.
-Infine, @command{gawk} permette di scrivere funzioni in C o in C++ che possono
-essere chiamate dal proprio programma (@pxref{Estensioni dinamiche}).
-
-@cindex argomenti, nelle chiamate di funzione
-Una funzione viene utilizzata invocandola tramite un'espressione di
-@dfn{chiamata di funzione}, che consiste nel nome della funzione seguito
-immediatamente da una lista di @dfn{argomenti} tra parentesi. Gli argomenti
-sono espressioni che forniscono i materiali grezzi su cui opera la funzione.
-Quando ci sono pi@`u argomenti, questi sono separati da virgole. Se
-non ci sono argomenti, basta scrivere @samp{()} dopo il nome della funzione.
-Gli esempi che seguono mostrano chiamate di funzione con e senza argomenti:
-
-@example
-sqrt(x^2 + y^2) @ii{un argomento}
-atan2(y, x) @ii{due argomenti}
-rand() @ii{nessun argomento}
-@end example
-
-@cindex risoluzione di problemi, sintassi della chiamata di funzione
-@cindex problemi, risoluzione di, sintassi della chiamata di funzione
-@quotation ATTENZIONE
-Non ci dev'essere nessuno spazio tra il nome della funzione e la parentesi
-aperta! Un nome di funzione definita dall'utente pu@`o essere scambiata per
-il nome di una
-variabile: uno spazio renderebbe l'espressione simile alla concatenazione di
-una variabile con un'espressione racchiusa tra parentesi.
-Per le funzioni predefinite, lo spazio prima delle parentesi non crea problemi,
-ma @`e meglio non prendere l'abitudine di usare spazi per evitare errori con le
-funzioni definite dall'utente.
-@end quotation
-
-Ogni funzione richiede uno specifico numero di argomenti.
-Per esempio, la funzione @code{sqrt()} dev'essere chiamata con
-un solo argomento, il numero del quale si vuole estrarre la radice quadrata:
-
-@example
-sqrt(@var{argomento})
-@end example
-
-Alcune delle funzioni predefinite hanno uno o pi@`u argomenti opzionali.
-Se questi argomenti non vengono forniti, le funzioni
-usano un valore di default appropriato.
-@xref{Funzioni predefinite} per tutti i dettagli. Se sono omessi argomenti
-in chiamate a funzioni definite dall'utente, tali argomenti sono considerati
-essere variabili locali. Il valore di tali variabili locali
-@`e la stringa nulla se usate in un contesto che richiede una stringa
-di caratteri, e lo zero se @`e richiesto
-un valore numerico
-(@pxref{Funzioni definite dall'utente}).
-
-Come funzionalit@`a avanzata, @command{gawk} prevede la possibilit@`a di
-effettuare chiamate di funzione
-indirette, il che permette di scegliere la funzione da chiamare al momento
-dell'esecuzione, invece che nel momento in cui si scrive il codice sorgente
-del programma.
-Si rimanda la trattazione di questa funzionalit@`a
-a un secondo momento; si veda @ref{Chiamate indirette}.
-
-@cindex effetti collaterali, chiamate di funzione
-Come ogni altra espressione, la chiamata di funzione ha un valore, chiamato
-spesso @dfn{valore di ritorno}, che @`e calcolato dalla funzione
-in base agli argomenti dati. In quest'esempio, il valore di ritorno
-di @samp{sqrt(@var{argomento})} @`e la radice quadrata di @var{argomento}.
-Il seguente programma legge numeri, un numero per riga, e stampa
-la radice quadrata di ciascuno:
-
-@example
-$ @kbd{awk '@{ print "La radice quadrata di", $1, "@`e", sqrt($1) @}'}
-@kbd{1}
-@print{} La radice quadrata di 1 @`e 1
-@kbd{3}
-@print{} La radice quadrata di 3 @`e 1.73205
-@kbd{5}
-@print{} La radice quadrata di 5 @`e 2.23607
-@kbd{Ctrl-d}
-@end example
-
-Una funzione pu@`o avere anche effetti collaterali, come assegnare
-valori a certe variabili o effettuare operazioni di I/O.
-Questo programma mostra come la funzione @code{match()}
-(@pxref{Funzioni per stringhe})
-cambia le variabili @code{RSTART} e @code{RLENGTH}:
-
-@example
-@{
- if (match($1, $2))
- print RSTART, RLENGTH
- else
- print "non uguali"
-@}
-@end example
-
-@noindent
-Qui vediamo un'esecuzione di esempio:
-
-@example
-$ @kbd{awk -f matchit.awk}
-@kbd{aaccdd c+}
-@print{} 3 2
-@kbd{pippo pluto}
-@print{} non uguali
-@kbd{abcdefg e}
-@print{} 5 1
-@end example
-
-@node Precedenza
-@section Precedenza degli operatori (Come si nidificano gli operatori)
-@cindex precedenza
-@cindex operatori, precedenza
-
-La @dfn{precedenza degli operatori} determina come gli operatori vengono
-raggruppati quando diversi operatori appaiono uno vicino all'altro in
-un'espressione.
-Per esempio, @samp{*} ha una precedenza pi@`u alta di @samp{+}; cos@`{@dotless{i}},
-@samp{a + b * c} moltiplica @code{b} e @code{c}, e poi aggiunge @code{a} al
-prodotto (ovvero esegue @samp{a + (b * c)}).
-
-La normale precedenza degli operatori pu@`o essere cambiata usando delle
-parentesi. Si possono vedere le regole di precedenza come un modo per
-indicare dove si sarebbero dovute mettere delle parentesi. Di fatto,
-@`e cosa saggia usare sempre le parentesi
-in presenza di una combinazione di operatori insolita, perch@'e altre persone
-che leggono il programma potrebbero non ricordare quale sia la precedenza
-in quel particolare caso.
-Anche dei programmatori esperti a volte dimenticano le regole esatte,
-il che porta a commettere errori.
-Usare esplicitamente le parentesi previene qualunque errore
-di questo tipo.
-
-Quando vengono usati insieme operatori con uguale precedenza, quello pi@`u a
-sinistra viene raggruppato per primo, ad eccezione degli operatori di
-assegnamento, condizionali e di elevamento a potenza, che vengono raggruppati
-nell'ordine opposto.
-Quindi, @samp{a - b + c} raggruppa come @samp{(a - b) + c} e
-@samp{a = b = c} raggruppa come @samp{a = (b = c)}.
-
-Normalmente la precedenza degli operatori unari di prefisso non ha importanza,
-perch@'e c'@`e un solo modo di interpretarli: prima il pi@`u interno. Quindi,
-@samp{$++i} significa @samp{$(++i)} e
-@samp{++$x} significa @samp{++($x)}. Tuttavia, quando un altro operatore segue
-l'operando, la precedenza degli operatori unari pu@`o avere importanza.
-@samp{$x^2} significa @samp{($x)^2}, ma @samp{-x^2} significa
-@samp{-(x^2)}, perch@'e @samp{-} ha precedenza pi@`u bassa rispetto a @samp{^},
-mentre @samp{$} ha precedenza pi@`u alta.
-Inoltre, gli operatori non possono essere combinati in modo tale da violare le
-regole di precedenza; per esempio, @samp{$$0++--} non @`e un'espressione valida
-perch@'e il primo @samp{$} ha precedenza pi@`u alta di
-@samp{++}; per evitare il problema l'espressione pu@`o essere scritta come
-@samp{$($0++)--}.
-
-Questa lista illustra gli operatori di @command{awk}, in ordine di precedenza
-dalla pi@`u alta alla pi@`u bassa:
-
-@c @asis for docbook to come out right
-@table @asis
-@item @code{(}@dots{}@code{)}
-Raggruppamento.
-
-@cindex @code{$} (dollaro), operatore di campo @code{$}
-@cindex dollaro (@code{$}), operatore di campo @code{$}
-@item @code{$}
-Riferimento a un campo.
-
-@cindex @code{+} (pi@`u), operatore @code{++}
-@cindex pi@`u (@code{+}), operatore @code{++}
-@cindex @code{-} (meno), operatore @code{--}
-@cindex meno (@code{-}), operatore @code{--}
-@item @code{++ --}
-Incremento, decremento.
-
-@cindex @code{^} (circonflesso), operatore @code{^}
-@cindex circonflesso (@code{^}), operatore @code{^}
-@cindex @code{*} (asterisco), operatore @code{**}
-@cindex asterisco (@code{*}), operatore @code{**}
-@item @code{^ **}
-Elevamento a potenza. Questi operatori sono raggruppati da destra verso
-sinistra.
-
-@cindex @code{+} (pi@`u), operatore @code{+}
-@cindex pi@`u (@code{+}), operatore @code{+}
-@cindex @code{-} (meno), operatore @code{-}
-@cindex meno (@code{-}), operatore @code{-}
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@item @code{+ - !}
-Pi@`u, meno, ``not'' logico, unari.
-
-@cindex @code{*} (asterisco), operatore @code{*}, come operatore di moltiplicazione
-@cindex asterisco (@code{*}), operatore @code{*}, come operatore di moltiplicazione
-@cindex @code{/} (barra), operatore @code{/}
-@cindex barra (@code{/}), operatore @code{/}
-@cindex @code{%} (percento), operatore @code{%}
-@cindex percento (@code{%}), operatore @code{%}
-@item @code{* / %}
-Moltiplicazione, divisione, resto di una divisione.
-
-@cindex @code{+} (pi@`u), operatore @code{+}
-@cindex pi@`u (@code{+}), operatore @code{+}
-@cindex @code{-} (meno), operatore @code{-}
-@cindex meno (@code{-}), operatore @code{-}
-@item @code{+ -}
-Addizione, sottrazione.
-
-@item Concatenazione di stringhe
-Non c'@`e un simbolo speciale per la concatenazione.
-Gli operandi sono semplicemente scritti uno accanto all'altro.
-(@pxref{Concatenazione}).
-
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
-@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
-@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>}
-@cindex parentesi acuta destra (@code{>}), operatore @code{>}
-@cindex @code{=} (uguale), operatore @code{==}
-@cindex uguale (@code{=}), operatore @code{==}
-@cindex @code{!} (punto esclamativo), operatore @code{!=}
-@cindex punto esclamativo (@code{!}), operatore @code{!=}
-@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
-@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
-@cindex operatori, input/output
-@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
-@cindex operatori, input/output
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex operatori, input/output
-@item @code{< <= == != > >= >> | |&}
-Operatori relazionali e ridirezione.
-Gli operatori relazionali e le ridirezioni hanno lo stesso livello di
-precedenza. I caratteri come @samp{>} servono sia come operatori relazionali
-che come ridirezioni; la distinzione tra i due significati dipende dal
-contesto.
-
-@cindex istruzione @code{print}, operatori I/O nell'
-@cindex istruzione @code{printf}, operatori I/O nell'
-Si noti che gli operatori di ridirezione I/O nelle istruzioni @code{print} e
-@code{printf} appartengono al livello dell'istruzione, non alle espressioni.
-La ridirezione non produce un'espressione che potrebbe essere l'operando di un
-altro operatore. Di conseguenza, non ha senso usare un operatore di
-ridirezione vicino a un altro operatore con precedenza pi@`u bassa senza
-parentesi. Tali combinazioni generano errori di sintassi
-(p.es., @samp{print pippo > a ? b : c}).
-Il modo corretto di scrivere quest'istruzione @`e @samp{print pippo > (a ? b : c)}.
-
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@item @code{~ !~}
-Corrispondenza, non corrispondenza.
-
-@cindex @code{in}, operatore
-@item @code{in}
-Appartenenza a un vettore.
-
-@cindex @code{&} (e commerciale), operatore @code{&&}
-@cindex e commerciale (@code{&}), operatore @code{&&}
-@item @code{&&}
-``and'' logico.
-
-@cindex @code{|} (barra verticale), operatore @code{||}
-@cindex barra verticale (@code{|}), operatore @code{||}
-@item @code{||}
-``or'' logico.
-
-@cindex @code{?} (punto interrogativo), operatore @code{?:}
-@cindex punto interrogativo (@code{?}), operatore @code{?:}
-@item @code{?:}
-Operatore condizionale. Questo operatore raggruppa da destra verso sinistra.
-
-@cindex @code{+} (pi@`u), operatore @code{+=}
-@cindex pi@`u (@code{+}), operatore @code{+=}
-@cindex @code{-} (meno), operatore @code{-=}
-@cindex meno (@code{-}), operatore @code{-=}
-@cindex @code{*} (asterisco), operatore @code{*=}
-@cindex asterisco (@code{*}), operatore @code{*=}
-@cindex @code{*} (asterisco), operatore @code{**=}
-@cindex asterisco (@code{*}), operatore @code{**=}
-@cindex @code{/} (barra), operatore @code{/=}
-@cindex barra (@code{/}), operatore @code{/=}
-@cindex @code{%} (percento), operatore @code{%=}
-@cindex percento (@code{%}), operatore @code{%=}
-@cindex @code{^} (circonflesso), operatore @code{^=}
-@cindex circonflesso (@code{^}), operatore @code{^=}
-@item @code{= += -= *= /= %= ^= **=}
-Assegnamento. Questi operatori raggruppano da destra verso sinistra.
-@end table
-
-@cindex POSIX @command{awk}, @code{**} e
-@cindex portabilit@`a, operatori, non in POSIX @command{awk}
-@quotation NOTA
-Gli operatori @samp{|&}, @samp{**} e @samp{**=} non sono definiti da POSIX.
-Per la massima portabilit@`a, @`e meglio non usarli.
-@end quotation
-
-@node Localizzazioni
-@section Il luogo fa la differenza
-@cindex localizzazione, definizione di
-
-I moderni sistemi prevedono la nozione di @dfn{localizzazione}: un modo per
-informare il sistema sulla serie di caratteri e sulla lingua locali.
-Lo standard ISO C definisce una localizzazione di default @code{"C"}, che @`e
-l'ambiente tipico a cui molti programmatori in C sono abituati.
-
-Un tempo, le impostazioni della localizzazione avevano influenza sulla
-ricerca di corrispondenze tramite @dfn{regexp}, ma ora non @`e pi@`u cos@`{@dotless{i}}
-(@pxref{Intervalli e localizzazione}).
-
-La localizzazione pu@`o influire sulla separazione dei record. Per il caso
-normale di @samp{RS = "\n"}, la localizzazione @`e generalmente irrilevante.
-Per altri separatori di record di un solo carattere, impostare
-la variabile d'ambiente @samp{LC_ALL=C}
-garantisce una migliore efficienza nella lettura dei record. Altrimenti,
-@command{gawk} dovrebbe fare diverse chiamate di funzione, @emph{per ogni
-carattere in input}, per determinare la fine del record.
-
-La localizzazione pu@`o influire sulla formattazione delle date e delle ore
-(@pxref{Funzioni di tempo}). Per esempio, un modo comune per abbreviare la
-data 4 settembre 2015, negli Stati Uniti @`e ``9/4/15.'' In molti paesi
-dell'Europa, invece, l'abbreviazione @`e "4.9.15". Quindi, la specifica di
-formato
-@code{%x} in una localizzazione @code{"US"} potrebbe produrre @samp{9/4/15},
-mentre in una localizzazione @code{"EUROPA"}, potrebbe produrre @samp{4.9.15}.
-
-Secondo POSIX, anche il confronto tra stringhe @`e influenzato dalla
-localizzazione (come nelle espressioni regolari). I dettagli sono descritti in
-@ref{Confronto POSIX di stringhe}.
-
-Infine, la localizzazione influenza il valore del separatore decimale
-usato quando @command{gawk} analizza i dati in input. Questo @`e stato
-trattato nel dettaglio in @ref{Conversione}.
-
-@node Sommario delle espressioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Le espressioni sono gli elementi base dei calcoli eseguiti nei programmi.
-Sono costruite a partire da costanti, variabili, chiamate di funzione e dalla
-combinazione di vari tipi di valori tramite operatori.
-
-@item
-@command{awk} fornisce tre tipi di costanti: numerica, di stringa e
-di @dfn{regexp}. Le costanti numeriche in @command{gawk} si possono
-specificare nei sistemi ottale ed esadecimale (con base 8 e 16), e anche nel
-sistema decimale (base 10). In alcuni contesti, una costante @dfn{regexp}
-isolata come @code{/pippo/} ha lo stesso significato di @samp{$0 ~ /pippo/}.
-
-@item
-Le variabili contengono valori che possono essere usati diverse volte nei
-calcoli. Un certo numero di variabili predefinite forniscono informazioni al
-programma @command{awk}, mentre altre permettono il controllo del comportamento
-di @command{awk}.
-
-@item
-I numeri sono automaticamente convertiti in stringhe, e le stringhe in numeri,
-a seconda delle necessit@`a di @command{awk}. I valori numerici sono convertiti
-come se fossero formattati con @code{sprintf()} usando il formato contenuto in
-@code{CONVFMT}. La localizzazione pu@`o influire sulle conversioni.
-
-@item
-In @command{awk} ci sono gli operatori aritmetici di uso comune (addizione,
-sottrazione, moltiplicazione, divisione, modulo), e il pi@`u e il meno unari.
-Ci sono anche operatori di confronto, operatori booleani, una verifica
-dell'esistenza di una chiave in
-un vettore, e operatori per la ricerca di corrispondenze con espressioni
-regolari. La concatenazione di stringhe @`e effettuata mettendo due espressioni
-una vicino all'altra; non c'@`e nessun operatore esplicito.
-L'operatore con tre operandi @samp{?:} fornisce una verifica ``if-else''
-all'interno delle espressioni.
-
-@item
-Gli operatori di assegnamento forniscono delle comode forme brevi per le comuni
-operazioni aritmetiche.
-
-@item
-In @command{awk}, un valore @`e considerato vero se @`e diverso da zero
-@emph{oppure} non nullo. Altrimenti, il valore @`e falso.
-
-@item
-Il tipo di una variabile viene impostata a ogni assegnamento e pu@`o cambiare
-durante il suo ciclo di vita. Il tipo determina il comportamento della
-variabile nei confronti (di tipo stringa o numerici).
-
-@item
-Le chiamate di funzione restituiscono un valore che pu@`o essere usato come parte
-di un'espressione pi@`u lunga. Le espressioni usate per passare valori di
-parametro vengono valutate completamente prima di chiamare la funzione.
-@command{awk} fornisce funzioni predefinite e prevede quelle definite
-dall'utente; questo @`e descritto in
-@ref{Funzioni}.
-
-@item
-La precedenza degli operatori specifica l'ordine secondo il quale vengono
-effettuate le operazioni, a meno che quest'ordine non sia esplicitamente
-alterato
-tramite parentesi. Le regole di precedenza degli operatori di @command{awk}
-sono compatibili con quelle del linguaggio C.
-
-@item
-La localizzazione pu@`o influire sul formato dei dati in uscita da un programma
-@command{awk}, e occasionalmente sul formato dei dati letti in input.
-
-@end itemize
-
-@node Criteri di ricerca e azioni
-@chapter Criteri di ricerca, azioni e variabili
-@cindex criteri di ricerca
-@cindex @dfn{pattern}, si veda criteri di ricerca
-@cindex espressione di ricerca
-
-Come gi@`a visto, ogni istruzione @command{awk} consiste di un criterio di
-ricerca [@dfn{pattern}] a cui @`e associata un'azione. Questo @value{CHAPTER}
-descrive come specificare criteri e azioni, cosa @`e possibile
-fare tramite le azioni e quali sono le variabili predefinite in
-@command{awk}.
-
-Le regole @dfn{criterio di ricerca--azione} e le istruzioni che si possono
-dare all'interno delle azioni formano il nucleo centrale dei programmi
-scritti in @command{awk}.
-In un certo senso, tutto quanto si @`e visto finora costituisce le fondamenta
-sulle quali sono costruiti i programmi. @`E giunto il momento di iniziare a
-costruire qualcosa di utile.
-
-@menu
-* Panoramica sui criteri di ricerca:: Come scrivere un criterio di ricerca.
-* Usare variabili di shell:: come usare variabili della shell in
- @command{awk}.
-* Panoramica sulle azioni:: Come scrivere un'azione.
-* Istruzioni:: Descrizione dettagliata delle varie
- istruzioni di controllo.
-* Variabili predefinite:: Sommario delle variabili predefinite.
-* Sommario criteri e azioni:: Sommario di criteri di ricerca e azioni.
-@end menu
-
-@node Panoramica sui criteri di ricerca
-@section Elementi di un criterio di ricerca
-
-@menu
-* @dfn{regexp} come criteri di ricerca:: Usare espressioni regolari come
- criteri di ricerca.
-* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
- criterio di ricerca.
-* Intervalli:: Coppie di espressioni regolari per
- delimitare una ricerca.
-* BEGIN/END:: Specificare regole di inizio e fine programma.
-* BEGINFILE/ENDFILE:: Due condizioni speciali per controlli avanzati.
-* Vuoto:: Il criterio di ricerca vuoto, che
- corrisponde a ogni record.
-@end menu
-
-@cindex criteri di ricerca, tipi di
-I criteri di ricerca in @command{awk} controllano l'esecuzione di
-azioni: un'azione viene eseguita
-quando il criterio di ricerca associato ad essa @`e soddisfatto dal
-record in input corrente.
-La tabella seguente @`e un sommario dei tipi di criteri di ricerca in
-@command{awk}:
-
-@table @code
-@item /@var{espressione regolare}/
-Un'espressione regolare. @`E verificata quando il testo di un
-record in input corrisponde all'espressione regolare.
-@iftex
-(@xrefIl{Espressioni regolari}.)
-@end iftex
-@ifnottex
-(@xref{Espressioni regolari}.)
-@end ifnottex
-
-@item @var{espressione}
-Una singola espressione. @`E verificata quando il suo valore @`e
-diverso da zero (se di tipo numerico) o non nullo (se @`e una stringa).
-(@xref{Espressioni come criteri di ricerca}.)
-
-@item @var{inizio_interv}, @var{fine_interv}
-Una coppia di criteri di ricerca separati da una virgola, che specificano un
-@dfn{intervallo} di record.
-L'intervallo comprende sia il record iniziale che corrisponde a @var{inizio_interv}
-sia il record finale che corrisponde a @var{fine_interv}.
-(@xref{Intervalli}.)
-
-@item BEGIN
-@itemx END
-Criteri di ricerca speciali che consentono azioni di inizializzazione o
-di pulizia in un programma @command{awk}.
-(@xref{BEGIN/END}.)
-
-@item BEGINFILE
-@itemx ENDFILE
-Criteri di ricerca speciali che consentono azioni di inizializzazione o di
-pulizia da eseguire all'inizio o alla fine di ogni file in input.
-(@xref{BEGINFILE/ENDFILE}.)
-
-@item @var{vuoto}
-Il criterio di ricerca vuoto corrisponde a ciascun record in input.
-(@xref{Vuoto}.)
-@end table
-
-@node @dfn{regexp} come criteri di ricerca
-@subsection Espressioni regolari come criteri di ricerca
-@cindex criteri di ricerca, espressioni come
-@cindex espressioni regolari, come criteri di ricerca
-
-Le espressioni regolari sono uno dei primi tipi di criteri di ricerca
-presentati in questo @value{DOCUMENT}.
-Questo tipo di criterio di ricerca @`e semplicemente una costante @dfn{regexp}
-posta nella parte @dfn{criterio di ricerca} di una regola. Equivale a
-scrivere @samp{$0 ~ /@var{criterio di ricerca}/}.
-Il criterio di ricerca @`e verificato quando il record in input corrisponde
-alla @dfn{regexp}.
-Per esempio:
-
-@example
-/pippo|pluto|paperino/ @{ personaggi_Disney++ @}
-END @{ print personaggi_Disney, "Personaggi Disney visti" @}
-@end example
-
-@node Espressioni come criteri di ricerca
-@subsection Espressioni come criteri di ricerca
-@cindex espressioni regolari, come criteri di ricerca
-
-Qualsiasi espressione @command{awk} pu@`o essere usata come un criterio di
-ricerca @command{awk}.
-Il criterio di ricerca @`e verificato se il valore dell'espressione @`e diverso
-da zero (se @`e un numero), o non nullo (se @`e una stringa).
-L'espressione @`e ricalcolata ogni volta che la regola viene applicata a un
-nuovo record in input. Se l'espressione usa campi come @code{$1}, il suo
-valore dipende direttamente dal contenuto del record in input appena letto;
-altrimenti, dipende solo da quel che @`e accaduto fino a quel momento durante
-l'esecuzione del programma @command{awk}.
-
-@cindex espressioni di confronto, come criteri di ricerca
-@cindex criteri di ricerca, espressioni di confronto come
-Le espressioni di confronto, che usano gli operatori di confronto descritti in
-@ref{Tipi di variabile e confronti},
-sono un tipo di criterio di ricerca usato frequentemente.
-Anche le @dfn{regexp}, verificate o non verificate, sono tipi di espressioni molto frequenti.
-L'operando a sinistra degli operatori @samp{~} e @samp{!~} @`e una stringa.
-L'operando di destra @`e un'espressione regolare costante delimitata da
-barre (@code{/@var{@dfn{regexp}}/}) o qualsiasi espressione il cui valore come
-stringa @`e usato come un'espressione regolare dinamica
-(@pxref{Espressioni regolari calcolate}).
-L'esempio seguente stampa il secondo campo di ogni record in input
-il cui primo campo sia esattamente @samp{li}:
-
-@cindex @code{/} (barra), criteri di ricerca e
-@cindex barra (@code{/}), criteri di ricerca e
-@cindex @code{~} (tilde), operatore @code{~}
-@cindex tilde (@code{~}), operatore @code{~}
-@cindex @code{!} (punto esclamativo), operatore @code{!~}
-@cindex punto esclamativo (@code{!}), operatore @code{!~}
-@example
-$ @kbd{awk '$1 == "li" @{ print $2 @}' mail-list}
-@end example
-
-@noindent
-(Il programma non stampa alcun output, perch@'e nessuna persona ha come nome esattamente @samp{li}.)
-Si veda la differenza con il seguente confronto di espressione regolare, che
-individua invece qualsiasi record il cui primo campo @emph{contenga} @samp{li}:
-
-@example
-$ @kbd{awk '$1 ~ /li/ @{ print $2 @}' mail-list}
-@print{} 555-5553
-@print{} 555-6699
-@end example
-
-@cindex @dfn{regexp}, costanti, come criteri di ricerca
-@cindex criteri di ricerca, costanti @dfn{regexp} come
-Una costante @dfn{regexp} usata come criterio di ricerca @`e anche un
-caso speciale di criterio di ricerca costituito da un'espressione.
-All'espressione @code{/li/} viene assegnato il valore uno se @samp{li}
-viene trovato nel record in input corrente. Quindi, come criterio di ricerca,
-@code{/li/} individua tutti i record che contengono la stringa @samp{li}.
-
-@cindex espressioni booleane, come criteri di ricerca
-Anche le espressioni booleane sono frequentemente usate come criteri di
-ricerca. Se un criterio di ricerca
-individua o no un record in input dipende dalla verifica delle
-sottoespressioni da cui @`e composto.
-Per esempio, il seguente comando stampa tutti i record in
-@file{mail-list} che contengono sia @samp{edu} che @samp{li}:
-
-@example
-$ @kbd{awk '/edu/ && /li/' mail-list}
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@end example
-
-Il seguente comando stampa tutti i record in
-@file{mail-list} che contengono @samp{edu} @emph{oppure} @samp{li}
-(o entrambi, naturalmente):
-
-@example
-$ @kbd{awk '/edu/ || /li/' mail-list}
-@print{} Amelia 555-5553 amelia.zodiacusque@@gmail.com F
-@print{} Broderick 555-0542 broderick.aliquotiens@@yahoo.com R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Julie 555-6699 julie.perscrutabor@@skeeve.com F
-@print{} Samuel 555-3430 samuel.lanceolis@@shu.edu A
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-Il seguente comando stampa tutti i record in
-@file{mail-list} che @emph{non} contengono la stringa @samp{li}:
-
-@example
-$ @kbd{awk '! /li/' mail-list}
-@print{} Anthony 555-3412 anthony.asserturo@@hotmail.com A
-@print{} Becky 555-7685 becky.algebrarum@@gmail.com A
-@print{} Bill 555-1675 bill.drowning@@hotmail.com A
-@print{} Camilla 555-2912 camilla.infusarum@@skynet.be R
-@print{} Fabius 555-1234 fabius.undevicesimus@@ucb.edu F
-@print{} Martin 555-6480 martin.codicibus@@hotmail.com A
-@print{} Jean-Paul 555-2127 jeanpaul.campanorum@@nyu.edu R
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{END}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{BEGINFILE}, criterio di ricerca, criteri di ricerca booleani e
-@cindex @code{ENDFILE}, criterio di ricerca, criteri di ricerca booleani e
-Le sottoespressioni di un'operatore booleano in un criterio di ricerca possono
-essere espressioni regolari costanti, confronti, o qualsiasi altra espressione
-di @command{awk}. Gli intervalli di ricerca
-non sono espressioni, e quindi non possono apparire all'interno di
-criteri di ricerca booleani. Analogamente, i criteri di ricerca speciali
-@code{BEGIN}, @code{END}, @code{BEGINFILE} ed @code{ENDFILE},
-che non corrispondono ad alcun record in input, non sono espressioni e non
-possono essere usati all'interno di criteri di ricerca booleani.
-
-L'ordine di precedenza dei differenti operatori che possono essere usati nei
-criteri di ricerca @`e descritto in @ref{Precedenza}.
-
-@node Intervalli
-@subsection Specificare intervalli di record con i criteri di ricerca
-
-@cindex intervalli di ricerca
-@cindex criteri di ricerca, intervalli nei
-@cindex righe, individuare intervalli di
-@cindex @code{,} (virgola), negli intervalli di ricerca
-@cindex virgola (@code{,}), negli intervalli di ricerca
-Un @dfn{intervallo di ricerca} @`e composto da due criteri di ricerca
-separati da una virgola, nella forma
-@samp{@var{inizio_intervallo}, @var{fine_intervallo}}. @`E usato per
-individuare
-una serie di record consecutivi nei file in input. Il primo criterio di
-ricerca, @var{inizio_intervallo}, controlla dove inizia la serie di record,
-mentre @var{fine_intervallo} controlla dove finisce la serie stessa.
-L'esempio seguente:
-
-@example
-awk '$1 == "on", $1 == "off"' miofile
-@end example
-
-@noindent
-stampa ogni record in @file{miofile} incluso tra i due record che iniziano con
-@samp{on}/@samp{off}, estremi compresi.
-
-Un intervallo di ricerca inizia con la valutazione di
-@var{inizio_intervallo} per ogni record in input. Quando un record soddisfa
-la condizione @var{inizio_intervallo}, l'intervallo di ricerca @`e
-@dfn{attivato} e l'intervallo di ricerca include anche quel
-record. Finch@'e l'intervallo di ricerca rimane attivo,
-automaticamente vengono trovate corrispondenze in ogni record in input letto.
-L'intervallo di ricerca verifica anche @var{fine_intervallo} per ogni
-record in input; quando la verifica ha successo, il
-criterio di ricerca viene @dfn{disattivato} a partire dal record seguente.
-Quindi il criterio di ricerca torna a controllare
-@var{inizio_intervallo} per ogni nuovo record.
-
-@cindex @code{if}, istruzione, azioni@comma{} modificabili
-Il record che segnala l'inizio dell'intervallo
-di ricerca e quello che segnala la fine di quell'intervallo soddisfano
-@emph{entrambi} il criterio di ricerca. Se non si vuole agire su tali record
-si possono scrivere istruzioni @code{if} nella parte @dfn{azione} della regola
-per distinguerli dai record che il programma @`e interessato a trattare.
-
-@`E possibile che un criterio di ricerca sia attivato e disattivato dallo
-stesso record. Se il record soddisfa entrambe le condizioni, l'azione @`e
-eseguita solo su quel record.
-Per esempio, si supponga che ci sia un testo tra due separatori identici
-(p.es., il simbolo @samp{%}), ognuno dei quali sia su una riga a parte, che
-dovrebbero essere ignorati. Un primo tentativo potrebbe essere quello di
-combinare un intervallo di ricerca che descrive il
-testo delimitato con l'istruzione
-@code{next}
-(non ancora introdotta, @pxref{Istruzione next}).
-Con quest'istruzione @command{awk} non effettua alcuna azione sul record
-corrente e inizia di nuovo a elaborare il successivo record in input.
-Un tale programma @`e simile a questo:
-
-@example
-/^%$/,/^%$/ @{ next @}
- @{ print @}
-@end example
-
-@noindent
-@cindex righe, saltare tra delimitatori
-@c @cindex @dfn{flag} variables
-Questo programma non funziona, perch@'e l'intervallo di ricerca @`e sia attivato
-che disattivato dalla prima riga incontrata, quella costituita da un @samp{%}.
-Per ottenere l'effetto desiderato, si scriva il programma nella maniera che
-segue, utilizzando un @dfn{flag}:
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@example
-/^%$/ @{ ignora = ! ignora; next @}
-ignora == 1 @{ next @} # ignora righe quando `ignora' @`e impostato a 1
-@end example
-
-In un intervallo di ricerca, la virgola (@samp{,}) ha la
-precedenza pi@`u bassa tra tutti gli operatori (cio@`e, @`e l'ultima a essere
-valutata). Il programma seguente tenta di combinare un intervallo di
-ricerca con un altro controllo, pi@`u semplice:
-
-@example
-echo Yes | awk '/1/,/2/ || /Yes/'
-@end example
-
-L'intenzione in questo programma @`e quello di esprimere le condizioni
-@samp{(/1/,/2/) || /Yes/}.
-Tuttavia, @command{awk} lo interpreta come se fosse
-@samp{/1/, (/2/ || /Yes/)}.
-Questo comportamento non pu@`o essere cambiato o evitato; gli intervalli di
-ricerca non si possono combinare con altri criteri di ricerca:
-
-@example
-$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
-@error{} gawk: riga com.:1: (/1/,/2/) || /Yes/
-@error{} gawk: riga com.:1: ^ syntax error
-@end example
-
-@cindex intervalli di ricerca, continuazione di riga e
-Come punto di secondaria importanza, nonostante sia stilisticamente poco elegante,
-lo standard POSIX consente di andare a capo dopo la virgola
-in un intervallo di ricerca. @value{DARKCORNER}
-@node BEGIN/END
-@subsection I criteri di ricerca speciali @code{BEGIN} ed @code{END}
-
-@cindex @code{BEGIN}, criterio di ricerca
-@cindex @code{END}, criterio di ricerca
-@cindex criterio di ricerca @code{END}
-Tutti i criteri di ricerca fin qui descritti servono a individuare dei record
-in input.
-I criteri di ricerca speciali @code{BEGIN} ed @code{END} non hanno questo scopo.
-Servono invece per effettuare azioni di inizializzazione o di pulizia nei
-programmi @command{awk}.
-Le regole @code{BEGIN} ed @code{END} devono prevedere azioni; non c'@`e
-un'azione di default per queste regole, perch@'e non c'@`e un record corrente
-quando sono invocate.
-Le regole @code{BEGIN} ed @code{END} sono spesso chiamate
-``blocchi @code{BEGIN} ed @code{END}'' da programmatori che usano @command{awk}
-da molto tempo.
-
-@menu
-* Usare BEGIN/END:: Come e perch@'e usare regole BEGIN/END.
-* I/O e BEGIN/END:: Problemi di I/O nelle regole BEGIN/END.
-@end menu
-
-@node Usare BEGIN/END
-@subsubsection Azioni di inizializzazione e pulizia
-
-@cindex @code{BEGIN}, criterio di ricerca
-@cindex criterio di ricerca @code{BEGIN}
-@cindex @code{END}, criterio di ricerca
-@cindex criterio di ricerca @code{END}
-Una regola @code{BEGIN} @`e eseguita solo una volta, prima che sia letto il
-primo record in input. Analogamente, una regola @code{END} @`e eseguita
-solo una volta, dopo che tutto l'input @`e gi@`a stato letto. Per esempio:
-
-@example
-$ @kbd{awk '}
-> @kbd{BEGIN @{ print "Analisi di \"li\"" @}}
-> @kbd{/li/ @{ ++n @}}
-> @kbd{END @{ print "\"li\" @`e presente in", n, "record." @}' mail-list}
-@print{} Analisi di "li"
-@print{} "li" @`e presente in 4 record.
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, operatori e
-@cindex @code{END}, criterio di ricerca, operatori e
-@cindex criterio di ricerca @code{END}, operatori e
-Questo programma trova il numero di record nel file in input
-@file{mail-list} che contengono la stringa @samp{li}. La regola @code{BEGIN}
-stampa un titolo per il rapporto. Non c'@`e bisogno di usare la regola
-@code{BEGIN} per inizializzare il contatore @code{n} a zero, poich@'e
-@command{awk} lo fa
-automaticamente (@pxref{Variabili}).
-La seconda regola incrementa la variabile @code{n} ogni volta che si legge
-un record che soddisfa il criterio di ricerca @samp{li}. La regola @code{END}
-stampa il valore di @code{n} alla fine del programma.
-
-I criteri di ricerca speciali @code{BEGIN} ed @code{END} non possono essere
-usati negli intervalli,
-o con operatori booleani (in effetti, non possono essere combinati con nessun
-altro operatore).
-Un programma @command{awk} pu@`o avere molte regole @code{BEGIN} e/o @code{END}.
-Queste sono eseguite nell'ordine in cui compaiono nel programma: tutte le
-regole @code{BEGIN} a inizio programma e tutte le regole @code{END}
-a fine programma.
-Le regole @code{BEGIN} ed @code{END} possono apparire in qualsiasi
-posizione all'interno del programma.
-Questa funzionalit@`a @`e stata aggiunta nella versione 1987 di @command{awk} ed
-@`e inclusa nello standard POSIX.
-La versione originale (1978) di @command{awk} richiedeva che la regola
-@code{BEGIN} fosse posta all'inizio del programma, e la regola
-@code{END} alla fine del programma, e solo una regola per tipo era ammessa.
-Ci@`o non @`e pi@`u obbligatorio, ma @`e una buona idea continuare a seguire questo
-modello per migliorare l'organizzazione e la leggibilit@`a del programma.
-
-Regole multiple @code{BEGIN} ed @code{END} sono utili per scrivere funzioni
-di libreria, poich@'e ogni file di libreria pu@`o avere la sua propria regola
-@code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o pulizia.
-L'ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi
-determina l'ordine in cui le rispettive regole @code{BEGIN} ed @code{END} sono
-eseguite. Per questo motivi, occorre prestare attenzione nello scrivere tali
-regole nei file di libreria, in modo che non sia importante
-l'ordine in cui tali regole vengono eseguite.
-@xref{Opzioni} per maggiori informazioni sull'uso di funzioni di libreria.
-@iftex
-@xrefil{Funzioni di libreria},
-@end iftex
-@ifnottex
-@xref{Funzioni di libreria},
-@end ifnottex
-per parecchie utili funzioni di libreria.
-
-Se un programma @command{awk} ha solo regole @code{BEGIN} e nessun'altra
-regola, il programma esce dopo aver eseguito le regole
-@code{BEGIN}.@footnote{La versione originale di @command{awk} continuava a
-leggere e ignorare i record in input fino alla fine del file.} Tuttavia, se
-una regola @code{END} esiste, l'intero input @`e letto, anche se non sono
-presenti altre regole nel programma. Ci@`o viene fatto necessariamente
-per permettere che
-la regola @code{END} faccia uso delle variabili @code{FNR} e @code{NR}.
-
-@node I/O e BEGIN/END
-@subsubsection Input/Output dalle regole @code{BEGIN} ed @code{END}
-
-@cindex input/output, dalle regole @code{BEGIN} ed @code{END}
-Ci sono parecchi punti (talora insidiosi) da tener presente se si fa dell'I/O
-all'interno di una regola @code{BEGIN} o @code{END}.
-Il primo ha a che fare con il valore di @code{$0} in una regola @code{BEGIN}.
-Poich@'e le regole @code{BEGIN} sono eseguite prima delle lettura di qualsiasi
-input, non c'@`e assolutamente alcun record in input, e quindi nessun campo,
-quando si eseguono delle regole @code{BEGIN}. I riferimento a @code{$0} e ai
-campi restituiscono una stringa nulla o zero, a seconda del contesto.
-Un modo per assegnare un valore effettivo a @code{$0} @`e di eseguire un
-comando @code{getline} senza indicare una variabile (@pxref{Getline}).
-Un altro modo @`e semplicemente quello di assegnare un valore a @code{$0}.
-
-@cindex Brian Kernighan, @command{awk} di
-@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGIN}/@code{END}
-@cindex POSIX @command{awk}, criteri di ricerca @code{BEGIN}/@code{END}
-@cindex @code{print}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{print} e
-@cindex @code{END}, criterio di ricerca, istruzione @code{print} e
-Il secondo punto @`e simile al primo, ma in direzione opposta.
-Tradizionalmente, pi@`u che altro per problemi di implementazione, @code{$0}
-e @code{NF} erano @emph{indefiniti} all'interno di una regola @code{END}.
-Lo standard POSIX prescrive che @code{NF} sia disponibile all'interno di una
-regola @code{END}. Contiene il numero di campi dell'ultimo record in input.
-Probabilmente per una svista, lo standard non specifica che @`e reso
-disponibile anche @code{$0}, sebbene possa apparire logico che sia cos@`{@dotless{i}}.
-In effetti, BWK @command{awk}, @command{mawk} e @command{gawk} mantengono il
-valore di @code{$0} in modo che sia possibile usarlo all'interno delle regole
-@code{END}. Occorre peraltro tener presente che alcune altre implementazioni
-e parecchie tra le versioni pi@`u vecchie di Unix @command{awk} non si
-comportano cos@`{@dotless{i}}.
-
-Il terzo punto @`e una conseguenza dei primi due. Il significato di
-@samp{print}
-all'interno di una regola @code{BEGIN} o @code{END} @`e quello di sempre:
-@samp{print $0}. Se @code{$0} @`e la stringa nulla, stampa una riga vuota.
-Molti programmatori di lungo corso di @command{awk} usano un semplice
-@samp{print} all'interno delle regole @code{BEGIN} ed @code{END},
-intendendo @samp{@w{print ""}}, contando sul fatto che @code{$0} sia una
-stringa nulla. Sebbene questo funzioni solitamente con le regole
-@code{BEGIN}, @`e una pessima idea nelle regole @code{END},
-almeno in @command{gawk}. @`E anche stilisticamente inelegante, perch@'e se
-serve una riga vuota in output, il programma dovrebbe stamparne
-una esplicitamente.
-
-@cindex @code{next}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
-@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-Per finire, le istruzioni @code{next} e @code{nextfile} non sono consentite
-all'interno di una regola @code{BEGIN}, perch@'e il ciclo implicito
-leggi-un-record-e-confrontalo-con-le-regole non @`e ancora iniziato.
-Analogamente, tali istruzioni non sono valide all'interno di una regola
-@code{END}, perch@'e tutto l'input @`e gi@`a stato letto.
-(@xref{Istruzione next} e
-@ifnotdocbook
-@pxref{Istruzione nextfile}.)
-@end ifnotdocbook
-@ifdocbook
-@ref{Istruzione nextfile}.)
-@end ifdocbook
-
-@node BEGINFILE/ENDFILE
-@subsection I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-@cindex @code{BEGINFILE}, criterio di ricerca
-@cindex @code{ENDFILE}, criterio di ricerca
-@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE}
-
-Questa @value{SECTION} descrive una funzionalit@`a specifica di @command{gawk}.
-
-Due tipi speciali di criterio di ricerca, @code{BEGINFILE} ed @code{ENDFILE},
-forniscono
-degli ``agganci'' per intervenire durante il ciclo di elaborazione dei file
-specificati sulla riga di comando di @command{gawk}.
-Come con le regole @code{BEGIN} ed @code{END}
-@ifnottex
-@ifnotdocbook
-(@pxref{BEGIN/END}),
-@end ifnotdocbook
-@end ifnottex
-@iftex
-(si veda la @value{SECTION} precedente),
-@end iftex
-@ifdocbook
-(si veda la @value{SECTION} precedente),
-@end ifdocbook
-tutte le regole @code{BEGINFILE} in un programma sono riunite, mantenendole
-nell'ordine in cui sono lette da @command{gawk} e lo stesso viene fatto
-per tutte le regole @code{ENDFILE}.
-
-Il corpo delle regole @code{BEGINFILE} @`e eseguito subito prima che
-@command{gawk} legga il primo record da un file. La variabile @code{FILENAME}
-@`e impostata al nome del file corrente e @code{FNR} @`e impostata a zero.
-
-La regola @code{BEGINFILE} d@`a la possibilit@`a di eseguire due compiti
-che sarebbe difficile o impossibile effettuare altrimenti:
-
-@itemize @value{BULLET}
-@item
-Si pu@`o verificare che il file sia leggibile. Di solito, se un file presente
-nella riga dei comandi non pu@`o essere aperto in lettura, il programma
-@command{gawk} viene terminato. Comunque, questo si pu@`o evitare, per poi
-passare a elaborare il file successivo specificato sulla riga dei comandi.
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile, con criterio di ricerca @code{BEGINFILE}
-@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-Questo controllo @`e fattibile controllando se la variabile @code{ERRNO} @`e
-diversa dalla stringa nulla; se @`e questo il caso, @command{gawk} non @`e
-riuscito ad aprire il file. In questo caso il programma pu@`o eseguire
-un'istruzione @code{nextfile}
-(@pxref{Istruzione nextfile}). In questo modo @command{gawk} salta
-completamente l'elaborazione di quel file.
-In caso contrario, @command{gawk} termina come al solito con un
-errore fatale.
-
-@item
-Se sono state scritte estensioni che modificano la gestione del record
-(tramite l'inserzione di un ``analizzatore di input'';
-@pxref{Analizzatori di input}), @`e possibile richiamarle
-a questo punto, prima che @command{gawk} inizi a elaborare il file.
-(Questa @`e una funzionalit@`a @emph{molto} avanzata, usata al momento solo dal
-@uref{http://sourceforge.net/projects/gawkextlib, progetto @code{gawkextlib}}.)
-@end itemize
-
-La regola @code{ENDFILE} @`e chiamata quando @command{gawk} ha finito di
-elaborare l'ultimo record di un file in input. Per l'ultimo file in input,
-@`e chiamata prima di ogni regola @code{END}.
-La regola @code{ENDFILE} @`e eseguita anche per file in input vuoti.
-
-Normalmente, se si verifica un errore di lettura durante il normale
-ciclo di elaborazione dell'input,
-questo @`e considerato fatale (il programma termina). Tuttavia, se @`e presente
-una regola @code{ENDFILE}, l'errore non @`e considerato fatale, ma viene
-impostato @code{ERRNO}. Ci@`o permette di intercettare ed elaborare errori
-di I/O a livello di programma @command{awk}.
-
-@cindex @code{next}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-L'istruzione @code{next} (@pxref{Istruzione next}) non @`e permessa all'interno
-di una regola @code{BEGINFILE} o @code{ENDFILE}. L'istruzione @code{nextfile}
-@`e consentita solo all'interno di una regola @code{BEGINFILE}, non all'interno
-di una regola @code{ENDFILE}.
-
-@cindex @code{getline}, comando, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
-L'istruzione @code{getline} (@pxref{Getline}) @`e limitata all'interno sia di
-@code{BEGINFILE} che di @code{ENDFILE}: solo le forme ridirette di
-di @code{getline} sono permesse.
-
-@code{BEGINFILE} ed @code{ENDFILE} sono estensioni @command{gawk}.
-In molte altre implementazioni di @command{awk} o se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}), non sono regole speciali.
-
-@c FIXME: For 4.2 maybe deal with this?
-@ignore
-Date: Tue, 17 May 2011 02:06:10 PDT
-From: rankin@pactechdata.com (Pat Rankin)
-Message-Id: <110517015127.20240f4a@pactechdata.com>
-Subject: BEGINFILE
-To: arnold@skeeve.com
-
- The documentation for BEGINFILE states that FNR is 0, which seems
-pretty obvious. It doesn't mention what the value of $0 is, and that's
-not obvious. I think setting it to null before starting the BEGINFILE
-action would be preferable to leaving whatever was there in the last
-record of the previous file.
-
- ENDFILE can retain the last record in $0. I guess it has to if
-the END rule's actions see that value too. But the beginning of a new
-file doesn't just mean that the old one has been closed; the old file
-is being superseded, so leaving the old data around feels wrong to me.
-[If the user wants to keep it on hand, he or she can use an ENDFILE
-rule to grab it before moving on to the next file.]
-@end ignore
-
-@node Vuoto
-@subsection Il criterio di ricerca vuoto
-
-@cindex vuoto, criterio di ricerca
-@cindex criteri di ricerca vuoti
-Un criterio di ricerca vuoto (cio@`e omesso) corrisponde a
-@emph{ogni} record in input. Per esempio, il programma:
-
-@example
-awk '@{ print $1 @}' mail-list
-@end example
-
-@noindent
-stampa il primo campo di ogni record.
-
-@node Usare variabili di shell
-@section Usare variabili di shell in programmi
-@cindex shell, variabili di
-@cindex programmi @command{awk}, variabili di shell in
-@c @cindex shell and @command{awk} interaction
-
-I programmi @command{awk} sono spesso usati come componenti di programmi pi@`u
-ampi, scritti in un linguaggio di shell.
-Per esempio, @`e molto comune usare una variabile di shell per
-specificare un criterio di ricerca che il programma @command{awk} deve poi
-individuare.
-Ci sono due modi per rendere disponibile il valore di una variabile di shell
-all'interno di un programma @command{awk}.
-
-@cindex shell, uso di doppio apice
-Un modo comune @`e quello di usare i doppi apici per sostituire il valore della
-variabile nel progamma @command{awk} contenuto nello @dfn{script}:
-
-Per esempio, si consideri il programma seguente:
-
-@example
-printf "Immettere il criterio di ricerca: "
-read criterio_di_ricerca
-awk "/$criterio_di_ricerca/ "'@{ num_trov++ @}
- END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
-@end example
-
-@noindent
-Il programma @command{awk} consiste di due pezzi di testo tra apici
-che, concatenati insieme, formano il programma.
-La prima parte @`e tra doppi apici, per consentire la sostituzione della
-variabile di shell @code{criterio_di_ricerca} contenuta al loro interno.
-La seconda parte @`e racchiusa tra apici singoli.
-
-La sostituzione di variabile attraverso gli apici funziona, ma pu@`o
-facilmente generare difficolt@`a. Richiede una buona comprensione delle
-regole per l'uso degli apici nella shell
-(@pxref{Protezione}),
-e spesso @`e difficile accoppiare i vari apici quando si legge il programma.
-
-Un metodo migliore @`e quello di usare la funzionalit@`a di assegnamento delle
-variabili di @command{awk}
-(@pxref{Opzioni di assegnamento})
-per assegnare il valore di una variabile di shell a una variabile
-di @command{awk}.
-Poi si possono usare @dfn{regexp} dinamiche come criterio di ricerca
-(@pxref{Espressioni regolari calcolate}).
-Quanto segue mostra come sarebbe l'esempio precedente usando questa tecnica:
-
-@example
-printf "Immettere il criterio di ricerca: "
-read criterio_di_ricerca
-awk -v crit="$criterio_di_ricerca" '$0 ~ crit @{ num_trov++ @}
- END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
-@end example
-
-@noindent
-Adesso il programma @command{awk} @`e solo una stringa tra apici semplici.
-L'assegnamento @samp{-v crit="$criterio_di_ricerca"} richiede ancora doppi
-apici, per il caso in cui uno spazio vuoto sia presente nel valore di
-@code{$criterio_di_ricerca}.
-La variabile @command{awk} @code{crit} potrebbe avere come nome anche
-@code{criterio_di_ricerca}, ma ci@`o potrebbe essere causa di confusione.
-Usare una variabile permette una maggiore flessibilit@`a, poich@'e la variabile
-pu@`o essere usata in ogni parte del
-programma---per stamparla, per indicizzare un vettore, o per qualsiasi altro
-scopo---senza che sia necessario l'artificio di doverla inserire usando gli
-apici.
-
-@node Panoramica sulle azioni
-@section Azioni
-@c @cindex action, definition of
-@c @cindex curly braces
-@c @cindex action, curly braces
-@c @cindex action, separating statements
-@cindex azioni
-
-Un programma o script @command{awk} consiste in una serie di
-regole e definizioni di funzione frammiste tra loro. (Le funzioni sono
-descritte pi@`u avanti. @xref{Funzioni definite dall'utente}.)
-Una regola contiene un criterio di ricerca e un'azione; l'uno o l'altra
-(ma non tutt'e due) possono essere omessi. Lo scopo di una @dfn{azione} @`e
-di specificare cosa deve fare @command{awk} quando si trova una corrispondenza
-con il criterio di ricerca. Quindi, schematicamente, un programma
-@command{awk} @`e normalmente simile a questo:
-
-@display
-[@var{criterio di ricerca}] @code{@{ @var{azione} @}}
- @var{criterio di ricerca} [@code{@{ @var{azione} @}}]
-@dots{}
-@code{function @var{nome}(@var{argomenti}) @{ @dots{} @}}
-@dots{}
-@end display
-
-@cindex @code{@{@}} (parentesi graffe), azioni e
-@cindex parentesi graffe (@code{@{@}}), azioni e
-@cindex separatori, per istruzioni in azioni
-@cindex a capo, separatore di istruzioni nelle azioni
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Un'azione consiste di una o pi@`u @dfn{istruzioni} @command{awk}, racchiuse
-fra parentesi graffe (@samp{@{@r{@dots{}}@}}). Ogni istruzione specifica
-una cosa da fare. Le istruzioni sono separate tra loro da dei ritorni a capo o
-da dei punti e virgola.
-Le parentesi graffe attorno a un'azione vanno usate anche se l'azione
-contiene una sola istruzione o se non contiene alcuna istruzione.
-Comunque, se si omette completamente l'azione, si possono omettere anche le
-parentesi graffe. Un'azione omessa @`e equivalente a specificare
-@samp{@{ print $0 @}}:
-
-@example
-/pippo/ @{ @} @ii{se si trova @code{pippo}, non fare nulla --- azione vuota}
-/pippo/ @ii{se si trova @code{pippo}, stampa il record --- azione omessa}
-@end example
-
-I seguenti tipi di istruzione sono disponibili in @command{awk}:
-
-@table @asis
-@cindex effetti collaterali delle istruzioni
-@cindex istruzioni, effetti collaterali delle
-@item Espressioni
-Servono per chiamare funzioni o assegnare valori a variabili
-@iftex
-(@pxrefil{Espressioni}). L'esecuzione
-@end iftex
-@ifnottex
-(@pxref{Espressioni}). L'esecuzione
-@end ifnottex
-di questo tipo di istruzione calcola semplicemente il valore dell'espressione.
-Ci@`o @`e utile quando l'espressione ha effetti collaterali
-(@pxref{Operatori di assegnamento}).
-
-@item Istruzioni di controllo
-Specificano il flusso di controllo dei programmi @command{awk}.
-Il linguaggio @command{awk} utilizza dei costrutti simili a quelli del C,
-(@code{if}, @code{for}, @code{while} e @code{do}), e anche alcune altre
-di tipo speciale (@pxref{Istruzioni}).
-
-@item Istruzioni composte
-Sono una o pi@`u istruzioni racchiuse tra parentesi graffe. Un'istruzione
-composta
-@`e usata per riunire un gruppo di istruzioni all'interno di
-un'istruzione @code{if}, @code{while}, @code{do} o @code{for}.
-
-@item Istruzioni di input
-Usano il comando @code{getline}
-(@pxref{Getline}).
-In @command{awk} sono anche disponibili le istruzioni @code{next}
-(@pxref{Istruzione next})
-e @code{nextfile}
-(@pxref{Istruzione nextfile}).
-
-@item Istruzioni di output
-Come @code{print} e @code{printf}.
-@iftex
-@xrefIl{Stampare}.
-@end iftex
-@ifnottex
-@xref{Stampare}.
-@end ifnottex
-
-@item Istruzioni di cancellazione
-Per eliminare elementi di vettori.
-@xref{Cancellazione}.
-@end table
-
-@node Istruzioni
-@section Istruzioni di controllo nelle azioni
-@cindex istruzioni di controllo
-@cindex controllo, tramite istruzioni, in azioni
-@cindex azioni, istruzioni di controllo in
-
-Le @dfn{istruzioni di controllo}, come @code{if}, @code{while} e cos@`{@dotless{i}} via,
-regolano il flusso di esecuzione nei programmi @command{awk}. Molte tra
-le istruzioni di controllo di @command{awk} sono modellate sulle
-corrispondenti istruzioni in C.
-@cindex istruzioni composte@comma{} istruzioni di controllo e
-@cindex composte, istruzioni@comma{} istruzioni di controllo e
-@cindex corpo, nelle azioni
-@cindex @code{@{@}} (parentesi graffe), istruzioni, raggruppare
-@cindex parentesi graffe (@code{@{@}}), istruzioni, raggruppare
-@cindex a capo, separatore di istruzioni nelle azioni
-@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
-@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
-Tutte le istruzioni di controllo iniziano con parole chiave speciali, come
-@code{if} e @code{while}, per distinguerle dalle semplici espressioni.
-Molte istruzioni di controllo contengono altre istruzioni. Per esempio,
-l'istruzione @code{if} contiene un'altra istruzione che pu@`o essere eseguita
-oppure no. Le istruzioni contenute sono chiamate @dfn{corpo}.
-Per includere pi@`u di un'istruzione nel corpo, queste vanno raggruppate
-in una sola @dfn{istruzione composta} tra parentesi graffe, e separate tra
-loro con dei ritorni a capo o dei punti e virgola.
-
-@menu
-* Istruzione if:: Eseguire in maniera condizionale
- istruzioni @command{awk}.
-* Istruzione while:: Eseguire il ciclo finch@'e @`e
- verificata una condizione.
-* Istruzione do:: Eseguire l'azione specificata, continuare
- a eseguire il ciclo
- finch@'e @`e verificata una condizione.
-* Istruzione for:: Un'altra istruzione iterativa, che
- permette di specificare clausole
- iniziali e di incremento.
-* Istruzione switch :: Valutazione di quale insieme di
- istruzioni eseguire, a seconda del
- valore assunto da una variabile.
-* Istruzione break:: Uscire subito dal ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione continue:: Andare alla fine del ciclo pi@`u interno
- in cui ci si trova.
-* Istruzione next:: Smettere di elaborare il record corrente.
-* Istruzione nextfile:: Smettere di elaborare il file corrente.
-* Istruzione exit:: Interrompere l'esecuzione di @command{awk}.
-@end menu
-
-@node Istruzione if
-@subsection L'istruzione @code{if}-@code{else}
-
-@cindex istruzione @code{if}
-@cindex @code{if}, istruzione
-L'istruzione @code{if}-@code{else} @`e quella che serve in @command{awk}
-per prendere decisioni. @`E simile
-a questa:
-
-@display
-@code{if (@var{condizione}) @var{se-vera-fai}} [@code{else @var{se-falsa-fai}}]
-@end display
-
-@noindent
-La @var{condizione} @`e un'espressione che controlla quel che fa il resto
-dell'istruzione. Se la @var{condizione} @`e vera, viene eseguita la
-parte @var{se-vera-fai}; altrimenti viene
-eseguita la parte @var{se-falsa-fai}.
-La parte @code{else} dell'istruzione @`e
-facoltativa. La condizione @`e considerata falsa se il suo valore @`e zero o
-la stringa nulla; altrimenti, la condizione @`e vera.
-Si consideri quanto segue:
-
-@example
-if (x % 2 == 0)
- print "x @`e pari"
-else
- print "x @`e dispari"
-@end example
-
-In questo esempio, se l'espressione @samp{x % 2 == 0} @`e vera (cio@`e,
-se il valore di @code{x} @`e esattamente divisibile per due), allora viene
-eseguita la prima istruzione
-@code{print}; altrimenti, viene eseguita la seconda istruzione @code{print}.
-Se la parola chiave @code{else} sta sulla stessa riga di @var{se-vera-fai}
-e se @var{se-vera-fai} non @`e un'istruzione composta (cio@`e, non @`e racchiusa
-tra parentesi graffe), allora un punto e virgola deve separare
-@var{se-vera-fai} dalla parola chiave @code{else}.
-Per chiarire questo, l'esempio precedente si pu@`o riscrivere come:
-
-@example
-if (x % 2 == 0) print "x @`e pari"; else
- print "x @`e dispari"
-@end example
-
-@noindent
-Se il @samp{;} @`e omesso, @command{awk} non pu@`o interpretare l'istruzione e
-segnala un errore di sintassi. Non si dovrebbero scrivere programmi in
-questo modo, perch@'e a chi li legge potrebbe sfuggire la parola chiave
-@code{else} se non @`e la prima parola della riga.
-
-@node Istruzione while
-@subsection L'istruzione @code{while}
-@cindex @code{while}, istruzione
-@cindex istruzione @code{while}
-@cindex cicli
-@cindex cicli, @code{while}
-@cindex cicli, si veda anche @code{while}, istruzione
-
-Nella programmazione, un @dfn{ciclo} @`e una parte di un programma che pu@`o
-essere eseguita due o pi@`u volte consecutivamente.
-L'istruzione @code{while} @`e la pi@`u semplice istruzione iterativa in
-@command{awk}. Esegue ripetutamente un'istruzione finch@'e una data
-condizione @`e vera. Per esempio:
-
-@example
-while (@var{condizione})
- @var{corpo-del-ciclo}
-@end example
-
-@cindex corpo, nei cicli
-@noindent
-@var{corpo-del-ciclo} @`e un'istruzione detta @dfn{corpo} del ciclo,
-e @var{condizione} @`e un'espressione che controlla per quante volte il ciclo
-deve continuare a essere ripetuto.
-La prima cosa che l'istruzione @code{while} fa @`e un controllo della
-@var{condizione}.
-Se la @var{condizione} @`e vera, viene eseguita l'istruzione
-@var{corpo-del-ciclo}.
-@ifinfo
-(La @var{condizione} @`e vera quando il suo valore
-@`e diverso da zero e non @`e la stringa nulla.)
-@end ifinfo
-Dopo che le istruzioni in @var{corpo-del-ciclo} sono state eseguite,
-@var{condizione} @`e controllata nuovamente, e se @`e ancora vera,
-@var{corpo-del-ciclo} viene eseguito ancora. Questo processo @`e ripetuto
-finch@'e @var{condizione} rimane vera. Se la @var{condizione} @`e falsa fin
-dall'inizio, il corpo del ciclo
-non viene eseguito per nulla, e @command{awk} continua con l'istruzione
-che viene dopo il ciclo.
-Questo esempio stampa i primi tre campi di ogni record in input, uno per
-riga:
-
-@example
-awk '
-@{
- i = 1
- while (i <= 3) @{
- print $i
- i++
- @}
-@}' inventory-shipped
-@end example
-
-@noindent
-Il corpo di questo ciclo @`e un'istruzione composta racchiusa tra parentesi graffe,
-che contiene due istruzioni.
-Il ciclo funziona in questo modo: all'inizio, il valore di @code{i} @`e
-impostato a 1.
-Poi, l'istruzione @code{while} controlla se @code{i} @`e minore o uguale a
-tre. Ci@`o @`e vero quando @code{i} @`e uguale a 1, quindi il campo
-@code{i}-esimo viene stampato. Quindi l'istruzione @samp{i++} incrementa il
-valore di @code{i}
-e il ciclo viene ripetuto. Il ciclo termina quando @code{i} assume il
-valore quattro.
-
-Un ritorno a capo non @`e richiesto tra la condizione e il corpo del ciclo;
-tuttavia, se lo si mette, il programma @`e di pi@`u facile comprensione,
-a meno che il corpo del ciclo non sia un'istruzione composta, oppure se @`e
-qualcosa di molto semplice. Neppure il ritorno a capo dopo la parentesi graffa
-aperta che inizia l'istruzione composta @`e necessario, ma il
-programma @`e di lettura pi@`u difficile se lo si omette.
-
-@node Istruzione do
-@subsection L'istruzione @code{do}-@code{while}
-@cindex @code{do}-@code{while}
-@cindex cicli, @code{do}-@code{while}
-
-Il ciclo @code{do} @`e una variazione dell'istruzione di ciclo @code{while}.
-Il ciclo @code{do} esegue il @var{corpo-del-ciclo} una volta e poi ripete il
-@var{corpo-del-ciclo} finch@'e la @var{condizione} rimane vera. @`E simile a questo:
-@example
-do
- @var{corpo-del-ciclo}
-while (@var{condizione})
-@end example
-
-Anche se la @var{condizione} @`e falsa fin dall'inizio, il @var{corpo-del-ciclo}
-viene eseguito almeno una volta (e solo una volta, a meno che
-l'esecuzione di @var{corpo-del-ciclo}
-non renda vera la @var{condizione}). Si confronti con il corrispondente
-@code{while}:
-
-@example
-while (@var{condizione})
- @var{corpo-del-ciclo}
-@end example
-
-@noindent
-Quest'istruzione non esegue il @var{corpo-del-ciclo} neppure una volta, se
-la @var{condizione} @`e falsa fin dall'inizio. Il seguente @`e un esempio di
-@code{do}:
-
-@example
-@{
- i = 1
- do @{
- print $0
- i++
- @} while (i <= 10)
-@}
-@end example
-
-@noindent
-Questo programma stampa ogni record in input per 10 volte. Non si tratta,
-peraltro, di un esempio molto realistico, perch@'e in questo caso un semplice
-@code{while} sarebbe sufficiente. Questa osservazione riflette un'esperienza
-reale; solo occasionalmente @`e davvero necessario usare un @code{do}.
-
-@node Istruzione for
-@subsection L'istruzione @code{for}
-@cindex istruzione @code{for}
-@cindex @code{for}, istruzione
-@cindex cicli, @code{for}, iterativi
-
-L'istruzione @code{for} rende pi@`u agevole contare le iterazioni di un ciclo.
-La forma generale dell'istruzione @code{for} @`e simile a questa:
-
-@example
-for (@var{inizializzazione}; @var{condizione}; @var{incremento})
- @var{corpo-del-ciclo}
-@end example
-
-@noindent
-La parti @var{inizializzazione}, @var{condizione} e @var{incremento} sono
-espressioni @command{awk} a piacere, e @var{corpo-del-ciclo} indica qualsiasi
-istruzione @command{awk}.
-
-L'istruzione @code{for} comincia con l'esecuzione di @var{inizializzazione}.
-Poi, finch@'e
-la @var{condizione} @`e vera, esegue ripetutamente @var{corpo-del-ciclo},
-e quindi @var{incremento}. Tipicamente, @var{inizializzazione} imposta una
-variabile a zero o a uno, @var{incremento} aggiunge uno alla stessa e
-@var{condizione} ne confronta il valore rispetto al numero desiderato di
-iterazioni.
-Per esempio:
-
-@example
-awk '
-@{
- for (i = 1; i <= 3; i++)
- print $i
-@}' inventory-shipped
-@end example
-
-@noindent
-Questo programma stampa i primi tre campi di ogni record in input, mettendo
-un campo su ogni riga.
-
-Non @`e possibile impostare
-pi@`u di una variabile nella parte di
-@var{inizializzazione} senza usare un'istruzione di assegnamento multiplo,
-come @samp{x = y = 0}. Ci@`o ha senso solo se tutti i valori iniziali
-sono uguali. (Ma @`e possibile inizializzare ulteriori variabili scrivendo
-i relativi assegnamenti come istruzioni separate @emph{prima} del ciclo
-@code{for}.)
-
-@c @cindex comma operator, not supported
-Lo stesso vale per la parte @var{incremento}. Se serve incrementare ulteriori
-variabili, questo va fatto con istruzioni separate alla fine del ciclo.
-L'espressione composta del linguaggio C, che usa l'operatore virgola [,]
-del C, sarebbe
-utile in questo contesto, ma non @`e
-prevista in @command{awk}.
-
-Molto spesso, @var{incremento} @`e un'espressione di incremento, come
-nell'esempio precedente. Ma questo non @`e obbligatorio; pu@`o trattarsi di
-un'espressione qualsiasi. Per esempio,
-la seguente istruzione stampa tutte le potenze di due comprese
-tra 1 e 100:
-
-@example
-for (i = 1; i <= 100; i *= 2)
- print i
-@end example
-
-Se non @`e necessaria, ognuna delle tre espressioni fra
-parentesi che segue la parola chiave @code{for} pu@`o essere omessa. Quindi,
-@w{@samp{for (; x > 0;)}} @`e equivalente a @w{@samp{while (x > 0)}}. Se la
-@var{condizione} @`e omessa del tutto, @`e ritenuta sempre vera, producendo
-un @dfn{ciclo infinito} (cio@`e, un ciclo che non finisce mai).
-
-Molto spesso, un ciclo @code{for} @`e un'abbreviazione per un ciclo @code{while},
-come si pu@`o vedere qui:
-
-@example
-@var{inizializzazione}
-while (@var{condizione}) @{
- @var{corpo-del-ciclo}
- @var{incremento}
-@}
-@end example
-
-@cindex cicli, istruzione @code{continue} e
-@noindent
-La sola eccezione @`e quando l'istruzione @code{continue}
-(@pxref{Istruzione continue}) @`e usata
-all'interno del ciclo. Se si modifica un'istruzione @code{for}
-sostituendola con un'istruzione @code{while}
-ci@`o pu@`o cambiare l'effetto dell'istruzione @code{continue} posta all'interno
-del ciclo.
-
-Il linguaggio @command{awk} ha un'istruzione @code{for} oltre all'istruzione
-@code{while} perch@'e un ciclo @code{for} @`e spesso pi@`u semplice da scrivere,
-e viene in mente pi@`u naturalmente.
-Contare il numero di iterazioni @`e
-molto frequente nei cicli. Pu@`o essere pi@`u facile pensare a questo conto come
-parte del ciclo, piuttosto che come qualcosa da fare all'interno del ciclo.
-
-@cindex @code{in}, operatore
-@cindex operatore @code{in}
-Esiste una versione alternativa al ciclo @code{for}, per esaminare tutti
-gli indici di un vettore:
-
-@example
-for (i in vettore)
- @var{fai qualcosa con} vettore[i]
-@end example
-
-@noindent
-@xref{Visitare un intero vettore}
-per maggiori informazioni su questa versione del ciclo @code{for}.
-
-@node Istruzione switch
-@subsection L'istruzione @code{switch}
-@cindex @code{switch}, istruzione
-@cindex @code{case}, parola chiave
-@cindex parola chiave @code{case}
-@cindex @code{default}, parola chiave
-@cindex parola chiave @code{default}
-
-Questa @value{SECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-Se @command{gawk} @`e in modalit@`a compatibile (@pxref{Opzioni}),
-la funzionalit@`a non @`e disponibile.
-
-L'istruzione @code{switch} consente di valutare un'espressione e di
-eseguire istruzioni se il valore trovato corrisponde a uno dei @code{case} [casi] previsti.
-Le istruzioni @code{case} sono esaminate per cercare una corrispondenza
-nell'ordine in cui i casi sono definiti nel programma. Se nessuno dei @code{case}
-corrisponde al valore dell'espressione, viene eseguita la sezione
-@code{default}, se @`e stata specificata.
-
-Ogni @code{case} contiene una singola costante, che pu@`o essere un numero,
-una stringa, o
-una @dfn{regexp}. Viene valutata l'espressione @code{switch}, e poi la
-costante di ogni @code{case} viene confrontata
-di volta in volta con il valore risultante.
-Il tipo di costante determina quale sar@`a il confronto: per i tipi numerici o
-stringa si seguono le regole abituali. Per una costante @dfn{regexp} viene
-effettuato un confronto tra l'espressione e il valore di tipo stringa
-dell'espressione originale.
-Il formato generale dell'istruzione @code{switch} @`e simile a questo:
-
-@example
-switch (@var{espressione}) @{
-case @var{valore o espressione regolare}:
- @var{corpo-del-caso}
-default:
- @var{corpo-del-default}
-@}
-@end example
-
-Il flusso di controllo
-dell'istruzione @code{switch} funziona come per il linguaggio C. Una volta
-stabilita una corrispondenza con un dato caso, le istruzione che formano il
-corpo del caso sono eseguite, fino a che non venga trovata un'istruzione
-@code{break},
-@code{continue}, @code{next}, @code{nextfile} o @code{exit},
-o fino alla fine dell'istruzione @code{switch} medesima. Per esempio:
-
-@example
-while ((c = getopt(ARGC, ARGV, "aksx")) != -1) @{
- switch (c) @{
- case "a":
- # stampa la dimensione di tutti i file
- all_files = TRUE;
- break
- case "k":
- BLOCK_SIZE = 1024 # in blocchi da 1 Kbyte
- break
- case "s":
- # fa solo le somme
- sum_only = TRUE
- break
- case "x":
- # non esce dal filesystem
- fts_flags = or(fts_flags, FTS_XDEV)
- break
- case "?":
- default:
- uso()
- break
- @}
-@}
-@end example
-
-Si noti che se nessuna delle istruzioni specificate qui arresta l'esecuzione
-di un'istruzione @code{case} per la quale @`e stata trovata una corrispondenza;
-l'esecuzione continua fino al successivo @code{case} finch@'e
-non viene interrotta. In questo esempio, il
-@code{case} per @code{"?"} esegue quello di @code{default}, che consiste nel
-chiamare una funzione di nome @code{uso()}.
-(La funzione @code{getopt()} qui chiamata @`e descritta in
-@ref{Funzione getopt}.)
-
-@node Istruzione break
-@subsection L'istruzione @code{break}
-@cindex @code{break}, istruzione
-@cindex istruzione @code{break}
-@cindex cicli, uscita
-@cindex cicli, istruzione @code{break} e
-
-L'istruzione @code{break} esce dal ciclo pi@`u interno @code{for},
-@code{while} o @code{do} dentro al quale si trova. L'esempio seguente
-trova, se esiste, il divisore pi@`u piccolo di un dato numero intero, oppure
-dichiara che si tratta di un numero primo:
-
-@example
-# trova il divisore pi@`u piccolo di num
-@{
- num = $1
- for (divisore = 2; divisore * divisore <= num; divisore++) @{
- if (num % divisore == 0)
- break
- @}
- if (num % divisore == 0)
- printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
- else
- printf "%d @`e un numero primo\n", num
-@}
-@end example
-
-Quando il resto della divisione @`e zero nella prima istruzione @code{if},
-@command{awk} immediatamente esce, a causa del @dfn{break}, dal ciclo
-@code{for} in cui @`e contenuto. Ci@`o vuol dire
-che @command{awk} prosegue immediatamente fino all'istruzione che viene dopo
-il ciclo, e continua l'elaborazione. (L'istruzione @code{break} @`e molto
-differente dall'istruzione @code{exit},
-la quale termina l'intero programma @command{awk}.
-@xref{Istruzione exit}.)
-
-Il seguente programma mostra come la @var{condizione} di un'istruzione
-@code{for} o @code{while} potrebbe essere sostituita da un'istruzione
-@code{break} all'interno di un @code{if}:
-
-@example
-# trova il divisore pi@`u piccolo di num
-@{
- num = $1
- for (divisore = 2; ; divisore++) @{
- if (num % divisore == 0) @{
- printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
- break
- @}
- if (divisore * divisore > num) @{
- printf "%d @`e un numero primo\n", num
- break
- @}
- @}
-@}
-@end example
-
-L'istruzione @code{break} @`e usata anche per terminare l'esecuzione di
-un'istruzione @code{switch}.
-Questo argomento @`e trattato in @ref{Istruzione switch}.
-
-@c @cindex @code{break}, outside of loops
-@c @cindex historical features
-@c @cindex @command{awk} language, POSIX version
-@cindex POSIX @command{awk}, @code{break} e
-@cindex angolo buio, istruzione @code{break}
-@cindex @command{gawk}, istruzione @code{break} in
-@cindex Brian Kernighan, @command{awk} di
-L'istruzione @code{break} non ha significato se
-usata fuori dal corpo di un ciclo o di un'istruzione @code{switch}.
-Tuttavia, anche se la cosa non @`e mai stata documentata,
-le prime implementazioni di @command{awk} consideravano l'istruzione @code{break}
-esterna a un ciclo come un'istruzione @code{next}
-(@pxref{Istruzione next}).
-@value{DARKCORNER}
-Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
-e lo stesso fa @command{gawk}.
-
-@node Istruzione continue
-@subsection L'istruzione @code{continue}
-
-@cindex @code{continue}, istruzione
-@cindex istruzione @code{continue}
-Analogamente a @code{break}, l'istruzione @code{continue} @`e usata solo
-all'interno di cicli @code{for}, @code{while} e @code{do}. L'istruzione
-ignora il resto del corpo del ciclo, facendo s@`{@dotless{i}} che la successiva iterazione
-del ciclo inizi immediatamente. Questo comportamento @`e differente da quello
-di @code{break}, che esce completamente dal ciclo.
-
-L'istruzione @code{continue} in un ciclo @code{for} fa s@`{@dotless{i}} che @command{awk}
-ignori il resto del corpo del ciclo e prosegua l'esecuzione con l'espressione
-@var{incremento} dell'istruzione @code{for}. Il seguente programma
-@`e un esempio di ci@`o:
-
-@example
-BEGIN @{
- for (x = 0; x <= 20; x++) @{
- if (x == 5)
- continue
- printf "%d ", x
- @}
- print ""
-@}
-@end example
-
-@noindent
-Questo programma stampa tutti i numeri da 0 a 20---tranne il 5, in cui
-l'istruzione @code{printf} @`e saltata. Siccome l'incremento @samp{x++}
-non viene saltato, @code{x} non rimane fermo al valore 5. Si confronti il ciclo
-@code{for} dell'esempio precedente con il seguente ciclo @code{while}:
-
-@example
-BEGIN @{
- x = 0
- while (x <= 20) @{
- if (x == 5)
- continue
- printf "%d ", x
- x++
- @}
- print ""
-@}
-@end example
-
-@noindent
-Questo programma inizia un ciclo infinito dopo che @code{x} ha assunto il
-valore 5, poich@'e l'istruzione di incremento (@samp{x++}) non @`e mai raggiunta.
-
-@c @cindex @code{continue}, fuori da un ciclo
-@c @cindex funzionalit@`a del passato
-@c @cindex linguaggio @command{awk}, versione POSIX
-@cindex POSIX @command{awk}, istruzione @code{continue} e
-@cindex angolo buio, istruzione @code{continue}
-@cindex @command{gawk}, istruzione @code{continue} in
-@cindex Brian Kernighan, @command{awk} di
-L'istruzione @code{continue} non ha un significato speciale se appare in
-un'istruzione @code{switch}, e non ha alcun significato se usata fuori dal
-corpo di un ciclo. Le prime versioni di @command{awk} trattavano le
-istruzioni @code{continue} che erano fuori da un ciclo allo stesso modo con
-cui trattavano l'istruzione @code{break}
-fuori da un ciclo: come se fosse un'istruzione @code{next}
-@ifset FOR_PRINT
-(trattata nella @value{SECTION} seguente).
-@end ifset
-@ifclear FOR_PRINT
-(@pxref{Istruzione next}).
-@end ifclear
-@value{DARKCORNER}
-Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
-e lo stesso vale per @command{gawk}.
-
-@node Istruzione next
-@subsection L'istruzione @code{next}
-@cindex @code{next}, istruzione
-@cindex istruzione @code{next}
-
-L'istruzione @code{next} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
-l'elaborazione del record corrente e proceda a elaborare il record successivo.
-Ci@`o vuol dire che nessuna delle eventuali regole successive viene eseguita
-per il record corrente e che il resto delle azioni presenti nella
-regola correntemente in esecuzione non viene eseguito.
-
-Si confronti quanto sopra con quel che fa la funzione @code{getline}
-(@pxref{Getline}). Anch'essa fa s@`{@dotless{i}} che @command{awk} legga il record
-successivo immediatamente, ma non altera il flusso del controllo in alcun
-modo (cio@`e, il resto dell'azione in esecuzione prosegue con il nuovo record
-in input).
-
-@cindex @command{awk}, programmi, eseguire
-Al livello pi@`u alto, l'esecuzione di un programma @command{awk} @`e un ciclo
-che legge un record in input e quindi confronta il criterio di ricerca di
-ciascuna regola con il record stesso. Se si vede questo ciclo come un
-@code{for} il cui corpo contiene le regole, l'istruzione @code{next} @`e analoga
-a un'istruzione @code{continue}. Salta, cio@`e, alla fine del corpo di questo
-ciclo implicito
-ed esegue l'incremento (ovvero legge un altro record).
-
-Per esempio, si supponga che un programma @command{awk} agisca solo su record
-che hanno quattro campi, e che non dovrebbe terminare con un errore se trova
-dei record in input non validi. Per evitare di complicare il resto del
-programma, si pu@`o scrivere una regola ``filtro'' a inizio programma, come
-mostrato in questo esempio:
-
-@example
-NF != 4 @{
- printf("%s:%d: salto: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
- next
-@}
-@end example
-
-@noindent
-Siccome @`e presente un @code{next},
-le regole successive del programma non elaboreranno i record non validi.
-Il messaggio @`e ridiretto al flusso in output
-@dfn{standard error}, sul quale vanno scritti i messaggi di errore.
-Per maggiori dettagli, si veda
-@ref{File speciali}.
-
-Se l'istruzione @code{next} provoca il raggiungimento della fine del file
-in input, vengono eseguite le eventuali regole @code{END} presenti.
-@xref{BEGIN/END}.
-
-L'istruzione @code{next} non @`e consentita all'interno delle regole
-@code{BEGINFILE} ed @code{ENDFILE}.
-@xref{BEGINFILE/ENDFILE}.
-
-@c @cindex @command{awk} language, POSIX version
-@c @cindex @code{next}, inside a user-defined function
-@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
-@cindex POSIX @command{awk}, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{next}, istruzione, in funzioni definite dall'utente
-@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
-Secondo lo standard POSIX, il comportamento di @command{awk} @`e indefinito
-se @code{next} @`e usato in una regola @code{BEGIN} o @code{END}.
-@command{gawk} considera questo come un errore di sintassi. Sebbene POSIX
-non proibisca di usarlo,
-molte altre implementazioni di @command{awk} non consentono che l'istruzione
-@code{next} sia usata all'interno del corpo di funzioni.
-(@pxref{Funzioni definite dall'utente}).
-Come tutte le altre istruzioni @code{next}, un'istruzione @code{next} all'interno del
-corpo di una funzione legge il record successivo e inizia a elaborarlo
-a partire dalla prima regola del programma.
-
-@node Istruzione nextfile
-@subsection L'istruzione @code{nextfile}
-@cindex @code{nextfile}, istruzione
-@cindex istruzione @code{nextfile}
-
-L'istruzione @code{nextfile}
-@`e simile all'istruzione @code{next}.
-Tuttavia, invece di terminare l'elaborazione del record corrente, l'istruzione
-@code{nextfile} richiede ad @command{awk} di terminare di elaborare il
-@value{DF} corrente.
-
-Alla fine dell'esecuzione dell'istruzione @code{nextfile},
-@code{FILENAME} @`e
-aggiornato per contenere il nome del successivo @value{DF} elencato sulla riga
-di comando, @code{FNR} @`e reimpostato a uno, e l'elaborazione riparte con
-la prima regola del programma.
-Se l'istruzione @code{nextfile} raggiunge la fine dei file in input,
-vengono eseguite le eventuali regole @code{END} presenti.
-Un'eccezione a questo si ha se @code{nextfile} @`e invocata durante
-l'esecuzione di qualche istruzione all'interno di una regola @code{END};
-in questo caso, il programma viene terminato immediatamente.
-@xref{BEGIN/END}.
-
-L'istruzione @code{nextfile} @`e utile quando ci sono parecchi @value{DF} da
-elaborare, ma non @`e necessario elaborare ogni record in ogni file.
-Senza @code{nextfile},
-per passare al successivo @value{DF}, un programma
-dovrebbe continuare a leggere i record che non gli servono. L'istruzione
-@code{nextfile} @`e una maniera molto pi@`u efficiente per ottenere lo stesso
-risultato.
-
-In @command{gawk}, l'esecuzione di @code{nextfile} produce ulteriori effetti:
-le eventuali regole @code{ENDFILE}
-sono eseguite se @command{gawk} non
-si trova correntemente all'interno di una regola @code{END} o
-@code{BEGINFILE}; @code{ARGIND} @`e
-incrementato e le eventuali regole @code{BEGINFILE} sono eseguite.
-(@code{ARGIND} non @`e stato ancora trattato.
-@xref{Variabili predefinite}.)
-
-In @command{gawk}, @code{nextfile} @`e utile all'interno di una regola
-@code{BEGINFILE} per evitare di elaborare un file che altrimenti causerebbe
-un errore fatale in @command{gawk}.
-In questo caso, le regole @code{ENDFILE} non vengono eseguite.
-@xref{BEGINFILE/ENDFILE}.
-
-Sebbene possa sembrare che @samp{close(FILENAME)} ottenga lo stesso
-risultato di @code{nextfile}, non @`e cos@`{@dotless{i}}. @code{close()}
-pu@`o essere usato solo per chiudere file, @dfn{pipe} e coprocessi che siano
-stati aperti tramite ridirezioni. Non ha niente a che vedere con
-l'elaborazione principale che
-@command{awk} fa dei file elencati in @code{ARGV}.
-
-@quotation NOTA
-Per molti anni, @code{nextfile} @`e stata
-un'estensione comune. A settembre 2012 si @`e deciso di
-includerla nello standard POSIX.
-Si veda @uref{http://austingroupbugs.net/view.php?id=607, il sito web dell'Austin Group}.
-@end quotation
-
-@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
-@cindex @code{nextfile}, in funzioni definite dall'utente
-@cindex Brian Kernighan, @command{awk} di
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-Le versioni correnti di BWK @command{awk} e @command{mawk}
-entrambe prevedono @code{nextfile}. Tuttavia, non sono consentite istruzioni
-@code{nextfile} all'interno del corpo delle funzioni
-(@pxref{Funzioni definite dall'utente}).
-@command{gawk} lo permette; una @code{nextfile} all'interno del corpo di una
-funzione legge il primo record del file
-successivo e inizia l'elaborazione dello stesso
-a partire dalla prima regola del programma, esattamente come farebbe
-qualsiasi altra istruzione @code{nextfile}.
-
-@node Istruzione exit
-@subsection L'istruzione @code{exit}
-
-@cindex @code{exit}, istruzione
-@cindex istruzione @code{exit}
-L'istruzione @code{exit} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
-l'esecuzione della regola corrente e che termini di elaborare l'input;
-qualsiasi input ancora da elaborare @`e ignorato. L'istruzione @code{exit} @`e
-scritta come segue:
-
-@display
-@code{exit} [@var{codice di ritorno}]
-@end display
-
-@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{exit} e
-@cindex criterio di ricerca @code{BEGIN}, istruzione @code{exit} e
-@cindex @code{END}, criterio di ricerca, istruzione @code{exit} e
-@cindex criterio di ricerca @code{END}, istruzione @code{exit} e
-Quando un'istruzione @code{exit} @`e eseguita all'interno di una regola @code{BEGIN},
-il programma termina completamente l'elaborazione. Nessun record in input
-viene letto. Tuttavia, se una regola @code{END} @`e presente, come parte
-dell'esecuzione dell'istruzione @code{exit},
-la regola @code{END} viene eseguita
-(@pxref{BEGIN/END}).
-Se @code{exit} @`e usata nel corpo di una regola @code{END},
-il programma termina immediatamente.
-
-Un'istruzione @code{exit} che non fa parte di una regola @code{BEGIN} o @code{END}
-termina l'esecuzione di qualsiasi ulteriore regola applicabile al record
-corrente, salta la lettura di qualsiasi record in input, ed esegue
-le eventuali regole @code{END}. @command{gawk} salta anche le eventuali regole
-@code{ENDFILE}, che non vengono eseguite.
-
-In questo caso,
-se non si desidera che la regola @code{END} venga eseguita, si deve impostare
-una variabile a un valore diverso da zero, prima di invocare l'istruzione
-@code{exit} e controllarne il valore nella regola @code{END}.
-@xref{Funzione assert}
-per un esempio di questo tipo.
-
-@cindex angolo buio, istruzione @code{exit}
-Se si specifica un argomento all'istruzione @code{exit}, il suo valore @`e
-usato come codice di ritorno finale dell'elaborazione @command{awk}. Se non
-viene specificato alcun argomento,
-@code{exit} fa terminare @command{awk} con un codice di ritorno di
-``successo''.
-Nel caso in cui un argomento
-sia specificato in una prima istruzione @code{exit} e poi @code{exit} sia
-chiamato una seconda volta all'interno di una regola @code{END} senza alcun
-argomento, @command{awk} usa il valore di ritorno specificato in precedenza.
-@value{DARKCORNER}
-@xref{Codice di ritorno} per maggiori informazioni.
-
-@cindex convenzioni di programmazione, istruzione @code{exit}
-Per esempio, si supponga che si sia verificata una condizione di errore
-difficile o impossibile da gestire. Convenzionalmente, i programmi la
-segnalano terminando con un codice di ritorno diverso da zero. Un programma
-@command{awk} pu@`o farlo usando un'istruzione @code{exit} con un argomento
-diverso da zero, come mostrato nell'esempio seguente:
-
-@example
-BEGIN @{
- if (("date" | getline data_corrente) <= 0) @{
- print "Non riesco a ottenere la data dal sistema" > "/dev/stderr"
- exit 1
- @}
- print "la data corrente @`e", data_corrente
- close("date")
-@}
-@end example
-
-@quotation NOTA
-Per una completa portabilit@`a, i codici di ritorno dovrebbero essere compresi
-tra zero e 126, estremi compresi.
-Valori negativi e valori maggiori o uguali a 127, possono non generare
-risultati coerenti tra loro in sistemi operativi diversi.
-@end quotation
-
-
-@node Variabili predefinite
-@section Variabili predefinite
-@cindex predefinite, variabili
-@cindex variabili predefinite
-
-La maggior parte delle variabili @command{awk} sono disponibili per essere
-usate dall'utente secondo le proprie esigenze;
-queste variabili non cambiano mai di valore a meno che il
-programma non assegni loro dei valori, e non hanno alcuna influenza sul
-programma a meno che non si decida di utilizzarle nel programma.
-Tuttavia, alcune variabili in @command{awk} hanno dei significati speciali
-predefiniti.
-@command{awk} tiene conto di alcune di queste automaticamente, in modo da
-rendere possibile la richiesta ad @command{awk} di fare certe cose nella
-maniera desiderata. Altre variabili sono impostate automaticamente da
-@command{awk}, in modo da poter comunicare al programma in esecuzione
-informazioni sul modo di procedere interno di @command{awk}.
-
-@cindex @command{gawk}, variabili predefinite e
-Questa @value{SECTION} documenta tutte le variabili predefinite di
-@command{gawk}; molte di queste variabili sono anche documentate nei
-@value{CHAPTER} che descrivono le loro aree di influenza.
-
-@menu
-* Variabili modificabili dall'utente:: Variabili predefinite modificabili per
- controllare @command{awk}.
-* Variabili auto-assegnate:: Variabili predefinite con cui
- @command{awk} fornisce informazioni.
-* ARGC e ARGV:: Modi di usare @code{ARGC} e @code{ARGV}.
-@end menu
-
-@node Variabili modificabili dall'utente
-@subsection Variabili predefinite modificabili per controllare @command{awk}
-@cindex variabili predefinite, modificabili dall'utente
-@cindex modificabili dall'utente, variabili
-
-La seguente @`e una lista alfabetica di variabili che @`e possibile modificare per
-controllare come @command{awk} gestisce alcuni compiti.
-
-Le variabili che sono specifiche di @command{gawk} sono contrassegnate da un
-cancelletto (@samp{#}). Queste variabili sono estensioni @command{gawk}.
-In altre implementazioni di @command{awk}, o se @command{gawk} @`e eseguito in
-modalit@`a compatibile
-(@pxref{Opzioni}), non hanno un significato speciale. (Eventuali eccezioni
-sono menzionate nella descrizione di ogni variabile.)
-
-@table @code
-@cindex @code{BINMODE}, variabile
-@cindex variabile @code{BINMODE}
-@cindex binario, input/output
-@cindex input/output binario
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
-@item BINMODE #
-Su sistemi non-POSIX, questa variabile specifica l'uso della modalit@`a binaria
-per tutto l'I/O. I valori numerici di uno, due o tre specificano che i file
-in input, i file di output o tutti i file, rispettivamente, devono usare I/O
-binario.
-Un valore numerico inferiore a zero @`e trattato come zero e un valore
-numerico maggiore di tre @`e trattato
-come tre. Alternativamente, le stringhe @code{"r"} o @code{"w"} specificano
-che i file in input e i file in output,
-rispettivamente, devono usare
-I/O binario. Una stringa @code{"rw"} o @code{"wr"} indica che tutti i file
-devono usare I/O binario. Ogni altro valore di stringa @`e trattato come
-@code{"rw"}, ma @command{gawk} genera un messaggio di avvertimento.
-@code{BINMODE} @`e descritto in maggior
-dettaglio in @ref{Uso su PC}. @command{mawk} (@pxref{Altre versioni})
-prevede questa variabile, ma consente solo valori numerici.
-
-@cindex @code{CONVFMT}, variabile
-@cindex variabile @code{CONVFMT}
-@cindex POSIX @command{awk}, variabile @code{CONVFMT} e
-@cindex numeri, conversione in stringhe
-@cindex stringhe, conversione in numeri
-@item @code{CONVFMT}
-Una stringa che controlla la conversione di numeri in
-stringhe (@pxref{Conversione}).
-In effetti @`e la stringa passata come primo argomento alla funzione
-@code{sprintf()}
-(@pxref{Funzioni per stringhe}).
-Il suo valore di default @`e @code{"%.6g"}.
-@code{CONVFMT} @`e stata introdotta dallo standard POSIX.
-
-@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
-@cindex @code{FIELDWIDTHS}, variabile
-@cindex variabile @code{FIELDWIDTHS}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FIELDWIDTHS}
-@cindex separatori di campo, variabile @code{FIELDWIDTHS} e
-@cindex campo, separatori di, variabile @code{FIELDWIDTHS} e
-@item FIELDWIDTHS #
-Una lista di posizioni di colonna, separate da spazi, per dire a
-@command{gawk}
-come dividere campi in input posti su colonne fisse.
-Assegnando un valore a @code{FIELDWIDTHS}, le variabili @code{FS} e
-@code{FPAT}
-@emph{non} vengono usate per effettuare la divisione in campi.
-@xref{Dimensione costante} per maggiori informazioni.
-
-@cindex @command{gawk}, variabile @code{FPAT} in
-@cindex @code{FPAT}, variabile
-@cindex variabile @code{FPAT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FPAT}
-@cindex separatori di campo, variabile @code{FPAT} e
-@cindex campo, separatori di, variabile @code{FPAT} e
-@item FPAT #
-Un'espressione regolare (di tipo stringa) per dire a @command{gawk}
-di creare i campi utilizzando come delimitatore il testo che corrisponde
-all'espressione regolare.
-Assegnando un valore a @code{FPAT}
-le variabili @code{FS} e @code{FIELDWIDTHS}
-@emph{non} vengono usate per effettuare la divisione in campi.
-@xref{Separazione in base al contenuto} per maggiori informazioni.
-
-@cindex @code{FS}, variabile
-@cindex variabile @code{FS}
-@cindex campo, separatori di
-@cindex separatori di campo
-@item FS
-Il separatore dei campi in input (@pxref{Separatori di campo}).
-Il valore pu@`o essere una stringa di un solo carattere o un'espressione
-regolare composta da pi@`u caratteri che individua il separatore tra i campi
-dei record in input. Se il suo valore
-@`e la stringa nulla (@code{""}),
-ogni singolo carattere del record costituisce un campo.
-(Questo comportamente @`e un'estensione @command{gawk}. POSIX @command{awk} non
-specifica il comportamento quando @code{FS} @`e la stringa nulla.
-Nonostante questo, alcune altre versioni di @command{awk} trattano @code{""}
-in modo speciale.)
-
-@cindex POSIX @command{awk}, variabile @code{FS} e
-Il valore di default @`e @w{@code{" "}}, una stringa consistente in un singolo
-spazio. In via eccezionale, questo valore significa che qualsiasi sequenza
-di spazi, TAB, e/o ritorni a capo costituisce
-un solo separatore.
-Inoltre eventuali spazi, TAB e ritorni a capo all'inizio e alla fine
-del record in input vengono ignorati.
-
-Si pu@`o impostare il valore di @code{FS} sulla riga dei comandi usando
-l'opzione @option{-F}:
-
-@example
-awk -F, '@var{programma}' @var{file-in-input}
-@end example
-
-@cindex @command{gawk}, separatori di campo e
-Se @command{gawk} sta usando @code{FIELDWIDTHS} o @code{FPAT}
-per separare i campi,
-assegnare un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} torni alla
-separazione dei campi normale, fatta utilizzando la variabile @code{FS}.
-Un modo semplice per fare questo
-@`e semplicemente quello di scrivere l'istruzione
-@samp{FS = FS}, aggiungendo magari un commento esplicativo.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex @code{IGNORECASE}, variabile
-@cindex variabile @code{IGNORECASE}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{IGNORECASE}
-@cindex maiuscolo/minuscolo e confronti tra stringhe
-@cindex maiuscolo/minuscolo e @dfn{regexp}
-@cindex espressioni regolari, maiuscolo/minuscolo
-@item IGNORECASE #
-Se la variabile @code{IGNORECASE} @`e diversa da zero o dalla stringa nulla,
-tutti i confronti tra stringhe
-e tutti i confronti tra espressioni regolari sono insensibili
-alle differenze maiuscolo/minuscolo.
-Questo vale per il confronto tra @dfn{regexp}
-usando @samp{~} e @samp{!~}, per le funzioni @code{gensub()},
-@code{gsub()}, @code{index()}, @code{match()}, @code{patsplit()},
-@code{split()} e @code{sub()},
-per la determinazione della fine record con @code{RS} e per la divisione
-in campi con @code{FS} e @code{FPAT}.
-Tuttavia, il valore di @code{IGNORECASE} @emph{non} influenza gli indici
-dei vettori
-e non influenza la separazione dei campi qualora si usi un separatore di campo
-costituito da un unico carattere.
-@xref{Maiuscolo-Minuscolo}.
-
-@cindex @command{gawk}, variabile @code{LINT} in
-@cindex @code{LINT}, variabile
-@cindex variabile @code{LINT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{LINT}
-@cindex @dfn{lint}, controlli
-@cindex controlli @dfn{lint}
-@item LINT #
-Quando questa variabile @`e vera (non uguale a zero e non uguale alla stringa
-nulla), @command{gawk} si comporta come se fosse stata specificata sulla
-riga di comando l'opzione @option{--lint}
-(@pxref{Opzioni}).
-Con un valore di @code{"fatal"}, gli avvertimenti di @dfn{lint} generano un errore
-fatale.
-Con un valore di @code{"invalid"}, sono inviati solo gli avvertimenti
-per cose che sono effettivamente non valide. (Questa parte non funziona
-ancora perfettamente.)
-Ogni altro valore @dfn{vero} stampa avvertimenti non fatali.
-Se @code{LINT} ha per valore @dfn{falso} nessun avvertimento @dfn{lint} viene
-stampato.
-
-Questa variabile @`e un'estensione @command{gawk}. Non ha un valore speciale
-per altre implementazioni di @command{awk}. A differenza di altre variabili
-speciali, modificare il valore di @code{LINT} altera la produzione di
-avvertimenti @dfn{lint} anche se @command{gawk} @`e in modalit@`a compatibile.
-Analogamente a come le opzioni
-@option{--lint} e @option{--traditional} controllano in maniera indipendente
-diversi aspetti del comportamente di @command{gawk}, il controllo
-degli avvertimenti di @dfn{lint} durante l'esecuzione del programma @`e indipendente
-dall'implementazione @command{awk} in esecuzione.
-
-@cindex @code{OFMT}, variabile
-@cindex variabile @code{OFMT}
-@cindex numeri, conversione in stringhe
-@cindex stringhe, conversione in numeri
-@item OFMT
-@`E questa la stringa che controlla la conversione di numeri in
-stringhe (@pxref{Conversione}) quando li
-si stampa con l'istruzione
-@code{print}. Funziona passandola
- come primo argomento alla funzione @code{sprintf()}
-(@pxref{Funzioni per stringhe}).
-Il suo valore di default @`e @code{"%.6g"}. Le prime versioni di @command{awk}
-usavano @code{OFMT} per specificare il formato da usare per convertire
-numeri in stringhe in espressioni generali; questo compito @`e ora svolto
-da @code{CONVFMT}.
-
-@cindex @code{sprintf()}, funzione, variabile @code{OFMT} e
-@cindex funzione @code{sprintf()}, variabile @code{OFMT} e
-@cindex @code{print}, istruzione, variabile @code{OFMT} e
-@cindex istruzione @code{print}, variabile @code{OFMT} e
-@cindex variabile @code{OFS}
-@cindex @code{OFS}, variabile
-@cindex campo, separatori di
-@cindex separatori di campo
-@item OFS
-@`E il separatore dei campi in output (@pxref{Separatori di output}). @`E ci@`o
-che viene stampato in output per separare i campi stampati da un'istruzione @code{print}.
-Il suo valore di default @`e @w{@code{" "}}, una stringa costituita da un solo
-spazio.
-
-@cindex @code{ORS}, variabile
-@cindex variabile @code{ORS}
-@item ORS
-Il separatore dei record in output. Viene stampato alla fine di ogni
-istruzione @code{print}. Il suo valore di default @`e @code{"\n"},
-il carattere di ritorno a capo.
-(@xref{Separatori di output}.)
-
-@cindex @code{PREC}, variabile
-@cindex variabile @code{PREC}
-@item PREC #
-La precisione disponibile nei numeri a virgola mobile a precisione arbitraria,
-per default 53 bit (@pxref{Impostare la precisione}).
-
-@cindex @code{ROUNDMODE}, variabile
-@cindex variabile @code{ROUNDMODE}
-@item ROUNDMODE #
-La modalit@`a di arrotondamento da usare per operazioni aritmetiche a precisione
-arbitraria svolte sui numeri, per default @code{"N"}
-(@code{roundTiesToEven} nello standard
-IEEE 754; @pxref{Impostare modi di arrotondare}).
-
-@cindex @code{RS}, variabile
-@cindex variabile @code{RS}
-@cindex separatori di record
-@cindex record, separatori di
-@item @code{RS}
-Il separatore tra record in input. Il suo valore di default @`e una stringa
-contenente il solo carattere di ritorno a capo, il che significa che un record in input
-consiste di una sola riga di testo.
-Il suo valore pu@`o essere anche la stringa nulla, nel qual caso i record sono
-separati da una o pi@`u righe vuote.
-Se invece @`e una @dfn{regexp}, i record sono separati da
-corrispondenze alla @dfn{regexp} nel testo in input.
-(@xref{Record}.)
-
-La possibilit@`a che @code{RS} sia un'espressione regolare
-@`e un'estensione @command{gawk}.
-In molte altre implementazioni @command{awk}, oppure
-se @command{gawk} @`e in modalit@`a compatibile
-(@pxref{Opzioni}),
-@`e usato solo il primo carattere del valore di @code{RS}.
-
-@cindex @code{SUBSEP}, variabile
-@cindex variabile @code{SUBSEP}
-@cindex separatori di indici
-@cindex indici, separatori di
-@item @code{SUBSEP}
-Il separatore di indici. Ha il valore di default di
-@code{"\034"} ed @`e usato per separare le parti di cui sono composti gli indici
-di un vettore multidimensionale. Quindi, l'espressione
-@samp{@w{pippo["A", "B"]}}
-in realt@`a accede a @code{pippo["A\034B"]}
-(@pxref{Vettori multidimensionali}).
-
-@cindex @command{gawk}, variabile @code{TEXTDOMAIN} in
-@cindex @code{TEXTDOMAIN}, variabile
-@cindex variabile @code{TEXTDOMAIN}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{TEXTDOMAIN}
-@cindex internazionalizzazione, localizzazione
-@item TEXTDOMAIN #
-Usata per l'internazionalizzazione di programmi a livello di
-@command{awk}. Imposta il dominio di testo (@dfn{text domain}) di default per costanti stringa
-marcate in maniera speciale nel codice sorgente, e anche per le funzioni
-@code{dcgettext()}, @code{dcngettext()} e @code{bindtextdomain()}
-@iftex
-(@pxrefil{Internazionalizzazione}).
-@end iftex
-@ifnottex
-(@pxref{Internazionalizzazione}).
-@end ifnottex
-Il valore di default di @code{TEXTDOMAIN} @`e @code{"messages"}.
-@end table
-
-@node Variabili auto-assegnate
-@subsection Variabili predefinite con cui @command{awk} fornisce informazioni
-
-@cindex predefinite, variabili, che forniscono informazioni
-@cindex variabili predefinite, che forniscono informazioni
-Quella che segue @`e una lista in ordine alfabetico di variabili che
-@command{awk} imposta automaticamente in determinate situazioni per
-fornire informazioni a un programma.
-
-Le variabili specifiche di @command{gawk} sono contrassegnate da un
-cancelletto (@samp{#}). Queste variabili sono estensioni @command{gawk}.
-In altre implementazioni di @command{awk} o se @command{gawk} @`e in
-modalit@`a compatibile (@pxref{Opzioni}), non hanno un significato speciale:
-
-@c @asis for docbook
-@table @asis
-@cindex @code{ARGC}/@code{ARGV}, variabili
-@cindex argomenti, riga di comando
-@cindex riga di comando, argomenti
-@item @code{ARGC}, @code{ARGV}
-Gli argomenti della riga di comando disponibili ai programmi @command{awk}
-sono memorizzati in un vettore di nome
-@code{ARGV}. @code{ARGC} @`e il numero di argomenti presenti sulla
-riga di comando.
-@xref{Altri argomenti}.
-A differenza di quasi tutti i vettori di @command{awk},
-@code{ARGV} @`e indicizzato da 0 a @code{ARGC} @minus{} 1.
-Lo si pu@`o vedere nell'esempio seguente:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{for (i = 0; i < ARGC; i++)}
-> @kbd{print ARGV[i]}
-> @kbd{@}' inventory-shipped mail-list}
-@print{} awk
-@print{} inventory-shipped
-@print{} mail-list
-@end example
-
-@noindent
-@code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
-contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
-@samp{mail-list}. Il valore di @code{ARGC} @`e tre, ossia uno in pi@`u
-dell'indice dell'ultimo elemento di @code{ARGV}, perch@'e gli elementi sono
-numerati a partire da zero.
-
-@cindex convenzioni di programmazione, variabili @code{ARGC}/@code{ARGV}
-I nomi @code{ARGC} e @code{ARGV}, come pure la convenzione di indicizzare
-il vettore da 0 a @code{ARGC} @minus{} 1, derivano dal modo in cui il
-linguaggio C accede agli argomenti presenti sulla riga di comando.
-
-@cindex angolo buio, valore di @code{ARGV[0]}
-Il valore di @code{ARGV[0]} pu@`o variare da sistema a sistema.
-Va anche notato che il programma @emph{non}
-@`e incluso in @code{ARGV}, e non sono incluse neppure le eventuali opzioni di
-@command{awk} specificate sulla riga di comando.
-@xref{ARGC e ARGV} per informazioni
-su come @command{awk} usa queste variabili.
-@value{DARKCORNER}
-
-@cindex @code{ARGIND}, variabile
-@cindex variabile @code{ARGIND}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ARGIND}
-@item @code{ARGIND #}
-L'indice in @code{ARGV} del file correntemente in elaborazione.
-Ogni volta che @command{gawk} apre un nuovo @value{DF} per elaborarlo, imposta
-@code{ARGIND} all'indice in @code{ARGV} del @value{FN}.
-Quando @command{gawk} sta elaborando i file in input, il confronto
-@samp{FILENAME == ARGV[ARGIND]} @`e sempre verificato.
-
-@cindex file, elaborazione@comma{} variabile @code{ARGIND} e
-Questa variabile @`e utile nell'elaborazione dei file; consente di stabilire
-a che punto ci si trova nella lista
-di @value{DF}, e anche di distinguere tra successive occorrenze dello stesso
-@value{FN} sulla riga dei comandi.
-
-@cindex nomi di file, distinguere
-Anche se @`e possibile modificare il valore di @code{ARGIND} all'interno del
-programma @command{awk}, @command{gawk} automaticamente lo imposta a un nuovo
-valore quando viene aperto il file successivo.
-
-@cindex @code{ENVIRON}, vettore
-@cindex vettore @code{ENVIRON}
-@cindex variabili d'ambiente, nel vettore @code{ENVIRON}
-@item @code{ENVIRON}
-Un vettore associativo contenente i valori delle variabili d'ambiente.
-Gli indici del vettore sono i nomi delle variabili d'ambiente; gli elementi
-sono i valori della specifica variabile d'ambiente. Per esempio,
-@code{ENVIRON["HOME"]} potrebbe valere @code{/home/arnold}.
-
-Per POSIX @command{awk}, le modifiche a questo vettore non cambiano
-le variabili d'ambiente passate a qualsivoglia programma che @command{awk}
-pu@`o richiamare tramite una ridirezione
-o usando la funzione @code{system()}.
-
-Tuttavia, a partire dalla @value{PVERSION} 4.2, se non si @`e in
-modalit@`a compatibile POSIX, @command{gawk} aggiorna le proprie variabili
-d'ambiente, quando si modifica @code{ENVIRON}, e in questo modo sono
-modificate anche le variabili d'ambiente disponibili ai programmi richiamati.
-Un'attenzione speciale dovrebbe essere prestata alla modifica di
-@code{ENVIRON["PATH"]}, che @`e il percorso di ricerca usato per trovare
-i programmi eseguibili.
-
-Queste modifiche possono anche influire sul programma @command{gawk}, poich@'e
-alcune funzioni predefinite possono tener conto di certe
-variabili d'ambiente.
-L'esempio pi@`u notevole di una tale situazione @`e @code{mktime()}
-(@pxref{Funzioni di tempo})
-che, in molti sistemi, tiene conto del valore della
-variabile d'ambiente @env{TZ}.
-
-Alcuni sistemi operativi possono non avere variabili d'ambiente.
-In tali sistemi, il vettore @code{ENVIRON} @`e vuoto (tranne che per
-le variabili
-@w{@code{ENVIRON["AWKPATH"]}} e
-@w{@code{ENVIRON["AWKLIBPATH"]}} eventualmente presenti;
-@pxref{AWKPATH (Variabile)} e
-@ifdocbook
-@ref{AWKLIBPATH (Variabile)}).
-@end ifdocbook
-@ifnotdocbook
-@pxref{AWKLIBPATH (Variabile)}).
-@end ifnotdocbook
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile
-@cindex variabile @code{ERRNO}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ERRNO}
-@cindex gestione errori, variabile @code{ERRNO} e
-@item @code{ERRNO #}
-Se si verifica un errore di sistema durante una ridirezione per @code{getline},
-durante una lettura per @code{getline} o durante un'operazione di
-@code{close()}, la variabile
-@code{ERRNO} contiene una stringa che descrive l'errore.
-
-Inoltre, @command{gawk} annulla @code{ERRNO} prima di aprire ogni
-file in input presente sulla riga di comando. Questo consente di controllare
-se il file @`e accessibile
-all'interno di un criterio di ricerca @code{BEGINFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-Per il resto, @code{ERRNO} si comporta analogamente alla variabile C
-@code{errno}.
-Tranne nel caso sopra accennato, @command{gawk} non annulla @emph{mai}
-@code{ERRNO} (lo imposta a zero o a @code{""}). Quindi, ci si deve
-aspettare che il suo valore sia significativo solo quando un'operazione
-di I/O restituisce un valore che indica il fallimento dell'operazione, come
-per esempio quando @code{getline} restituisce @minus{}1. Si @`e, naturalmente,
-liberi di annullarla prima di effettuare un'operazione di I/O.
-
-Se il valore di @code{ERRNO} corrisponde a un errore di sistema della
-variabile C @code{errno}, @code{PROCINFO["errno"]} sar@`a impostato al valore
-di @code{errno}. Per errori non di sistema, @code{PROCINFO["errno"]} sar@`a
-impostata al valore zero.
-
-@cindex @code{FILENAME}, variabile
-@cindex variabile @code{FILENAME}
-@cindex angolo buio, variabile @code{FILENAME}
-@item @code{FILENAME}
-Il nome del file in input corrente. Quando non ci sono @value{DF}
-sulla riga dei comandi, @command{awk} legge dallo standard input e
-@code{FILENAME} @`e impostato a @code{"-"}. @code{FILENAME} cambia ogni
-volta che si legge un nuovo file
-@iftex
-(@pxrefil{Leggere file}).
-@end iftex
-@ifnottex
-(@pxref{Leggere file}).
-@end ifnottex
-All'interno di una
-regola @code{BEGIN}, il valore di @code{FILENAME} @`e @code{""}, perch@'e non si
-sta elaborando alcun file in input.@footnote{Alcune tra le prime implementazioni di Unix
-@command{awk} inizializzavano @code{FILENAME} a @code{"-"}, anche se
-vi erano @value{DF} da elaborare. Un tale comportamento era incorretto e
-non ci si dovrebbe poter contare nei programmi.}
-@value{DARKCORNER} Si noti, tuttavia,
-che l'uso di @code{getline} (@pxref{Getline}) all'interno di una regola
-@code{BEGIN} pu@`o implicare l'assegnamento di un valore a @code{FILENAME}.
-
-@cindex @code{FNR}, variabile
-@cindex variabile @code{FNR}
-@item @code{FNR}
-Il numero del record corrente nel file corrente. @command{awk} incrementa
-@code{FNR} ogni volta che legge un nuovo record (@pxref{Record}).
-@command{awk} imposta nuovamente a zero @code{FNR} ogni volta che inizia a
-leggere un nuovo file in input.
-
-@cindex @code{NF}, variabile
-@cindex variabile @code{NF}
-@item @code{NF}
-Il numero di campi nel corrente record in input.
-@code{NF} @`e impostato ogni volta che si legge un nuovo record,
-quando un nuovo campo viene creato,
-o quando si modifica @code{$0} (@pxref{Campi}).
-
-A differenza di molte altre variabili descritte in questa @value{SUBSECTION},
-l'assegnamento di un valore a @code{NF} pu@`o potenzialmente influenzare
-il funzionamento interno di @command{awk}. In particolare, assegnamenti
-a @code{NF} si possono usare per aggiungere o togliere campi dal
-record corrente. @xref{Cambiare i campi}.
-
-@cindex @code{FUNCTAB}, vettore
-@cindex vettore @code{FUNCTAB}
-@cindex @command{gawk}, vettore @code{FUNCTAB} in
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FUNCTAB}
-@item @code{FUNCTAB #}
-Un vettore i cui indici e i corrispondenti valori sono i nomi di tutte le
-funzioni predefinite, definite dall'utente ed estese, presenti nel programma.
-
-@quotation NOTA
-Il tentativo di usare l'istruzione @code{delete} per eliminare il vettore
-@code{FUNCTAB} genera un errore fatale. Genera un errore fatale anche
-ogni tentativo di impostare un elemento di @code{FUNCTAB}.
-@end quotation
-
-@cindex @code{NR}, variabile
-@cindex variabile @code{NR}
-@item @code{NR}
-Il numero di record in input che @command{awk} ha elaborato dall'inizio
-dell'esecuzione del programma
-(@pxref{Record}).
-@command{awk} incrementa @code{NR} ogni volta che legge un nuovo record.
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{PROCINFO}
-@item @code{PROCINFO #}
-Gli elementi di questo vettore danno accesso a informazioni sul
-programma @command{awk} in esecuzione.
-I seguenti elementi (elencati in ordine alfabetico)
-sono sicuramente sempre disponibili:
-
-@table @code
-@cindex effettivo, @dfn{ID di gruppo} dell'utente di @command{gawk}
-@item PROCINFO["egid"]
-Il valore restituito dalla chiamata di sistema @code{getegid()}.
-
-@item PROCINFO["errno"]
-Il valore della variabile C @code{ERRNO} quando @code{ERRNO} @`e impostato
-al messaggio di errore a essa associato.
-
-@item PROCINFO["euid"]
-@cindex @dfn{ID effettivo} dell'utente di @command{gawk}
-Il valore restituito dalla chiamata di sistema @code{geteuid()}.
-
-@item PROCINFO["FS"]
-Questo elemento vale
-@code{"FS"} se @`e in uso la separazione in campi con @code{FS},
-@code{"FIELDWIDTHS"} se @`e in uso quella con @code{FIELDWIDTHS},
-oppure @code{"FPAT"} se @`e in uso l'individuazione di campo con @code{FPAT}.
-
-@item PROCINFO["gid"]
-@cindex @dfn{ID di gruppo} dell'utente @command{gawk}
-Il valore restituito dalla chiamata di sistema @code{getgid()} .
-
-@item PROCINFO["identifiers"]
-@cindex programma, identificativi in un
-@cindex identificativi in un programma
-Un sottovettore, indicizzato dai nomi di tutti gli identificativi usati
-all'interno del programma @command{awk}. Un @dfn{identificativo} @`e
-semplicemente il nome di una variabile
-(scalare o vettoriale), una funzione predefinita, una funzione definita
-dall'utente, o una funzione contenuta in un'estensione.
-Per ogni identificativo, il valore dell'elemento @`e uno dei seguenti:
-
-@table @code
-@item "array"
-L'identificativo @`e un vettore.
-
-@item "builtin"
-L'identificativo @`e una funzione predefinita.
-
-@item "extension"
-L'identificativo @`e una funzione in un'estensione caricata tramite
-@code{@@load} o con l'opzione @option{-l}.
-
-@item "scalar"
-L'identificativo @`e uno scalare.
-
-@item "untyped"
-L'identificativo non ha ancora un tipo (potrebbe essere usato come scalare o
-come vettore; @command{gawk} non @`e ancora in grado di dirlo).
-
-@item "user"
-L'identificativo @`e una funzione definita dall'utente.
-@end table
-
-@noindent
-I valori riportano ci@`o che @command{gawk} sa sugli identificativi
-dopo aver finito l'analisi iniziale del programma; questi valori @emph{non}
-vengono pi@`u aggiornati durante l'esecuzione del programma.
-
-@item PROCINFO["pgrpid"]
-@cindex @dfn{process group ID} del programma @command{gawk}
-Il @dfn{ID di gruppo del processo} del programma corrente.
-
-@item PROCINFO["pid"]
-@cindex @dfn{process ID} del programma @command{gawk}
-Il @dfn{process ID} del programma corrente.
-
-@item PROCINFO["ppid"]
-@cindex @dfn{parent process ID} del programma @command{gawk}
-Il @dfn{ID di processo del padre} del programma corrente.
-
-@item PROCINFO["strftime"]
-La stringa col formato di default usato per la funzione @code{strftime()}.
-Assegnando un nuovo valore a questo elemento si cambia quello di default.
-@xref{Funzioni di tempo}.
-
-@item PROCINFO["uid"]
-Il valore restituito dalla chiamata di sistema @code{getuid()}.
-
-@item PROCINFO["version"]
-@cindex versione di @command{gawk}
-@cindex @command{gawk}, versione di
-La versione di @command{gawk}.
-@end table
-
-I seguenti elementi addizionali del vettore
-sono disponibili per fornire informazioni sulle librerie MPFR e GMP,
-se la versione in uso di @command{gawk} consente il calcolo con precisione
-arbitraria
-(@pxref{Calcolo con precisione arbitraria}):
-
-@table @code
-@item PROCINFO["gmp_version"]
-@cindex versione della libreria GNU MP
-La versione della libreria GNU MP.
-
-@cindex versione della libreria GNU MPFR
-@item PROCINFO["mpfr_version"]
-La versione della libreria GNU MPFR.
-
-@item PROCINFO["prec_max"]
-@cindex precisione massima consentita dalla libreria MPFR
-La massima precisione consentita da MPFR.
-
-@item PROCINFO["prec_min"]
-@cindex precisione minima richiesta dalla libreria MPFR
-La precisione minima richiesta da MPFR.
-@end table
-
-I seguenti elementi addizionali del vettore
-sono disponibili per fornire
-informazioni sulla versione dell'estensione API, se la versione
-di @command{gawk} prevede il caricamento dinamico di funzioni di estensione
-@iftex
-(@pxrefil{Estensioni dinamiche}):
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}):
-@end ifnottex
-
-@table @code
-@item PROCINFO["api_major"]
-@cindex versione dell'estensione API @command{gawk}
-@cindex estensione API, numero di versione
-La versione principale dell'estensione API.
-
-@item PROCINFO["api_minor"]
-La versione secondaria dell'estensione API.
-@end table
-
-@cindex gruppi supplementari Unix con @command{gawk}
-Su alcuni sistemi, ci possono essere elementi nel vettore, da @code{"group1"}
-fino a @code{"group@var{N}"}. @var{N} @`e il numero di
-gruppi supplementari che il processo [Unix] possiede. Si usi l'operatore
-@code{in} per verificare la presenza di questi elementi
-(@pxref{Visitare elementi}).
-
-I seguenti elementi consentono di modificare il comportamento di
-@command{gawk}:
-
-@item PROCINFO["NONFATAL"]
-Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni
-consentono la prosecuzizone del programma.
-@xref{Continuazione dopo errori}.
-
-@item PROCINFO["@var{nome_output}", "NONFATAL"]
-Gli errori in output per il file @var{nome_output}
-consentono la prosecuzizone del programma.
-@xref{Continuazione dopo errori}.
-
-@table @code
-@item PROCINFO["@var{comando}", "pty"]
-Per una comunicazione bidirezionale con @var{comando}, si usi una pseudo-tty
-invece di impostare una @dfn{pipe} bidirezionale.
-@xref{I/O bidirezionale} per ulteriori informazioni.
-
-@item PROCINFO["@var{input_name}", "READ_TIMEOUT"]
-Imposta un tempo limite per leggere dalla ridirezione di input @var{input_name}.
-@xref{Timeout in lettura} per ulteriori informazioni.
-
-@item PROCINFO["sorted_in"]
-Se questo elemento esiste in @code{PROCINFO}, il suo valore controlla
-l'ordine in cui gli indici dei vettori saranno elaborati nei cicli
-@samp{for (@var{indice} in @var{vettore})}.
-Questa @`e una funzionalit@`a avanzata, la cui descrizione completa sar@`a vista
-pi@`u avanti; si veda
-@ref{Visitare un intero vettore}.
-@end table
-
-@cindex @code{RLENGTH}, variabile
-@cindex variabile @code{RLENGTH}
-@item @code{RLENGTH}
-La lunghezza della sottostringa individuata dalla funzione
-@code{match()}
-(@pxref{Funzioni per stringhe}).
-@code{RLENGTH} viene impostata quando si richiama la funzione @code{match()}.
-Il suo
-valore @`e la lunghezza della stringa individuata, oppure @minus{}1 se non @`e
-stata trovata alcuna corrispondenza.
-
-@cindex @code{RSTART}, variabile
-@cindex variabile @code{RSTART}
-@item @code{RSTART}
-L'indice, in caratteri, da cui parte la sottostringa che @`e individuata dalla
-funzione @code{match()}
-(@pxref{Funzioni per stringhe}).
-@code{RSTART} viene impostata quando si richiama la funzione @code{match()}.
-Il suo
-valore @`e la posizione nella stringa da cui inizia la sottostringa
-individuata, oppure zero, se non @`e stata trovata alcuna corrispondenza.
-
-@cindex @command{gawk}, variabile @code{RT} in
-@cindex @code{RT}, variabile
-@cindex variabile @code{RT}
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{RT}
-@item @code{RT #}
-Il testo in input che corrisponde al testo individuato da @code{RS},
-il separatore di record. Questa variabile viene impostata dopo aver letto
-ciascun record.
-
-@cindex @command{gawk}, vettore @code{SYMTAB} in
-@cindex @code{SYMTAB}, vettore
-@cindex vettore @code{SYMTAB}
-@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{SYMTAB}
-@item @code{SYMTAB #}
-Un vettore i cui indici sono i nomi di tutte le variabili globali e i vettori
-definiti nel programma. @code{SYMTAB} rende visibile al
-programmatore @command{awk} la tabella dei simboli di @command{gawk}.
-Viene preparata nella fase di analisi iniziale del programma @command{gawk}
-ed @`e completata prima di cominciare a eseguire il programma.
-
-Il vettore pu@`o essere usato per accedere indirettamente, in lettura o in
-scrittura, al valore di una variabile:
-
-@example
-pippo = 5
-SYMTAB["pippo"] = 4
-print pippo # stampa 4
-@end example
-
-@noindent
-La funzione @code{isarray()} (@pxref{Funzioni per i tipi}) si pu@`o usare per
-controllare se un elemento in @code{SYMTAB} @`e un vettore.
-Inoltre, non @`e possibile usare l'istruzione @code{delete} con il vettore
-@code{SYMTAB}.
-
-@`E possibile aggiungere a @code{SYMTAB} un elemento che non sia un
-identificativo gi@`a esistente:
-
-@example
-SYMTAB["xxx"] = 5
-print SYMTAB["xxx"]
-@end example
-
-@noindent
-Il risultato @`e quello previsto: in questo caso @code{SYMTAB} si comporta
-come un normale vettore. La sola differenza @`e che non @`e poi possibile
-cancellare @code{SYMTAB["xxx"]}.
-
-@cindex Schorr, Andrew
-Il vettore @code{SYMTAB} @`e pi@`u interessante di quel che sembra. Andrew
-Schorr fa notare che effettivamente consente di ottenere dei puntatori ai dati
-in @command{awk}. Si consideri quest'esempio:
-
-@example
-# Moltiplicazione indiretta di una qualsiasi variabile per un
-# numero a piacere e restituzione del risultato
-
-function multiply(variabile, numero)
-@{
- return SYMTAB[variabile] *= numero
-@}
-@end example
-
-@noindent
-Si potrebbe usare in questo modo:
-
-@example
-BEGIN @{
- risposta = 10.5
- multiply("risposta", 4)
- print "La risposta @`e", risposta
-@}
-@end example
-
-@noindent
-Eseguendo, il risultato @`e:
-
-@example
-$ @kbd{gawk -f risposta.awk}
-@print{} La risposta @`e 42
-@end example
-
-@quotation NOTA
-Per evitare seri paradossi temporali,
-@footnote{Per non parlare dei grossi problemi di implementazione.}
-n@'e @code{FUNCTAB} n@'e @code{SYMTAB}
-sono disponibili come elementi all'interno del vettore @code{SYMTAB}.
-@end quotation
-@end table
-
-@cindex sidebar, Modificare @code{NR} e @code{FNR}
-@ifdocbook
-@docbook
-<sidebar><title>Modificare @code{NR} e @code{FNR}</title>
-@end docbook
-
-@cindex @code{NR}, variabile, modifica di
-@cindex variabile @code{NR}, modifica di
-@cindex @code{FNR}, variabile, modifica di
-@cindex variabile @code{FNR}, modifica di
-@cindex angolo buio, variabili @code{FNR}/@code{NR}
-@command{awk} incrementa le variabili @code{NR} e @code{FNR}
-ogni volta che legge un record, invece che impostarle al valore assoluto del
-numero di record letti. Ci@`o significa che un programma pu@`o
-modificare queste variabili e i valori cos@`{@dotless{i}} assegnati sono incrementati per
-ogni record.
-@value{DARKCORNER}
-Si consideri l'esempio seguente:
-
-@example
-$ @kbd{echo '1}
-> @kbd{2}
-> @kbd{3}
-> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
-> @kbd{@{ print NR @}'}
-@print{} 1
-@print{} 17
-@print{} 18
-@print{} 19
-@end example
-
-@noindent
-Prima che @code{FNR} venisse aggiunto al linguaggio @command{awk}
-(@pxref{V7/SVR3.1}),
-molti programmi @command{awk} usavano questa modalit@`a per
-contare il numero di record in un file impostando a zero @code{NR} al cambiare
-di @code{FILENAME}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Modificare @code{NR} e @code{FNR}}
-
-
-@cindex @code{NR}, variabile, modifica di
-@cindex variabile @code{NR}, modifica di
-@cindex @code{FNR}, variabile, modifica di
-@cindex variabile @code{FNR}, modifica di
-@cindex angolo buio, variabili @code{FNR}/@code{NR}
-@command{awk} incrementa le variabili @code{NR} e @code{FNR}
-ogni volta che legge un record, invece che impostarle al valore assoluto del
-numero di record letti. Ci@`o significa che un programma pu@`o
-modificare queste variabili e i valori cos@`{@dotless{i}} assegnati sono incrementati per
-ogni record.
-@value{DARKCORNER}
-Si consideri l'esempio seguente:
-
-@example
-$ @kbd{echo '1}
-> @kbd{2}
-> @kbd{3}
-> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
-> @kbd{@{ print NR @}'}
-@print{} 1
-@print{} 17
-@print{} 18
-@print{} 19
-@end example
-
-@noindent
-Prima che @code{FNR} venisse aggiunto al linguaggio @command{awk}
-(@pxref{V7/SVR3.1}),
-molti programmi @command{awk} usavano questa modalit@`a per
-contare il numero di record in un file impostando a zero @code{NR} al cambiare
-di @code{FILENAME}.
-@end cartouche
-@end ifnotdocbook
-
-@node ARGC e ARGV
-@subsection Usare @code{ARGC} e @code{ARGV}
-@cindex @code{ARGC}/@code{ARGV}, variabili, come usarle
-@cindex variabili @code{ARGC}/@code{ARGV}, come usarle
-@cindex argomenti, riga di comando
-@cindex riga di comando, argomenti
-
-@iftex
-La
-@end iftex
-@ref{Variabili auto-assegnate}
-conteneva il programma seguente che visualizzava le informazioni contenute
-in @code{ARGC} e @code{ARGV}:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{for (i = 0; i < ARGC; i++)}
-> @kbd{print ARGV[i]}
-> @kbd{@}' inventory-shipped mail-list}
-@print{} awk
-@print{} inventory-shipped
-@print{} mail-list
-@end example
-
-@noindent
-In questo esempio, @code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
-contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
-@samp{mail-list}.
-Si noti che il nome del programma @command{awk} non @`e incluso in @code{ARGV}.
-Le altre opzioni della riga di comando, con i relativi argomenti,
-sono parimenti non presenti, compresi anche gli assegnamenti di
-variabile fatti tramite l'opzione @option{-v}
-(@pxref{Opzioni}).
-I normali assegnamenti di variabile sulla riga dei comandi @emph{sono}
-trattati come argomenti e quindi inseriti nel vettore @code{ARGV}.
-Dato il seguente programma in un file di nome @file{vediargomenti.awk}:
-
-@example
-BEGIN @{
- printf "A=%d, B=%d\n", A, B
- for (i = 0; i < ARGC; i++)
- printf "\tARGV[%d] = %s\n", i, ARGV[i]
-@}
-END @{ printf "A=%d, B=%d\n", A, B @}
-@end example
-
-@noindent
-la sua esecuzione produce il seguente risultato:
-
-@example
-$ @kbd{awk -v A=1 -f vediargomenti.awk B=2 /dev/null}
-@print{} A=1, B=0
-@print{} ARGV[0] = awk
-@print{} ARGV[1] = B=2
-@print{} ARGV[2] = /dev/null
-@print{} A=1, B=2
-@end example
-
-Un programma pu@`o modificare @code{ARGC} e gli elementi di @code{ARGV}.
-Ogni volta che @command{awk} arriva alla fine di un file in input, usa
-il successivo elemento nel vettore @code{ARGV} come nome del successivo file
-in input. Cambiando il contenuto di quella stringa, un programma
-pu@`o
-modificare la lista dei file che sono letti.
-Si usi @code{"-"} per rappresentare lo standard input. Assegnando ulteriori
-elementi e incrementando @code{ARGC}
-verranno letti ulteriori file.
-
-Se il valore di @code{ARGC} viene diminuto, vengono ignorati i file in input
-posti alla fine della lista. Memorizzando il valore originale di @code{ARGC}
-da qualche altra parte, un programma pu@`o gestire gli argomenti
-ignorati come se fossero qualcosa di diverso dai @value{FN}.
-
-Per eliminare un file che sia in mezzo alla lista, si imposti in @code{ARGV}
-la stringa nulla
-(@code{""}) al posto del nome del file in questione. Come funzionalit@`a
-speciale, @command{awk} ignora valori di @value{FN} che siano stati
-rimpiazzati con la stringa nulla.
-Un'altra possibilit@`a @`e quella
-di usare l'istruzione @code{delete} per
-togliere elementi da @code{ARGV} (@pxref{Cancellazione}).
-
-Tutte queste azioni sono tipicamente eseguite nella regola @code{BEGIN},
-prima di iniziare l'elaborazione vera e propria dell'input.
-@xref{Programma split} e
-@ifnotdocbook
-@pxref{Programma tee}
-@end ifnotdocbook
-@ifdocbook
-@ref{Programma tee}
-@end ifdocbook
-per esempi
-su ognuno dei modi per togliere elementi dal vettore @code{ARGV}.
-
-Per passare direttamente delle opzioni a un programma scritto in
-@command{awk}, si devono terminare le opzioni di @command{awk} con
-@option{--} e poi inserire le opzioni destinate al programma @command{awk},
-come mostrato qui di seguito:
-
-@example
-awk -f mio_programma.awk -- -v -q file1 file2 @dots{}
-@end example
-
-Il seguente frammento di programma ispeziona @code{ARGV} per esaminare, e
-poi rimuovere, le opzioni sulla riga di comando viste sopra:
-
-@example
-BEGIN @{
- for (i = 1; i < ARGC; i++) @{
- if (ARGV[i] == "-v")
- verbose = 1
- else if (ARGV[i] == "-q")
- debug = 1
- else if (ARGV[i] ~ /^-./) @{
- e = sprintf("%s: opzione non riconosciuta -- %c",
- ARGV[0], substr(ARGV[i], 2, 1))
- print e > "/dev/stderr"
- @} else
- break
- delete ARGV[i]
- @}
-@}
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{ARGC}/@code{ARGV}
-Terminare le opzioni di @command{awk} con @option{--} non @`e
-necessario in @command{gawk}. A meno che non si specifichi @option{--posix},
-@command{gawk} inserisce, senza emettere messaggi, ogni opzione non
-riconosciuta
-nel vettore @code{ARGV} perch@'e sia trattata dal programma @command{awk}.
-Dopo aver trovato un'opzione non riconosciuta, @command{gawk} non cerca
-ulteriori opzioni, anche se ce ne fossero di riconoscibili.
-La riga dei comandi precedente sarebbe
-con @command{gawk}:
-
-@example
-gawk -f mio_programma.awk -q -v file1 file2 @dots{}
-@end example
-
-@noindent
-Poich@'e @option{-q} non @`e un'opzione valida per @command{gawk}, quest'opzione
-e l'opzione @option{-v} che segue sono passate al programma @command{awk}.
-(@xref{Funzione getopt} per una funzione di libreria @command{awk}
-che analizza le opzioni della riga di comando.)
-
-Nel progettare un programma, si dovrebbero scegliere opzioni che non
-siano in conflitto con quelle di @command{gawk}, perch@'e ogni opzioni
-accettata da @command{gawk} verr@`a elaborata prima di passare il resto
-della riga dei comandi al programma @command{awk}.
-Usare @samp{#!} con l'opzione @option{-E} pu@`o essere utile in questo caso
-(@pxref{@dfn{Script} eseguibili}
-e
-@ifnotdocbook
-@pxref{Opzioni}).
-@end ifnotdocbook
-@ifdocbook
-@ref{Opzioni}).
-@end ifdocbook
-
-@node Sommario criteri e azioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Coppie @dfn{criterio di ricerca--azione} sono gli elementi base di un
-programma @command{awk}. I criteri di ricerca possono essere espressioni
-normali, espressioni di intervallo, o costanti @dfn{regexp}; possono anche
-essere i criteri speciali @code{BEGIN}, @code{END},
-@code{BEGINFILE} o @code{ENDFILE}; o essere omessi. L'azione viene eseguita
-se il record corrente soddisfa il criterio di ricerca. Criteri di ricerca
-vuoti (omessi) corrispondono a
-tutti i record in input.
-
-@item
-L'I/O effettuato nelle azioni delle regole @code{BEGIN} ed @code{END}
-ha alcuni vincoli.
-Questo vale a maggior ragione per le regole @code{BEGINFILE} ed
-@code{ENDFILE}. Queste ultime due forniscono degli ``agganci'' per interagire
-con l'elaborazione dei file fatta da @command{gawk},
-consentendo di risolvere situazioni che altrimenti genererebbero degli
-errori fatali (ad esempio per un file che non si @`e autorizzati
-a leggere).
-
-@item
-Le variabili di shell possono essere usate nei programmi @command{awk}
-prestando la dovuta attenzione all'uso degli apici.
-@`E pi@`u facile passare una variabile di shell ad
-@command{awk} usando l'opzione @option{-v} e una variabile @command{awk}.
-
-@item
-Le azioni sono formate da istruzioni racchiuse tra parentesi graffe.
-Le istruzioni sono composte da
-espressioni, istruzioni di controllo,
-istruzioni composte,
-istruzioni di input/output e istruzioni di cancellazione.
-
-@item
-Le istruzioni di controllo in @command{awk} sono @code{if}-@code{else},
-@code{while}, @code{for} e @code{do}-@code{while}. @command{gawk}
-aggiunge l'istruzione @code{switch}. Ci sono due tipi di istruzione
-@code{for}: uno per eseguire dei cicli, e l'altro per esaminare un vettore.
-
-@item
-Le istruzioni @code{break} e @code{continue} permettono di uscire
-velocemente da un ciclo, o di passare alla successiva iterazione dello
-stesso (o di uscire da un'istruzione @code{switch}).
-
-@item
-Le istruzioni @code{next} e @code{nextfile} permettono, rispettivamente,
-di passare al record successivo, ricominciando l'elaborazione dalla prima
-regola del programma, o di passare al successivo file in input, sempre
-ripartendo dalla prima regola del programma.
-
-@item
-L'istruzione @code{exit} termina il programma. Quando @`e eseguita
-dall'interno di un'azione (o nel corpo di una funzione), trasferisce
-il controlla alle eventuali istruzioni @code{END}. Se @`e eseguita nel corpo
-di un'istruzione @code{END}, il programma @`e terminato
-immediatamente. @`E possibile specificare un valore numerico da usare come
-codice di ritorno di @command{awk}.
-
-@item
-Alcune variabili predefinite permettono di controllare @command{awk},
-principalmente per l'I/O. Altre variabili trasmettono informazioni
-da @command{awk} al programma.
-
-@item
-I vettori @code{ARGC} e @code{ARGV} rendono disponibili al programma gli
-argomenti della riga di comando. Una loro modifica all'interno di una regola
-@code{BEGIN} permette di controllare come @command{awk} elaborer@`a i @value{DF}
-in input.
-
-@end itemize
-
-@node Vettori
-@chapter Vettori in @command{awk}
-@cindex vettori
-
-Un @dfn{vettore} @`e una tabella di valori chiamati @dfn{elementi}. Gli
-elementi di un vettore sono individuati dai loro @dfn{indici}. Gli indici
-possono essere numeri o stringhe.
-
-Questo @value{CHAPTER} descrive come funzionano i vettori in @command{awk},
-come usare gli elementi di un vettore, come visitare tutti gli elementi
-di un vettore, e come rimuovere elementi da un vettore.
-Descrive anche come @command{awk} simula vettori multidimensionali,
-oltre ad alcuni aspetti meno ovvii sull'uso dei vettori.
-Il @value{CHAPTER} prosegue illustrando la funzionalit@`a di ordinamento dei
-vettori di @command{gawk}, e termina con una breve descrizione della capacit@`a
-di @command{gawk} di consentire veri vettori di vettori.
-
-@menu
-* Fondamenti sui vettori:: Informazioni di base sui vettori.
-* Indici numerici di vettore:: Come usare numeri come indici in
- @command{awk}.
-* Indici non inizializzati:: Usare variabili non inizializzate come indici.
-* Cancellazione:: L'istruzione @code{delete} toglie un elemento
- da un vettore.
-* Vettori multidimensionali:: Emulare vettori multidimensionali in
- @command{awk}.
-* Vettori di vettori:: Vettori multidimensionali veri.
-* Sommario dei vettori:: Sommario dei vettori.
-@end menu
-
-@node Fondamenti sui vettori
-@section Informazioni di base sui vettori
-
-Questa @value{SECTION} espone le nozioni fondamentali: elaborare gli elementi
-di un vettore uno alla volta, e visitare sequenzialmente tutti gli elementi
-di un vettore.
-
-@menu
-* Introduzione ai vettori:: Introduzione ai vettori
-* Visitare elementi:: Come esaminare un elemento di un vettore.
-* Impostare elementi:: Come cambiare un elemento di un vettore.
-* Esempio di vettore:: Esempio semplice di vettore
-* Visitare un intero vettore:: Variazione dell'istruzione @code{for}. Esegue
- un ciclo attraverso gli indici degli elementi
- contenuti in un vettore.
-* Controllare visita:: Controllare l'ordine in cui i vettori sono
- visitati.
-@end menu
-
-@node Introduzione ai vettori
-@subsection Introduzione ai vettori
-
-@cindex Wall, Larry
-@quotation
-@i{Visitare sequenzialmente un vettore associativo @`e come tentare di
-lapidare qualcuno usando una mitragliatrice Uzi carica.}
-@author Larry Wall
-@end quotation
-
-Il linguaggio @command{awk} mette a disposizione vettori monodimensionali per
-memorizzare gruppi di stringhe o di numeri correlati fra loro. Ogni vettore di
-@command{awk} deve avere un nome. I nomi dei vettori hanno la stessa sintassi
-dei nomi di variabile; qualsiasi nome valido di variabile potrebbe essere anche
-un valido nome di vettore. Un nome per@`o non pu@`o essere usato in entrambi i
-modi (come vettore e come variabile) nello stesso programma @command{awk}.
-
-I vettori in @command{awk} assomigliano superficialmente ai vettori in altri
-linguaggi di programmazione, ma ci sono differenze fondamentali. In
-@command{awk}, non @`e necessario specificare la dimensione di un vettore prima
-di iniziare a usarlo. In pi@`u, qualsiasi numero o stringa pu@`o essere usato
-come indice di un vettore, non solo numeri interi consecutivi.
-
-Nella maggior parte degli altri linguaggi, i vettori devono essere
-@dfn{dichiarati} prima dell'uso, specificando quanti elementi o componenti
-contengono. In questi linguaggi, la dichiarazione causa l'allocazione, per
-questi elementi, di un blocco di memoria contiguo.
-Normalmente, un indice di un vettore dev'essere un intero non negativo.
-Per esempio, l'indice zero specifica il primo elemento nel vettore, che @`e
-effettivamente memorizzato all'inizio di un blocco di memoria. L'indice uno
-specifica il secondo elemento, che @`e memorizzato subito dopo il primo elemento,
-e cos@`{@dotless{i}} via. @`E impossibile aggiungere ulteriori elementi al vettore, perch@'e
-esso pu@`o contenere solo il numero di elementi dichiarato.
-(Alcuni linguaggi consentono indici iniziali e finali arbitrari---p.es.,
-@samp{15 .. 27}---per@`o la dimensione del vettore rimane fissa una volta che
-il vettore sia stato dichiarato.)
-
-@c 1/2015: Do not put the numeric values into @code. Array element
-@c values are no different than scalar variable values.
-Un vettore contiguo di quattro elementi potrebbe essere come quello in
-@ifnotdocbook
-@ref{vettore-elementi},
-@end ifnotdocbook
-@ifdocbook
-come mostrato in @inlineraw{docbook, <xref linkend="vettore-elementi"/>}:
-@end ifdocbook
-concettualmente, se i valori degli elementi sono 8, @code{"pippo"},
-@code{""} e 30.
-
-@ifnotdocbook
-@float Figura,vettore-elementi
-@caption{Un vettore contiguo}
-@ifset SMALLPRINT
-@center @image{vettore-elementi, 11cm, , Un vettore contiguo}
-@end ifset
-@ifclear SMALLPRINT
-@center @image{vettore-elementi, , , Un vettore contiguo}
-@end ifclear
-@end float
-@end ifnotdocbook
-
-@docbook
-<figure id="vettore-elementi" float="0">
-<title>Un vettore contiguo</title>
-<mediaobject>
-<imageobject role="web"><imagedata fileref="vettore-elementi.png" format="PNG"/></imageobject>
-</mediaobject>
-</figure>
-@end docbook
-
-@noindent
-Vengono memorizzati solo i valori; gli indici sono definiti implicitamente
-dall'ordine dei valori. Qui, 8 @`e il valore il cui indice @`e zero, perch@'e 8
-appare nella posizione con zero elementi prima di essa.
-
-@cindex vettori, indicizzazione
-@cindex indicizzare i vettori
-@cindex associativi, vettori
-@cindex vettori associativi
-I vettori in @command{awk} non sono di questo tipo: sono invece
-@dfn{associativi}.
-Ci@`o significa che ogni vettore @`e un insieme di coppie, ognuna costituita
-da un indice e dal corrispondente valore dell'elemento del vettore:
-
-@ifnotdocbook
-@c extra empty column to indent it right
-@multitable @columnfractions .1 .1 .1
-@headitem @tab Indice @tab Valore
-@item @tab @code{3} @tab @code{30}
-@item @tab @code{1} @tab @code{"pippo"}
-@item @tab @code{0} @tab @code{8}
-@item @tab @code{2} @tab @code{""}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-
-<tbody>
-<row>
-<entry><literal>3</literal></entry>
-<entry><literal>30</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"pippo"</literal></entry>
-</row>
-
-<row>
-<entry><literal>0</literal></entry>
-<entry><literal>8</literal></entry>
-</row>
-
-<row>
-<entry><literal>2</literal></entry>
-<entry><literal>""</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-Le coppie sono elencate in ordine casuale perch@'e il loro ordinamento @`e
-irrilevante.@footnote{L'ordine potr@`a variare nelle diverse implementazioni
-di @command{awk}, che tipicamente usa tabelle @dfn{hash} per memorizzare
-elementi e valori del vettore.}
-
-Un vantaggio dei vettori associativi @`e che si possono aggiungere nuove coppie
-in qualsiasi momento. Per esempio, supponiamo di aggiungere al vettore un
-decimo elemento il cui valore sia @w{@code{"numero dieci"}}. Il risultato sar@`a:
-
-@ifnotdocbook
-@c extra empty column to indent it right
-@multitable @columnfractions .1 .1 .3
-@headitem @tab Indice @tab Valore
-@item @tab @code{10} @tab @code{"numero dieci"}
-@item @tab @code{3} @tab @code{30}
-@item @tab @code{1} @tab @code{"pippo"}
-@item @tab @code{0} @tab @code{8}
-@item @tab @code{2} @tab @code{""}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-<tbody>
-
-<row>
-<entry><literal>10</literal></entry>
-<entry><literal>"numero dieci"</literal></entry>
-</row>
-
-<row>
-<entry><literal>3</literal></entry>
-<entry><literal>30</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"pippo"</literal></entry>
-</row>
-
-<row>
-<entry><literal>0</literal></entry>
-<entry><literal>8</literal></entry>
-</row>
-
-<row>
-<entry><literal>2</literal></entry>
-<entry><literal>""</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-@cindex sparsi, vettori
-@cindex vettori sparsi
-Ora il vettore @`e @dfn{sparso}, il che significa semplicemente che non sono
-usati alcuni indici. Ha gli elementi 0, 1, 2, 3 e 10, ma mancano gli
-elementi 4, 5, 6, 7, 8 e 9.
-
-Un'altra caratteristica dei vettori associativi @`e che gli indici non devono
-essere necessariamente interi non negativi. Qualsiasi numero, o anche una
-stringa, pu@`o essere un indice. Per esempio, il seguente @`e un vettore che
-traduce delle parole dall'inglese all'italiano:
-
-@ifnotdocbook
-@multitable @columnfractions .1 .1 .1
-@headitem @tab Indice @tab Valore
-@item @tab @code{"dog"} @tab @code{"cane"}
-@item @tab @code{"cat"} @tab @code{"gatto"}
-@item @tab @code{"one"} @tab @code{"uno"}
-@item @tab @code{1} @tab @code{"uno"}
-@end multitable
-@end ifnotdocbook
-
-@docbook
-<informaltable>
-<tgroup cols="2">
-<colspec colname="1" align="left"/>
-<colspec colname="2" align="left"/>
-<thead>
-<row>
-<entry>Indice</entry>
-<entry>Valore</entry>
-</row>
-</thead>
-<tbody>
-<row>
-<entry><literal>"dog"</literal></entry>
-<entry><literal>"cane"</literal></entry>
-</row>
-
-<row>
-<entry><literal>"cat"</literal></entry>
-<entry><literal>"gatto"</literal></entry>
-</row>
-
-<row>
-<entry><literal>"one"</literal></entry>
-<entry><literal>"uno"</literal></entry>
-</row>
-
-<row>
-<entry><literal>1</literal></entry>
-<entry><literal>"uno"</literal></entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-
-@end docbook
-
-@noindent
-Qui abbiamo deciso di tradurre il numero uno sia nella forma letterale che in
-quella numerica, per illustrare che un singolo vettore pu@`o avere come indici
-sia numeri che stringhe.
-(In effetti, gli indici dei vettori sono sempre stringhe.
-Ci sono alcune sottigliezze su come funzionano i numeri quando sono usati come
-indici dei vettori; questo verr@`a trattato in maggior dettaglio nella
-@ref{Indici numerici di vettore}.)
-Qui sopra, il numero @code{1} non @`e tra doppi apici, perch@'e @command{awk}
-lo converte automaticamente in una stringa.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex maiuscolo/minuscolo, distinzione, indici dei vettori e
-@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
-@cindex @code{IGNORECASE}, variabile, e indici dei vettori
-@cindex variabile @code{IGNORECASE}, e indici dei vettori
-Il valore di @code{IGNORECASE} non ha alcun effetto sull'indicizzazione dei
-vettori. Lo stesso valore di stringa usato per memorizzare un elemento di un
-vettore pu@`o essere usato per richiamarlo.
-Quando @command{awk} crea un vettore (p.es., con la funzione predefinita
-@code{split()}), gli indici di quel vettore sono numeri interi consecutivi
-a partire da uno.
-(@xref{Funzioni per stringhe}.)
-
-I vettori di @command{awk} sono efficienti: il tempo necessario per accedere a
-un elemento @`e indipendente dal numero di elementi nel vettore.
-
-@node Visitare elementi
-@subsection Come esaminare un elemento di un vettore
-@cindex vettori, esaminare elementi
-@cindex vettore, elementi di un
-@cindex elementi di un vettore
-
-Il modo principale di usare un vettore @`e quello di esaminare uno dei suoi
-elementi. Un @dfn{riferimento al vettore} @`e un'espressione come questa:
-
-@example
-@var{vettore}[@var{espressione-indice}]
-@end example
-
-@noindent
-Qui, @var{vettore} @`e il nome di un vettore. L'espressione
-@var{espressione-indice} @`e l'indice dell'elemento del vettore che si vuol
-esaminare.
-
-@c 1/2015: Having the 4.3 in @samp is a little iffy. It's essentially
-@c an expression though, so leave be. It's to early in the discussion
-@c to mention that it's really a string.
-Il valore del riferimento al vettore @`e il valore corrente di quell'elemento
-del vettore. Per esempio, @code{pippo[4.3]} @`e un'espressione che richiama
-l'elemento del vettore @code{pippo} il cui indice @`e @samp{4.3}.
-
-@cindex vettori, elementi non assegnati
-@cindex elementi di vettore non assegnati
-@cindex elementi di vettore vuoti
-Un riferimento a un elemento di un vettore il cui indice non esiste ancora
-restituisce un valore uguale a @code{""}, la stringa nulla. Questo comprende
-elementi a cui non @`e stato assegnato un valore ed elementi che sono stati
-eliminati (@pxref{Cancellazione}).
-
-@cindex elementi inesistenti di un vettore
-@cindex vettori, elementi che non esistono
-@quotation NOTA
-Un riferimento a un elemento inesistente crea @emph{automaticamente}
-quell'elemento di vettore, con la stringa nulla come valore. (In certi casi,
-ci@`o @`e indesiderabile, perch@'e potrebbe sprecare memoria all'interno di
-@command{awk}.)
-
-I programmatori principianti di @command{awk} fanno spesso l'errore di
-verificare se un elemento esiste controllando se il valore @`e vuoto:
-
-@example
-# Verifica se "pippo" esiste in a: @ii{Non corretto!}
-if (a["pippo"] != "") @dots{}
-@end example
-
-@noindent
-Questo @`e sbagliato per due motivi. Primo, @emph{crea} @code{a["pippo"]}
-se ancora non esisteva! Secondo, assegnare a un elemento di un vettore la
-stringa vuota come valore @`e un'operazione valida (anche se un po' insolita).
-@end quotation
-
-@c @cindex arrays, @code{in} operator and
-@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore
-Per determinare se un elemento con un dato indice esiste in un vettore,
-si usi la seguente espressione:
-
-@example
-@var{indice} in @var{vettore}
-@end example
-
-@cindex effetti collaterali, indicizzazione di vettori
-@noindent
-Quest'espressione verifica se lo specifico indice @var{indice} esiste, senza
-l'effetto collaterale di creare quell'elemento nel caso che esso non sia
-presente. L'espressione ha il valore uno (vero) se
-@code{@var{vettore}[@var{indice}]}
-esiste e zero (falso) se non esiste.
-@c (Qui usiamo @var{indx}, perch@'e @samp{index} @`e il nome di una funzione
-@c predefinita.)
-Per esempio, quest'istruzione verifica se il vettore @code{frequenze}
-contiene l'indice @samp{2}:
-
-@example
-if (2 in frequenze)
- print "L'indice 2 @`e presente."
-@end example
-
-Si noti che questo @emph{non} verifica se il vettore
-@code{frequenze} contiene un elemento il cui @emph{valore} @`e 2.
-Il solo modo far questo @`e quello di passare in rassegna tutti gli
-elementi. Inoltre, questo @emph{non} crea @code{frequenze[2]}, mentre la
-seguente alternativa (non corretta) lo fa:
-
-@example
-if (frequenze[2] != "")
- print "L'indice 2 @`e presente."
-@end example
-
-@node Impostare elementi
-@subsection Assegnare un valore a elementi di un vettore
-@cindex vettori, elementi, assegnare valori
-@cindex elementi di vettori, assegnare valori
-
-Agli elementi di un vettore possono essere assegnati valori proprio come
-alle variabili di @command{awk}:
-
-@example
-@var{vettore}[@var{espressione-indice}] = @var{valore}
-@end example
-
-@noindent
-@var{vettore} @`e il nome di un vettore. L'espressione
-@var{espressione-indice} @`e l'indice dell'elemento del vettore a cui @`e
-assegnato il valore. L'espressione @var{valore} @`e il valore da assegnare
-a quell'elemento del vettore.
-
-@node Esempio di vettore
-@subsection Esempio semplice di vettore
-@cindex vettori, un esempio sull'uso
-
-Il seguente programma prende una lista di righe, ognuna delle quali inizia con
-un numero di riga, e le stampa in ordine di numero di riga. I numeri di riga
-non sono ordinati al momento della lettura, ma sono invece in ordine sparso.
-Questo programma ordina le righe mediante la creazione di un vettore che usa
-i numeri di riga come indici. Il programma stampa poi le righe
-ordinate secondo il loro numero. @`E un programma molto semplice e non @`e in
-grado di gestire numeri ripetuti, salti di riga o righe che non
-iniziano con un numero:
-
-@example
-@c file eg/misc/arraymax.awk
-@{
- if ($1 > massimo)
- massimo = $1
- vett[$1] = $0
-@}
-
-END @{
- for (x = 1; x <= massimo; x++)
- print vett[x]
-@}
-@c endfile
-@end example
-
-La prima regola tiene traccia del numero di riga pi@`u grande visto
-durante la lettura;
-memorizza anche ogni riga nel vettore @code{vett}, usando come indice
-il numero di riga.
-La seconda regola viene eseguita dopo che @`e stato letto tutto l'input, per
-stampare tutte le righe.
-Quando questo programma viene eseguito col seguente input:
-
-@example
-@c file eg/misc/arraymax.data
-5 Io sono l'uomo Cinque
-2 Chi sei? Il nuovo numero due!
-4 . . . E quattro a terra
-1 Chi @`e il numero uno?
-3 Sei il tre.
-@c endfile
-@end example
-
-@noindent
-Il suo output @`e:
-
-@example
-1 Chi @`e il numero uno?
-2 Chi sei? Il nuovo numero due!
-3 Sei il tre.
-4 . . . E quattro a terra
-5 Io sono l'uomo Cinque
-@end example
-
-Se un numero di riga appare pi@`u di una volta, l'ultima riga con quel dato
-numero prevale sulle altre.
-Le righe non presenti nel vettore
-si possono saltare con un semplice perfezionamento della
-regola @code{END} del programma, in questo modo:
-
-@example
-END @{
- for (x = 1; x <= massimo; x++)
- if (x in vett)
- print vett[x]
-@}
-@end example
-
-@node Visitare un intero vettore
-@subsection Visitare tutti gli elementi di un vettore
-@cindex elementi di vettori, visitare
-@cindex visitare vettori
-@cindex vettori, visitare
-@cindex cicli, @code{for}, visita di un vettore
-
-Nei programmi che usano vettori, @`e spesso necessario usare un ciclo che
-esegue un'azione su ciascun elemento di un vettore. In altri linguaggi, dove
-i vettori sono contigui e gli indici sono limitati ai numeri interi
-non negativi,
-questo @`e facile: tutti gli indici validi possono essere visitati partendo
-dall'indice pi@`u basso e arrivando a quello pi@`u alto. Questa tecnica non
-@`e applicabile in @command{awk}, perch@'e qualsiasi numero o stringa pu@`o
-fare da indice in un vettore. Perci@`o @command{awk} ha un tipo speciale di
-istruzione @code{for} per visitare un vettore:
-
-@example
-for (@var{variabile} in @var{vettore})
- @var{corpo}
-@end example
-
-@noindent
-@cindex @code{in}, operatore, uso in cicli
-@cindex operatore @code{in}, uso in cicli
-Questo ciclo esegue @var{corpo} una volta per ogni indice in @var{vettore} che
-il programma ha usato precedentemente, con la variabile @var{variabile}
-impostata a quell'indice.
-
-@cindex vettori, istruzione @code{for} e
-@cindex @code{for}, istruzione, esecuzione di cicli su un vettore
-Il seguente programma usa questa forma dell'istruzione @code{for}. La
-prima regola visita i record in input e tiene nota di quali parole appaiono
-(almeno una volta) nell'input, memorizzando un 1 nel vettore @code{usate} con
-la parola come indice. La seconda regola visita gli elementi di
-@code{usate} per trovare tutte le parole distinte che appaiono nell'input.
-Il programma stampa poi ogni parola che @`e pi@`u lunga di 10 caratteri e
-anche il numero di tali parole.
-@xref{Funzioni per stringhe}
-per maggiori informazioni sulla funzione predefinita @code{length()}.
-
-@example
-# Registra un 1 per ogni parola usata almeno una volta
-@{
- for (i = 1; i <= NF; i++)
- usate[$i] = 1
-@}
-
-# Trova il numero di parole distinte lunghe pi@`u di 10 caratteri
-END @{
- for (x in usate) @{
- if (length(x) > 10) @{
- ++numero_parole_lunghe
- print x
- @}
- @}
- print numero_parole_lunghe, "parole pi@`u lunghe di 10 caratteri"
-@}
-@end example
-
-@noindent
-@xref{Programma utilizzo parole}
-per un esempio di questo tipo pi@`u dettagliato.
-
-@cindex vettori, elementi di, ordine di accesso da parte dell'operatore @code{in}
-@cindex elementi di vettori, ordine di accesso da parte dell'operatore @code{in}
-@cindex @code{in}, operatore, ordine di accesso dei vettori
-@cindex operatore @code{in}, ordine di accesso dei vettori
-L'ordine nel quale gli elementi del vettore sono esaminati da quest'istruzione
-@`e determinato dalla disposizione interna degli elementi del vettore all'interno
-di @command{awk} e nell'@command{awk} standard non pu@`o essere controllato
-o cambiato. Questo pu@`o portare a dei problemi se vengono aggiunti nuovi
-elementi al @var{vettore} dall'istruzione eseguendo il corpo del ciclo;
-non @`e prevedibile se il ciclo @code{for} li potr@`a raggiungere. Similmente,
-modificare @var{variabile} all'interno del ciclo potrebbe produrre strani
-risultati. @`E meglio evitare di farlo.
-
-Di sicuro, @command{gawk} imposta la lista di elementi su cui eseguire
-l'iterazione prima che inizi il ciclo, e non la cambia in corso d'opera.
-Ma non tutte le versioni di @command{awk} fanno cos@`{@dotless{i}}. Si consideri questo
-programma, chiamato @file{vediciclo.awk}:
-
-@example
-BEGIN @{
- a["questo"] = "questo"
- a["@`e"] = "@`e"
- a["un"] = "un"
- a["ciclo"] = "ciclo"
- for (i in a) @{
- j++
- a[j] = j
- print i
- @}
-@}
-@end example
-
-Ecco quel che accade quando viene eseguito con @command{gawk} (e @command{mawk}):
-
-@example
-$ @kbd{gawk -f vediciclo.awk}
-@print{} questo
-@print{} ciclo
-@print{} un
-@print{} @`e
-@end example
-
-Se si usa invece BWK @command{awk}:
-
-@example
-$ @kbd{nawk -f vediciclo.awk}
-@print{} ciclo
-@print{} questo
-@print{} @`e
-@print{} un
-@print{} 1
-@end example
-
-@node Controllare visita
-@subsection Visita di vettori in ordine predefinito con @command{gawk}
-
-Questa @value{SUBSECTION} descrive una funzionalit@`a disponibile solo in
-@command{gawk}.
-
-Per default, quando un ciclo @code{for} visita un vettore, l'ordine
-@`e indeterminato, il che vuol dire che l'implementazione di @command{awk}
-determina l'ordine in cui il vettore viene attraversato.
-Quest'ordine normalmente @`e basato sull'implementazione interna dei vettori
-e varia da una versione di @command{awk} alla successiva.
-
-@cindex vettori, ordine di visita, controllo dell'
-@cindex controllare l'ordine di visita dei vettori
-Spesso, tuttavia, servirebbe fare qualcosa di semplice, come
-``visitare il vettore confrontando gli indici in ordine crescente,''
-o ``visitare il vettore confrontando i valori in ordine decrescente.''
-@command{gawk} fornisce due meccanismi che permettono di farlo.
-
-@itemize @value{BULLET}
-@item
-Assegnare a @code{PROCINFO["sorted_in"]} un valore a scelta fra
-alcuni valori predefiniti.
-Si vedano pi@`u sotto i valori ammessi.
-
-@item
-Impostare @code{PROCINFO["sorted_in"]} al nome di una funzione definita
-dall'utente, da usare per il confronto tra gli elementi di un vettore. Questa
-funzionalit@`a avanzata verr@`a descritta in seguito in @ref{Ordinamento di vettori}.
-@end itemize
-
-@cindex @code{PROCINFO}, valori di @code{sorted_in}
-Sono disponibili i seguenti valori speciali per @code{PROCINFO["sorted_in"]}:
-
-@table @code
-@item "@@unsorted"
-Lasciare gli elementi del vettore in ordine arbitrario
-(questo @`e il comportamento di default di @command{awk}).
-
-@item "@@ind_str_asc"
-Ordinare in ordine crescente di indice, confrontando tra loro gli indici
-come stringhe; questo @`e l'ordinamento pi@`u normale.
-(Internamente, gli indici dei vettori sono sempre stringhe, per cui con
-@samp{a[2*5] = 1} l'indice @`e la stringa @code{"10"} e non il numero 10.)
-
-@item "@@ind_num_asc"
-Ordinare in ordine crescente di indice, ma nell'elaborazione gli indici vengono
-trattati come numeri. Gli indici con valore non numerico verranno posizionati
-come se fossero uguali a zero.
-
-@item "@@val_type_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). L'ordinamento @`e in base al tipo assegnato all'elemento
-(@pxref{Tipi di variabile e confronti}).
-Tutti i valori numerici precedono tutti i valori di tipo stringa,
-che a loro volta vengono prima dei sottovettori.
-(I sottovettori non sono ancora stati descritti;
-@pxref{Vettori di vettori}.)
-
-@item "@@val_str_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). I valori scalari sono confrontati come stringhe.
-I sottovettori, se presenti, vengono per ultimi.
-
-@item "@@val_num_asc"
-Ordinare secondo il valore degli elementi in ordine crescente (invece che in
-base agli indici). I valori scalari sono confrontati come numeri.
-I sottovettori, se presenti, vengono per ultimi.
-Quando i valori numerici coincidono, vengono usati i valori di tipo stringa
-per stabilire un ordinamento: ci@`o garantisce risultati coerenti tra differenti
-versioni della funzione C @code{qsort()},@footnote{Quando due elementi
-risultano uguali, la funzione C @code{qsort()} non garantisce
-che dopo l'ordinamento venga rispettato il loro ordine relativo originale.
-Usando il valore di stringa per stabilire un ordinamento univoco quando i
-valori numerici sono uguali assicura che il comportamento di @command{gawk}
-sia coerente in differenti ambienti.} che @command{gawk} usa internamente
-per effettuare l'ordinamento.
-
-@item "@@ind_str_desc"
-Ordinare come fa @code{"@@ind_str_asc"}, ma gli
-indici di tipo stringa sono ordinati dal pi@`u alto al pi@`u basso.
-
-@item "@@ind_num_desc"
-Ordinare come fa @code{"@@ind_num_asc"}, ma gli
-indici numerici sono ordinati dal pi@`u alto al pi@`u basso.
-
-@item "@@val_type_desc"
-Ordinare come fa @code{"@@val_type_asc"}, ma i valori
-degli elementi, a seconda del tipo, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-
-@item "@@val_str_desc"
-Ordinare come fa @code{"@@val_str_asc"}, ma i valori degli
-elementi, trattati come stringhe, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-
-@item "@@val_num_desc"
-Ordinare come fa @code{"@@val_num_asc"}, ma i valori degli
-elementi, trattati come numeri, sono ordinati dal pi@`u alto al pi@`u basso.
-I sottovettori, se presenti, vengono per primi.
-@end table
-
-L'ordine in cui il vettore @`e visitato viene determinato prima di iniziare
-l'esecuzione del ciclo @code{for}. Cambiare @code{PROCINFO["sorted_in"]}
-all'interno del corpo del ciclo non influisce sul ciclo stesso.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ a[4] = 4}
-> @kbd{ a[3] = 3}
-> @kbd{ for (i in a)}
-> @kbd{ print i, a[i]}
-> @kbd{@}'}
-@print{} 4 4
-@print{} 3 3
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{ PROCINFO["sorted_in"] = "@@ind_str_asc"}
-> @kbd{ a[4] = 4}
-> @kbd{ a[3] = 3}
-> @kbd{ for (i in a)}
-> @kbd{ print i, a[i]}
-> @kbd{@}'}
-@print{} 3 3
-@print{} 4 4
-@end example
-
-Quando si ordina un vettore in base al valore dei suoi elementi, se viene
-trovato un valore che @`e un sottovettore, questo @`e considerato pi@`u grande di
-qualsiasi stringa o valore numerico, indipendentemente da quel che contiene
-lo stesso sottovettore, e tutti i sottovettori sono trattati come se fossero
-l'uno uguale all'altro. Il loro ordine reciproco @`e determinato dai loro
-indici, visti come stringhe.
-
-Di seguito sono elencati alcuni punti da tener presenti sulla visita
-ordinata dei vettori:
-
-@itemize @value{BULLET}
-@item
-Il valore di @code{PROCINFO["sorted_in"]} @`e globale. Cio@`e, ha effetto su tutti
-i cicli @code{for} relativi a qualsiasi vettore. Se si deve cambiarlo
-all'interno del proprio codice, si dovrebbe vedere se era gi@`a stato
-definito in precedenza, e salvare il valore relativo, per ripristinarlo
-successivamente:
-
-@example
-@dots{}
-if ("sorted_in" in PROCINFO) @{
- ordine_salvato = PROCINFO["sorted_in"]
- PROCINFO["sorted_in"] = "@@val_str_desc" # o qualcos'altro
-@}
-@dots{}
-if (ordine_salvato)
- PROCINFO["sorted_in"] = ordine_salvato
-@end example
-
-@item
-Come gi@`a accennato, l'ordine di visita di default del vettore
-@`e rappresentato da @code{"@@unsorted"}. Si pu@`o ottenere il comportamento di
-default anche assegnando la stringa nulla a @code{PROCINFO["sorted_in"]} o
-semplicemente eliminando l'elemento @code{"sorted_in"} dal vettore
-@code{PROCINFO} con l'istruzione @code{delete}.
-(L'istruzione @code{delete} non @`e stata ancora descritta; @pxref{Cancellazione}.)
-@end itemize
-
-Inoltre, @command{gawk} fornisce funzioni predefinite per l'ordinamento
-dei vettori; si veda @ref{Funzioni di ordinamento di vettori}.
-
-@node Indici numerici di vettore
-@section Usare numeri per indicizzare i vettori
-
-@cindex numeri, come indici di vettore
-@cindex vettori, indici numerici di
-@cindex indici di vettori, numeri come
-@cindex @code{CONVFMT}, variabile, e indici di vettore
-Un aspetto importante da ricordare riguardo ai vettori @`e che
-@emph{gli indici dei vettori sono sempre stringhe}.
-Quando un valore numerico @`e usato come indice,
-viene convertito in un valore di tipo stringa prima di essere usato per
-l'indicizzazione (@pxref{Conversione}).
-Ci@`o vuol dire che il valore della variabile predefinita @code{CONVFMT} pu@`o
-influire su come un programma ha accesso agli elementi di un vettore.
-Per esempio:
-
-@example
-xyz = 12.153
-dati[xyz] = 1
-CONVFMT = "%2.2f"
-if (xyz in dati)
- printf "%s @`e in dati\n", xyz
-else
- printf "%s non @`e in dati\n", xyz
-@end example
-
-@noindent
-Il risultato @`e @samp{12.15 non @`e in dati}. La prima istruzione d@`a a
-@code{xyz} un valore numerico. L'assegnamento a @code{dati[xyz]}
-indicizza @code{dati} col valore di tipo stringa @code{"12.153"}
-(usando il valore di conversione di default @code{CONVFMT}, @code{"%.6g"}).
-Quindi, all'elemento del vettore @code{dati["12.153"]} @`e assegnato il valore
-uno. Il programma cambia poi
-il valore di @code{CONVFMT}. La verifica @samp{(xyz in dati)} genera un nuovo
-valore di stringa da @code{xyz}---questa volta @code{"12.15"}---perch@'e il
-valore di @code{CONVFMT} consente solo due cifre decimali. Questa
-verifica d@`a esito negativo, perch@'e @code{"12.15"} @`e diverso da @code{"12.153"}.
-
-@cindex convertire numeri interi che sono indici di vettore
-@cindex numeri interi, indici di vettore
-Secondo le regole di conversione
-(@pxref{Conversione}), i valori numerici interi
-vengono convertiti in stringhe sempre come interi, indipendentemente dal
-valore che potrebbe avere @code{CONVFMT}. E infatti il caso
-seguente produce il risultato atteso:
-
-@example
-for (i = 1; i <= maxsub; i++)
- @ii{fa qualcosa con} vettore[i]
-@end example
-
-La regola ``i valori numerici interi si convertono sempre in stringhe intere''
-ha un'altra conseguenza per l'indicizzazione dei vettori.
-Le costanti ottali ed esadecimali
-@ifnotdocbook
-(@pxref{Numeri non-decimali})
-@end ifnotdocbook
-@ifdocbook
-(trattate in @ref{Numeri non-decimali})
-@end ifdocbook
-vengono convertite internamente in numeri, e la loro forma originale
-non viene pi@`u ricordata. Ci@`o significa, per esempio, che
-@code{vettore[17]},
-@code{vettore[021]} e
-@code{vettore[0x11]} fanno riferimento tutti allo stesso
-elemento!
-
-Come molte cose in @command{awk}, molto spesso le cose
-funzionano come ci si aspetta. @`E utile comunque avere una
-conoscenza precisa delle regole applicate, poich@'e a volte possono avere
-effetti difficili da individuare sui programmi.
-
-@node Indici non inizializzati
-@section Usare variabili non inizializzate come indici
-
-@cindex variabili non inizializzate, come indici di vettore
-@cindex non inizializzate, variabili, come indici di vettore
-@cindex indici di vettore, variabili non inizializzate come
-@cindex vettori, indici, variabili non inizializzate come
-Supponiamo che sia necessario scrivere un programma
-per stampare i dati di input in ordine inverso.
-Un tentativo ragionevole per far ci@`o (con qualche dato di
-prova) potrebbe essere qualcosa di questo tipo:
-
-@example
-$ @kbd{echo 'riga 1}
-> @kbd{riga 2}
-> @kbd{riga 3' | awk '@{ l[righe] = $0; ++righe @}}
-> @kbd{END @{}
-> @kbd{for (i = righe - 1; i >= 0; i--)}
-> @kbd{print l[i]}
-> @kbd{@}'}
-@print{} riga 3
-@print{} riga 2
-@end example
-
-Sfortunatamente, la prima riga di dati in input non appare
-nell'output!
-
-A prima vista, verrebbe da dire che questo programma avrebbe dovuto
-funzionare. La variabile @code{righe}
-non @`e inizializzata, e le variabili non inizializzate hanno il valore numerico
-zero. Cos@`{@dotless{i}}, @command{awk} dovrebbe aver stampato il valore @code{l[0]}.
-
-Qui il problema @`e che gli indici per i vettori di @command{awk} sono
-@emph{sempre} stringhe. Le variabili non inizializzate, quando sono usate come
-stringhe, hanno il valore @code{""}, e non zero. Quindi, @samp{riga 1}
-finisce per essere memorizzata in @code{l[""]}.
-La seguente variante del programma funziona correttamente:
-
-@example
-@{ l[righe++] = $0 @}
-END @{
- for (i = righe - 1; i >= 0; i--)
- print l[i]
-@}
-@end example
-
-Qui, @samp{++} forza @code{righe} a essere di tipo numerico, rendendo
-quindi il ``vecchio valore'' uno zero numerico. Questo viene poi convertito
-in @code{"0"} come l'indice del vettore.
-
-@cindex nulle, stringhe, come indici di vettore
-@cindex stringhe nulle, come indici di vettore
-@cindex angolo buio, indici di vettori
-@cindex @dfn{lint}, controlli, indici di vettori
-@cindex controlli @dfn{lint}, indici di vettori
-Anche se la cosa pu@`o sembrare strana, la stringa nulla
-(@code{""}) @`e un indice di vettore valido.
-@value{DARKCORNER}
-Se viene fornita l'opzione @option{--lint} sulla riga di comando
-@pxref{Opzioni}), @command{gawk} avvisa quando la stringa nulla viene usata
-come indice.
-
-@node Cancellazione
-@section L'istruzione @code{delete}
-@cindex @code{delete}, istruzione
-@cindex istruzione @code{delete}
-@cindex eliminare elementi di vettori
-@cindex vettori, elementi, eliminazione di
-@cindex elementi di vettori, eliminazione di
-
-Per rimuovere un singolo elemento da un vettore si usa l'istruzione
-@code{delete}:
-
-@example
-delete @var{vettore}[@var{espressione-indice}]
-@end example
-
-Una volta che un elemento di un vettore @`e stato eliminato, il valore che aveva
-quell'elemento non @`e pi@`u disponibile. @`E come se quell'elemento non sia
-mai stato referenziato oppure come se non gli sia mai stato assegnato un
-valore. Il seguente @`e un esempio di eliminazione di elementi da un vettore:
-
-@example
-for (i in frequenze)
- delete frequenze[i]
-@end example
-
-@noindent
-Quest'esempio rimuove tutti gli elementi dal vettore @code{frequenze}. Una
-volta che un elemento @`e stato eliminato, una successiva istruzione @code{for}
-che visiti il vettore non trover@`a quell'elemento, e l'uso dell'operatore
-@code{in} per controllare la presenza di quell'elemento restituisce zero (cio@`e
-falso):
-
-@example
-delete pippo[4]
-if (4 in pippo)
- print "Questo non verr@`a mai stampato"
-@end example
-
-@cindex nulle, stringhe, ed eliminazione di elementi di un vettore
-@cindex stringhe nulle, ed eliminazione di elementi di un vettore
-@`E importante notare che eliminare un elemento @emph{non} @`e la stessa cosa
-che assegnargli un valore nullo (la stringa vuota, @code{""}).
-Per esempio:
-
-@example
-pippo[4] = ""
-if (4 in pippo)
- print "Questo viene stampato, anche se pippo[4] @`e vuoto"
-@end example
-
-@cindex @dfn{lint}, controlli, elementi di vettori
-@cindex controlli @dfn{lint}, elementi di vettori
-@cindex elementi di vettori, controlli @dfn{lint} per
-Non @`e un errore eliminare un elemento che non esiste.
-Tuttavia, se viene data l'opzione @option{--lint} sulla riga di comando
-(@pxref{Opzioni}),
-@command{gawk} emette un messaggio di avvertimento quando viene eliminato un
-elemento che non @`e presente in un vettore.
-
-@cindex comuni, estensioni, @code{delete} per eliminare interi vettori
-@cindex estensioni comuni@comma{} @code{delete} per eliminare interi vettori
-@cindex vettori, eliminare l'intero contenuto
-@cindex eliminare interi vettori
-@cindex @code{delete}, @var{vettore}
-@cindex differenze tra @command{awk} e @command{gawk}, elementi dei vettori, eliminazione
-Tutti gli elementi di un vettore possono essere eliminati con una singola
-istruzione omettendo l'indice nell'istruzione @code{delete},
-in questo modo:
-
-
-@example
-delete @var{vettore}
-@end example
-
-L'uso di questa versione dell'istruzione @code{delete} @`e circa tre volte pi@`u
-efficiente dell'equivalente ciclo che elimina gli elementi uno
-alla volta.
-
-Questa forma dell'istruzione @code{delete} @`e ammessa anche
-da BWK @command{awk} e da @command{mawk}, e anche da
-diverse altre implementazioni.
-
-@cindex Brian Kernighan, @command{awk} di
-@quotation NOTA
-Per molti anni, l'uso di @code{delete} senza un indice era un'estensione
-comune. A settembre 2012 si @`e deciso di includerla nello
-standard POSIX. Si veda @uref{http://austingroupbugs.net/view.php?id=544,
-il sito dell'Austin Group}.
-@end quotation
-
-@cindex portabilit@`a, eliminazione di elementi di un vettore
-@cindex Brennan, Michael
-La seguente istruzione fornisce un modo portabile, anche se non evidente,
-per svuotare un vettore:@footnote{Un ringraziamento a Michael
-Brennan per la segnalazione.}
-
-@example
-split("", vettore)
-@end example
-
-@cindex @code{split()}, funzione, eliminazione di elementi di vettori
-@cindex funzione @code{split()}, eliminazione di elementi di vettori
-La funzione @code{split()}
-(@pxref{Funzioni per stringhe})
-dapprima svuota il vettore indicato. La chiamata chiede di dividere
-la stringa nulla. Poich@'e non c'@`e nulla da dividere, la
-funzione si limita a svuotare il vettore e poi termina.
-
-@quotation ATTENZIONE
-L'eliminazione di tutti gli elementi di un vettore non cambia il suo tipo; non
-si pu@`o svuotare un vettore e poi usare il nome del vettore come scalare
-(cio@`e, come una variabile semplice). Per esempio, questo non @`e consentito:
-
-@example
-a[1] = 3
-delete a
-a = 3
-@end example
-@end quotation
-
-@node Vettori multidimensionali
-@section Vettori multidimensionali
-
-@menu
-* Visitare vettori multidimensionali:: Visitare vettori multidimensionali.
-@end menu
-
-@cindex indici di vettori multidimensionali
-@cindex vettori multidimensionali
-@cindex multidimensionali, vettori
-Un @dfn{vettore multidimensionale} @`e un vettore in cui un elemento @`e
-identificato da un insieme di indici invece che da un indice singolo. Per
-esempio, un vettore bidimenisonale richiede due indici. Il modo consueto (in
-molti linguaggi, compreso @command{awk}) per far riferimento a un elemento di
-un vettore multidimensionale chiamato @code{griglia} @`e con
-@code{griglia[@var{x},@var{y}]}.
-
-@cindex @code{SUBSEP}, variabile, e vettori multidimensionali
-@cindex variabile @code{SUBSEP}, e vettori multidimensionali
-I vettori multidimensionali sono resi disponibili in @command{awk} attraverso
-la concatenazione di pi@`u indici in una stringa;
-@command{awk} converte gli indici in stringhe
-(@pxref{Conversione}) e
-le concatena assieme, inserendo un separatore tra ognuna di loro. Ne
-risulta una sola stringa che include i valori di ogni indice. La
-stringa cos@`{@dotless{i}} composta viene usata come un singolo indice in un vettore
-ordinario monodimensionale. Il separatore usato @`e il valore della variabile
-predefinita @code{SUBSEP}.
-
-Per esempio, supponiamo di valutare l'espressione @samp{pippo[5,12] = "valore"}
-quando il valore di @code{SUBSEP} @`e @code{"@@"}. I numeri 5 e 12 vengono
-convertiti in stringhe che sono poi
-concatenate con un @samp{@@} tra di essi, dando @code{"5@@12"}; di conseguenza,
-l'elemento del vettore @code{pippo["5@@12"]} @`e impostato a @code{"valore"}.
-
-Una volta che il valore dell'elemento @`e memorizzato, @command{awk}
-ignora se sia stato memorizzato con un solo indice o con una
-serie di indici. Le due espressioni @samp{pippo[5,12]} e
-@w{@samp{pippo[5 SUBSEP 12]}} sono sempre equivalenti.
-
-Il valore di default di @code{SUBSEP} @`e la stringa @code{"\034"},
-che contiene un carattere non stampabile che difficilmente appare in
-un programma di @command{awk} e nella maggior parte dei dati di input.
-Il vantaggio di scegliere un carattere improbabile discende dal fatto che i
-valori degli indici che contengono una stringa corrispondente a @code{SUBSEP}
-possono portare a stringhe risultanti ambigue. Supponendo che
-@code{SUBSEP} valga @code{"@@"}, @w{@samp{pippo["a@@b", "c"]}} e
-@w{@samp{pippo["a", "b@@c"]}} risultano indistinguibili perch@'e entrambi
-sarebbero in realt@`a memorizzati come @samp{pippo["a@@b@@c"]}.
-
-@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore multidimensionale
-Per verificare se una determinata sequenza di indici esiste in un vettore
-multidimensionale, si usa lo stesso operatore (@code{in}) che viene usato
-per i vettori monodimensionali. Si scrive l'intera sequenza di indici tra
-parentesi, separati da virgole, come operando di sinistra:
-
-@example
-if ((@var{indice1}, @var{indice2}, @dots{}) in @var{vettore})
- @dots{}
-@end example
-
-Qui vediamo un esempio, avendo in input un vettore bidimensionale
-di campi, ruota questo vettore di 90 gradi in senso orario e stampa il
-risultato. Si suppone che tutte le righe in input contengano lo stesso
-numero di elementi:
-
-@example
-@{
- if (max_nf < NF)
- max_nf = NF
- max_nr = NR
- for (x = 1; x <= NF; x++)
- vettore[x, NR] = $x
-@}
-
-END @{
- for (x = 1; x <= max_nf; x++) @{
- for (y = max_nr; y >= 1; --y)
- printf("%s ", vettore[x, y])
- printf("\n")
- @}
-@}
-@end example
-
-@noindent
-Dato l'input:
-
-@example
-1 2 3 4 5 6
-2 3 4 5 6 1
-3 4 5 6 1 2
-4 5 6 1 2 3
-@end example
-
-@noindent
-il programma produce il seguente output:
-
-@example
-4 3 2 1
-5 4 3 2
-6 5 4 3
-1 6 5 4
-2 1 6 5
-3 2 1 6
-@end example
-
-@node Visitare vettori multidimensionali
-@subsection Visitare vettori multidimensionali
-
-Non c'@`e un'istruzione @code{for} particolare per visitare un
-vettore ``multidimensionale''. Non ce ne pu@`o essere una, perch@'e
-@command{awk} in realt@`a non ha
-vettori o elementi multidimensionali: c'@`e solo una modalit@`a
-multidimensionale per @emph{accedere} a un vettore.
-
-@cindex indici di vettori multidimensionali, visitare gli
-@cindex vettori, multidimensionali, visitare
-@cindex visitare vettori multidimensionali
-Comunque, se un programma ha un vettore al quale si accede sempre in
-modalit@`a multidimensionale, si pu@`o ottenere il risultato di visitarlo
-combinando l'istruzione di visita @code{for}
-(@pxref{Visitare un intero vettore}) con la funzione
-interna @code{split()}
-(@pxref{Funzioni per stringhe}).
-Si procede nel seguente modo:
-
-@example
-for (indice_combinato in vettore) @{
- split(indice_combinato, indici_separati, SUBSEP)
- @dots{}
-@}
-@end example
-
-@noindent
-Questo imposta la variabile @code{indice_combinato} a ogni
-concatenazione di indici contenuta nel vettore, e la suddivide
-nei singoli indici separandoli
-in corrispondenza del valore di
-@code{SUBSEP}. I singoli indici diventano poi gli elementi
-del vettore @code{indici_separati}.
-
-Perci@`o, se un valore @`e stato precedentemente memorizzato in
-@code{vettore[1, "pippo"]}, esiste in @code{vettore} un elemento con indice
-@code{"1\034pippo"} (ricordare che il valore di default di @code{SUBSEP}
-@`e il carattere con codice ottale 034).
-Prima o poi, l'istruzione @code{for} trova quell'indice e fa un'iterazione
-con la variabile @code{indice_combinato} impostata a @code{"1\034pippo"}.
-Poi viene chiamata la funzione @code{split()} in questo modo:
-
-@example
-split("1\034pippo", indici_separati, "\034")
-@end example
-
-@noindent
-Il risultato @`e quello di impostare @code{indici_separati[1]} a @code{"1"} e
-@code{indici_separati[2]} a @code{"pippo"}. Ecco fatto!
-La sequenza originale degli indici separati @`e ripristinata.
-
-
-@node Vettori di vettori
-@section Vettori di vettori
-@cindex vettori di vettori
-
-@command{gawk} migliora l'accesso ai vettori multidimensionali di
-@command{awk} standard e mette a disposizione dei veri vettori di vettori.
-Agli elementi di un sottovettore si fa riferimento tramite il loro indice
-racchiuso tra parentesi quadre, proprio come gli elementi del vettore
-principale. Per esempio, quel che segue crea un sottovettore con due elementi
-all'indice @code{1} del vettore principale @code{a}:
-
-@example
-a[1][1] = 1
-a[1][2] = 2
-@end example
-
-Questo simula un vero vettore bidimensionale. Ogni elemento di un sottovettore
-pu@`o contenere un altro sottovettore come valore, che a sua volta pu@`o
-contenere anche ulteriori vettori. In questo modo, si possono creare vettori
-di tre o pi@`u dimensioni.
-Gli indici possono essere costituiti da qualunque espressione di
-@command{awk}, compresi dei
-valori scalari separati da virgole (cio@`e, un indice multidimensionale simulato
-di @command{awk}). Quindi, la seguente espressione @`e valida in
-@command{gawk}:
-
-@example
-a[1][3][1, "nome"] = "barney"
-@end example
-
-Ogni sottovettore e il vettore principale possono essere di diversa lunghezza.
-Di fatto, gli elementi di un vettore o un suo sottovettore non devono essere
-necessariamente tutti dello stesso tipo. Ci@`o significa che il vettore
-principale come anche uno qualsiasi dei suoi sottovettori pu@`o essere
-non rettangolare,
-o avere una struttura frastagliata. Si pu@`o assegnare un valore scalare
-all'indice @code{4} del vettore principale @code{a}, anche se @code{a[1]}
-@`e esso stesso un vettore e non uno scalare:
-
-@example
-a[4] = "Un elemento in un vettore frastagliato"
-@end example
-
-I termini @dfn{dimensione}, @dfn{riga} e @dfn{colonna} sono privi di
-significato quando sono applicati
-a questo tipo di vettore, ma d'ora in poi useremo ``dimensione'' per indicare
-il numero massimo di indici necessario per far riferimento a un elemento
-esistente. Il tipo di ogni elemento che @`e gi@`a stato assegnato non pu@`o essere
-cambiato assegnando un valore di tipo diverso. Prima si deve eliminare
-l'elemento corrente, per togliere completamente dalla memoria di
-@command{gawk} ogni riferimento a quell'indice:
-
-@example
-delete a[4]
-a[4][5][6][7] = "Un elemento in un vettore quadridimensionale"
-@end example
-
-@noindent
-Le due istruzioni rimuovono il valore scalare dall'indice @code{4} e
-inseriscono poi un
-sottovettore interno a tre indici contenente uno scalare. Si pu@`o anche
-eliminare un intero sottovettore o un sottovettore di sottovettori:
-
-@example
-delete a[4][5]
-a[4][5] = "Un elemento nel sottovettore a[4]"
-@end example
-
-Si deve per@`o ricordare che non @`e consentito eliminare il vettore principale
-@code{a} e poi usarlo come scalare.
-
-Le funzioni predefinite che accettano come argomenti dei vettori possono
-essere usate
-anche con i sottovettori. Per esempio, il seguente frammento di codice usa
-@code{length()} (@pxref{Funzioni per stringhe})
-per determinare il numero di elementi nel vettore principale @code{a}
-e nei suoi sottovettori:
-
-@example
-print length(a), length(a[1]), length(a[1][3])
-@end example
-
-@noindent
-Il risultato per il nostro vettore principale @code{a} @`e il seguente:
-
-@example
-2, 3, 1
-@end example
-
-@noindent
-L'espressione @samp{@var{indice} in @var{vettore}}
-(@pxref{Visitare elementi}) funziona allo stesso modo sia per
-i vettori regolari in stile @command{awk}
-che per i vettori di vettori. Per esempio, le espressioni @samp{1 in a},
-@samp{3 in a[1]} e @samp{(1, "nome") in a[1][3]} risultano tutte di valore
-uno (vero) per il nostro vettore @code{a}.
-
-L'istruzione @samp{for (elemento in vettore)} (@pxref{Visitare un intero vettore})
-pu@`o essere nidificata per visitare tutti gli
-elementi di un vettore di vettori che abbia una struttura rettangolare. Per
-stampare il contenuto (valori scalari) di un vettore di vettori bidimensionale
-(cio@`e nel quale ogni elemento di primo livello @`e esso stesso un
-vettore, non necessariamente di lunghezza uguale agli altri)
-si pu@`o usare il seguente codice:
-
-@example
-for (i in vettore)
- for (j in vettore[i])
- print vettore[i][j]
-@end example
-
-La funzione @code{isarray()} (@pxref{Funzioni per i tipi})
-permette di verificare se un elemento di un vettore @`e esso stesso un vettore:
-
-@example
-for (i in vettore) @{
- if (isarray(vettore[i]) @{
- for (j in vettore[i]) @{
- print vettore[i][j]
- @}
- @}
- else
- print vettore[i]
-@}
-@end example
-
-Se la struttura di un vettore di vettori frastagliato @`e nota in anticipo,
-si pu@`o spesso trovare il modo per visitarlo usando istruzioni di controllo.
-Per esempio,
-il seguente codice stampa gli elementi del nostro vettore principale @code{a}:
-
-@example
-for (i in a) @{
- for (j in a[i]) @{
- if (j == 3) @{
- for (k in a[i][j])
- print a[i][j][k]
- @} else
- print a[i][j]
- @}
-@}
-@end example
-
-@noindent
-@xref{Visitare vettori} per una funzione definita dall'utente che
-``visita'' un vettore di vettori di dimensioni arbitrarie.
-
-Si ricordi che un riferimento a un elemento di un vettore non
-inizializzato genera un elemento con valore uguale a @code{""}, la stringa
-nulla. Questo ha
-un'importante implicazione quando s'intende usare un sottovettore come
-argomento di una funzione, come illustrato nel seguente esempio:
-
-@example
-$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'}
-@error{} gawk: riga com.:1: fatale: split: secondo argomento
-@error{} non-vettoriale
-@end example
-
-Il modo per aggirare quest'ostacolo @`e quello di definire prima @code{b[1]}
-come vettore creando un indice arbitrario:
-
-@example
-$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'}
-@print{} a
-@end example
-
-@node Sommario dei vettori
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-@command{awk} standard dispone di vettori associativi monodimensionali
-(vettori indicizzati da valori di tipo stringa). Tutti i vettori sono
-associativi; gli indici numerici vengono convertiti automaticamente in
-stringhe.
-
-@item
-Agli elementi dei vettori si fa riferimento come
-@code{@var{vettore}[@var{indice}]}. Fare riferimento a un elemento lo
-crea se questo non esiste ancora.
-
-@item
-Il modo corretto per vedere se un vettore ha un elemento con un dato indice
-@`e quello di usare l'operatore @code{in}: @samp{@var{indice} in @var{vettore}}.
-
-@item
-Si usa @samp{for (@var{indice} in @var{vettore}) @dots{}} per visitare
-ogni singolo elemento di un vettore. Nel corpo del ciclo,
-@var{indice} assume via via il valore dell'indice di ogni elemento del vettore.
-
-@item
-L'ordine in cui il ciclo @samp{for (@var{indice} in @var{vettore})}
-attraversa un vettore non @`e definito in POSIX @command{awk} e varia a seconda
-dell'implementazione. @command{gawk} consente di controllare l'ordinamento
-di visita
-assegnando speciali valori predefiniti a @code{PROCINFO["sorted_in"]}.
-
-@item
-Si usa @samp{delete @var{vettore}[@var{indice}]} per eliminare un singolo
-elemento di un vettore.
-Per eliminare tutti gli elementi di un vettore,
-si usa @samp{delete @var{vettore}}.
-Quest'ultima funzionalit@`a @`e stata per molti anni un'estensione comune
-e ora @`e standard, ma potrebbe non essere disponibile in tutte le
-versioni commerciali di @command{awk}.
-
-@item
-@command{awk} standard simula vettori multidimensionali ammettendo pi@`u indici
-separati da virgole. I loro valori sono concatenati in un'unica
-stringa, separati dal valore di @code{SUBSEP}. Il modo di creazione
-dell'indice non viene immagazzinato; cos@`{@dotless{i}},
-cambiare @code{SUBSEP} potrebbe avere conseguenze inaspettate. Si pu@`o usare
-@samp{(@var{sub1}, @var{sub2}, @dots{}) in @var{vettore}} per vedere se
-un certo indice multidimensionale esiste in @var{vettore}.
-
-@item
-@command{gawk} consente di avere a disposizione veri vettori di vettori.
-Si usa una coppia
-di parentesi quadre per ogni dimensione in tali vettori:
-@code{dati[riga][colonna]}, per esempio. Gli elementi del vettore possono
-poi essere valori scalari (numeri o stringhe) o altri vettori.
-
-@item
-Si usa la funzione predefinita @code{isarray()} per determinare se un elemento
-di un vettore @`e esso stesso un sottovettore.
-
-@end itemize
-
-@node Funzioni
-@chapter Funzioni
-
-@cindex funzioni predefinite
-@cindex predefinite, funzioni
-Questo @value{CHAPTER} descrive le funzioni predefinite di @command{awk},
-che sono di tre tipi: numeriche, di stringa, e di I/O.
-@command{gawk} mette a disposizione ulteriori tipi di funzioni
-per gestire valori che rappresentano marcature temporali, per manipolare bit, per
-ordinare vettori, per fornire informazioni sui tipi di variabile,
-per internazionalizzare e localizzare i programmi.@footnote{Per
-un'introduzione alle tematiche suddette, si pu@`o consultare l'articolo
-"Localizzazione dei programmi" nel
-@uref{http://www.pluto.it/files/journal/pj0404/l10n.html, sito pluto.it.}}
-
-Oltre alle funzioni predefinite, @command{awk} consente di
-scrivere nuove funzioni utilizzabili all'interno di un programma.
-La seconda met@`a di questo @value{CHAPTER} descrive le funzioni
-@dfn{definite dall'utente}.
-Vengono infine descritte le chiamate indirette a una funzione, un'estensione
-specifica di @command{gawk} che consente di stabilire durante l'esecuzione del
-programma quale funzione chiamare.
-
-@menu
-* Funzioni predefinite:: Riepilogo delle funzioni predefinite.
-* Funzioni definite dall'utente:: Descrizione dettagliata delle funzioni
- definite dall'utente.
-* Chiamate indirette:: Scegliere la funzione da chiamare in
- fase di esecuzione del programma.
-* Sommario delle funzioni:: Sommario delle funzioni.
-@end menu
-
-@node Funzioni predefinite
-@section Funzioni predefinite
-
-Le funzioni @dfn{predefinite} sono sempre disponibili per essere chiamate
-da un programma @command{awk}. Questa @value{SECTION} definisce tutte le
-funzioni predefinite di @command{awk}; di alcune di queste si fa menzione
-in altre @value{SECTIONS},
-ma sono comunque riassunte anche qui per comodit@`a.
-
-@menu
-* Chiamare funzioni predefinite:: Come chiamare funzioni predefinite.
-* Funzioni numeriche:: Funzioni che trattano numeri, comprese
- @code{int()}, @code{sin()} e @code{rand()}.
-* Funzioni per stringhe:: Funzioni di manipolazione di stringhe,
- come @code{split()}, @code{match()}
- e @code{sprintf()}.
-* Funzioni di I/O:: Funzioni per i file e per i comandi
- della shell.
-* Funzioni di tempo:: Funzione per gestire marcature temporali.
-* Funzioni a livello di bit:: Funzioni per operazioni di
- manipolazione bit.
-* Funzioni per i tipi:: Funzioni per informazioni sul tipo
- di una variabile.
-* Funzioni di internazionalizzazione:: Funzioni per tradurre stringhe.
-@end menu
-
-@node Chiamare funzioni predefinite
-@subsection Chiamare funzioni predefinite
-
-Per chiamare una delle funzioni predefinite di @command{awk},
-si scrive il nome della funzione seguito dai suoi argomenti racchiusi
-tra parentesi. Per esempio, @samp{atan2(y + z, 1)}
-@`e una chiamata alla funzione @code{atan2()} e ha due argomenti.
-
-@cindex convenzioni di programmazione, nelle chiamate di funzione
-@cindex spazio bianco, nelle chiamate di funzione
-La presenza di spazi bianchi tra il nome della funzione predefinita
-e la parentesi aperta @`e consentita, ma @`e buona norma quella di evitare
-di inserire spazi bianchi in quella posizione.
-Le funzioni definite dall'utente non consentono che vi siano spazi bianchi
-fra nome funzione e aperta parentesi,
-ed @`e pi@`u semplice evitare errori seguendo una semplice convenzione che
-resta sempre valida: non inserire spazi dopo il nome di una funzione.
-
-@cindex risoluzione di problemi, @command{gawk}, errori fatali@comma{} argomenti di funzione e
-@cindex problemi, risoluzione di, @command{gawk}, errori fatali@comma{} argomenti di funzione e
-@cindex @command{gawk}, argomenti di funzione e
-@cindex differenze tra @command{awk} e @command{gawk}, argomenti di funzione (@command{gawk})
-Ogni funzione predefinita accetta un certo numero di argomenti.
-In alcuni casi, gli argomenti possono essere omessi. I valori di default per
-gli argomenti omessi variano
-da funzione a funzione e sono descritti insieme a
-ciascuna funzione. In alcune implementazioni di @command{awk}, gli
-eventuali argomenti in pi@`u specificati per le funzioni predefinite sono
-ignorati. Tuttavia, in @command{gawk},
-@`e un errore fatale fornire argomenti in pi@`u a una funzione predefinita.
-
-Quando si richiama una funzione viene calcolato, prima di effettuare la
-chiamata, il valore assunto dalle espressioni che descrivono i parametri
-da passare alla funzione.
-Per esempio, nel seguente frammento di codice:
-
-@example
-i = 4
-j = sqrt(i++)
-@end example
-
-@cindex ordine di valutazione, funzioni
-@cindex funzioni predefinite, ordine di valutazione
-@cindex predefinite, funzioni, ordine di valutazione
-@noindent
-la variabile @code{i} @`e incrementata al valore cinque prima di chiamare
-la funzione @code{sqrt()} alla quale viene fornito come parametro il valore
-quattro.
-L'ordine di valutazione delle espressioni usate come parametri per la
-funzione @`e indefinito. Per questo motivo, si deve evitare di scrivere
-programmi che presuppongono che i parametri siano valutati da sinistra a
-destra o da destra a sinistra. Per esempio:
-
-@example
-i = 5
-j = atan2(++i, i *= 2)
-@end example
-
-Se l'ordine di valutazione @`e da sinistra a destra, @code{i} assume dapprima
-il valore 6, e quindi il valore 12, e la funzione @code{atan2()} @`e chiamata
-con i due argomenti 6 e 12. Ma se l'ordine di valutazione @`e da destra a
-sinistra, @code{i} assume dapprima il valore 10, e poi il valore 11, e la
-funzione @code{atan2()} @`e chiamata con i due argomenti 11 e 10.
-
-@node Funzioni numeriche
-@subsection Funzioni numeriche
-@cindex funzioni numeriche
-@cindex numeriche, funzioni
-
-La seguente lista descrive tutte le
-funzioni predefinite che hanno a che fare con i numeri.
-I parametri facoltativi sono racchiusi tra parentesi quadre@w{ ([ ]):}
-
-@c @asis for docbook
-@table @asis
-@item @code{atan2(@var{y}, @var{x})}
-@cindexawkfunc{atan2}
-@cindex arcotangente
-Restituisce l'arcotangente di @code{@var{y} / @var{x}} in radianti.
-Si pu@`o usare @samp{pi = atan2(0, -1)} per ottenere il valore di
-@value{PI} greco.
-
-@item @code{cos(@var{x})}
-@cindexawkfunc{cos}
-@cindex coseno
-Restituisce il coseno di @var{x}, con @var{x} in radianti.
-
-@item @code{exp(@var{x})}
-@cindexawkfunc{exp}
-@cindex esponenziale
-Restituisce l'esponenziale di @var{x} (@code{e ^ @var{x}}) o un messaggio
-di errore se @var{x} @`e fuori dall'intervallo consentito.
-L'intervallo entro il quale pu@`o variare @var{x}
-dipende dalla rappresentazione dei numeri in virgola mobile nella macchina in
-uso.
-
-@item @code{int(@var{x})}
-@cindexawkfunc{int}
-@cindex arrotondamento all'intero pi@`u vicino
-Restituisce l'intero pi@`u vicino a @var{x}, situato tra @var{x} e zero,
-troncato togliendo i decimali.
-Per esempio, @code{int(3)} @`e 3, @code{int(3.9)} @`e 3, @code{int(-3.9)}
-@`e @minus{}3, e @code{int(-3)} @`e ancora @minus{}3.
-
-@item @code{intdiv(@var{numeratore}, @var{denominatore}, @var{risultato})}
-@cindexawkfunc{intdiv}
-@cindex funzione @code{intdiv}
-Esegue una divisione tra numeri interi, simile alla funzione standard C
-che ha lo stesso nome. Dapprima, il @code{numeratore} e il
-@code{denominatore} vengono troncati, eliminando la parte decimale,
-per trasformarli in numeri interi.
-Il vettore @code{risultato} viene dapprima svuotato, e poi viene impostato
-l'elemento @code{risultato["quotient"]} al risultato della divisione
-@samp{numeratore / denominatore}, troncato a numero intero
-mediante l'eliminazione dei decimali,
-e viene impostato l'elemento @code{risultato["remainder"]} al
-risultato dell'operazione @samp{numeratore % denominatore}, troncato a
-numero intero allo stesso modo del risultato. Questa funzione @`e
-rivolta principalmente a chi usa numeri interi di lunghezza arbitraria;
-consente di evitare la creazione di numeri in virgola mobile
-di precisione arbitaria usando la funzionalit@`a MPFR
-(@pxref{Interi a precisione arbitraria}).
-
-Questa funzione @`e un'estensione @code{gawk}. Non @`e disponibile in
-modalit@`a compatibile (@pxref{Opzioni}).
-
-@item @code{log(@var{x})}
-@cindexawkfunc{log}
-@cindex logaritmo
-Restituisce il logaritmo naturale di @var{x}, se @var{x} @`e positivo;
-altrimenti, restituisce @code{NaN} (``not a number'') sui sistemi che
-implementano lo standard IEEE 754.
-Inoltre, @command{gawk} stampa un messaggio di avvertimento qualora @code{x}
-sia negativo.
-
-@item @code{rand()}
-@cindexawkfunc{rand}
-@cindex numeri casuali, funzioni @code{rand()}/@code{srand()}
-Restituisce un numero casuale. I valori di @code{rand()} sono
-uniformemente distribuiti tra zero e uno.
-Il valore potrebbe essere zero ma non @`e mai uno.@footnote{La versione C di
-@code{rand()} in molti sistemi Unix
-produce notoriamente delle sequenze piuttosto mediocri di numeri casuali.
-Tuttavia, non @`e prescritto che un'implementazione di @command{awk}
-debba usare la funzione @code{rand()} del linguaggio C per implementare
-la versione @command{awk} di @code{rand()}.
-In effetti, @command{gawk} usa, per generare numeri casuali,
-la funzione @code{random()} di BSD, che @`e
-notevolmente migliore di @code{rand()}}
-
-Spesso servono dei numeri casuali interi invece che frazionari.
-La seguente funzione definita dall'utente pu@`o essere usata per ottenere
-un numero casuale non negativo inferiore a @var{n}:
-
-@example
-function randint(n)
-@{
- return int(n * rand())
-@}
-@end example
-
-@noindent
-La moltiplicazione produce un numero casuale maggiore o uguale a zero e
-minore di @code{n}. Tramite @code{int()}, questo risultato diventa
-un intero tra zero e @code{n} @minus{} 1, estremi inclusi.
-
-Il seguente esempio usa una funzione simile per generate interi casuali
-fra uno e @var{n}. Il programma stampa un numero casuale per
-ogni record in input:
-
-@example
-# funzione per simulare un tiro di dado.
-function roll(n) @{ return 1 + int(rand() * n) @}
-
-# Tira 3 dadi a sei facce e
-# stampa il numero di punti.
-@{
- printf("%d punteggio\n", roll(6) + roll(6) + roll(6))
-@}
-@end example
-
-@cindex inizializzazione generazione di numeri casuali
-@cindex numeri casuali, inizializzazione generazione di
-@cindex numeri casuali, seme di
-@quotation ATTENZIONE
-Nella maggior parte delle implementazioni di @command{awk}, compreso
-@command{gawk},
-@code{rand()} inizia a generare numeri casuali partendo sempre
-dallo stesso numero, o @dfn{seme}, per ogni invocazione di
-@command{awk}.@footnote{@command{mawk}
-usa un seme differente ogni volta.} @`E per questo motivo che
-un programma genera sempre gli stessi risultati ogni volta che lo si esegue.
-I numeri sono casuali all'interno di una singola esecuzione di @command{awk}
-ma "prevedibili" in ogni successiva esecuzione.
-Ci@`o torna utile in fase di test, ma se si desidera che
-un programma generi sequenze differenti di numeri casuali ogni volta
-che @`e chiamato, occorre impostare il seme a un valore che cambi
-per ogni esecuzione. Per fare questo, @`e prevista la funzione @code{srand()}.
-@end quotation
-
-@item @code{sin(@var{x})}
-@cindexawkfunc{sin}
-@cindex seno
-Restituisce il seno di @var{x}, con @var{x} espresso in radianti.
-
-@item @code{sqrt(@var{x})}
-@cindexawkfunc{sqrt}
-@cindex radice quadrata
-Restituisce la radice quadrata positiva di @var{x}.
-@command{gawk} stampa un messaggio di avvertimento
-se @var{x} @`e un numero negativo. Quindi, @code{sqrt(4)} vale 2.
-
-@item @code{srand(}[@var{x}]@code{)}
-@cindexawkfunc{srand}
-Imposta al valore @var{x} il numero di partenza, o seme,
-utilizzato per generare numeri casuali.
-
-Ogni seme genera una sequenza particolare di numeri casuali.@footnote{I
-numeri casuali generati da un computer non sono veramente casuali.
-Tecnicamente sono conosciuti come numeri @dfn{pseudo-casuali}. Ci@`o vuol dire
-che, anche se i numeri in una sequenza sembrano casuali, @`e possibile
-in realt@`a generare la stessa sequenza di numeri casuali pi@`u e pi@`u volte.}
-Quindi, impostando il seme allo stesso valore una seconda volta,
-viene prodotta ancora la stessa sequenza di numeri casuali.
-
-@quotation ATTENZIONE
-Differenti implementazioni di @command{awk} usano internamente differenti
-generatori di numeri casuali. Non si deve dare per scontato che lo stesso
-programma @command{awk}
-generi la stessa serie di numeri casuali se viene eseguito da differenti
-versioni di @command{awk}.
-@end quotation
-
-Se si omette l'argomento @var{x}, scrivendo @samp{srand()}, viene usato
-come seme la data e ora corrente. @`E questo il modo per ottenere numeri
-casuali che sono veramente imprevedibili.
-
-Il valore restituito da @code{srand()} @`e quello del seme precedente.
-Questo per facilitare il monitoraggio dei semi, nel caso occorra riprodurre
-in maniera coerente delle sequenze di numeri casuali.
-
-POSIX non specifica quale debba essere il seme iniziale, che quindi varia
-a seconda delle implementazioni @command{awk}.
-@end table
-
-@node Funzioni per stringhe
-@subsection Funzioni di manipolazione di stringhe
-@cindex funzioni di manipolazione di stringhe
-
-Le funzioni in questa @value{SECTION} leggono o modificano il testo di
-una o pi@`u stringhe.
-
-@command{gawk} implementa la localizzazione
-(@pxref{Localizzazioni}) ed effettua
-ogni manipolazione di stringhe trattando ogni singolo @emph{carattere}, non
-ogni singolo @emph{byte}.
-Questa distinzione @`e particolarmente importante da comprendere per
-quelle localizzazioni in cui un singolo carattere pu@`o essere rappresentato
-da pi@`u di un byte.
-Quindi, per esempio, la funzione @code{length()} restituisce il numero di
-caratteri in una stringa, e non il numero di byte usato per rappresentare quei
-caratteri. Allo stesso modo, @code{index()} restituisce indici di caratteri, e
-non indici di byte.
-
-@quotation ATTENZIONE
-Un certo numero di funzioni riguarda indici all'interno di stringhe. Per
-queste funzioni, il primo carattere di una stringa @`e alla posizione
-(all'indice) uno. Questo comportamento @`e differente da quello del C e dei
-linguaggi che da esso discendono, nei quali il primo carattere @`e alla posizione
-zero. @`E importante ricordarlo quando si fanno calcoli sugli indici, in
-particolare se si ha familiarit@`a con il linguaggio C.
-@end quotation
-
-Nella lista seguente, i parametri facoltativi sono racchiusi tra parentesi
-quadre@w{ ([ ]).}
-Parecchie funzioni operano sostituzioni in una stringa; la spiegazione
-completa di ci@`o @`e contenuta nella descrizione della funzione @code{sub()},
-che si trova quasi alla fine di questa lista, ordinata alfabeticamente.
-
-Le funzioni specifiche di @command{gawk} sono contrassegnate col simbolo
-del cancelletto (@samp{#}). Tali funzioni non sono disponibili in modalit@`a
-compatibile (@pxref{Opzioni}):
-
-
-@menu
-* Dettagli ostici:: Pi@`u di quel che si vorrebbe sapere su @samp{\}
- e @samp{&} con @code{sub()}, @code{gsub()}, e
- @code{gensub()}.
-@end menu
-
-@c @asis for docbook
-@table @asis
-@item @code{asort(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
-@itemx @code{asorti(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
-@cindexgawkfunc{asorti}
-@cindex vettori, ordinamento dei
-@cindex ordinamento di vettori
-@cindex vettori, determinare il numero degli elementi
-@cindexgawkfunc{asort}
-@cindex ordinamento vettori per indici
-@cindex vettori, ordinamento per indici
-@cindex indici di vettori, ordinamento per
-Queste due funzioni sono abbastanza simili, e quindi sono descritte
-insieme.
-
-@quotation NOTA
-La seguente descrizione ignora il terzo argomento, @var{come}, perch@'e
-richiede la conoscenza di funzionalit@`a di cui non si @`e ancora parlato. Per
-questo motivo la seguente trattazione @`e volutamente semplificata. (In seguito
-l'argomento verr@`a trattato in maniera pi@`u esauriente; si veda @ref{Funzioni di
-ordinamento di vettori} per la descrizione completa.)
-@end quotation
-
-Entrambe le funzioni restituiscono il numero di elementi nel vettore @var{sorgente}.
-Con @command{asort()}, @command{gawk} ordina i valori di @var{sorgente}
-e rimpiazza gli indici dei valori ordinati di @var{sorgente} con
-numeri interi sequenziali, a partire da uno. Se si specifica il vettore
-opzionale @var{destinazione},
-@var{sorgente} @`e copiato in @var{destinazione}. @var{destinazione}
-viene quindi ordinato, lasciando immodificati gli indici di @var{sorgente}.
-
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-Nel confronto tra stringhe, la variabile @code{IGNORECASE} influenza
-l'ordinamento
-(@pxref{Funzioni di ordinamento di vettori}). Se il vettore
-@var{sorgente} contiene sottovettori come valori
-(@pxref{Vettori di vettori}), questi saranno alla fine, dopo tutti i valori
-scalari.
-I sottovettori @emph{non} vengono ordinati ricorsivamente.
-
-Per esempio, se i contenuti del vettore @code{a} sono i seguenti:
-
-@example
-a["ultimo"] = "de"
-a["primo"] = "sac"
-a["mediano"] = "cul"
-@end example
-
-@noindent
-Una chiamata a @code{asort()}:
-
-@example
-asort(a)
-@end example
-
-@noindent
-genera i seguenti contenuti di @code{a}:
-
-@example
-a[1] = "cul"
-a[2] = "de"
-a[3] = "sac"
-@end example
-
-La funzione @code{asorti()} si comporta in maniera simile ad @code{asort()};
-tuttavia l'ordinamento avviene in base agli @emph{indici}, e non in base ai
-valori. Quindi, nell'esempio seguente, a partire dallo stesso insieme iniziale
-di indici e valori nel vettore @code{a}, la chiamata di @samp{asorti(a)}
-produrrebbe:
-
-@example
-a[1] = "mediano"
-a[2] = "primo"
-a[3] = "ultimo"
-@end example
-
-@item @code{gensub(@var{regexp}, @var{rimpiazzo}, @var{come}} [@code{, @var{obiettivo}}]@code{) #}
-@cindexgawkfunc{gensub}
-@cindex cercare e rimpiazzare in stringhe
-@cindex sostituzione in stringa
-Ricerca nella stringa @var{obiettivo} delle corrispondenze
-all'espressione regolare @var{regexp}.
-Se @var{come} @`e una stringa che inizia
-con @samp{g} o @samp{G} (abbreviazione di ``global''), sostituisce
-ogni occorrenza di @var{regexp} con la stringa
-@var{rimpiazzo}. Altrimenti, @var{come} @`e visto come un numero che indica
-quale corrispondenza di @var{regexp} va rimpiazzata. Se non si specifica
-il nome dell'@var{obiettivo}, si
-opera su @code{$0}. La funzione restituisce come risultato la stringa
-modificata, e la stringa originale di partenza @emph{non} viene modificata.
-
-@code{gensub()} @`e una funzione generale di sostituzione. Mira a fornire
-pi@`u funzionalit@`a rispetto alle funzioni standard @code{sub()} e
-@code{gsub()}.
-
-@code{gensub()} prevede una funzionalit@`a ulteriore, non disponibile in
-@code{sub()} o @code{gsub()}: la possibilit@`a di specificare componenti di
-una @dfn{regexp} nel testo da sostituire. Questo @`e fatto utilizzando delle
-parentesi nella @dfn{regexp} per designare i componenti, e quindi inserendo
-@samp{\@var{N}} nel testo di rimpiazzo, dove @var{N} @`e una cifra da 1 a 9.
-Per esempio:
-
-@example
-$ @kbd{gawk '}
-> @kbd{BEGIN @{}
-> @kbd{a = "abc def"}
-> @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)}
-> @kbd{print b}
-> @kbd{@}'}
-@print{} def abc
-@end example
-
-@noindent
-Come con @code{sub()}, occorre battere due barre inverse, per ottenerne
-una come componente della stringa.
-Nel testo di rimpiazzo, la sequenza @samp{\0} rappresenta l'intero testo
-corrispondente, e lo stesso vale per
-il carattere @samp{&}.
-
-Il seguente esempio mostra come @`e possibile usare il terzo argomento
-per controllare quale corrispondenza
-della @dfn{regexp} sia da modificare:
-
-@example
-$ @kbd{echo a b c a b c |}
-> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'}
-@print{} a b c AA b c
-@end example
-
-In questo caso, @code{$0} @`e la stringa obiettivo di default.
-@code{gensub()} restituisce la nuova stringa come risultato, e questa
-@`e passata direttamente a @code{print} per essere stampata.
-
-@c @cindex avvertimenti automatici
-@c @cindex automatici, avvertimenti
-Se l'argomento @var{come} @`e una stringa che non inizia con @samp{g} o
-@samp{G}, o se @`e un numero minore o uguale a zero, si effettua solo una
-sostituzione. Se @var{come} @`e zero, @command{gawk} emette
-un messaggio di avvertimento.
-
-Se @var{regexp} non viene trovata in @var{obiettivo}, il valore
-restituito da @code{gensub()}
-@`e il valore originale e non modificato di @var{obiettivo}.
-
-@item @code{gsub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
-@cindexawkfunc{gsub}
-Ricerca in @var{obiettivo}
-@emph{tutte} le sottostringhe corrispondenti al criterio di ricerca, le
-pi@`u lunghe possibili partendo da sinistra, @emph{non sovrapposte tra loro},
-e le sostituisce con @var{rimpiazzo}.
-La lettera @samp{g} in @code{gsub()} significa
-``global'', e richiede di sostituire dappertutto. Per esempio:
-
-@example
-@{ gsub(/Inghilterra/, "Regno Unito"); print @}
-@end example
-
-@noindent
-sostituisce tutte le occorrenze della stringa @samp{Inghilterra} con
-@samp{Regno Unito} in tutti i record in input.
-
-La funzione @code{gsub()} restituisce il numero di sostituzioni effettuate.
-Se la variabile da cercare e modificare (@var{obiettivo}) @`e omessa,
-viene usato l'intero record in input.
-Come in @code{sub()}, i caratteri @samp{&} e @samp{\} sono speciali,
-e il terzo argomento dev'essere modificabile.
-
-@item @code{index(@var{dove}, @var{cosa})}
-@cindexawkfunc{index}
-@cindex ricerca in stringhe
-@cindex trovare sottostringhe in una stringa
-Ricerca nella stringa @var{dove} la prima occorrenza della stringa @var{cosa},
-e restituisce la posizione in caratteri dell'inizio di quest'occorrenza nella
-stringa @var{dove}. Si consideri il seguente esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{ print index("noccioline", "oli") @}'}
-@print{} 6
-@end example
-
-@noindent
-Se @var{cosa} non viene trovato, @code{index()} restituisce zero.
-
-@cindex angolo buio, @dfn{regexp} come secondo argomento di @code{index()}
-In BWK @command{awk} e @command{gawk},
-@`e un errore fatale usare una costante @dfn{regexp} per @var{cosa}.
-Altre implementazioni lo consentono, considerando semplicemente
-la costante @dfn{regexp} come un'espressione che significa
-@samp{$0 ~ /@dfn{regexp}/}. @value{DARKCORNER}
-
-@item @code{length(}[@var{stringa}]@code{)}
-@cindexawkfunc{length}
-@cindex stringa, lunghezza di una
-@cindex lunghezza di una stringa
-Restituisce il numero di caratteri in @var{stringa}. Se
-@var{stringa} @`e un numero, viene restituita la lunghezza della stringa
-di cifre che rappresenta quel numero. Per esempio, @code{length("abcde")} @`e
-cinque.
-Invece, @code{length(15 * 35)} restituisce tre. In questo esempio,
-@iftex
-@math{15 @cdot 35 = 525},
-@end iftex
-@ifnottex
-@ifnotdocbook
-15 * 35 = 525,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-15 &sdot; 35 = 525,
-@end docbook
-e 525 @`e quindi convertito alla stringa @code{"525"}, che @`e composta da
-tre caratteri.
-
-@cindex lunghezza di un record in input
-@cindex record in input, lunghezza di un
-Se non si specifica alcun argomento, @code{length()} restituisce la
-lunghezza di @code{$0}.
-
-@c @cindex historical features
-@cindex portabilit@`a, funzione @code{length()}
-@cindex POSIX @command{awk}, funzione @code{length()} e
-@quotation NOTA
-In alcune delle prime versioni di @command{awk}, la funzione @code{length()}
-poteva essere richiamata senza alcuna parentesi. Farlo @`e considerata
-una cattiva abitudine, sebbene il POSIX standard 2008 lo consenta esplicitamente,
-per compatibilit@`a con la vecchia prassi. Per garantire la massima
-portabilit@`a ai programmi, @`e meglio mettere sempre le parentesi.
-@end quotation
-
-@cindex angolo buio, funzione @code{length()}
-Se @code{length()} @`e chiamata con una variabile che non @`e stata usata,
-@command{gawk} considera la variabile come uno scalare. Altre
-implementazioni di @command{awk} non assegnano nessun tipo alla variabile.
-@value{DARKCORNER}
-Si consideri:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
-@print{} 0
-@error{} gawk: riga com.:1: fatale: tentativo di usare
-@error{} scalare 'x' come vettore
-
-$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
-@print{} 0
-@end example
-
-@noindent
-Se @option{--lint} @`e
-stato specificato sulla riga di comando, @command{gawk} emette un
-avvertimento a questo riguardo.
-
-@cindex estensioni comuni, @code{length()} applicato a un vettore
-@cindex comuni, estensioni@comma{} @code{length()} applicato a un vettore
-@cindex differenze tra @command{gawk} e @command{awk}
-@cindex numero di elementi di un vettore
-@cindex vettore, determinare il numero degli elementi
-In @command{gawk} e in parecchie altre implementazioni @command{awk},
-se l'argomento @`e un vettore, la funzione @code{length()} restituisce il numero
-di elementi nel vettore. @value{COMMONEXT}
-Ci@`o @`e meno utile di quel che sembra a prima vista, in quanto
-non @`e affatto detto che il vettore abbia come indici i numeri da 1 al
-numero di elementi che contiene.
-Se @option{--lint} @`e
-stato specificato sulla riga di comando,
-(@pxref{Opzioni}),
-@command{gawk} avvisa che l'uso di un vettore come argomento non
-@`e portabile.
-Se si specifica l'opzione @option{--posix}, l'uso di un vettore come
-argomento genera un errore fatale
-@iftex
-(@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-(@pxref{Vettori}).
-@end ifnottex
-
-@item @code{match(@var{stringa}, @var{regexp}} [@code{, @var{vettore}}]@code{)}
-@cindexawkfunc{match}
-@cindex stringa, ricercare espressioni regolari in una
-@cindex ricerca @dfn{regexp} in stringhe
-Ricerca in @var{stringa} la
-sottostringa pi@`u lunga, a partire da sinistra, che corrisponde
-all'espressione regolare @var{regexp} e restituisce la posizione
-del carattere (indice) con cui inizia la sottostringa (uno, se
-la corrispondenza parte dall'inizio di @var{stringa}). Se non viene
-trovata alcuna corrispondenza, restituisce zero.
-
-L'argomento @var{regexp} pu@`o essere sia una costante @dfn{regexp}
-(@code{/}@dots{}@code{/}) che una costante stringa (@code{"}@dots{}@code{"}).
-In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
-per la quale cercare una corrispondenza.
-@xref{Espressioni regolari calcolate} per una
-spiegazione sulla differenza tra le due forme e sulle loro
-implicazioni riguardo al modo per scrivere correttamente un programma.
-
-L'ordine dei primi due argomenti @`e l'opposto di molte altre funzioni che
-trattano stringhe e che hanno a che fare con espressioni regolari, come
-@code{sub()} e @code{gsub()}. Potrebbe essere di aiuto ricordare che
-per @code{match()}, l'ordine @`e lo stesso che per l'operatore @samp{~} :
-@samp{@var{stringa} ~ @var{regexp}}.
-
-@cindex @code{RSTART}, variabile, funzione @code{match()} e
-@cindex variabile @code{RSTART}, funzione @code{match()} e
-@cindex @code{RLENGTH}, variabile, funzione @code{match()} e
-@cindex variabile @code{RLENGTH}, funzione @code{match()} e
-@cindex funzione @code{match()}, variabili @code{RSTART}/@code{RLENGTH}
-@cindex @code{match()}, funzione, variabili @code{RSTART}/@code{RLENGTH}
-La funzione @code{match()} imposta la variabile predefinita @code{RSTART}
-all'indice.
-Imposta anche la variabile predefinita @code{RLENGTH} alla
-lunghezza in caratteri della sottostringa individuata. Se non viene
-trovata alcuna corrispondenza, @code{RSTART} @`e impostata a zero, e
-@code{RLENGTH} a @minus{}1.
-
-Per esempio:
-
-@example
-@c file eg/misc/findpat.awk
-@{
- if ($1 == "TROVA")
- regexp = $2
- else @{
- dove = match($0, regexp)
- if (dove != 0)
- print "Corrispondenza di", regexp, "alla posiz.", \
- dove, "in", $0
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-Questo programma ricerca delle righe che corrispondono all'espressione
-regolare contenuta nella variabile
-@code{regexp}. Quest'espressione regolare pu@`o essere modificata. Se la
-prima parola in una riga @`e @samp{TROVA}, @code{regexp} diventa la
-seconda parola su quella riga. Quindi, dato:
-
-@example
-@c file eg/misc/findpat.data
-TROVA or+e
-Il mio programma corre
-ma non troppo velocemente
-TROVA Melvin
-JF+KM
-Questa riga appartiene a Reality Engineering Co.
-Melvin @`e passato da qui.
-@c endfile
-@end example
-
-@noindent
-@command{awk} stampa:
-
-@example
-Corrispondenza di or+e alla posiz. 19 in Il mio programma corre
-Corrispondenza di Melvin alla posiz. 1 in Melvin @`e passato da qui.
-@end example
-
-@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{match()}
-Se @var{vettore} esiste gi@`a, viene cancellato, e quindi l'elemento numero
-zero di @var{vettore} @`e impostato all'intera parte di @var{stringa}
-individuata da @var{regexp}. Se @var{regexp} contiene parentesi,
-gli elementi aventi per indici numeri interi in @var{vettore} sono
-impostati per contenere ognuno la parte di @var{stringa} individuata dalla
-corrispondente sottoespressione delimitata da parentesi.
-Per esempio:
-
-@example
-$ @kbd{echo pippoooopaperpluttttttt |}
-> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
-> @kbd{print vett[1], vett[2] @}'}
-@print{} pippoooo pluttttttt
-@end example
-
-Inoltre,
-sono disponibili indici multidimensionali che contengono
-la posizione di partenza e la lunghezza di ogni sottoespressione
-individuata:
-
-@example
-$ @kbd{echo pippoooopaperpluttttttt |}
-> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
-> @kbd{print vett[1], vett[2]}
-> @kbd{print vett[1, "start"], vett[1, "length"]}
-> @kbd{print vett[2, "start"], vett[2, "length"]}
-> @kbd{@}'}
-@print{} pippoooo pluttttttt
-@print{} 1 8
-@print{} 14 10
-@end example
-
-Possono non esserci indici che individuino inizio e posizione
-per ogni sottoespressione
-fra parentesi, perch@'e non tutte potrebbero aver individuato del testo;
-quindi, andrebbero esaminati usando l'operatore @code{in}
-(@pxref{Visitare elementi}).
-
-@cindex risoluzione di problemi, funzione @code{match()}
-@cindex problemi, risoluzione di, funzione @code{match()}
-L'argomento @var{vettore} di @code{match()} @`e un'estensione
-@command{gawk}. In modalit@`a compatibile
-(@pxref{Opzioni}),
-l'impiego di un terzo argomento causa un errore fatale.
-
-@item @code{patsplit(@var{stringa}, @var{vettore}} [@code{, @var{regexpdelim}} [@code{, @var{separatori}} ] ]@code{) #}
-@cindexgawkfunc{patsplit}
-@cindex dividere in un vettore una stringa
-@cindex creare un vettore da una stringa
-Divide
-@var{stringa} in parti definite da @var{regexpdelim}
-e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
-vettore @var{separatori}. Il primo pezzo @`e memorizzato in
-@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
-cos@`{@dotless{i}} via. Il terzo argomento, @var{regexpdelim}, @`e
-una @dfn{regexp} che descrive i campi in @var{stringa} (allo stesso modo in
-cui @code{FPAT} @`e una @dfn{regexp} che descrive i campi nei record
-in input).
-Pu@`o essere una costante @dfn{regexp} o una stringa.
-Se @var{regexpdelim} @`e omesso, viene usato il valore di @code{FPAT}.
-@code{patsplit()} restituisce il numero di elementi creati.
-@code{@var{separatori}[@var{i}]} @`e
-la stringa che separa
-l'elemento @code{@var{vettore}[@var{i}]} e @code{@var{vettore}[@var{i}+1]}.
-Ogni separatore iniziale sar@`a in @code{@var{separatori}[0]}.
-
-La funzione @code{patsplit()} divide delle stringhe in pezzi in modo
-simile a quello con cui le righe in input vengono divise in campi
-usando @code{FPAT}
-(@pxref{Separazione in base al contenuto}).
-
-Prima di dividere la stringa, @code{patsplit()} cancella ogni elemento che
-fosse eventualmente presente
-nei vettori @var{vettore} e @var{separatori}.
-
-@item @code{split(@var{stringa}, @var{vettore}} [@code{, @var{separacampo}} [@code{, @var{separatori}} ] ]@code{)}
-@cindexawkfunc{split}
-Divide @var{stringa} in pezzi separati da @var{separacampo}
-e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
-vettore @var{separatori}. Il primo pezzo @`e memorizzato in
-@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
-cos@`{@dotless{i}} via. Il valore della stringa specificata nel terzo argomento,
-@var{separacampo}, @`e una @dfn{regexp} che indica come dividere @var{stringa}
-(analogamente a come @code{FS} pu@`o essere un @dfn{regexp} che indica dove
-dividere i record in input).
-Se @var{separacampo} @`e omesso, si usa il valore di @code{FS}.
-@code{split()} restituisce il numero di elementi creati.
-@var{separatori} @`e un'estensione @command{gawk}, in cui
-@code{@var{separatori}[@var{i}]}
-@`e la stringa che separa @code{@var{vettore}[@var{i}]} e
-@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
-@code{@var{separatori}[@var{n}]}, dove @var{n} @`e il valore restituito da
-@code{split()} (cio@`e il numero di elementi in @var{vettore}).
-
-La funzione @code{split()} divide le stringhe in pezzi in modo simile
-a quello con cui le righe in input sono divise in campi. Per esempio:
-
-@example
-split("cul-de-sac", a, "-", separatori)
-@end example
-
-@noindent
-@cindex stringhe, divisione, esempio
-divide la stringa @code{"cul-de-sac"} in tre campi usando @samp{-} come
-separatore. Il vettore @code{a} ha i seguenti contenuti:
-
-@example
-a[1] = "cul"
-a[2] = "de"
-a[3] = "sac"
-@end example
-
-e imposta il contenuto del vettore @code{separatori} come segue:
-
-@example
-seps[1] = "-"
-seps[2] = "-"
-@end example
-
-@noindent
-Il valore restituito da questa chiamata a @code{split()} @`e tre.
-
-@cindex differenze tra @command{awk} e @command{gawk}, 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
-vengono ignorati nell'assegnare valori agli elementi di @var{vettore} ma non nel
-vettore @var{separatori}, e gli elementi sono separati da uno o pi@`u spazi
-bianchi. Inoltre, come nel caso della divisione dei record in input, se
-@var{separacampo} @`e la stringa nulla, ogni singolo carattere nella stringa
-costituisce un elemento del vettore.
-@value{COMMONEXT}
-
-Si noti, tuttavia, che @code{RS} non influisce sul comportamento di
-@code{split()}.
-Anche se @samp{RS = ""} fa s@`{@dotless{i}} che il carattere di ritorno a capo sia un
-separatore di campo,
-questo non influenza il modo in cui @code{split()} divide le stringhe.
-
-@cindex angolo buio, funzione @code{split()}
-Recenti implementazioni di @command{awk}, incluso @command{gawk},
-consentono che il terzo argomento sia una costante @dfn{regexp}
-(@w{@code{/}@dots{}@code{/}})
-o anche una stringa. @value{DARKCORNER}
-Anche lo standard POSIX permette questo.
-@xref{Espressioni regolari calcolate} per la spiegazione della differenza
-tra l'uso di una costante stringa e l'uso di una costante @dfn{regexp},
-sulle loro implicazioni riguardo a come scrivere correttamente un programma.
-
-Prima di dividere la stringa, @code{split()} cancella ogni elemento
-eventualmente gi@`a presente
-nei vettori @var{vettore} e @var{separatori}.
-
-Se @var{stringa} @`e la stringa nulla, il vettore non ha elementi.
-(Quindi, in questo modo si pu@`o cancellare un intero vettore con una sola
-istruzione).
-@xref{Cancellazione}.)
-
-Se in @var{stringa} non viene trovato @var{separacampo} (ma la stringa
-non @`e la stringa nulla),
-@var{vettore} ha solo un elemento. Il valore di quell'elemento @`e la
-@var{stringa} originale.
-
-In modalit@`a POSIX (@pxref{Opzioni}), il quarto argomento non @`e disponibile.
-
-@item @code{sprintf(@var{formato}, @var{espressione1}, @dots{})}
-@cindexawkfunc{sprintf}
-@cindex formattare stringhe
-@cindex stringhe, formattazione
-Restituisce (senza stamparla) la stringa che @code{printf} avrebbe
-stampato con gli stessi argomenti
-(@pxref{Printf}).
-Per esempio:
-
-@example
-pival = sprintf("pi = %.2f (approx.)", 22/7)
-@end example
-
-@noindent
-assegna la stringa @w{@samp{pi = 3.14 (approx.)}} alla variabile @code{pival}.
-
-@cindexgawkfunc{strtonum}
-@cindex conversione di una stringa in un numero
-@cindex stringhe, conversione in numeri
-@item @code{strtonum(@var{stringa}) #}
-Esamina @var{stringa} e restituisce il suo valore numerico. Se
-@var{stringa} inizia con la cifra @samp{0}, @code{strtonum()} presuppone
-che @var{stringa} sia un numero ottale. Se @var{stringa} inizia con
-@samp{0x} o @samp{0X}, @code{strtonum()} presuppone che @var{stringa} sia un
-numero esadecimale.
-Per esempio:
-
-@example
-$ @kbd{echo 0x11 |}
-> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'}
-@print{} 17
-@end example
-
-Usare la funzione @code{strtonum()} @emph{non} @`e lo stesso che aggiungere
-zero al valore di una stringa;
-la conversione automatica di stringhe in numeri
-si applica solo a dati decimali, non a quelli ottali o
-esadecimali.@footnote{Tranne nel caso si usi l'opzione
-@option{--non-decimal-data}, il che non @`e consigliato.
-@xref{Dati non decimali} per ulteriori informazioni.}
-
-Si noti anche che @code{strtonum()} usa il separatore decimale della
-localizzazione corrente per riconoscere i numeri
-(@pxref{Localizzazioni}).
-
-@item @code{sub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
-@cindexawkfunc{sub}
-@cindex rimpiazzare in una stringa
-@cindex stringa, rimpiazzare in una
-Ricerca in @var{obiettivo}, che @`e visto come una stringa,
-la prima sottostringa pi@`u lunga possibile,
-a partire da sinistra, che corrisponde all'espressione regolare @var{regexp}.
-Modifica l'intera stringa sostituendo il testo individuato con
-@var{rimpiazzo}.
-La stringa cos@`{@dotless{i}} modificata diventa il nuovo valore di @var{obiettivo}.
-Restituisce il numero di sostituzioni fatte (zero o uno).
-
-L'argomento @var{regexp} pu@`o essere o una costante @dfn{regexp}
-(@code{/}@dots{}@code{/}) o una constante stringa (@code{"}@dots{}@code{"}).
-In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
-da individuare.
-@xref{Espressioni regolari calcolate} per la spiegazione della differenza tra
-le due forme, delle loro implicazioni riguardo al modo di scrivere
-correttamente un programma.
-
-Questa funzione @`e particolare perch@'e @var{obiettivo} non @`e semplicemente usato
-per calcolare un valore, e non basta che sia un'espressione qualsiasi:
-dev'essere una variabile, un campo, o un elemento di vettore in cui
-@code{sub()} possa memorizzare un valore modificato. Se questo argomento @`e
-omesso, il comportamento di default @`e
-quello di usare e modificare
-@code{$0}.@footnote{Si noti che questo significa che il record sar@`a dapprima
-ricostruito, usando il valore di @code{OFS} se qualche campo @`e stato cambiato,
-e che i campi saranno aggiornati dopo la sostituzione, anche se l'operazione in
-s@'e non cambia il record (@`e una ``no-op'') come @samp{sub(/^/, "")}.} Per
-esempio:
-
-@example
-str = "acqua, acqua dappertutto"
-sub(/cqu/, "vari", str)
-@end example
-
-@noindent
-modifica @code{stringa} facendola divenire
-@w{@samp{avaria, acqua dappertutto}},
-rimpiazzando l'occorrenza pi@`u lunga,
-a partire da sinistra, di @samp{cqu} con @samp{vari}.
-
-Se il carattere speciale @samp{&} compare in @var{rimpiazzo}, designa
-l'esatta sottostringa individuata da @var{regexp}. (Se
-@dfn{regexp} pu@`o individuare pi@`u di una stringa, questa sottostringa
-pu@`o assumere valori diversi.) Per esempio:
-
-@example
-@{ sub(/candidato/, "& e sua moglie"); print @}
-@end example
-
-@noindent
-cambia la prima occorrenza di @samp{candidato} a @samp{candidato
-e sua moglie} in ogni riga in input.
-Ecco un altro esempio:
-
-@example
-$ @kbd{awk 'BEGIN @{}
-> @kbd{str = "daabaaa"}
-> @kbd{sub(/a+/, "C&C", str)}
-> @kbd{print str}
-> @kbd{@}'}
-@print{} dCaaCbaaa
-@end example
-
-@noindent
-questo mostra come @samp{&} possa rappresentare una stringa variabile
-e illustra anche la regola
-``a partire da sinistra, la pi@`u lunga'' nell'individuazione di @dfn{regexp}
-(@pxref{Pi@`u lungo da sinistra}).
-
-L'effetto di questo carattere speciale (@samp{&}) pu@`o essere neutralizzato
-anteponendogli una barra inversa nella stringa. Come al solito, per
-inserire una barra inversa nella
-stringa, occorre scrivere due barre inverse. Quindi, occorre scrivere
-@samp{\\&} in una costante stringa per includere un carattere @samp{&}
-nel rimpiazzo.
-Per esempio, quanto segue mostra come rimpiazzare il primo @samp{|} su
-ogni riga con un @samp{&}:
-
-@example
-@{ sub(/\|/, "\\&"); print @}
-@end example
-
-@cindex @code{sub()}, funzione, argomenti di
-@cindex funzione @code{sub()}, argomenti di
-@cindex @code{gsub()}, funzione, argomenti di
-@cindex funzione @code{gsub()}, argomenti di
-Come gi@`a accennato, il terzo argomento di @code{sub()} dev'essere
-una variabile, un campo, o un elemento di vettore.
-Alcune versioni di @command{awk} accettano come terzo argomento
-un'espressione che non @`e un @dfn{lvalue}. In tal caso, @code{sub()}
-cerca ugualmente l'espressione e restituisce zero o uno, ma il risultato
-della sostituzione (se ce n'@`e uno) viene scartato perch@'e non c'@`e un posto
-dove memorizzarlo. Tali versioni di @command{awk} accettano espressioni
-come le seguente:
-
-@example
-sub(/USA/, "Stati Uniti", "gli USA e il Canada")
-@end example
-
-@noindent
-@cindex risoluzione di problemi, funzioni @code{gsub()}/@code{sub()}
-@cindex problemi, risoluzione di, funzioni @code{gsub()}/@code{sub()}
-Per compatibilit@`a storica, @command{gawk} accetta un tale codice erroneo.
-Tuttavia, l'uso di qualsiasi altra espressione non modificabile
-come terzo parametro causa un errore fatale, e il programma
-non viene portato a termine.
-
-Infine, se la @var{regexp} non @`e una costante @dfn{regexp}, @`e convertita
-in una stringa, e quindi il valore di quella stringa @`e trattato come
-la @dfn{regexp} da individuare.
-
-@item @code{substr(@var{stringa}, @var{inizio}} [@code{, @var{lunghezza}} ]@code{)}
-@cindexawkfunc{substr}
-@cindex sottostringa
-Restituisce una sottostringa di @var{stringa} lunga @var{lunghezza} caratteri,
-iniziando dal carattere numero @var{inizio}. Il primo carattere di una
-stringa @`e il carattere numero uno.@footnote{Questo @`e differente da
-C e C++, in cui il primo carattere ha il numero zero.}
-Per esempio, @code{substr("Washington", 5, 3)} restituisce @code{"ing"}.
-
-Se @var{lunghezza} non @`e presente, @code{substr()} restituisce l'intero
-suffisso di
-@var{stringa} a partire dal carattere numero @var{inizio}. Per esempio,
-@code{substr("Washington", 5)} restituisce @code{"ington"}. L'intero
-suffisso @`e restituito anche
-se @var{lunghezza} @`e maggiore del numero di caratteri disponibili
-nella stringa, a partire dal carattere @var{inizio}.
-
-@cindex Brian Kernighan, @command{awk} di
-Se @var{inizio} @`e minore di uno, @code{substr()} lo tratta come se
-fosse uno. (POSIX non specifica cosa fare in questo caso:
-BWK @command{awk} si comporta cos@`{@dotless{i}}, e quindi @command{gawk} fa lo stesso.)
-Se @var{inizio} @`e maggiore del numero di caratteri
-nella stringa, @code{substr()} restituisce la stringa nulla.
-Analogamente, se @var{lunghezza} @`e presente ma minore o uguale a zero,
-viene restituita la stringa nulla.
-
-@cindex risoluzione di problemi, funzione @code{substr()}
-@cindex problemi, risoluzione di, funzione @code{substr()}
-La stringa restituita da @code{substr()} @emph{non pu@`o} essere
-assegnata. Quindi, @`e un errore tentare di modificare una porzione di
-una stringa, come si vede nel seguente esempio:
-
-@example
-stringa = "abcdef"
-# tentare di ottenere "abCDEf", non @`e possibile
-substr(stringa, 3, 3) = "CDE"
-@end example
-
-@noindent
-@`E anche un errore usare @code{substr()} come terzo argomento
-di @code{sub()} o @code{gsub()}:
-
-@example
-gsub(/xyz/, "pdq", substr($0, 5, 20)) # SBAGLIATO
-@end example
-
-@cindex portabilit@`a, funzione @code{substr()}
-(Alcune versioni commerciali di @command{awk} consentono un tale uso di
-@code{substr()}, ma un tale codice non @`e portabile.)
-
-Se si devono sostituire pezzi di una stringa,
-si combini @code{substr()}
-con una concatenazione di stringa, nel modo seguente:
-
-@example
-stringa = "abcdef"
-@dots{}
-stringa = substr(stringa, 1, 2) "CDE" substr(stringa, 6)
-@end example
-
-@cindex maiuscolo/minuscolo, conversione da/a
-@cindex stringhe, convertire maiuscolo/minuscolo
-@item @code{tolower(@var{stringa})}
-@cindexawkfunc{tolower}
-@cindex convertire stringa in minuscolo
-Restituisce una copia di @var{stringa}, con ogni carattere maiuscolo
-nella stringa rimpiazzato dal suo corrispondente carattere minuscolo.
-I caratteri non alfabetici non vengono modificati. Per esempio,
-@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
-@code{"maiuscolo minuscolo 123"}.
-
-@item @code{toupper(@var{stringa})}
-@cindexawkfunc{toupper}
-@cindex convertire stringa in maiuscolo
-Restituisce una copia di @var{stringa}, con ogni carattere minuscolo
-nella stringa rimpiazzato dal suo corrispondente carattere maiuscolo.
-I caratteri non alfabetici non vengono modificati. Per esempio,
-@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
-@code{"MAIUSCOLO MINUSCOLO 123"}.
-@end table
-
-@cindex sidebar, Individuare la stringa nulla
-@ifdocbook
-@docbook
-<sidebar><title>Individuare la stringa nulla</title>
-@end docbook
-
-@cindex individuare la stringa nulla
-@cindex stringa nulla, individuare la
-@cindex @code{*} (asterisco), operatore @code{*}, individuare la stringa nulla
-@cindex asterisco (@code{*}), operatore @code{*}, individuare la stringa nulla
-
-In @command{awk}, l'operatore @samp{*} pu@`o individuare la stringa nulla.
-Questo @`e particolarmente importante per le funzioni @code{sub()},
-@code{gsub()} e @code{gensub()}. Per esempio:
-
-@example
-$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
-@print{} XaXbXcX
-@end example
-
-@noindent
-Sebbene questo sia abbastanza sensato, pu@`o suscitare una certa sorpresa.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Individuare la stringa nulla}
-
-
-@cindex individuare la stringa nulla
-@cindex stringa nulla, individuare la
-@cindex @code{*} (asterisco), operatore @code{*}, individuare la stringa nulla
-@cindex asterisco (@code{*}), operatore @code{*}, individuare la stringa nulla
-
-In @command{awk}, l'operatore @samp{*} pu@`o individuare la stringa nulla.
-Questo @`e particolarmente importante per le funzioni @code{sub()},
-@code{gsub()} e @code{gensub()}. Per esempio:
-
-@example
-$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
-@print{} XaXbXcX
-@end example
-
-@noindent
-Sebbene questo sia abbastanza sensato, pu@`o suscitare una certa sorpresa.
-@end cartouche
-@end ifnotdocbook
-
-
-@node Dettagli ostici
-@subsubsection Ulteriori dettagli su @samp{\} e @samp{&} con @code{sub()}, @code{gsub()} e @code{gensub()}
-
-@cindex protezione caratteri nelle funzioni @code{gsub()}/@code{gensub()}/@code{sub()}
-@cindex funzione @code{sub()}, protezione caratteri
-@cindex @code{sub()}, funzione, protezione caratteri
-@cindex funzione @code{gsub()}, protezione caratteri
-@cindex @code{gsub()}, funzione, protezione caratteri
-@cindex funzione @code{gensub()} (@command{gawk}), protezione caratteri
-@cindex @code{gensub()}, funzione (@command{gawk}), protezione caratteri
-@cindex @code{\} (barra inversa), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
-@cindex barra inversa (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
-@cindex @code{&} (e commerciale), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
-@cindex e commerciale (@code{&}), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
-
-@quotation ATTENZIONE
-Si dice che questa sottosezione possa causare dei mal di testa.
-In prima lettura pu@`o essere benissimo saltata.
-@end quotation
-
-Quando si usa @code{sub()}, @code{gsub()} o @code{gensub()}, e si
-desidera includere delle
-barre inverse e delle "e commerciali" (@code{&}) nel testo da sostituire
-@`e necessario ricordare che ci sono parecchi livelli di
-@dfn{protezione caratteri} in gioco.
-
-Anzitutto, vi @`e il livello @dfn{lessicale}, quello in cui @command{awk}
-legge un programma e ne costruisce una copia interna da eseguire.
-Poi c'@`e il momento dell'esecuzione, quello in cui @command{awk}
-esamina effettivamente la stringa da sostituire, per determinare cosa
-fare.
-
-@cindex Brian Kernighan, @command{awk} di
-In entrambi i livelli, @command{awk} ricerca un dato insieme di caratteri
-che possono venire dopo una
-barra inversa. A livello lessicale, cerca le sequenze di protezione
-elencate in @ref{Sequenze di protezione}.
-Quindi, per ogni @samp{\} che @command{awk} elabora al momento
-dell'esecuzione, occorre immetterne due a livello lessicale.
-Quando un carattere che non ha necessit@`a di una sequenza di protezione
-segue una @samp{\}, sia BWK @command{awk} che @command{gawk} semplicemente
-rimuovono la @samp{\} stessa e
-mettono il carattere seguente nella stringa. Quindi, per esempio,
-@code{"a\qb"} @`e trattato come se si fosse scritto @code{"aqb"}.
-
-Al momento dell'esecuzione, le varie funzioni gestiscono sequenze di
-@samp{\} e @samp{&} in maniera differente. La situazione @`e (purtroppo)
-piuttosto complessa.
-Storicamente, le funzioni @code{sub()} e @code{gsub()} trattavano la
-sequenza di due caratteri @samp{\&} in maniera speciale; questa sequenza
-era rimpiazzata nel testo
-generato da un singolo carattere @samp{&}. Ogni altra @samp{\} contenuta
-nella stringa @var{rimpiazzo} che non era posta prima di una @samp{&} era
-lasciata passare senza modifiche.
-Questo @`e illustrato nella @ref{table-sub-escapes}.
-
-@c Thank to Karl Berry for help with the TeX stuff.
-@float Tabella,table-sub-escapes
-@caption{Elaborazione storica delle sequenze di protezione per @code{sub()} e @code{gsub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
- @code{\&}! @code{&}!Il testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\\&}! @code{\\&}!I caratteri @samp{\&}_cr
- @code{\\\\\&}! @code{\\&}!I caratteri @samp{\&}_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\\&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\&} @tab @code{&} @tab Il testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\\&} @tab @code{\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\\&} @tab @code{\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\\&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
- Immissione @code{sub()} vede @code{sub()} genera
- --------------- ------------- ---------------
- @code{\&} @code{&} Il testo individuato
- @code{\\&} @code{\&} La lettera @samp{&}
- @code{\\\&} @code{\&} La lettera @samp{&}
- @code{\\\\&} @code{\\&} Le lettere @samp{\&}
- @code{\\\\\&} @code{\\&} Le lettere @samp{\&}
-@code{\\\\\\&} @code{\\\&} Le lettere @samp{\\&}
- @code{\\q} @code{\q} Le lettere @samp{\q}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-@noindent
-Questa tabella mostra l'elaborazione a livello lessicale, in cui
-un numero dispari di barre inverse diventa un numero pari al momento
-dell'esecuzione,
-e mostra anche l'elaborazione in fase di esecuzione fatta da @code{sub()}.
-(Per amor di semplicit@`a le tavole che ancora seguono mostrano solo il caso
-di un numero pari di barre inverse immesso a livello lessicale.)
-
-Il problema con l'approccio storico @`e che non c'@`e modo di ottenere
-un carattere @samp{\} seguito dal testo individuato.
-
-Parecchie edizioni dello standard POSIX hanno provato a risolvere questo
-problema, senza riuscirci. I dettagli sono irrilevanti in questo contesto.
-
-A un certo punto, il manutentore di @command{gawk} ha presentato una
-proposta per una revisione dello standard per tornare
-a regole che corrispondano pi@`u da vicino alla prassi originalmente seguita.
-Le regole proposte hanno dei casi speciali che rendono possibile
-produrre una @samp{\} prima del
-testo individuato. Questo si pu@`o vedere nella
-@ref{table-sub-proposed}.
-
-@float Tabella,table-sub-proposed
-@caption{Regole @command{gawk} per @code{sub()} e barra inversa}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
-@code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
- @code{\\\\}! @code{\\}!@code{\\}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@item @code{\\\\} @tab @code{\\} @tab @code{\\}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
-Immissione @code{sub()} vede @code{sub()} genera
---------- ---------- ---------------
-@code{\\\\\\&} @code{\\\&} Il carattere @samp{\&}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\q} @code{\q} I caratteri @samp{\q}
- @code{\\\\} @code{\\} @code{\\}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-In breve, al momento dell'esecuzione, ci sono ora tre sequenze speciali
-di caratteri (@samp{\\\&}, @samp{\\&}, e @samp{\&}) mentre tradizionalmente
-ce n'era una sola. Tuttavia, come nel caso storico, ogni @samp{\} che
-non fa parte di una di queste tre sequenze non @`e speciale e appare
-nell'output cos@`{@dotless{i}} come @`e scritto.
-
-@command{gawk} 3.0 e 3.1 seguono queste regole per @code{sub()} e
-@code{gsub()}. La revisione dello standard POSIX ha richiesto molto pi@`u tempo
-di quel che ci si attendeva. Inoltre, la proposta del manutentore di
-@command{gawk} @`e andata persa durante il processo di standardizzazione. Le
-regole finali risultanti sono un po' pi@`u semplici. I risultati sono simili,
-tranne che in un caso.
-
-@cindex POSIX @command{awk}, funzioni @code{gsub()}/@code{sub()} e
-Le regole POSIX stabiliscono che @samp{\&} nella stringa di rimpiazzo
-produca il carattere @samp{&}, @samp{\\} produce il carattere @samp{\},
-e che @samp{\} seguito da qualsiasi carattere non @`e speciale; la @samp{\}
-@`e messa direttamente nell'output.
-Queste regole sono presentate nella @ref{table-posix-sub}.
-
-@float Tabella,table-posix-sub
-@caption{Regole POSIX per @code{sub()} e @code{gsub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{sub()} vede!@code{sub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
-@code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\q}! @code{\q}!I caratteri @samp{\q}_cr
- @code{\\\\}! @code{\\}!@code{\}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitemImmissione @tab @code{sub()} vede @tab @code{sub()} genera
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\&} @tab @code{\&} @tab I caratteri @samp{&}
-@item @code{\\q} @tab @code{\q} @tab I caratteri @samp{\q}
-@item @code{\\\\} @tab @code{\\} @tab @code{\}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
-Immissione @code{sub()} vede @code{sub()} genera
---------- ---------- ---------------
-@code{\\\\\\&} @code{\\\&} I caratteri @samp{\&}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\q} @code{\q} I caratteri @samp{\q}
- @code{\\\\} @code{\\} @code{\}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-Il solo caso in cui la differenza @`e rilevante @`e l'ultimo: @samp{\\\\}
-@`e visto come @samp{\\} e produce @samp{\} invece che @samp{\\}.
-
-A partire dalla @value{PVERSION} 3.1.4, @command{gawk} ha seguito le regole
-POSIX quando si specifica @option{--posix} (@pxref{Opzioni}). Altrimenti, ha
-continuato a seguire le regole proposte [a POSIX], poich@'e questa @`e stato il
-comportamento seguito per parecchi anni.
-
-Quando la @value{PVERSION} 4.0.0 @`e stata rilasciata, il manutentore di
-@command{gawk}
-ha stabilito come default le regole POSIX, interrompendo cos@`{@dotless{i}} oltre
-un decennio di compatibilit@`a
-all'indietro.@footnote{Questa decisione si @`e dimostrata piuttosto avventata,
-anche se una nota in questa sezione avvertiva che la successiva versione
-principale di @command{gawk} avrebbe adottato le regole POSIX.}
-Inutile dire che questa non @`e stata una buona idea, e quindi dalla
-@value{PVERSION} 4.0.1, @command{gawk} ha ripreso il suo comportamento
-tradizionale, seguendo le regole POSIX solo quando si specifica l'opzione
-@option{--posix}.
-
-Le regole per @code{gensub()} sono molto pi@`u semplici. Al momento
-dell'esecuzione, quando @command{gawk} vede una @samp{\}, se il carattere
-seguente @`e una cifra,
-il testo individuato dalla corrispondente sottoespressione tra parentesi
-@`e inserito nell'output generato. Altrimenti, qualsiasi carattere segua la
-@samp{\} viene inserito nel testo generato, mentre la @samp{\} va persa,
-come si vede nella @ref{table-gensub-escapes}.
-
-@float Tabella,table-gensub-escapes
-@caption{Elaborazione sequenze di protezione in @code{gensub()}}
-@tex
-\vbox{\bigskip
-% We need more characters for escape and tab ...
-\catcode`_ = 0
-\catcode`! = 4
-% ... since this table has lots of &'s and \'s, so we unspecialize them.
-\catcode`\& = \other \catcode`\\ = \other
-_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
- Immissione!@code{gensub()} vede!@code{gensub()} genera_cr
-_hrulefill!_hrulefill!_hrulefill_cr
- @code{&}! @code{&}!Il testo individuato_cr
- @code{\\&}! @code{\&}!Il carattere @samp{&}_cr
- @code{\\\\}! @code{\\}!Il carattere @samp{\}_cr
- @code{\\\\&}! @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
-@code{\\\\\\&}! @code{\\\&}!I caratteri @samp{\&}_cr
- @code{\\q}! @code{\q}!Il carattere @samp{q}_cr
-}
-_bigskip}
-@end tex
-@ifdocbook
-@multitable @columnfractions .20 .20 .60
-@headitem Immissione @tab @code{gensub()} vede @tab @code{gensub()} genera
-@item @code{&} @tab @code{&} @tab Il testo individuato
-@item @code{\\&} @tab @code{\&} @tab Il carattere @samp{&}
-@item @code{\\\\} @tab @code{\\} @tab Il carattere @samp{\}
-@item @code{\\\\&} @tab @code{\\&} @tab Il carattere @samp{\}, seguito dal testo individuato
-@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
-@item @code{\\q} @tab @code{\q} @tab Il carattere @samp{q}
-@end multitable
-@end ifdocbook
-@ifnottex
-@ifnotdocbook
-@display
- Immissione @code{gensub()} vede @code{gensub()} genera
- --------- ------------- ------------------
- @code{&} @code{&} Il testo individuato
- @code{\\&} @code{\&} Il carattere @samp{&}
- @code{\\\\} @code{\\} Il carattere @samp{\}
- @code{\\\\&} @code{\\&} Il carattere @samp{\}, seguito dal testo individuato
-@code{\\\\\\&} @code{\\\&} I caratteri @samp{\&}
- @code{\\q} @code{\q} Il carattere @samp{q}
-@end display
-@end ifnotdocbook
-@end ifnottex
-@end float
-
-A causa della complessit@`a dell'elaborazione a livello lessicale e in fase
-di esecuzione, e dei casi speciali di @code{sub()} e @code{gsub()},
-si raccomanda l'uso di @command{gawk} e di @code{gensub()} quando ci siano
-da fare delle sostituzioni.
-
-@node Funzioni di I/O
-@subsection Funzioni di Input/Output
-@cindex input/output, funzioni di
-@cindex funzioni di input/output
-
-Le seguenti funzioni riguardano l'input/output (I/O).
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@table @asis
-@item @code{close(}@var{nome_file} [@code{,} @var{come}]@code{)}
-@cindexawkfunc{close}
-@cindex file, chiusura
-@cindex chiudere un file o un coprocesso
-Chiude il file @var{nome_file} in input o in output. Alternativamente,
-l'argomento pu@`o essere un comando della shell usato per creare un
-coprocesso, o per ridirigere
-verso o da una @dfn{pipe}; questo coprocesso o @dfn{pipe} viene chiuso.
-@xref{Chiusura file e @dfn{pipe}}
-per ulteriori informazioni.
-
-Quando si chiude un coprocesso, pu@`o talora essere utile chiudere dapprima
-un lato della @dfn{pipe} bidirezionale e quindi chiudere l'altro.
-Questo si pu@`o fare fornendo un secondo argomento a @code{close()}.
-Questo secondo argomento (@var{come})
-dovrebbe essere una delle due stringhe @code{"to"} o @code{"from"},
-che indicano quale lato della @dfn{pipe} chiudere. La stringa pu@`o essere
-scritta indifferentemente in maiuscolo o in minuscolo.
-@xref{I/O bidirezionale},
-che tratta questa funzionalit@`a con maggior dettaglio e mostra un esempio.
-
-Si noti che il secondo argomento di @code{close()} @`e
-un'estensione @command{gawk}; non @`e disponibile in modalit@`a compatibile
-(@pxref{Opzioni}).
-
-@item @code{fflush(}[@var{nome_file}]@code{)}
-@cindexawkfunc{fflush}
-@cindex scrivere su disco i buffer di output contenuti in memoria
-Scrive su disco ogni output contenuto in memoria, associato con
-@var{nome_file}, che @`e o un
-file aperto in scrittura o un comando della shell che ridirige output a
-una @dfn{pipe} o a un coprocesso.
-
-@cindex buffer, scrivere su disco un
-@cindex memoria tampone, scrivere su disco
-@cindex output, bufferizzazione
-@cindex output, nella memoria tampone (buffer)
-Molti programmi di utilit@`a @dfn{bufferizzano} il loro output (cio@`e,
-accumulano in memoria record da scrivere in un file su disco o sullo
-schermo, fin quando non arriva il momento giusto per inviare i
-dati al dispositivo di output).
-Questo @`e spesso pi@`u efficiente che scrivere
-ogni particella di informazione non appena diventa disponibile. Tuttavia,
-qualche volta @`e necessario forzare un programma a @dfn{svuotare}
-i suoi buffer (cio@`e, inviare l'informazione alla sua destinazione,
-anche se un buffer non @`e pieno).
-Questo @`e lo scopo della funzione @code{fflush()}; anche
-@command{gawk} scrive il suo output in un buffer, e la funzione @code{fflush()}
-forza @command{gawk} a svuotare i suoi buffer.
-
-@cindex estensioni comuni, funzione @code{fflush()}
-@cindex Brian Kernighan, @command{awk} di
-Brian Kernighan ha aggiunto @code{fflush()} al suo @command{awk} nell'aprile
-1992. Per due decenni @`e rimasta un'estensione comune. A Dicembre
-2012 @`e stata accettata e inclusa nello standard POSIX.
-Si veda @uref{http://austingroupbugs.net/view.php?id=634, il sito Web dell'Austin Group}.
-
-POSIX standardizza @code{fflush()} come segue: se non c'@`e alcun
-argomento, o se l'argomento @`e la stringa nulla (@w{@code{""}}),
-@command{awk} svuota i buffer di @emph{tutti} i file in output e di
-@emph{tutte} le @dfn{pipe}.
-
-@quotation NOTA
-Prima della @value{PVERSION} 4.0.2, @command{gawk}
-avrebbe svuotato solo i buffer dello standard output se non era
-specificato alcun argomento,
-e svuotato tutti i buffer dei file in output e delle @dfn{pipe} se
-l'argomento era la stringa nulla.
-Questo @`e stato modificato per essere compatibile con l'@command{awk} di
-Kernighan, nella speranza che standardizzare questa
-funzionalit@`a in POSIX sarebbe stato pi@`u agevole (come poi @`e effettivamente
-successo).
-
-Con @command{gawk},
-si pu@`o usare @samp{fflush("/dev/stdout")} se si desidera solo svuotare i
-buffer dello standard output.
-@end quotation
-
-@c @cindex automatic warnings
-@c @cindex warnings, automatic
-@cindex risoluzione di problemi, funzione @code{fflush()}
-@cindex problemi, risoluzione di, funzione @code{fflush()}
-@code{fflush()} restituisce zero se il buffer @`e svuotato con successo;
-altrimenti, restituisce un valore diverso da zero. (@command{gawk}
-restituisce @minus{}1.)
-Nel caso in cui tutti i buffer vadano svuotati, il valore restituito @`e zero
-solo se tutti i buffer sono stati svuotati con successo. Altrimenti,
-@`e @minus{}1, e @command{gawk} avvisa riguardo al @var{nome_file}
-che ha problemi.
-
-@command{gawk} invia anche un messaggio di avvertimento se si tenta di svuotare i
-buffer di un file o @dfn{pipe} che era stato aperto in lettura
-(p.es. con @code{getline}),
-o se @var{nome_file} non @`e un file, una @dfn{pipe}, o un coprocesso aperto.
-in tal caso, @code{fflush()} restituisce ancora @minus{}1.
-
-@cindex sidebar, Bufferizzazione interattiva e non interattiva
-@ifdocbook
-@docbook
-<sidebar><title>Bufferizzazione interattiva e non interattiva</title>
-@end docbook
-
-@cindex bufferizzazione, interattiva vs.@: non interattiva
-
-A complicare ulteriormente le cose, i problemi di bufferizzazione possono
-peggiorare se il programma eseguito
-@`e @dfn{interattivo} (cio@`e, se
-comunica con un utente seduto davanti a una tastiera).@footnote{Un programma
-@`e interattivo se il suo standard output @`e connesso a un dispositivo
-terminale. Ai giorni nostri, questo vuol dire davanti a uno
-schermo e a una tastiera.}
-
-@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
-@c motivating me to write this section.
-I programmi interattivi normalmente @dfn{bufferizzano per riga} il loro
-output (cio@`e, scrivono in output una riga alla volta). I programmi
-non-interattivi attendono di aver riempito un buffer, il che pu@`o voler dire
-anche parecchie righe di output.
-Ecco un esempio della differenza:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}'}
-@kbd{1 1}
-@print{} 2
-@kbd{2 3}
-@print{} 5
-@kbd{Ctrl-d}
-@end example
-
-@noindent
-Ogni riga di output @`e stampata immediatamente. Si confronti questo
-comportamente con quello di questo esempio:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}' | cat}
-@kbd{1 1}
-@kbd{2 3}
-@kbd{Ctrl-d}
-@print{} 2
-@print{} 5
-@end example
-
-@noindent
-In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
-@kbd{Ctrl-d}, perch@'e l'output @`e bufferizzato e inviato tramite
-@dfn{pipe} al comando @command{cat} in un colpo solo.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Bufferizzazione interattiva e non interattiva}
-
-
-@cindex bufferizzazione, interattiva vs.@: non interattiva
-
-A complicare ulteriormente le cose, i problemi di bufferizzazione possono
-peggiorare se il programma eseguito
-@`e @dfn{interattivo} (cio@`e, se
-comunica con un utente seduto davanti a una tastiera).@footnote{Un programma
-@`e interattivo se il suo standard output @`e connesso a un dispositivo
-terminale. Ai giorni nostri, questo vuol dire davanti a uno
-schermo e a una tastiera.}
-
-@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
-@c motivating me to write this section.
-I programmi interattivi normalmente @dfn{bufferizzano per riga} il loro
-output (cio@`e, scrivono in output una riga alla volta). I programmi
-non-interattivi attendono di aver riempito un buffer, il che pu@`o voler dire
-anche parecchie righe di output.
-Ecco un esempio della differenza:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}'}
-@kbd{1 1}
-@print{} 2
-@kbd{2 3}
-@print{} 5
-@kbd{Ctrl-d}
-@end example
-
-@noindent
-Ogni riga di output @`e stampata immediatamente. Si confronti questo
-comportamente con quello di questo esempio:
-
-@example
-$ @kbd{awk '@{ print $1 + $2 @}' | cat}
-@kbd{1 1}
-@kbd{2 3}
-@kbd{Ctrl-d}
-@print{} 2
-@print{} 5
-@end example
-
-@noindent
-In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
-@kbd{Ctrl-d}, perch@'e l'output @`e bufferizzato e inviato tramite
-@dfn{pipe} al comando @command{cat} in un colpo solo.
-@end cartouche
-@end ifnotdocbook
-
-@item @code{system(@var{comando})}
-@cindexawkfunc{system}
-@cindex chiamare comandi di shell
-@cindex interagire con altri programmi
-Esegue il comando del sistema operativo @var{comando} e quindi
-ritorna al programma @command{awk}.
-Restituisce il codice ritorno di @var{comando}.
-
-Per esempio, inserendo il seguente frammento di codice in un programma
-@command{awk}:
-
-@example
-END @{
- system("date | mail -s 'awk completato' root")
-@}
-@end example
-
-@noindent
-all'amministratore di sistema viene inviato un messaggio di posta quando
-il programma @command{awk} termina di elaborare l'input e inizia
-l'elaborazione da eseguire alla fine dell'input.
-
-Si noti che la ridirezione di @code{print} o @code{printf} in una
-@dfn{pipe} @`e spesso sufficiente per ottenere lo stesso risultato.
-Se @`e necessario eseguire parecchi comandi, @`e pi@`u efficiente
-stamparli verso una @dfn{pipe} diretta alla shell:
-
-@example
-while (@var{ancora lavoro da fare})
- print @var{comando} | "/bin/sh"
-close("/bin/sh")
-@end example
-
-@noindent
-@cindex risoluzione di problemi, funzione @code{system()}
-@cindex problemi, risoluzione di, funzione @code{system()}
-@cindex @option{--sandbox}, opzione, disabilitare la funzione @code{system()}
-@cindex opzione @option{--sandbox}, disabilitare la funzione @code{system()}
-Tuttavia, nel caso che il programma @command{awk} sia interattivo,
-@code{system()} @`e utile per eseguire grossi programmi autonomi,
-come ad esempio la shell o un programma di modifica testi.
-Alcuni sistemi operativi non consentono di implementare la funzione
-@code{system()}.
-Richiamare @code{system()} in sistemi in cui non @`e disponibile provoca
-un errore fatale.
-
-@quotation NOTA
-Quando si specifica l'opzione @option{--sandbox}, la funzione @code{system()} @`e
-disabilitata (@pxref{Opzioni}).
-@end quotation
-
-Nei sistemi aderenti allo standard POSIX, il codice di ritorno di un
-comando @`e un numero contenuto in 16 bit. Il valore del codice di ritorno
-passato alla funzione C @code{exit()} alla fine del programma @`e contenuto
-negli 8 bit di valore pi@`u alto dei 16 bit (la met@`a sinistra) che compongono
-il numero. I bit di valore pi@`u basso (la met@`a destra) indicano se il
-processo @`e stato terminato da un segnale (bit 7), e, se questo @`e il caso,
-il numero del segnale che ha provocato la terminazione (bit 0--6).
-
-Tradizionalmente, la funzione @code{system()} di @command{awk} si @`e
-semplicemente limitata a restituire il valore del codice di ritorno
-diviso per 256 (ossia la met@`a sinistra del numero di 16 bit, spostata
-a destra). In una situazione normale questo equivale a utilizzare il
-codice di ritornodi @code{system()}, ma nel caso in cui il programma sia
-stato terminato da un segnale, il valore diventa un numero frazionale a
-virgola mobile.@footnote{In uno scambio di messaggi privato il Dr.@:
-Kernighan mi ha comunicato che questo modo di procedere @`e probabilmente
-errato.} POSIX stabilisce che la chiamata a @code{system()} dall'interno
-di @command{awk} dovrebbe restituire l'intero valore a 16 bit.
-
-@command{gawk} si trova in qualche modo a met@`a strada.
-I valori del codice di ritorno sono descritti nella
-@ref{table-system-return-values}.
-
-@float Tabella,table-system-return-values
-@caption{Valori codici di ritorno da chiamata a @code{system()}}
-@multitable @columnfractions .40 .60
-@headitem Situazione @tab Valore codice di ritorno da @code{system()}
-@item @option{--traditional} @tab Valore dalla funzione C @code{system()}/256
-@item @option{--posix} @tab Valore dalla funzione C @code{system()}
-@item Uscita normale dal comando @tab Codice di ritorno del comando
-@item Terminazione da un segnale @tab 256 + numero segnale "assassino"
-@item Terminazione da un segnale con dump memoria @tab 512 + numero segnale "assassino"
-@item Qualsiasi tipo di errore @tab @minus{}1
-@end multitable
-@end float
-@end table
-
-@cindex sidebar, Controllare la bufferizzazione dell'output con @code{system()}
-@ifdocbook
-@docbook
-<sidebar><title>Controllare la bufferizzazione dell'output con @code{system()}</title>
-@end docbook
-
-@cindex buffer, scrivere su disco un
-@cindex bufferizzazione, dell'input/output
-@cindex output, bufferizzazione
-@cindex bufferizzazione, dell'output
-
-La funzione @code{fflush()} consente un controllo esplicito sulla
-bufferizzazione dell'output per singoli file e @dfn{pipe}.
-Tuttavia, il suo utilizzo non @`e portabile su molte delle meno recenti
-implementazioni di @command{awk}. Un metodo alternativo per forzare la
-scrittura dell'output @`e una chiamata a
-@code{system()} che abbia come argomento la stringa nulla:
-
-@example
-system("") # scrive l'output su disco
-@end example
-
-@noindent
-@command{gawk} tratta questo uso della funzione @code{system()} come un
-caso speciale, e si guarda bene dall'invocare la shell (o un altro
-interprete di comandi) con un comando nullo.
-Quindi, con @command{gawk}, questa maniera di procedere non @`e solo utile,
-ma @`e anche efficiente.
-Questo metodo dovrebbe funzionare anche con
-altre implementazioni di @command{awk}, ma non @`e detto che eviti una
-invocazione non necessaria della shell. (Altre implementazioni potrebbero
-limitarsi a forzare la scrittura del buffer associato con lo
-standard output, e non necessariamente di tutto l'output bufferizzato.)
-
-Avendo in mente le attese di un programmatore, sarebbe sensato che
-@code{system()} forzi la scrittura su disco di tutto l'output disponibile.
-Il programma seguente:
-
-@example
-BEGIN @{
- print "prima riga stampata"
- system("echo system echo")
- print "seconda riga stampata"
-@}
-@end example
-
-@noindent
-deve stampare:
-
-@example
-prima riga stampata
-system echo
-seconda riga stampata
-@end example
-
-@noindent
-e non:
-
-@example
-system echo
-prima riga stampata
-seconda riga stampata
-@end example
-
-Se @command{awk} non forzasse la scrittura dei suoi buffer prima di
-invocare @code{system()}, l'output sarebbe quest'ultimo (quello non voluto).
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Controllare la bufferizzazione dell'output con @code{system()}}
-
-
-@cindex buffer, scrivere su disco un
-@cindex bufferizzazione, dell'input/output
-@cindex output, bufferizzazione
-@cindex bufferizzazione, dell'output
-
-La funzione @code{fflush()} consente un controllo esplicito sulla
-bufferizzazione dell'output per singoli file e @dfn{pipe}.
-Tuttavia, il suo utilizzo non @`e portabile su molte delle meno recenti
-implementazioni di @command{awk}. Un metodo alternativo per forzare la
-scrittura dell'output @`e una chiamata a
-@code{system()} che abbia come argomento la stringa nulla:
-
-@example
-system("") # scrive l'output su disco
-@end example
-
-@noindent
-@command{gawk} tratta questo uso della funzione @code{system()} come un
-caso speciale, e si guarda bene dall'invocare la shell (o un altro
-interprete di comandi) con un comando nullo.
-Quindi, con @command{gawk}, questa maniera di procedere non @`e solo utile,
-ma @`e anche efficiente.
-Questo metodo dovrebbe funzionare anche con
-altre implementazioni di @command{awk}, ma non @`e detto che eviti una
-invocazione non necessaria della shell. (Altre implementazioni potrebbero
-limitarsi a forzare la scrittura del buffer associato con lo
-standard output, e non necessariamente di tutto l'output bufferizzato.)
-
-Avendo in mente le attese di un programmatore, sarebbe sensato che
-@code{system()} forzi la scrittura su disco di tutto l'output disponibile.
-Il programma seguente:
-
-@example
-BEGIN @{
- print "prima riga stampata"
- system("echo system echo")
- print "seconda riga stampata"
-@}
-@end example
-
-@noindent
-deve stampare:
-
-@example
-prima riga stampata
-system echo
-seconda riga stampata
-@end example
-
-@noindent
-e non:
-
-@example
-system echo
-prima riga stampata
-seconda riga stampata
-@end example
-
-Se @command{awk} non forzasse la scrittura dei suoi buffer prima di
-invocare @code{system()}, l'output sarebbe quest'ultimo (quello non voluto).
-@end cartouche
-@end ifnotdocbook
-
-@node Funzioni di tempo
-@subsection Funzioni per gestire marcature temporali
-@cindex funzioni di tempo
-
-@cindex marcature temporali
-@cindex data e ora, si veda marcature temporali
-@cindex @dfn{log} (registro), file di, marcature temporali nei
-@cindex registro (@dfn{log}), file di, marcature temporali nel
-@cindex file di registro (@dfn{log}), marcature temporali nei
-@cindex @command{gawk}, data e ora (marcature temporali)
-@cindex POSIX @command{awk}, marcature temporali e
-I programmi @command{awk} sono frequentemente usati per elaborare file di
-registro [file con estensione .log], che contengono l'informazione sulla data e
-l'ora (marcatura temporale) in cui un particolare record @`e stato registrato sul log.
-Molti programmi registrano questa informazione nel formato restituito
-dalla chiamata di sistema @code{time()}, la quale misura il numero di secondi
-trascorsi a partire da una certa data iniziale (Epoca). Nei sistemi aderenti
-allo standard POSIX, questo @`e il numero di secondi a partire dal primo gennaio
-1970, ora di Greenwich (1970-01-01 00:00:00 UTC), senza includere i secondi
-@ifclear FOR_PRINT
-@iftex
-intercalari.@footnote{@xrefIl{Glossario},
-@end iftex
-@ifnottex
-intercalari.@footnote{@xref{Glossario},
-@end ifnottex
-in particolare le voci ``Epoca'' e ``UTC.''}
-@end ifclear
-@ifset FOR_PRINT
-intercalari.
-@end ifset
-Tutti i sistemi noti aderenti allo standard POSIX gestiscono le marcature
-temporali da 0 fino a
-@iftex
-@math{2^{31} - 1},
-@end iftex
-@ifinfo
-2^31 - 1,
-@end ifinfo
-@ifnottex
-@ifnotinfo
-2@sup{31} @minus{} 1,
-@end ifnotinfo
-@end ifnottex
-il che @`e sufficiente per rappresentare date e ore fino a inizio 2038
-(2038-01-19 03:14:07 UTC). Molti sistemi supportano una maggiore estensione
-di date, compresi dei valori negativi per rappresentare delle date
-anteriori all'Epoca.
-
-@cindex @command{date}, programma di utilit@`a GNU
-@cindex programma di utilit@`a @command{date} GNU
-@cindex tempo, ottenerlo
-Per facilitare l'elaborazione di tali file di registro, e per produrre
-dei rapporti utili, @command{gawk} prevede le seguenti funzioni per
-lavorare con le marcature temporali. Si tratta di estensioni @command{gawk};
-non sono previste nello standard POSIX.@footnote{Il comando di utilit@`a GNU
-@command{date} pu@`o fare anche molte delle cose qui descritte. Pu@`o essere
-preferibile usarlo per semplici operazioni relative a data e ora in semplici
-script della shell.} Tuttavia, anche versioni recenti di @command{mawk}
-(@pxref{Altre versioni}) prevedono queste funzioni. I parametri facoltativi
-sono racchiusi tra parentesi quadre ([ ]):
-
-@c @asis for docbook
-@table @asis
-@item @code{mktime(@var{specifiche_data}} [@code{, @var{utc-flag}} ]@code{)}
-@cindexgawkfunc{mktime}
-@cindex generare data e ora
-Trasforma @var{specifiche_data} in una marcatura temporale nello stesso formato
-restituito da @code{systime()}. @`E simile alla funzione omonima
-in ISO C. L'argomento, @var{specifiche_data}, @`e una stringa della forma
-@w{@code{"@var{AAAA} @var{MM} @var{GG} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}.
-La stringa consiste di sei o sette numeri che rappresentano,
-rispettivamente,
-l'anno in quattro cifre, il mese da 1 a 12, il giorno del mese
-da 1 a 31, l'ora del giorno da 0 a 23, il minuto da 0 a
-59, il secondo da 0 a 60,@footnote{Occasionalmente ci sono dei
-minuti in un anno con un secondo intercalare, il che spiega perch@'e i
-secondi possono arrivare fino a 60.}
-e un'indicazione opzionale relativa all'ora legale.
-
-I valori di questi numeri possono non essere negli intervalli specificati; per
-esempio, un'ora di @minus{}1 sta a indicare 1 ora prima di mezzanotte.
-Viene adottato il calendario gregoriano con l'origine posta all'anno zero,
-con l'anno 0 che viene prima dell'anno 1 e l'anno @minus{}1 che viene prima
-dell'anno 0. Se il flag @var{utc-flag} @`e specificato ed @`e diverso da zero
-e dalla stringa nulla, si suppone che l'ora sia quella del fuso orario UTC;
-altrimenti l'ora @`e considerata essere quella del fuso orario locale. Se
-l'indicatore dell'ora legale @`e positivo, si presuppone che l'ora sia quella
-legale; se @`e 0, l'ora considerata @`e quella di Greenwich (standard time); se
-invece @`e negativo (questo @`e il default), @code{mktime()} tenta di
-determinare se @`e in vigore l'ora legale o no, nel momento specificato.
-
-Se @var{specifiche_data} non contiene elementi in numero sufficiente, o se
-la data e ora risultante sono fuori dall'intervallo previsto,
-@code{mktime()} restituisce @minus{}1.
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-@item @code{strftime(}[@var{formato} [@code{,} @var{data_e_ora} [@code{,} @var{utc}] ] ]@code{)}
-@cindexgawkfunc{strftime}
-@cindex formato stringa marcature temporali
-@cindex formato stringa data e ora
-@cindex data e ora, formato stringa
-@cindex marcature temporali, formato stringa
-Formatta la data e ora specificata da @var{data_e_ora} in base alle indicazioni
-contenute nella stringa @var{formato} e restituisce il risultato.
-@`E simile alla funzione omonima in ISO C.
-Se @var{utc} @`e presente ed @`e diverso da zero o dalla stringa nulla,
-il valore @`e formattato come UTC (Tempo Coordinato Universale,
-gi@`a noto come GMT o Tempo Medio di Greenwich).
-Altrimenti, il valore @`e formattato per il fuso orario locale.
-La stringa @var{data_e_ora} @`e nello stesso formato del valore restituito
-dalla funzione @code{systime()}. Se non si specifica l'argomento
-@var{data_e_ora}, @command{gawk} usa l'ora del giorno corrente per la
-formattazione.
-Omettendo l'argomento @var{formato}, @code{strftime()} usa
-il valore di @code{PROCINFO["strftime"]} come stringa di formattazione
-(@pxref{Variabili predefinite}).
-Il valore di default della stringa @`e
-@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}. Questa stringa di formattazione
-produce lo stesso output del programma di utilit@`a equivalente
-@command{date}.
-Si pu@`o assegnare un nuovo valore a @code{PROCINFO["strftime"]} per
-modificare la formattazione di default; si veda
-la lista che segue per le varie direttive di formattazione.
-
-@item @code{systime()}
-@cindexgawkfunc{systime}
-@cindex marcature temporali
-@cindex data e ora, si veda marcature temporali
-@cindex data e ora corrente del sistema
-Restituisce l'ora corrente come numero di secondi a partire dall'Epoca
-del sistema. Sui sistemi aderenti allo standard POSIX, questo @`e il numero
-di secondi trascorsi a partire dal primo gennaio 1970, ora di Greenwich
-(1970-01-01 00:00:00 UTC), senza includere i secondi intercalari.
-@end table
-
-La funzione @code{systime()} consente di confrontare una marcatura temporale
-in un file di registro con la data e ora correnti. In particolare, @`e facile
-determinare quanto tempo prima un particolare record @`e stato registrato.
-@`E anche possibile produrre record di registro usando il formato
-``secondi a partire dall'Epoca''.
-
-@cindex conversione di date in marcature temporali
-@cindex date, conversione in marcature temporali
-@cindex marcature temporali, conversione date nelle
-La funzione @code{mktime()} consente di convertire una rappresentazione in
-forma testuale di una data e ora in una marcatura temporale.
-Questo semplifica i confronti prima/dopo tra differenti date e ore, in
-particolare quando si abbia a che fare con date e ore provenienti da una
-fonte esterna, come un file di registro.
-
-La funzione @code{strftime()} permette di trasformare facilmente una marcatura
-temporale in un'informazione intelligibile. @`E analoga come tipo alla funzione
-@code{sprintf()} (@pxref{Funzioni per stringhe}), nel senso che copia
-letteralmente ci@`o che non @`e una specifica di formato nella stringa che viene
-restituita, mentre sostituisce i valori di data e ora a seconda delle
-specifiche di formato contenute nella stringa @var{formato}.
-
-@cindex specificatori di formato, funzione @code{strftime()} di (@command{gawk})
-@cindex formato, specificatori di, funzione @code{strftime()} di (@command{gawk})
-Per @code{strftime()} lo standard
-1999 ISO C@footnote{Sfortunatamente,
-non tutte le funzioni @code{strftime()} dei vari sistemi operativi
-ammettono tutte le conversioni qui elencate.}
-consente le seguenti specifiche di formattazione delle date:
-
-@table @code
-@item %a
-Il nome abbreviato del giorno della settimana nella lingua locale.
-
-@item %A
-Il nome completo del giorno della settimana nella lingua locale.
-
-@item %b
-Il nome abbreviato del mese dell'anno nella lingua locale.
-
-@item %B
-Il nome completo del mese dell'anno nella lingua locale.
-
-@item %c
-Il formato ``appropriato'' della rappresentazione della data e ora
-nella lingua locale.
-(Questo @`e @samp{%A %B %d %T %Y} per la localizzazione @code{"C"}.)
-
-@item %C
-La parte che designa il secolo nell'anno corrente.
-Si ottiene dividendo per 100 l'anno, e
-troncando verso il basso
-all'intero pi@`u vicino.
-
-@item %d
-Il giorno del mese come numero decimale (01--31).
-
-@item %D
-Equivale a specificare @samp{%m/%d/%y}.
-
-@item %e
-Il giorno del mese, preceduto da uno spazio se di tratta di una cifra sola.
-
-@item %F
-Equivale a specificare @samp{%Y-%m-%d}.
-Questo @`e il formato ISO 8601 della data.
-
-@item %g
-L'anno (ultime due cifre) ricavato prendendo il resto della divisione per 100
-dell'anno a cui appartiene la settimana, secondo ISO 8601, come numero decimale
-(00--99). Per esempio, il primo gennaio 2012, fa parte della settimana 53 del
-2011. Quindi, l'anno relativo al numero di settimana ISO di quella data @`e 2011
-(ossia 11), anche se la data in s@'e @`e nel 2012. Analogamente, il 31 dicembre
-2012, @`e nella prima settimana del 2013. Quindi, l'anno relativo al numero di
-settimana ISO di quella data @`e 2013 (ossia 13), anche se la data in s@'e @`e nel
-2012.
-
-@item %G
-L'anno intero relativo al numero di settimana ISO, come numero decimale.
-
-@item %h
-Equivalente a @samp{%b}.
-
-@item %H
-L'ora (in un orologio a 24 ore) come numero decimale (00--23).
-
-@item %I
-L'ora (in un orologio a 12 ore) come numero decimale (01--12).
-
-@item %j
-Il giorno dell'anno come numero decimale (001--366).
-
-@item %m
-Il mese come numero decimale (01--12).
-
-@item %M
-Il minuto come numero decimale (00--59).
-
-@item %n
-Un carattere di ritorno a capo (ASCII LF).
-
-@item %p
-L'equivalente nella lingua locale delle designazioni AM/PM
-(mattino/pomerigggio) associate a un orologio a 12 ore.
-
-@item %r
-L'ora locale nel formato a 12 ore.
-(Questo @`e @samp{%I:%M:%S %p} nella localizzazione @code{"C"}.)
-
-@item %R
-Equivalente a specificare @samp{%H:%M}.
-
-@item %S
-Il secondo come numero decimale (00--60).
-
-@item %t
-Un carattere di tabulazione [TAB].
-
-@item %T
-Equivalente a specificare @samp{%H:%M:%S}.
-
-@item %u
-Il numero del giorno della settimana come numero decimale (1--7).
-Luned@`{@dotless{i}} @`e il giorno numero 1.
-
-@item %U
-Il numero di settimana dell'anno (con la prima domenica dell'anno presa
-come primo giorno della prima settimana) come numero decimale (00--53).
-
-@c @cindex ISO 8601
-@item %V
-Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} dell'anno preso
-come primo giorno della prima settimana) come numero decimale (01--53).
-Il metodo per determinare il numero di settimana @`e quello specificato
-dallo standard ISO 8601.
-(In pratica: se la settimana che contiene il primo gennaio ha quattro o
-pi@`u giorni nel nuovo anno, allora
-@`e la settimana numero uno; altrimenti @`e l'ultima settimana
-[52 o 53] dell'anno
-precedente, e la settimana successiva @`e la settimana numero uno.)
-
-@item %w
-Il giorno della settimana come numero decimale (0--6).
-Domenica @`e il giorno zero.
-
-@item %W
-Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} come primo giorno
-della settimana numero uno)
-come numero decimale (00--53).
-
-@item %x
-Il formato ``appropriato'' della rappresentazione della data
-nella lingua locale.
-(Questo @`e @samp{%A %B %d %Y} nella localizzazione @code{"C"}.)
-
-@item %X
-Il formato ``appropriato'' della rappresentazione della data.
-(Questo @`e @samp{%T} nella localizzazione @code{"C"}.)
-
-@item %y
-L'anno modulo 100 (le ultime due cifre) come numero decimale (00--99).
-
-@item %Y
-L'anno come numero decimale (p.es., 2015).
-
-@c @cindex RFC 822
-@c @cindex RFC 1036
-@item %z
-La differenza di fuso orario [rispetto all'ora di Greenwich] in formato
-@samp{+@var{OOMM}} (p.es., il
-formato necessario per produrre intestazioni di data conformi agli standard
-RFC 822/RFC 1036).
-
-@item %Z
-Il nome o l'abbreviazione della zona di fuso orario (@dfn{time zone}); se il fuso
-orario non @`e determinabile, @`e impostata alla stringa nulla.
-
-@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
-@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
-``notazioni alternative'' di specifica
-in cui solo la seconda lettera (@samp{%c}, @samp{%C} e cos@`{@dotless{i}} via) @`e
-significativa.@footnote{Se questo risulta incomprensibile, non @`e il
-caso di preoccuparsi; queste notazioni hanno lo scopo di facilitare
-la ``internazionalizzazione'' dei programmi.
-Altre funzionalit@`a di internazionalizzazione sono descritte in
-@ref{Internazionalizzazione}.}
-(Queste facilitano la compatibilit@`a con il programma di utilit@`a
-POSIX @command{date}.)
-
-@item %%
-Un singolo carattere @samp{%}.
-@end table
-
-Se uno specificatore di conversione non @`e tra quelli elencati sopra, il
-comportamento @`e indefinito.@footnote{Questo @`e perch@'e ISO C lascia
-indefinito il comportamento della versione C di @code{strftime()} e
-@command{gawk} usa la versione di sistema di @code{strftime()},
-se disponibile.
-Tipicamente, lo specificatore di conversione "non previsto" non appare
-nella stringa risultante, o appare cos@`{@dotless{i}} come @`e scritto.}
-
-Per sistemi che non aderiscono completamente agli standard
-@command{gawk} utilizza una copia di
-@code{strftime()} dalla libreria C di GNU.
-Sono disponibili tutte le specifiche di formato sopra elencate.
-Se la detta versione @`e
-usata per compilare @command{gawk} (@pxref{Installazione}),
-sono disponibili anche le seguenti ulteriori specifiche di formato:
-
-@table @code
-@item %k
-L'ora (in un orologio a 24 ore) come numero decimale (0--23).
-I numeri di una sola cifra sono preceduti da uno spazio bianco.
-
-@item %l
-L'ora (in un orologio a 12 ore) come numero decimale (1--12).
-I numeri di una sola cifra sono preceduti da uno spazio bianco.
-
-@ignore
-@item %N
-Il nome dell'``Imperatore/Era''.
-Equivalente a @samp{%C}.
-
-@item %o
-L'anno dell'``Imperatore/Era''.
-Equivalente a @samp{%y}.
-@end ignore
-
-@item %s
-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}).
-@end ignore
-@end table
-
-In aggiunta a ci@`o, le notazioni alternative sono riconosciute, ma al
-loro posto sono usate quelle normali.
-
-@cindex @code{date}, programma di utilit@`a POSIX
-@cindex programma di utilit@`a POSIX @code{date}
-@cindex POSIX @command{awk}, programma di utilit@`a @code{date} e
-Il seguente esempio @`e un'implementazione @command{awk} del
-programma di utilit@`a POSIX @command{date}.
-Normalmente, il programma di utilit@`a @command{date} stampa la
-data e l'ora corrente nel formato ben noto. Tuttavia, se si
-specifica al comando un argomento che inizia con un @samp{+}, @command{date}
-copia i caratteri che non sono specifiche di formato nello standard output
-e interpreta l'ora corrente secondo gli specificatori di formato
-contenuti nella stringa. Per esempio:
-
-@example
-$ @kbd{date '+Oggi @`e %A, %d %B %Y.'}
-@print{} Oggi @`e luned@`{@dotless{i}}, 22 settembre 2014.
-@end example
-
-Ecco la versione @command{gawk} del programma di utilit@`a @command{date}.
-@`E all'interno di uno script di shell per gestire l'opzione @option{-u},
-che richiede che @command{date} sia eseguito come se il fuso orario
-fosse impostato a UTC:
-
-@example
-#! /bin/sh
-#
-# date --- simula il comando POSIX 'date'
-
-case $1 in
--u) TZ=UTC0 # usare UTC
- export TZ
- shift ;;
-esac
-
-gawk 'BEGIN @{
- formato = PROCINFO["strftime"]
- codice_di_ritorno = 0
-
- if (ARGC > 2)
- codice_di_ritorno = 1
- else if (ARGC == 2) @{
- formato = ARGV[1]
- if (formato ~ /^\+/)
- formato = substr(formato, 2) # togli il + iniziale
- @}
- print strftime(formato)
- exit codice_di_ritorno
-@}' "$@@"
-@end example
-
-@node Funzioni a livello di bit
-@subsection Funzioni per operazioni di manipolazione bit
-@cindex bit, funzioni per la manipolazione di
-@cindex manipolazione di bit, funzioni per la
-@cindex funzioni per la manipolazione di bit
-@cindex bit, operazioni sui
-@cindex AND, operazione sui bit
-@cindex OR, operazione sui bit
-@cindex XOR, operazione sui bit
-@cindex operazioni sui bit
-@quotation
-@i{Io posso spiegarlo per te, ma non posso capirlo per te.}
-@author Anonimo
-@end quotation
-
-Molti linguaggi consentono di eseguire operazioni @dfn{bit a bit}
-su due numeri interi. In altre parole, l'operazione @`e eseguita
-su ogni successiva coppia di bit presi da ognuno dei due operandi.
-Tre operazioni comuni sono AND, OR e XOR bit a bit.
-Queste operazioni sono descritte nella @ref{table-bitwise-ops}.
-
-@c 11/2014: Postprocessing turns the docbook informaltable
-@c into a table. Hurray for scripting!
-@float Tabella,table-bitwise-ops
-@caption{Operazioni a livello di bit}
-@ifnottex
-@ifnotdocbook
-@display
-@verbatim
- Operatore booleano
- | AND | OR | XOR
- |---+---+---+---+---+---
-Operandi | 0 | 1 | 0 | 1 | 0 | 1
-----------+---+---+---+---+---+---
- 0 | 0 0 | 0 1 | 0 1
- 1 | 0 1 | 1 1 | 1 0
-@end verbatim
-@end display
-@end ifnotdocbook
-@end ifnottex
-@tex
-\centerline{
-\vbox{\bigskip % space above the table (about 1 linespace)
-% Because we have vertical rules, we can't let TeX insert interline space
-% in its usual way.
-\offinterlineskip
-\halign{\strut\hfil#\quad\hfil % operands
- &\vrule#&\quad#\quad % rule, 0 (of and)
- &\vrule#&\quad#\quad % rule, 1 (of and)
- &\vrule# % rule between and and or
- &\quad#\quad % 0 (of or)
- &\vrule#&\quad#\quad % rule, 1 (of of)
- &\vrule# % rule between or and xor
- &\quad#\quad % 0 of xor
- &\vrule#&\quad#\quad % rule, 1 of xor
- \cr
-&\omit&\multispan{11}\hfil\bf Operatore booleano\hfil\cr
-\noalign{\smallskip}
-& &\multispan3\hfil AND\hfil&&\multispan3\hfil OR\hfil
- &&\multispan3\hfil XOR\hfil\cr
-\bf Operandi&&0&&1&&0&&1&&0&&1\cr
-\noalign{\hrule}
-\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr
-\noalign{\hrule height0pt}% without this the rule does not extend; why?
-0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr
-1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr
-}}}
-@end tex
-
-@docbook
-<informaltable>
-
-<tgroup cols="7" colsep="1">
-<colspec colname="c1"/>
-<colspec colname="c2"/>
-<colspec colname="c3"/>
-<colspec colname="c4"/>
-<colspec colname="c5"/>
-<colspec colname="c6"/>
-<colspec colname="c7"/>
-<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/>
-<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/>
-<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/>
-<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/>
-
-<tbody>
-<row>
-<entry colsep="0"></entry>
-<entry spanname="optitle"><emphasis role="bold">Operatore booleano</emphasis></entry>
-</row>
-
-<row rowsep="1">
-<entry rowsep="0"></entry>
-<entry spanname="andspan">AND</entry>
-<entry spanname="orspan">OR</entry>
-<entry spanname="xorspan">XOR</entry>
-</row>
-
-<row rowsep="1">
-<entry ><emphasis role="bold">Operandi</emphasis></entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-<entry colsep="0">0</entry>
-<entry colsep="1">1</entry>
-</row>
-
-<row>
-<entry align="center">0</entry>
-<entry colsep="0">0</entry>
-<entry>0</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-</row>
-
-<row>
-<entry align="center">1</entry>
-<entry colsep="0">0</entry>
-<entry>1</entry>
-<entry colsep="0">1</entry>
-<entry>1</entry>
-<entry colsep="0">1</entry>
-<entry>0</entry>
-</row>
-
-</tbody>
-</tgroup>
-</informaltable>
-@end docbook
-@end float
-
-@cindex bit, complemento a livello di
-@cindex complemento a livello di bit
-Come si vede, il risultato di un'operazione di AND @`e 1 solo quando
-@emph{entrambi} i bit sono 1.
-Il risultato di un'operazione di OR @`e 1 se @emph{almeno un} bit @`e 1.
-Il risultato di un'operazione di XOR @`e 1 se l'uno o l'altro
-bit @`e 1, ma non tutti e due.
-La successiva operazione @`e il @dfn{complemento}; il complemento di 1 @`e 0 e
-il complemento di 0 @`e 1. Quindi, quest'operazione ``inverte'' tutti i bit
-di un dato valore.
-
-@cindex bit, spostamento di
-@cindex spostamento a sinistra, bit a bit
-@cindex spostamento a destra, bit a bit
-@cindex spostamento, bit a bit
-Infine, due altre operazioni comuni consistono nello spostare i bit
-a sinistra o a destra.
-Per esempio, se si ha una stringa di bit @samp{10111001} e la si sposta
-a destra di tre bit, si ottiene @samp{00010111}.@footnote{Questo esempio
-presuppone che degli zeri riempiano le posizioni a sinistra.
-Per @command{gawk}, @`e sempre
-cos@`{@dotless{i}}, ma in alcuni linguaggi @`e possibile che le posizioni a sinistra
-siano riempite con degli uno.}
-Partendo nuovamente da @samp{10111001} e spostandolo a sinistra di tre
-bit, si ottiene @samp{11001000}. La lista seguente descrive
-le funzioni predefinite di @command{gawk} che rendono disponibili
-le operazioni a livello di bit.
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@cindex @command{gawk}, operazioni a livello di bit in
-@table @code
-@cindexgawkfunc{and}
-@cindex AND, operazione sui bit
-@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce l'AND bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-
-@cindexgawkfunc{compl}
-@cindex complemento a livello di bit
-@item @code{compl(@var{val})}
-Restituisce il complemento bit a bit di @var{val}.
-
-@cindexgawkfunc{lshift}
-@cindex spostamento a sinistra
-@item @code{lshift(@var{val}, @var{contatore})}
-Restituisce il valore di @var{val}, spostato a sinistra di
-@var{contatore} bit.
-
-@cindexgawkfunc{or}
-@cindex OR, operazione sui bit
-@item @code{or(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce l'OR bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-
-@cindexgawkfunc{rshift}
-@cindex spostamento a destra
-@item @code{rshift(@var{val}, @var{contatore})}
-Restituisce il valore di @var{val}, spostato a destra
-di @var{contatore} bit.
-
-@cindexgawkfunc{xor}
-@cindex XOR, operazione sui bit
-@item @code{xor(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
-Restituisce il XOR bit a bit degli argomenti.
-Gli argomenti devono essere almeno due.
-@end table
-
-@quotation ATTENZIONE
-A partire dalla versione di @command{gawk} @value{PVERSION} 4.2, gli operandi
-negativi non sono consentiti per nessuna di queste funzioni. Un operando
-negativo produce un errore fatale. Si veda la nota a lato
-``Attenzione. Non @`e tutto oro quel che luccica!'' per maggiori informazioni sul perch@'e.
-@end quotation
-
-Ecco una funzione definita dall'utente (@pxref{Funzioni definite dall'utente})
-che illustra l'uso di queste funzioni:
-
-@cindex @code{bits2str()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{bits2str()}
-@cindex @code{testbits.awk}, programma
-@cindex programma @code{testbits.awk}
-@example
-@group
-@c file eg/lib/bits2str.awk
-# bits2str --- decodifica un byte in una serie di 0/1 leggibili
-
-function bits2str(byte, dati, maschera)
-@{
- if (byte == 0)
- return "0"
-
- maschera = 1
- for (; byte != 0; stringa = rshift(stringa, 1))
- dati = (and(byte, maschera) ? "1" : "0") dati
-
- while ((length(dati) % 8) != 0)
- dati = "0" dati
-
- return dati
-@}
-@c endfile
-@end group
-
-@c this is a hack to make testbits.awk self-contained
-@ignore
-@c file eg/prog/testbits.awk
-# bits2str --- turn a byte into readable 1's and 0's
-
-function bits2str(bits, data, mask)
-@{
- if (bits == 0)
- return "0"
-
- mask = 1
- for (; bits != 0; bits = rshift(bits, 1))
- data = (and(bits, mask) ? "1" : "0") data
-
- while ((length(data) % 8) != 0)
- data = "0" data
-
- return data
-@}
-@c endfile
-@end ignore
-@c file eg/prog/testbits.awk
-BEGIN @{
- printf "123 = %s\n", bits2str(123)
- printf "0123 = %s\n", bits2str(0123)
- printf "0x99 = %s\n", bits2str(0x99)
- comp = compl(0x99)
- printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
- shift = lshift(0x99, 2)
- printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
- shift = rshift(0x99, 2)
- printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
-@}
-@c endfile
-@end example
-
-@noindent
-Questo programma produce il seguente output quando viene eseguito:
-
-@example
-$ @kbd{gawk -f testbits.awk}
-@print{} 123 = 01111011
-@print{} 0123 = 01010011
-@print{} 0x99 = 10011001
-@print{} compl(0x99) = 0x3fffffffffff66 = 001111111111111111111111111111111
-@print{} 11111111111111101100110
-@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
-@print{} rshift(0x99, 2) = 0x26 = 00100110
-@end example
-
-@cindex conversione da stringhe a numeri
-@cindex stringhe, conversione
-@cindex numeri, conversione in stringhe
-@cindex conversione da numeri a stringhe
-@cindex numero visto come stringa di bit
-La funzione @code{bits2str()} trasforma un numero binario in una stringa.
-Inizializzando @code{maschera} a uno otteniamo
-un valore binario in cui il bit pi@`u a destra @`e impostato a
-uno. Usando questa maschera,
-la funzione continua a controllare il bit pi@`u a destra.
-l'operazione di AND tra la maschera e il valore indica se il
-bit pi@`u a destra @`e uno oppure no. Se questo @`e il caso, un @code{"1"}
-@`e concatenato all'inizio della stringa.
-Altrimenti, @`e concatenato uno @code{"0"}.
-Il valore @`e quindi spostato a destra di un bit e il ciclo continua
-finch@'e non ci sono pi@`u bit.
-
-Se il valore iniziale @`e zero, viene restituito semplicemente uno @code{"0"}.
-Altrimenti, alla fine, al valore ottenuto vengono aggiunti degli zeri a
-sinistra, per arrivare a stringhe
-di lunghezza multipla di 8, ossia contenenti un numero intero di byte.
-Questo @`e tipico dei computer moderni.
-
-Il codice principale nella regola @code{BEGIN} mostra la differenza tra
-i valori decimale e ottale dello stesso numero.
-(@pxref{Numeri non-decimali}),
-e poi mostra i risultati delle funzioni
-@code{compl()}, @code{lshift()} e @code{rshift()}.
-
-@cindex sidebar, Attenzione. Non @`e tutto oro quel che luccica!
-@ifdocbook
-@docbook
-<sidebar><title>Attenzione. Non @`e tutto oro quel che luccica!</title>
-@end docbook
-
-
-In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
-non su valori a virgola mobile. Come regola generale, tali operazioni
-funzionano meglio se eseguite su interi senza segno.
-
-@command{gawk} tenta di trattare gli argomenti delle funzioni
-"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
-provocano un errore fatale.
-
-In una normale operazione, per tutte queste funzioni, prima il valore a virgola
-mobile a doppia precisione viene convertito nel tipo intero senza segno di C
-pi@`u ampio, poi viene eseguita l'operazione "bit a bit". Se il risultato non
-pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
-vengono rimossi i bit iniziali diversi da zero uno alla volta finch@'e
-non sono rappresentati esattamente. Il risultato @`e poi nuovamente convertito
-in un tipo @code{double} di C.@footnote{Per essere pi@`u chiari,
-la conseguenza @`e che @command{gawk} pu@`o memorizzare solo un determinato
-intervallo di valori interi; i numeri al di fuori di questo intervallo vengono
-ridotti per rientrare all'interno dell'intervallo.}
-
-Comunque, quando si usa il calcolo con precisione arbitraria con l'opzione
-@option{-M} (@pxref{Calcolo con precisione arbitraria}), il risultato pu@`o
-essere diverso. Questo @`e particolarmente evidente con la funzione @code{compl()}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
-@print{} 9007199254740949
-$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
-@print{} -43
-@end example
-
-Quel che avviene diventa chiaro quando si stampano i risultati
-in notazione esadecimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0x1fffffffffffd5
-$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0xffffffffffffffd5
-@end example
-
-Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
-gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
-Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
-interi come regolari valori a virgola mobile con doppia precisione, che
-mantengono solo 53 bit di precisione. Inoltre, la libreria GNU MP tratta
-(o almeno sembra che tratti) il bit iniziale come un bit con segno; cos@`i il
-risultato con @option{-M} in questo caso @`e un numero negativo.
-
-In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
-tranne le pi@`u semplici, probabilmente @`e una cattiva idea; caveat emptor!
-
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Attenzione. Non @`e tutto oro quel che luccica!}
-
-
-
-In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
-non su valori a virgola mobile. Come regola generale, tali operazioni
-funzionano meglio se eseguite su interi senza segno.
-
-@command{gawk} tenta di trattare gli argomenti delle funzioni
-"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
-provocano un errore fatale.
-
-In una normale operazione, per tutte queste funzioni, prima il valore a virgola
-mobile a doppia precisione viene convertito nel tipo intero senza segno di C
-pi@`u ampio, poi viene eseguita l'operazione "bit a bit". Se il risultato non
-pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
-vengono rimossi i bit iniziali diversi da zero uno alla volta finch@'e
-non sono rappresentati esattamente. Il risultato @`e poi nuovamente convertito
-in un tipo @code{double} di C.@footnote{Per essere pi@`u chiari,
-la conseguenza @`e che @command{gawk} pu@`o memorizzare solo un determinato
-intervallo di valori interi; i numeri al di fuori di questo intervallo vengono
-ridotti per rientrare all'interno dell'intervallo.}
-
-Comunque, quando si usa il calcolo con precisione arbitraria con l'opzione
-@option{-M} (@pxref{Calcolo con precisione arbitraria}), il risultato pu@`o
-essere diverso. Questo @`e particolarmente evidente con la funzione @code{compl()}:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
-@print{} 9007199254740949
-$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
-@print{} -43
-@end example
-
-Quel che avviene diventa chiaro quando si stampano i risultati
-in notazione esadecimale:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0x1fffffffffffd5
-$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
-@print{} 0xffffffffffffffd5
-@end example
-
-Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
-gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
-Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
-interi come regolari valori a virgola mobile con doppia precisione, che
-mantengono solo 53 bit di precisione. Inoltre, la libreria GNU MP tratta
-(o almeno sembra che tratti) il bit iniziale come un bit con segno; cos@`i il
-risultato con @option{-M} in questo caso @`e un numero negativo.
-
-In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
-tranne le pi@`u semplici, probabilmente @`e una cattiva idea; caveat emptor!
-
-@end cartouche
-@end ifnotdocbook
-
-@node Funzioni per i tipi
-@subsection Funzioni per conoscere il tipo di una variabile
-
-@command{gawk} prevede due funzioni che permettono di conoscere
-il tipo di una variabile.
-Questo @`e necessario per scrivere del codice che visiti ogni elemento di un
-vettore di vettori
-(@pxref{Vettori di vettori}) e in altri contesti.
-
-@table @code
-@cindexgawkfunc{isarray}
-@cindex scalare o vettore
-@item isarray(@var{x})
-Restituisce il valore 'vero' se @var{x} @`e un vettore. Altrimenti, restituisce
-'falso'.
-
-@cindexgawkfunc{typeof}
-@cindex variabile, tipo di una
-@cindex tipo di una variabile
-@item typeof(@var{x})
-Restituisce una delle stringhe seguenti, a seconda del tipo di @var{x}:
-
-@c nested table
-@table @code
-@item "array"
-@var{x} @`e un vettore.
-
-@item "regexp"
-@var{x} @`e una @dfn{regexp} fortemente tipizzata
-(@pxref{Costanti @dfn{regexp} forti}).
-
-@item "number"
-@var{x} @`e un numero.
-
-@item "string"
-@var{x} @`e una stringa.
-
-@item "strnum"
-@var{x} @`e un numero che ha avuto origine da un input dell'utente,
-come un campo o il risultato di una chiamata a @code{split()}.
-(Cio@`e, @var{x} ha l'attributo @dfn{strnum};
-@pxref{Tipi di variabile}.)
-
-@item "unassigned"
-@var{x} @`e una variabile scalare a cui non @`e ancora stato assegnato un valore.
-Per esempio:
-
-@example
-BEGIN @{
- # crea a[1] ma non gli attribuisce alcun valore
- a[1]
- print typeof(a[1]) # unassigned
-@}
-@end example
-
-@item "untyped"
-@var{x} non @`e stata usata per nulla; pu@`o diventare uno scalare o un
-vettore.
-Per esempio:
-
-@example
-BEGIN @{
- print typeof(x) # x non @`e mai stato usato --> untyped
- mk_arr(x)
- print typeof(x) # x ora @`e un vettore --> array
-@}
-
-function mk_arr(a) @{ a[1] = 1 @}
-@end example
-
-@end table
-@end table
-
-@code{isarray()} torna utile in due occasioni. La prima @`e quando
-si visita un vettore multidimensionale: si pu@`o stabilire se un elemento @`e
-un vettore oppure no. La seconda @`e all'interno del corpo di una funzione
-definita dall'utente (argomento non ancora trattato;
-@pxref{Funzioni definite dall'utente}), per determinare se un parametro
-@`e un vettore oppure no.
-
-@quotation NOTA
-Usare @code{isarray()} a livello globale per controllare le variabili
-non ha alcun senso. Si suppone infatti che chi scrive il programma
-sappia se una variabile @`e un vettore oppure no. E in
-effetti, per come funziona @command{gawk}, se si passa una variabile
-che non sia stata usata in precedenza a @code{isarray()}, @command{gawk}
-la crea al volo, assegnandole il tipo scalare.
-@end quotation
-
-La funzione @code{typeof()} @`e generale; consente di determinare
-se una variabile o un parametro di funzione @`e uno scalare, un vettore,
-o una @dfn{regexp} fortemente tipizzata.
-
-L'uso di @code{isarray()} @`e deprecato; si dovrebbe usare @code{typeof()}
-al suo posto. Si dovrebbe sostituire ogni uso esistente di
-@samp{isarray(var)} nei programmi esistenti con
-@samp{typeof(var) == "array"}.
-
-@node Funzioni di internazionalizzazione
-@subsection Funzioni per tradurre stringhe
-@cindex @command{gawk}, funzioni di traduzione di stringhe
-@cindex funzioni di traduzione di stringhe
-@cindex traduzione di stringhe, funzioni di
-@cindex internazionalizzazione
-@cindex programmi @command{awk}, internazionalizzare
-
-@command{gawk} prevede strumenti per internazionalizzare i programmi
-@command{awk}.
-Questi sono costituiti dalle funzioni descritte nella lista seguente.
-Le descrizioni sono volutamente concise.
-@xref{Internazionalizzazione},
-per un'esposizione completa.
-I parametri facoltativi sono racchiusi tra parentesi quadre ([ ]):
-
-@table @asis
-@cindexgawkfunc{bindtextdomain}
-@cindex impostare directory con catalogo messaggi tradotti
-@cindex messaggi tradotti, impostare directory con catalogo
-@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio}]@code{)}
-Imposta la directory in cui
-@command{gawk} trova i file di traduzione dei messaggi, nel caso in cui
-non siano o non possano essere messi nelle directory ``standard''
-(p.es., durante la fase di test di un programma).
-Restituisce la directory alla quale @var{dominio} @`e ``connesso.''
-
-Il default per @var{dominio} @`e il valore di @code{TEXTDOMAIN}.
-Se @var{directory} @`e la stringa nulla (@code{""}),
-@code{bindtextdomain()} restituisce la connessione corrente per il
-@var{dominio} dato.
-
-@cindexgawkfunc{dcgettext}
-@cindex traduzione di stringhe
-@item @code{dcgettext(@var{stringa}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
-Restituisce la traduzione di @var{stringa} nel
-dominio linguistico @var{dominio} per la categoria di localizzazione
-@var{categoria}.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-@cindexgawkfunc{dcngettext}
-@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
-Restituisce la forma plurale usata per @var{numero} nella
-traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
-@var{dominio} per la categoria di localizzazione @var{categoria}.
-@var{stringa1} @`e la variante al singolare in inglese di un messaggio e
-@var{stringa2} @`e la variante al plurare in inglese dello stesso messaggio.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-@end table
-
-@node Funzioni definite dall'utente
-@section Funzioni definite dall'utente
-
-@cindex funzioni definite dall'utente
-@cindex utente, funzioni definite dall'
-Programmi @command{awk} complessi spesso possono essere semplificati
-definendo delle apposite funzioni personali.
-Le funzioni definite dall'utente sono richiamate allo stesso modo di quelle
-predefinite
-(@pxref{Chiamate di funzione}),
-ma dipende dall'utente la loro definizione
-(cio@`e, dire ad @command{awk} cosa dovrebbero fare queste funzioni).
-
-@menu
-* Sintassi delle definizioni:: Come scrivere definizioni e cosa
- significano.
-* Esempio di funzione:: Un esempio di definizione di
- funzione e spiegazione della stessa.
-* Precisazioni sulle funzioni:: Cose a cui prestare attenzione.
-* Istruzione return:: Specificare il valore che una
- funzione restituisce.
-* Variabili di tipo dinamico:: Come cambiare tipo a una variabile in
- fase di esecuzione del programma.
-@end menu
-
-@node Sintassi delle definizioni
-@subsection Come scrivere definizioni e cosa significano
-
-@quotation
-@i{Risponde al vero affermare che la sintassi di awk per la definizione
-di variabili locali @`e semplicemente atroce.}
-@author Brian Kernighan
-@end quotation
-
-@cindex funzioni, definizione di
-@cindex definizione di funzioni
-Definizioni di funzioni possono stare in una posizione qualsiasi tra le regole
-di un programma @command{awk}. Quindi, la forma generale di un
-programma @command{awk} @`e estesa per
-permettere l'inclusione di regole @emph{e} la definizione di funzioni
-create dall'utente.
-Non @`e necessario che la definizione di una funzione sia posta prima
-del richiamo della stessa. Questo dipende dal fatto che @command{awk}
-legge l'intero programma, prima di iniziare ad eseguirlo.
-
-La definizione di una funzione chiamata @var{nome} @`e simile a questa:
-
-@display
-@code{function} @var{nome}@code{(}[@var{lista-parametri}]@code{)}
-@code{@{}
- @var{corpo-della-funzione}
-@code{@}}
-@end display
-
-@cindex nomi di funzione
-@cindex funzioni, nomi di
-@cindex limitazioni nei nomi di funzione
-@cindex nomi di funzione, limitazioni nei
-@noindent
-Qui, @var{nome} @`e il nome della funzione da definire. Un nome di funzione
-valido @`e come un nome di variabile valido: una sequenza di
-lettere, cifre e trattini bassi che non inizia con una cifra.
-Anche qui, solo le 52 lettere inglesi maiuscole e minuscole possono
-essere usate in un nome di funzione.
-All'interno di un singolo programma @command{awk}, un dato nome pu@`o essere
-usato una sola volta: per una variabile, o per un vettore,
-o per una funzione.
-
-@var{lista-parametri} @`e una lista opzionale degli argomenti della funzione
-e dei nomi delle variabili locali,
-separati da virgole. Quando la funzione viene chiamata,
-i nomi degli argomenti sono usati per contenere il valore degli argomenti
-passati con la chiamata.
-
-Una funzione non pu@`o avere due parametri con lo stesso nome, e neanche un
-parametro con lo stesso nome della funzione stessa.
-
-@quotation ATTENZIONE
-Secondo lo standard POSIX, i parametri di funzione
-non possono avere lo stesso nome di una delle speciali variabili predefinite
-(@pxref{Variabili predefinite}), e un parametro di funzione non pu@`o avere
-lo stesso nome di un'altra funzione.
-Non tutte le versioni di @command{awk} applicano queste limitazioni.
-@command{gawk} applica solo la prima di queste restrizioni.
-Se viene specificata l'opzione @option{--posix} (@pxref{Opzioni}),
-anche la seconda restrizione viene applicata.
-@end quotation
-
-Le variabili locali si comportano come la stringa vuota
-se vengono utilizzate dove @`e richiesto il valore di una stringa,
-e valgono zero se utilizzate dove @`e richiesto un valore numerico.
-Questo @`e lo stesso comportamento delle variabili regolari a cui non sia
-stato ancora assegnato un valore. (Ci sono ulteriori informazioni riguardo
-alle variabili locali;
-@pxref{Variabili di tipo dinamico}.)
-
-Il @var{corpo-della-funzione} @`e composto da istruzioni @command{awk}.
-Questa @`e la parte pi@`u importante della definizione, perch@'e dice quello che
-la funzione dovrebbe realmente
-@emph{fare}. I nomi di argomento esistono per consentire al corpo della
-funzione di gestire gli argomenti;
-le variabili locali esistono per consentire al corpo della funzione di
-memorizzare dei valori temporanei.
-
-I nomi di argomento non sono sintatticamente distinti da quelli delle
-variabili locali. Invece, il numero di argomenti forniti quando la
-funzione viene chiamata determina quanti degli argomenti passati sono delle
-variabili. Quindi, se tre valori di argomento sono specificati, i primi
-tre nomi in @var{lista-parametri}
-sono degli argomenti e i rimanenti sono delle variabili locali.
-
-Ne consegue che se il numero di argomenti richiesto non @`e lo stesso in
-tutte le chiamate alla funzione, alcuni dei nomi in @var{lista-parametri}
-possono essere in alcuni casi degli argomenti e in altri casi
-delle variabili locali. Un'altra angolatura da cui guardare questo fatto
-@`e che gli argomenti omessi assumono come valore di default la stringa nulla.
-
-@cindex convenzioni di programmazione, nella scrittura di funzioni
-@cindex funzioni, convenzioni di programmazione, nella scrittura di
-Solitamente, quando si scrive una funzione, si sa quanti nomi si intendono
-usare per gli argomenti e quanti si vogliono usare come variabili locali.
-@`E una convenzione in uso quella di aggiungere alcuni spazi extra tra gli
-argomenti e le variabili locali, per documentare come va utilizzata quella
-funzione.
-
-@cindex variabili nascoste
-@cindex nascondere valori di variabile
-Durante l'esecuzione del corpo della funzione, gli argomenti e i valori
-delle variabili locali
-nascondono, o @dfn{oscurano}, qualsiasi variabile dello stesso nome usata
-nel resto del programma. Le variabili oscurate non sono accessibili
-nel corpo della funzione, perch@'e non c'@`e modo di accedere a esse
-mentre i loro nomi sono stati "occupati" dagli argomenti e dalla variabili
-locali. Tutte le altre variabili usate nel programma @command{awk}
-possono essere accedute o impostate normalmente nel corpo della funzione.
-
-Gli argomenti e le variabili locali esistono solo finch@'e il corpo della
-funzione @`e in esecuzione. Una volta che l'esecuzione @`e terminata,
-ritornano accessibili le variabili che erano oscurate
-durante l'esecuzione della funzione.
-
-@cindex ricorsive, funzioni
-@cindex funzioni ricorsive
-Il corpo della funzione pu@`o contenere espressioni che chiamano altre
-funzioni. Tali espressioni possono perfino chiamare direttamente, o
-indirettamente tramite un'altra funzione, la funzione stessa.
-Quando questo succede, la funzione @`e detta @dfn{ricorsiva}.
-Il fatto che una funzione richiami se stessa @`e detto @dfn{ricorsione}.
-
-Tutte le funzioni predefinite restituiscono un valore al loro chiamante.
-Anche le funzioni definite dall'utente possono farlo, usando
-l'istruzione @code{return},
-che @`e descritta in dettaglio nella @ref{Istruzione return}.
-Molti dei successivi esempi in questa @value{SECTION} usano
-l'istruzione @code{return}.
-
-@cindex estensioni comuni, parola chiave @code{func}
-@c @cindex @command{awk} language, POSIX version
-@c @cindex POSIX @command{awk}
-@cindex POSIX @command{awk}, parola chiave @code{function} in
-In molte implementazioni di @command{awk}, compreso @command{gawk},
-la parola chiave @code{function} pu@`o essere
-abbreviata come @code{func}. @value{COMMONEXT}
-Tuttavia, POSIX specifica solo l'uso della parola chiave
-@code{function}. Questo ha alcune implicazioni di carattere pratico.
-Se @command{gawk} @`e in modalit@`a POSIX-compatibile
-(@pxref{Opzioni}), la seguente
-istruzione @emph{non} definisce una funzione:
-
-@example
-func foo() @{ a = sqrt($1) ; print a @}
-@end example
-
-@noindent
-Invece, definisce una regola che, per ogni record, concatena il valore
-della variabile @samp{func} con il valore restituito dalla funzione @samp{foo}.
-Se la stringa risultante @`e diversa dalla stringa nulla, l'azione viene eseguita.
-Questo non @`e con ogni probabilit@`a quello che si desidera.
-(@command{awk} accetta questo input come
-sintatticamente valido, perch@'e le funzioni, nei programmi @command{awk}
-possono essere usate prima che siano state definite.@footnote{Questo
-programma in realt@`a non verr@`a eseguito, perch@'e @code{foo()} risulter@`a
-essere una funzione non definita.})
-
-@cindex portabilit@`a, nella definizione di funzioni
-Per essere certi che un programma @command{awk} sia portabile,
-va sempre usata la parola chiave
-@code{function} per definire una funzione.
-
-@node Esempio di funzione
-@subsection Un esempio di definizione di funzione
-@cindex esempio di definizione di funzione
-@cindex funzione, esempio di definizione di
-
-
-Ecco un esempio di funzione definita dall'utente, di nome
-@code{stampa_num()}, che
-ha come input un numero e lo stampa in un formato specifico:
-
-@example
-function stampa_num(numero)
-@{
- printf "%6.3g\n", numero
-@}
-@end example
-
-@noindent
-Per comprenderne il funzionamento, ecco una regola @command{awk} che usa
-la funzione @code{stampa_num()}:
-
-@example
-$3 > 0 @{ stampa_num($3) @}
-@end example
-
-@noindent
-Questo programma stampa, nel nostro formato speciale, tutti i terzi campi
-nei record in input che
-contengono un numero positivo. Quindi, dato il seguente input:
-
-@example
- 1.2 3.4 5.6 7.8
- 9.10 11.12 -13.14 15.16
-17.18 19.20 21.22 23.24
-@end example
-
-@noindent
-questo programma, usando la nostra funzione per formattare i risultati, stampa:
-
-@example
- 5.6
- 21.2
-@end example
-
-La funzione seguente cancella tutti gli elementi in un vettore
-(si ricordi che gli spazi bianchi in soprannumero stanno a indicare
-l'inizio della lista delle variabili locali):
-
-@example
-function cancella_vettore(a, i)
-@{
- for (i in a)
- delete a[i]
-@}
-@end example
-
-Quando si lavora con vettori, @`e spesso necessario cancellare
-tutti gli elementi in un vettore e ripartire con una nuova lista di elementi
-(@pxref{Cancellazione}).
-Invece di dover ripetere
-questo ciclo ogni volta che si deve cancellare
-un vettore, un programma pu@`o limitarsi a effettuare una chiamata
-a @code{cancella_vettore()}.
-(Questo garantisce la portabilit@`a. L'uso di @samp{delete @var{vettore}}
-per cancellare
-il contenuto di un intero vettore @`e un'aggiunta relativamente
-recente@footnote{Verso la fine del 2012.}
-allo standard POSIX.)
-
-Quello che segue @`e un esempio di una funzione ricorsiva. Prende come
-parametro di input una stringa e restituisce la stringa in ordine inverso.
-Le funzioni ricorsive devono sempre avere un test che interrompa la
-ricorsione.
-In questo caso, la ricorsione termina quando la stringa in input @`e
-gi@`a vuota:
-
-@c 8/2014: Thanks to Mike Brennan for the improved formulation
-@cindex @code{rev()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{rev()}
-@example
-function rev(stringa)
-@{
- if (stringa == "")
- return ""
-
- return (rev(substr(stringa, 2)) substr(stringa, 1, 1))
-@}
-@end example
-
-Se questa funzione @`e in un file di nome @file{rev.awk}, si pu@`o provare
-cos@`{@dotless{i}}:
-
-@example
-$ @kbd{echo "Non v'allarmate!" |}
-> @kbd{gawk -e '@{ print rev($0) @}' -f rev.awk}
-@print{} !etamralla'v noN
-@end example
-
-La funzione C @code{ctime()} prende una marcatura temporale e la restituisce
-come una stringa,
-formattata come gi@`a sappiamo.
-Il seguente esempio usa la funzione predefinita @code{strftime()}
-(@pxref{Funzioni di tempo})
-per creare una versione @command{awk} di @code{ctime()}:
-
-@cindex @code{ctime()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{ctime()}
-@example
-@c file eg/lib/ctime.awk
-# ctime.awk
-#
-# versione awk della funzione C ctime(3)
-
-function ctime(ts, format)
-@{
- format = "%a %e %b %Y, %H.%M.%S, %Z"
-
- if (ts == 0)
- ts = systime() # usare data e ora correnti per default
- return strftime(format, ts)
-@}
-@c endfile
-@end example
-
-Si potrebbe pensare che la funzione @code{ctime()} possa usare
-@code{PROCINFO["strftime"]}
-come stringa di formato. Sarebbe un errore, perch@'e si suppone che
-@code{ctime()} restituisca data e ora formattati in maniera standard,
-e qualche codice a livello utente potrebbe aver modificato in precedenza
-@code{PROCINFO["strftime"]}.
-
-@node Precisazioni sulle funzioni
-@subsection Chiamare funzioni definite dall'utente
-
-@cindex funzioni definite dall'utente, chiamare
-@cindex chiamare funzioni definite dall'utente
-@dfn{Chiamare una funzione} significa richiedere l'esecuzione di una
-funzione, la quale svolge il compito per cui @`e stata scritta.
-La chiamata di una funzione @`e un'espressione e il suo valore @`e quello
-restituito dalla funzione.
-
-@menu
-* Chiamare una funzione:: Non usare spazi.
-* Campo di validit@`a variabili:: Variabili locali e globali.
-* Parametri per valore/riferimento:: Passaggio parametri.
-@end menu
-
-@node Chiamare una funzione
-@subsubsection Scrivere una chiamata di funzione
-
-Una chiamata di funzione consiste nel nome della funzione seguito dagli
-argomenti racchiusi tra parentesi. Gli argomenti specificati nella chiamata
-sono costituiti da espressioni @command{awk}. Ogni volta che si esegue una
-chiamata queste espressioni vengono ricalcolate, e i loro valori diventano gli
-argomenti passati alla funzione. Per esempio, ecco una chiamata a
-@code{pippo()} con tre argomenti (il primo dei quali @`e una concatenazione di
-stringhe):
-
-@example
-pippo(x y, "perdere", 4 * z)
-@end example
-
-@quotation ATTENZIONE
-Caratteri bianchi (spazi e TAB) non sono permessi tra il nome della funzione e
-la parentesi aperta che apre la lista degli argomenti. Se per errore si
-lasciano dei caratteri bianchi, @command{awk} li interpreterebbe come se
-s'intendesse concatenare una variabile con un'espressione tra parentesi.
-Tuttavia, poich@'e si @`e usato un nome di funzione e non un nome di variabile,
-verrebbe emesso un messaggio di errore.
-@end quotation
-
-@node Campo di validit@`a variabili
-@subsubsection Variabili locali e globali.
-
-@cindex variabili locali, in una funzione
-@cindex locali, variabili, per una funzione
-Diversamente da molti altri linguaggi, non c'@`e modo di
-rendere locale una variabile in un blocco @code{@{} @dots{} @code{@}} di
-@command{awk}, ma si pu@`o rendere locale una variabile di una funzione. @`E
-buona norma farlo quando una variabile serve solo all'interno di quella
-particolare funzione.
-
-Per rendere locale una variabile per una funzione, basta dichiarare la
-variabile come argomento della funzione dopo gli argomenti richiesti dalla
-funzione (@pxref{Sintassi delle definizioni}). Si consideri il seguente
-esempio, dove la variabile @code{i} @`e una variabile globale usata sia dalla
-funzione @code{pippo()} che dalla funzione @code{pluto()}:
-
-@example
-function pluto()
-@{
- for (i = 0; i < 3; i++)
- print "in pluto i=" i
-@}
-
-function pippo(j)
-@{
- i = j + 1
- print "in pippo i=" i
- pluto()
- print "in pippo i=" i
-@}
-
-BEGIN @{
- i = 10
- print "in BEGIN i=" i
- pippo(0)
- print "in BEGIN i=" i
-@}
-@end example
-
-L'esecuzione di questo script produce quanto segue, perch@'e la stessa
-variabile @code{i} @`e usata sia nelle
-funzioni @code{pippo()} e @code{pluto()} sia a livello della
-regola @code{BEGIN}:
-
-@example
-in BEGIN i=10
-in pippo i=1
-in pluto i=0
-in pluto i=1
-in pluto i=2
-in pippo i=3
-in BEGIN i=3
-@end example
-
-Se si vuole che @code{i} sia una variabile locale sia per
-@code{pippo()} che per @code{pluto()}, occorre procedere in questo modo
-(gli spazi extra prima della @code{i} sono una convenzione di codifica
-che serve a ricordare che @code{i} @`e una variabile locale, non
-un argomento):
-
-@example
-function pluto( i)
-@{
- for (i = 0; i < 3; i++)
- print "in pluto i=" i
-@}
-
-function pippo(j, i)
-@{
- i = j + 1
- print "in pippo i=" i
- pluto()
- print "in pippo i=" i
-@}
-
-BEGIN @{
- i = 10
- print "in BEGIN i=" i
- pippo(0)
- print "in BEGIN i=" i
-@}
-@end example
-
-L'esecuzione della versione corretta dello script produce il seguente
-output:
-
-@example
-in BEGIN i=10
-in pippo i=1
-in pluto i=0
-in pluto i=1
-in pluto i=2
-in pippo i=1
-in BEGIN i=10
-@end example
-
-Oltre a valori scalari (stringhe e numeri), si possono usare anche
-vettori locali. Usando come parametro il nome di un vettore, @command{awk}
-lo considera come tale, e lo tratta come locale alla funzione.
-Inoltre, chiamate ricorsive creano nuovi vettori.
-Si consideri questo esempio:
-
-@example
-function qualche_funz(p1, a)
-@{
- if (p1++ > 3)
- return
-
- a[p1] = p1
-
- qualche_funz(p1)
-
- printf("Al livello %d, indice %d %s trova in a\n",
- p1, (p1 - 1), (p1 - 1) in a ? "si" : "non si")
- printf("Al livello %d, indice %d %s trova in a\n",
- p1, p1, p1 in a ? "si" : "non si")
- print ""
-@}
-
-BEGIN @{
- qualche_funz(1)
-@}
-@end example
-
-Quando viene eseguito, questo programma produce il seguente output:
-
-@example
-Al livello 4, indice 3 non si trova in a
-Al livello 4, indice 4 si trova in a
-
-Al livello 3, indice 2 non si trova in a
-Al livello 3, indice 3 si trova in a
-
-Al livello 2, indice 1 non si trova in a
-Al livello 2, indice 2 si trova in a
-@end example
-
-@node Parametri per valore/riferimento
-@subsubsection Passare parametri di funzione per valore o per riferimento
-
-In @command{awk}, quando si definisce una funzione, non c'@`e modo di
-dichiarare esplicitamente se gli argomenti sono passati @dfn{per valore}
-o @dfn{per riferimento}.
-
-Invece, il modo con cui i parametri sono passati @`e determinato
-durante l'esecuzione del programma,
-quando la funzione @`e chiamata, nel rispetto della regola seguente:
-se l'argomento @`e una variabile di tipo vettoriale, questa @`e passata
-per riferimento. Altrimenti, l'argomento @`e passato per valore.
-
-@cindex chiamare per valore
-Passare un argomento per valore significa che quando una funzione @`e chiamata,
-le viene fornita una @emph{copia} del valore di quell'argomento. Il chiamante
-pu@`o usare una variabile il cui valore calcolato viene passato come argomento, ma la
-funzione chiamata non la riconosce come variabile; riconosce solo il valore
-assunto dall'argomento. Per esempio, scrivendo il seguente codice:
-
-@example
-pippo = "pluto"
-z = mia_funzione(pippo)
-@end example
-
-@noindent
-non si deve pensare che l'argomento passato a @code{mia_funzione()} sia ``la
-variabile @code{pippo}.'' Invece, @`e corretto considerare l'argomento come la
-stringa il cui valore @`e @code{"pluto"}.
-Se la funzione @code{mia_funzione()} altera i valori delle sue variabili
-locali, ci@`o non influisce su nessun'altra variabile. Quindi, se
-@code{mia_funzione()} fa questo:
-
-@example
-function mia_funzione(stringa)
-@{
- print stringa
- stringa = "zzz"
- print stringa
-@}
-@end example
-
-@noindent
-cambiando cos@`{@dotless{i}} il valore della variabile che @`e il suo primo argomento, ossia
-@code{stringa}, il valore di @code{pippo} per il chiamante @emph{non} viene
-modificato. Il ruolo svolto da @code{pippo} nella chiamata di
-@code{mia_funzione()} termina quando il suo valore (@code{"pluto"}) viene
-calcolato. Se la variabile @code{stringa} esiste anche al di fuori di
-@code{mia_funzione()}, il corpo della funzione non pu@`o modificare questo valore
-esterno, perch@'e esso rimane oscurato durante l'esecuzione di
-@code{mia_funzione()} e non pu@`o quindi essere visto o modificato.
-
-@cindex chiamare per riferimento
-@cindex vettori, come parametri di funzione
-@cindex funzioni, vettori come parametri di
-Tuttavia, quando sono dei vettori a fungere da parametri alle funzioni, questi
-@emph{non} vengono copiati. Invece, il vettore stesso @`e reso disponibile per
-essere manipolato direttamente dalla funzione. Questo @`e quel che si dice
-solitamente una @dfn{chiamata per riferimento}. Le modifiche effettuate su un
-vettore passato come parametro all'interno del corpo di una funzione
-@emph{sono} visibili all'esterno della funzione.
-
-@quotation NOTA
-Modificare un vettore passato come parametro all'interno di una funzione
-pu@`o essere molto pericoloso se non si sta attenti a quel che si sta facendo.
-Per esempio:
-
-@example
-function cambialo(vettore, ind, nvalore)
-@{
- vettore[ind] = nvalore
-@}
-
-BEGIN @{
- a[1] = 1; a[2] = 2; a[3] = 3
- cambialo(a, 2, "due")
- printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
- a[1], a[2], a[3]
-@}
-@end example
-
-@noindent
-stampa @samp{a[1] = 1, a[2] = due, a[3] = 3}, perch@'e
-@code{cambialo()} memorizza @code{"due"} nel secondo elemento di @code{a}.
-@end quotation
-
-@cindex indefinite, funzioni
-@cindex funzioni indefinite
-Alcune implementazioni di @command{awk} consentono di chiamare una
-funzione che non @`e stata definita.
-Viene solo emesso un messaggio che descrive il problema al momento
-dell'esecuzione, se il programma tenta di chiamare quella funzione.
-Per esempio:
-
-@example
-BEGIN @{
- if (0)
- pippo()
- else
- pluto()
-@}
-function pluto() @{ @dots{} @}
-# si noti che `pippo' non @`e definito
-@end example
-
-@noindent
-Poich@'e la condizione dell'istruzione @samp{if} non risulter@`a mai verificata
-in questo caso,
-non @`e un problema reale il fatto che
-che @code{pippo()} non sia stato definito. Solitamente, tuttavia,
-@`e un problema se un programma chiama una funzione indefinita.
-
-@cindex @dfn{lint}, controlli, funzione indefinita
-@cindex controlli @dfn{lint} per funzione indefinita
-@cindex funzione indefinita, controlli @dfn{lint} per
-
-Se si specifica l'opzione @option{--lint}
-(@pxref{Opzioni}),
-@command{gawk} elenca le chiamate a funzioni indefinite.
-
-@cindex portabilit@`a, istruzione @code{next} in funzioni definite dall'utente
-@cindex @code{next}, istruzione, in funzioni definite dall'utente
-Alcune implementazione di @command{awk} emettono un messaggio di errore
-se si usa l'istruzione @code{next}
-o @code{nextfile}
-(@pxref{Istruzione next}, e
-@ifdocbook
-@ref{Istruzione nextfile})
-@end ifdocbook
-@ifnotdocbook
-@pxref{Istruzione nextfile})
-@end ifnotdocbook
-all'interno di una funzione definita dall'utente.
-@command{gawk} non ha questa limitazione.
-
-@node Istruzione return
-@subsection L'istruzione @code{return}
-@cindex @code{return}, istruzione@comma{} in funzioni definite dall'utente
-@cindex istruzione @code{return}@comma{} in funzioni definite dall'utente
-
-Come visto in parecchi esempi precedenti,
-il corpo di una funzione definita dall'utente pu@`o contenere un'istruzione
-@code{return}.
-Quest'istruzione restituisce il controllo a quella parte del
-del programma @command{awk} che ha effettuato la chiamata.
-Pu@`o anche essere usata per restituire un valore da usare nel resto del
-programma @command{awk}.
-Questo @`e un esempio:
-
-@display
-@code{return} [@var{espressione}]
-@end display
-
-La parte @var{espressione} @`e facoltativa.
-Probabilmente per una svista, POSIX non definisce qual @`e il valore
-restituito, se si omette @var{espressione}. Tecnicamente parlando, questo
-rende il valore restituito indefinito, e quindi, indeterminato.
-In pratica, tuttavia, tutte le versioni di @command{awk} restituiscono
-semplicemente la stringa nulla, che vale zero se usata
-in un contesto che richiede un numero.
-
-Un'istruzione @code{return} senza una @var{espressione} @`e considerata presente
-alla fine di ogni definizione di funzione.
-Quindi, se il flusso di esecuzione raggiunge la fine del corpo della
-funzione, tecnicamente la funzione
-restituisce un valore indeterminato.
-In pratica, restituisce la stringa nulla. @command{awk}
-@emph{non} emette alcun messaggio di avvertimento se si usa
-il valore restituito di una tale funzione.
-
-Talvolta pu@`o capitare di scrivere una funzione per quello che fa, non per
-quello che restituisce. Una tale funzione corrisponde a una funzione
-@code{void} in C, C++, o Java, o a una @code{procedure} in Ada.
-Quindi, pu@`o essere corretto non
-restituire alcun valore; basta fare attenzione a non usare poi il
-valore restituito da una tale funzione.
-
-Quello che segue @`e un esempio di una funzione definita dall'utente
-che restituisce un valore che @`e
-il numero pi@`u alto presente tra gli elementi di un vettore:
-
-@example
-function massimo(vettore, i, max)
-@{
- for (i in vettore) @{
- if (max == "" || vettore[i] > max)
- max = vettore[i]
- @}
- return max
-@}
-@end example
-
-@cindex programmazione, convenzioni di, parametri di funzione
-@cindex convenzioni di programmazione, parametri di funzione
-@noindent
-La chiamata a @code{massimo()} ha un solo argomento, che @`e il nome di
-un vettore. Le variabili locali @code{i} e @code{max} non vanno intese
-come argomenti; nulla vieta di passare pi@`u di un argomento
-a @code{massimo()} ma i risultati sarebbero strani. Gli spazi extra prima
-di @code{i} nella lista dei parametri della funzione indicano che @code{i} e
-@code{max} sono variabili locali.
-@`E consigliabile seguire questa convenzione quando si definiscono delle funzioni.
-
-Il programma seguente usa la funzione @code{massimo()}. Carica un vettore,
-richiama @code{massimo()}, e quindi elenca il numero massimo contenuto in
-quel vettore:
-
-@example
-function massimo(vettore, i, max)
-@{
- for (i in vettore) @{
- if (max == "" || vettore[i] > max)
- max = vettore[i]
- @}
- return max
-@}
-
-# Carica tutti i campi di ogni record in numeri.
-@{
- for (i = 1; i <= NF; i++)
- numeri[NR, i] = $i
-@}
-
-END @{
- print massimo(numeri)
-@}
-@end example
-
-Dato il seguente input:
-
-@example
- 1 5 23 8 16
-44 3 5 2 8 26
-256 291 1396 2962 100
--6 467 998 1101
-99385 11 0 225
-@end example
-
-@noindent
-il programma trova (come si pu@`o immaginare) che 99.385 @`e il
-valore pi@`u alto contenuto nel vettore.
-
-@node Variabili di tipo dinamico
-@subsection Funzioni e loro effetti sul tipo di una variabile
-
-@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,
-prima dell'effettiva esecuzione di un programma.
-Ecco un esempio di programma commentato:
-
-@example
-function pippo(a)
-@{
- a[1] = 1 # il parametro @`e un vettore
-@}
-
-BEGIN @{
- b = 1
- pippo(b) # non valido: errore fatale, tipi variabile in conflitto
-
- pippo(x) # x non inizializzato, diventa un vettore dinamicamente
- x = 1 # a questo punto, non permesso: errore in esecuzione
-@}
-@end example
-
-In questo esempio, la prima chiamata a @code{pippo()} genera
-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.
-
-@node Chiamate indirette
-@section Chiamate indirette di funzione
-
-@cindex indiretta, chiamata di funzione
-@cindex chiamata indiretta di funzione
-@cindex funzione, puntatori a
-@cindex puntatori a funzioni
-@cindex differenze tra @command{awk} e @command{gawk}, chiamata indiretta di funzione
-
-Questa sezione descrive un'estensione avanzata, specifica di @command{gawk}.
-
-Spesso pu@`o essere utile ritardare la scelta della funzione da chiamare
-fino al momento in cui il programma viene eseguito.
-Per esempio, potrebbero esserci diversi tipi di record in input, ciascuno
-dei quali dovrebbe essere elaborato in maniera differente.
-
-Solitamente, si userebbe una serie di istruzioni @code{if}-@code{else}
-per decidere quale funzione chiamare. Usando la chiamata @dfn{indiretta}
-a una funzione, si pu@`o assegnare il nome della funzione da chiamare a
-una variabile di tipo stringa, e usarla per chiamare la funzione.
-Vediamo un esempio.
-
-Si supponga di avere un file con i punteggi ottenuti negli esami per i
-corsi che si stanno seguendo, e che si desideri ottenere la somma e la
-media dei punteggi ottenuti.
-Il primo campo @`e il nome del corso. I campi seguenti sono i nomi delle
-funzioni da chiamare per elaborare i dati, fino a un campo ``separatore''
-@samp{dati:}. Dopo il separatore, fino alla fine del record,
-ci sono i vari risultati numerici di ogni test.
-
-Ecco il file iniziale:
-
-@example
-@c file eg/data/class_data1
-Biologia_101 somma media dati: 87.0 92.4 78.5 94.9
-Chimica_305 somma media dati: 75.2 98.3 94.7 88.2
-Inglese_401 somma media dati: 100.0 95.6 87.1 93.4
-@c endfile
-@end example
-
-Per elaborare i dati, si potrebbe iniziare a scrivere:
-
-@example
-@{
- corso = $1
- for (i = 2; $i != "dati:"; i++) @{
- if ($i == "somma")
- somma() # elabora l'intero record
- else if ($i == "media")
- media()
- @dots{} # e cos@`{@dotless{i}} via
- @}
-@}
-@end example
-
-@noindent
-Questo stile di programmazione funziona, ma pu@`o essere scomodo.
-Con la chiamata @dfn{indiretta} di funzione, si pu@`o richiedere a @command{gawk}
-di usare il @emph{valore} di una variabile come @emph{nome} della funzione da
-chiamare.
-
-@cindex @code{@@}, notazione per la chiamata indiretta di funzioni
-@cindex chiamata indiretta di funzioni, notazione @code{@@}
-La sintassi @`e simile a quella di una normale chiamata di funzione:
-un identificativo, seguito immediatamente da una parentesi aperta,
-qualche argomento, e una parentesi chiusa, con l'aggiunta di un carattere
-@samp{@@} all'inizio:
-
-@example
-quale_funzione = "somma"
-risultato = @@quale_funzione() # chiamata della funzione somma()
-@end example
-
-Ecco un intero programma che elabora i dati mostrati sopra,
-usando la chiamata indiretta di funzioni:
-
-@example
-@c file eg/prog/indirectcall.awk
-# chiamataindiretta.awk --- esempio di chiamata indiretta di funzioni
-@c endfile
-@ignore
-@c file eg/prog/indirectcall.awk
-#
-# Arnold Robbins, arnold@skeeve.com, Public Domain
-# January 2009
-@c endfile
-@end ignore
-
-@c file eg/prog/indirectcall.awk
-# media --- calcola la media dei valori dei campi $primo - $ultimo
-
-function media(primo, ultimo, somma, i)
-@{
- somma = 0;
- for (i = primo; i <= ultimo; i++)
- somma += $i
-
- return somma / (ultimo - primo + 1)
-@}
-
-# somma --- restituisce la somma dei valori dei campi $primo - $ultimo
-
-function somma(primo, ultimo, totale, i)
-@{
- max = 0;
- for (i = primo; i <= ultimo; i++)
- totale += $i
-
- return totale
-@}
-@c endfile
-@end example
-
-Queste due funzioni presuppongono che si lavori con dei campi; quindi,
-i parametri @code{primo} e @code{ultimo} indicano da quale campo iniziare
-e fino a quale arrivare.
-Per il resto, eseguono i calcoli richiesti, che sono i soliti:
-
-@example
-@c file eg/prog/indirectcall.awk
-# Per ogni record,
-# stampa il nome del corso e le statistiche richieste
-@{
- nome_corso = $1
- gsub(/_/, " ", nome_corso) # Rimpiazza _ con spazi
-
- # trova campo da cui iniziare
- for (i = 1; i <= NF; i++) @{
- if ($i == "dati:") @{
- inizio = i + 1
- break
- @}
- @}
-
- printf("%s:\n", nome_corso)
- for (i = 2; $i != "dati:"; i++) @{
- quale_funzione = $i
- printf("\t%s: <%s>\n", $i, @@quale_funzione(inizio, NF) "")
- @}
- print ""
-@}
-@c endfile
-@end example
-
-Questo @`e il ciclo principale eseguito per ogni record.
-Stampa il nome del corso (con le
-lineette basse sostituite da spazi). Trova poi l'inizio dei dati veri
-e propri, salvandolo in @code{inizio}.
-L'ultima parte del codice esegue un ciclo per ogni nome di funzione
-(da @code{$2} fino al separatore, @samp{dati:}), chiamando la funzione
-il cui nome @`e specificato nel campo. La chiamata di funzione indiretta
-compare come parametro nella chiamata a @code{printf}.
-(La stringa di formattazione di @code{printf} usa @samp{%s} come
-specificatore di formato, affinch@'e sia possibile usare funzioni
-che restituiscano sia stringhe che numeri. Si noti che il risultato
-della chiamata indiretta @`e concatenato con la stringa nulla, in modo da
-farlo considerare un valore di tipo stringa).
-
-Ecco il risultato dell'esecuzione del programma:
-
-@example
-$ @kbd{gawk -f chiamataindiretta.awk dati_dei_corsi}
-@print{} Biologia 101:
-@print{} somma: <352.8>
-@print{} media: <88.2>
-@print{}
-@print{} Chimica 305:
-@print{} somma: <356.4>
-@print{} media: <89.1>
-@print{}
-@print{} Inglese 401:
-@print{} somma: <376.1>
-@print{} media: <94.025>
-@end example
-
-La possibilit@`a di usare la chiamata indiretta di funzioni @`e pi@`u potente
-di quel che si possa pensare inizialmente.
-I linguaggi C e C++ forniscono ``puntatori di funzione'' che
-sono un metodo per chiamare una funzione scelta al momento dell'esecuzione.
-Uno dei pi@`u noti usi di questa funzionalit@`a @`e
-la funzione C @code{qsort()}, che ordina un vettore usando il famoso
-algoritmo noto come ``quicksort''
-(si veda @uref{http://en.wikipedia.org/wiki/Quicksort, l'articolo di Wikipedia}
-per ulteriori informazioni). Per usare questa funzione, si specifica un
-puntatore a una funzione di confronto. Questo meccanismo consente
-di ordinare dei dati arbitrari in una maniera arbitraria.
-
-Si pu@`o fare qualcosa di simile usando @command{gawk}, cos@`{@dotless{i}}:
-
-@example
-@c file eg/lib/quicksort.awk
-# quicksort.awk --- Algoritmo di quicksort, con funzione di confronto
-# fornita dall'utente
-@c endfile
-@ignore
-@c file eg/lib/quicksort.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# January 2009
-
-@c endfile
-@end ignore
-@c file eg/lib/quicksort.awk
-
-# quicksort --- Algoritmo di quicksort di C.A.R. Hoare.
-# Si veda Wikipedia o quasi ogni libro
-# che tratta di algoritmi o di informatica.
-@c endfile
-@ignore
-@c file eg/lib/quicksort.awk
-#
-# Adattato da B.W. Kernighan & D.M. Ritchie
-# The C Programming Language
-# (Englewood Cliffs, NJ: Prentice Hall, 1988)
-# Seconda Edizione, pagina 110
-@c endfile
-@end ignore
-@c file eg/lib/quicksort.awk
-
-function quicksort(dati, sinistra, destra, minore_di, i, ultimo)
-@{
- if (sinistra >= destra) # non fa nulla se il vettore contiene
- return # meno di due elementi
-
- quicksort_scambia(dati, sinistra, int((sinistra + destra) / 2))
- ultimo = sinistra
- for (i = sinistra + 1; i <= destra; i++)
- if (@@minore_di(dati[i], dati[sinistra]))
- quicksort_scambia(dati, ++ultimo, i)
- quicksort_scambia(dati, sinistra, ultimo)
- quicksort(dati, sinistra, ultimo - 1, minore_di)
- quicksort(dati, ultimo + 1, destra, minore_di)
-@}
-
-# quicksort_scambia --- funzione ausiliaria per quicksort,
-# sarebbe meglio fosse nel programma principale
-
-function quicksort_scambia(dati, i, j, salva)
-@{
- salva = dati[i]
- dati[i] = dati[j]
- dati[j] = salva
-@}
-@c endfile
-@end example
-
-La funzione @code{quicksort()} riceve il vettore @code{dati}, gli
-indici iniziali e finali da ordinare
-(@code{sinistra} e @code{destra}), e il nome di una funzione che
-esegue un confronto ``minore di''. Viene quindi eseguito
-l'algoritmo di quicksort.
-
-Per fare uso della funzione di ordinamento, torniamo all'esempio
-precedente. La prima cosa da fare @`e di scrivere qualche funzione
-di confronto:
-
-@example
-@c file eg/prog/indirectcall.awk
-# num_min --- confronto numerico per minore di
-
-function num_min(sinistra, destra)
-@{
- return ((sinistra + 0) < (destra + 0))
-@}
-
-# num_magg_o_ug --- confronto numerico per maggiore o uguale
-
-function num_magg_o_ug(sinistra, destra)
-@{
- return ((sinistra + 0) >= (destra + 0))
-@}
-@c endfile
-@end example
-
-La funzione @code{num_magg_o_ug()} serve per ottenere un ordinamento
-decrescente (dal numero pi@`u alto al pi@`u basso); quando @`e usato
-per eseguire un test per ``minore di'', in realt@`a fa l'opposto
-(maggiore o uguale a), il che conduce a ottenere dati ordinati
-in ordine decrescente.
-
-Poi serve una funzione di ordinamento.
-Come parametri ha i numeri del campo iniziale e di quello finale,
-e il nome della funzione di confronto.
-Costruisce un vettore con
-i dati e richiama appropriatamente @code{quicksort()}; quindi formatta i
-risultati mettendoli in un'unica stringa:
-
-@example
-@c file eg/prog/indirectcall.awk
-# ordina --- ordina i dati a seconda di `confronta'
-# e li restituisce come un'unica stringa
-
-function ordina(primo, ultimo, confronta, dati, i, risultato)
-@{
- delete dati
- for (i = 1; primo <= ultimo; primo++) @{
- dati[i] = $primo
- i++
- @}
-
- quicksort(dati, 1, i-1, confronta)
-
- risultato = dati[1]
- for (i = 2; i in dati; i++)
- risultato = risultato " " dati[i]
-
- return risultato
-@}
-@c endfile
-@end example
-
-Per finire, le due funzioni di ordinamento chiamano la funzione
-@code{ordina()}, passandole i nomi delle due funzioni di confronto:
-
-@example
-@c file eg/prog/indirectcall.awk
-# ascendente --- ordina i dati in ordine crescente
-# e li restituisce sotto forma di stringa
-
-function ascendente(primo, ultimo)
-@{
- return ordina(primo, ultimo, "num_min")
-@}
-
-# discendente --- ordina i dati in ordine decrescente
-# e li restituisce sotto forma di stringa
-
-function discendente(primo, ultimo)
-@{
- return ordina(primo, ultimo, "num_magg_o_ug")
-@}
-@c endfile
-@end example
-
-Ecco una versione estesa del @value{DF}:
-
-@example
-@c file eg/data/class_data2
-Biologia_101 somma media ordina discendente dati: 87.0 92.4 78.5 94.9
-Chimica_305 somma media ordina discendente dati: 75.2 98.3 94.7 88.2
-Inglese_401 somma media ordina discendente dati: 100.0 95.6 87.1 93.4
-@c endfile
-@end example
-
-Per finire, questi sono i risultati quando si esegue il programma
-in questa versione migliorata:
-
-@example
-$ @kbd{gawk -f quicksort.awk -f indirettacall.awk class_data2}
-@print{} Biologia 101:
-@print{} somma: <352.8>
-@print{} media: <88.2>
-@print{} ascendente: <78.5 87.0 92.4 94.9>
-@print{} discendente: <94.9 92.4 87.0 78.5>
-@print{}
-@print{} Chimica 305:
-@print{} somma: <356.4>
-@print{} media: <89.1>
-@print{} ascendente: <75.2 88.2 94.7 98.3>
-@print{} discendente: <98.3 94.7 88.2 75.2>
-@print{}
-@print{} Inglese 401:
-@print{} somma: <376.1>
-@print{} media: <94.025>
-@print{} ascendente: <87.1 93.4 95.6 100.0>
-@print{} discendente: <100.0 95.6 93.4 87.1>
-@end example
-
-Un altro esempio in cui le chiamate indirette di funzione sono utili
-@`e costituito dall'elaborazione di vettori. La descrizione si pu@`o trovare
-@ref{Visitare vettori}.
-
-Occorre ricordarsi di anteporre il carattere @samp{@@} prima di una
-chiamata indiretta di funzione.
-
-A partire dalla @value{PVERSION} 4.1.2 di @command{gawk}, le chiamate
-indirette di funzione
-possono anche essere usate per chiamare funzioni predefinite e con
-funzioni di estensione
-(@pxref{Estensioni dinamiche}). Ci sono alcune limitazioni nel richiamare
-in maniera indiretta delle funzioni predefinite, come qui dettagliato:
-
-@itemize @value{BULLET}
-@item
-Non si pu@`o passare una costante @dfn{regexp} a una funzione predefinita
-effettuando una chiamata di funzione indiretta.@footnote{Questa
-limitazione potrebbe cambiare in una futura versione;
-per appurarlo, si controlli la documentazione che accompagna
-la versione in uso di @command{gawk}.}
-Quanto sopra vale per le funzioni
-@code{sub()}, @code{gsub()}, @code{gensub()}, @code{match()},
-@code{split()} e @code{patsplit()}.
-
-@item
-Nel chiamare @code{sub()} o @code{gsub()}, sono accettati solo due argomenti,
-poich@'e queste funzioni sono atipiche, in quanto aggiornano il loro terzo
-argomento. Questo significa che verr@`a sempre aggiornato l'argomento di
-default, @code{$0}.
-@end itemize
-
-@command{gawk} fa del suo meglio per rendere efficiente la chiamata indiretta
-di funzioni. Per esempio, nel ciclo seguente:
-
-@example
-for (i = 1; i <= n; i++)
- @@quale_funzione()
-@end example
-
-@noindent
-@command{gawk} ricerca solo una volta quale funzione chiamare.
-
-@node Sommario delle funzioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-@command{awk} include delle funzioni predefinite e consente all'utente
-di definire le sue proprie funzioni.
-
-@item
-POSIX @command{awk} include tre tipi di funzioni predefinite: numeriche, di
-stringa, e di I/O. @command{gawk} prevede funzioni per ordinare vettori, per
-lavorare con valori che rappresentano marcature temporali,
-per la manipolazione di bit,
-per determinare il tipo di una variabile (vettoriale piuttosto che scalare), e
-programmi per l'internazionalizzazione e la localizzazione. @command{gawk}
-prevede anche parecchie estensioni ad alcune funzioni standard, tipicamente
-nella forma di ulteriori argomenti.
-
-@item
-Le funzioni accettano zero o pi@`u argomenti e restituiscono un valore. Le
-espressioni che specificano il valore di ogni argomento sono valutate
-completamente prima della chiamata
-a una funzione. L'ordine di valutazione di questi argomenti non @`e definito.
-Il valore restituito dalla funzione pu@`o essere ignorato.
-
-@item
-La gestione delle barre inverse in @code{sub()} e @code{gsub()} non @`e
-semplice.
-@`E pi@`u semplice nella funzione di @command{gawk} @code{gensub()},
-ma anche questa funzione richiede attenzione quando la si usa.
-
-@item
-Le funzioni definite dall'utente consentono importanti funzionalit@`a ma hanno
-anche alcune ineleganze sintattiche. In una chiamata di funzione non si pu@`o
-inserire alcuno spazio tra il nome della funzione e la parentesi sinistra
-aperta che inizia la lista degli argomenti. Inoltre, non c'@`e nessuna
-prescrizione per le variabili locali, e per questo la
-convenzione in uso @`e di aggiungere parametri extra, e di separarli visivamente
-dai parametri veri e propri inserendo degli spazi bianchi prima di essi.
-
-@item
-Le funzioni definite dall'utente possono chiamare altre
-funzioni definite dall'utente (oltre a quelle predefinite)
-e possono chiamare se stesse ricorsivamente. I parametri di funzione
-``nascondono'' qualsiasi variabile globale che abbia lo stesso nome.
-Non si pu@`o usare il nome di una variabile riservata (p.es. @code{ARGC})
-come nome di un parametro in funzioni definite dall'utente.
-
-@item
-I valori scalari sono passati alle funzioni definite dall'utente
-per valore. I parametri che sono dei vettori sono passati alle funzioni
-per riferimento; ogni modifica fatta dalla funzione a un parametro che
-sia un vettore @`e quindi visibile dopo aver eseguito quella funzione.
-
-@item
-L'istruzione @code{return} serve per tornare indietro da una funzione definita
-dall'utente. Un'espressione opzionale diviene il valore restituito dalla
-funzione. Una funzione pu@`o solo restituire valori di tipo scalare.
-
-@item
-Se una variabile che non @`e stata mai usata @`e passata a una funzione
-definita dall'utente, il modo con cui quella funzione elabora la variabile
-ne pu@`o determinare il tipo: o scalare o vettoriale.
-
-@item
-@command{gawk} consente la chiamata indiretta di funzioni usando una sintassi
-speciale. Impostando una variabile al nome di una funzione, si pu@`o
-determinare al momento dell'esecuzione che funzione sar@`a chiamata in un certo
-punto del programma. Questo equivale a usare un puntatore a una funzione nei
-linguaggi C e C++.
-
-@end itemize
-
-
-@ifnotinfo
-@part @value{PART2}Risoluzione di problemi con @command{awk}
-@end ifnotinfo
-
-@ifdocbook
-La Parte II mostra come usare @command{awk} e @command{gawk} per risolvere
-problemi. Qui c'@`e il codice di molti programmi, da leggere e da cui si pu@`o
-imparare. @`E composta dai seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Funzioni di libreria}
-
-@item
-@ref{Programmi di esempio}
-@end itemize
-@end ifdocbook
-
-@node Funzioni di libreria
-@chapter Una libreria di funzioni @command{awk}
-@cindex libreria di funzioni @command{awk}
-@cindex funzioni di libreria
-@cindex funzioni definite dall'utente, libreria di
-
-@iftex
-La
-@end iftex
-@ref{Funzioni definite dall'utente} descrive come scrivere le proprie
-funzioni @command{awk} personali. Scrivere funzioni @`e importante, perch@'e
-consente di incapsulare in un unico contenitore algoritmi e azioni di
-programma. Semplifica la programmazione, rendendo lo sviluppo di un programma
-pi@`u gestibile, e rendendo i programmi pi@`u leggibili.
-
-@cindex Kernighan, Brian
-@cindex Plauger, P.J.@:
-Nel loro autorevole libro del 1976,
-@cite{Software Tools},@footnote{Purtroppo, a distanza di oltre 35 anni,
-molte delle
-lezioni impartite da questo libro devono ancora essere apprese da un gran
-numero di programmatori professionisti.}
-Brian Kernighan e P.J.@: Plauger hanno scritto:
-
-@quotation
-A programmare bene non s'impara dai concetti generali, ma vedendo come
-programmi complessi possono essere resi puliti, facili da leggere,
-facili da manutenere e modificare,
-strutturati in modo comprensibile, efficienti e affidabili,
-applicando il buon senso e delle buone pratiche di programmazione.
-Lo studio attento e l'imitazione di buoni programmi conduce a una migliore
-scrittura.
-@end quotation
-
-In effetti, loro reputavano quest'idea tanto importante da mettere questa
-frase sulla copertina del libro. Poich@'e credo fermamente che la loro
-affermazione sia corretta, questo @value{CHAPTER} e
-@iftex
-il
-@end iftex
-@ref{Programmi di esempio}
-forniscono una corposa raccolta di codice da leggere e, si spera, da cui
-imparare.
-
-Questo @value{CHAPTER} illustra una libreria di utili funzioni @command{awk}.
-Molti dei programmi descritti nel seguito di questo @value{DOCUMENT}
-usano queste funzioni.
-Le funzioni sono illustrate progressivamente, dalla pi@`u semplice alla pi@`u
-complessa.
-
-@cindex Texinfo
-@iftex
-La
-@end iftex
-@ref{Programma extract}
-illustra un programma che si pu@`o usare per estrarre il codice sorgente
-degli esempi di funzioni di libreria e di programmi dal sorgente Texinfo
-di questo @value{DOCUMENT}.
-(Questo @`e gi@`a stato fatto durante la preparazione della distribuzione
-di @command{gawk}.)
-
-@ifclear FOR_PRINT
-Chi avesse scritto una o pi@`u funzioni @command{awk} utili e di uso
-generale, e volesse metterle a disposizione della comunit@`a degli utenti di
-@command{awk}, pu@`o leggere le informazioni contenute in
-@ref{Come contribuire}.
-@end ifclear
-
-@cindex portabilit@`a, programmi di esempio
-I programmi contenuti in questo @value{CHAPTER} e in
-@ref{Programmi di esempio},
-utilizzano anche le funzionalit@`a specifiche di @command{gawk}.
-Riscrivere questi programmi per implementazioni di @command{awk} diverse
-@`e piuttosto semplice:
-
-@itemize @value{BULLET}
-@item
-I messaggi di errore diagnostici sono inviati a @file{/dev/stderr}.
-Usare @samp{| "cat 1>&2"} al posto di @samp{> "/dev/stderr"} se il sistema
-in uso non ha un @file{/dev/stderr}, o se non @`e possibile usare
-@command{gawk}.
-
-@item
-Alcuni programmi usano @code{nextfile}
-(@pxref{Istruzione nextfile})
-per evitare di leggere gli input ancora non letti dal file in input corrente.
-
-@item
-@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue.
-@cindex distinzione maiuscolo/minuscolo, programmi di esempio
-@cindex @code{IGNORECASE}, variabile, nei programmi di esempio
-@cindex variabile @code{IGNORECASE}, nei programmi di esempio
-Infine, alcuni dei programmi scelgono di ignorare la distinzione tra maiuscolo e
-minuscolo nei loro input, assegnando il valore uno a @code{IGNORECASE}.
-Si pu@`o ottenere quasi lo stesso effetto@footnote{I risultati non sono identici.
-L'output del record trasformato sar@`a tutto in minuscolo, mentre
-@code{IGNORECASE} preserva il contenuto originale del record in input.}
-aggiungendo la seguente regola
-all'inizio del programma:
-
-@example
-# ignora maiuscolo/minuscolo
-@{ $0 = tolower($0) @}
-@end example
-
-@noindent
-Inoltre, si verifichi che tutte le @dfn{regexp} e le costanti
-di tipo stringa usate nei confronti utilizzano solo lettere minuscole.
-@end itemize
-
-@menu
-* Nomi di variabili di libreria:: Che nomi @`e meglio dare alle variabili
- private globali nelle funzioni di libreria.
-* Funzioni di tipo generale:: Funzioni di uso generale.
-* Gestione File Dati:: Funzioni per gestire file-dati specificati
- sulla riga di comando.
-* Funzione getopt:: Una funzione per trattare argomenti presenti
- sulla riga di comando.
-* Funzioni Passwd:: Funzioni per ottenete informazioni
- sull'utente [da /etc/passwd].
-* Funzioni Group:: Funzioni per ottenete informazioni
- sul gruppo [da /etc/group].
-* Visitare vettori:: Una funzione per visitare vettori di vettori.
-* Sommario funzioni di libreria:: Sommario funzioni di libreria
-* Esercizi con le librerie:: Esercizi.
-@end menu
-
-@node Nomi di variabili di libreria
-@section Dare un nome a variabili globali in funzioni di libreria
-
-@cindex nomi di vettore/variabile
-@cindex nomi di funzione
-@cindex questioni sui nomi permessi
-@cindex nomi permessi, questioni sui
-@cindex programmi @command{awk}, documentazione
-@cindex documentazione, di programmi @command{awk}
-Per come si @`e sviluppato il linguaggio @command{awk}, le variabili sono
-o @dfn{globali} (usabili dall'intero programma) o @dfn{locali} (usabili solo
-in una specifica funzione). Non c'@`e uno stato intermedio analogo alle
-variabili @code{statiche} in C.
-
-@cindex variabili globali, per funzioni di libreria
-@cindex globali, variabili, per funzioni di libreria
-@cindex private, variabili
-@cindex variabili private
-Le funzioni di libreria hanno spesso necessit@`a di avere variabili globali da
-usare per conservare informazioni di stato tra successive chiamate alla
-funzione; per esempio, la variabile di @code{getopt()} @code{_opti}
-(@pxref{Funzione getopt}).
-Tali variabili vengono dette @dfn{private}, poich@'e le sole funzioni che
-devono usarle sono quelle della libreria.
-
-Quando si scrive una funzione di libreria, si dovrebbe cercare di scegliere per
-le variabili private dei nomi che non entrano in conflitto con nessuna delle
-variabili usate da un'altra funzione di libreria o dal programma principale di
-un utente. Per esempio, un nome come @code{i} o @code{j} non @`e una buona
-scelta, perch@'e i programmi a livello utente usano spesso nomi di variabile come
-questi per le proprie elaborazioni.
-
-@cindex convenzioni di programmazione, nomi di variabili private
-@cindex programmazione, convenzioni di, nomi di variabili private
-I programmi di esempio mostrati in questo @value{CHAPTER} usano per le
-loro variabili private nomi che iniziano con un trattino basso(@samp{_}).
-Generalmente gli utenti
-non usano trattini bassi iniziali nei nomi di variabile, cos@`{@dotless{i}} questa convenzione
-riduce le possibilit@`a che il nome di variabile coincida con un nome usato
-nel programma dell'utente.
-
-@cindex @code{_} (trattino basso), nei nomi di variabili private
-@cindex trattino basso (@code{_}), nei nomi di variabili private
-Inoltre, parecchie funzioni di libreria usano un prefisso che suggerisce
-quale funzione o gruppo di funzioni usa quelle variabili; per esempio,
-@code{_pw_byname()} nelle routine che consultano la lista degli utenti
-(@pxref{Funzioni Passwd}).
-L'uso di questa convenzione viene raccomandata, poich@'e riduce ulteriormente la
-possibilit@`a di conflitti accidentali tra nomi di variabile. Si noti che questa
-convenzione pu@`o anche essere usata per i nomi di variabile e per i nomi delle
-funzioni private.@footnote{Sebbene tutte le routine di libreria si sarebbero
-potute riscrivere usando questa convenzione, ci@`o non @`e stato fatto, per far
-vedere come lo stile di programmazione in @command{awk} si @`e evoluto e
-per fornire alcuni spunti per questa spiegazione.}
-
-Come nota finale sui nomi delle variabili, se una funzione rende
-disponibile una variabile globale per essere usata da un programma principale,
-@`e una buona convenzione quella di far iniziare i nomi di queste variabili con
-una lettera maiuscola; per esempio, @code{Opterr} e @code{Optind} di
-@code{getopt()}
-(@pxref{Funzione getopt}).
-La lettera maiuscola iniziale indica che la variabile @`e globale,
-mentre il fatto che
-il nome della variabile non @`e tutto in lettere maiuscole indica che la variabile
-non @`e una delle variabili predefinite di @command{awk}, come @code{FS}.
-
-@cindex @option{--dump-variables}, opzione, uso per funzioni di libreria
-@cindex opzione @option{--dump-variables}, uso per funzioni di libreria
-@`E importante anche che @emph{tutte} le variabili nelle funzioni di libreria
-che non abbiano la necessit@`a di essere
-conservate per tutta la durata del
-programma siano, di fatto, dichiarate
-come locali.@footnote{L'opzione da riga di comando di @command{gawk}
-@option{--dump-variables} @`e utile per verificare questo.} Se ci@`o non viene
-fatto, la variabile potrebbe essere usata accidentalmente nel programma
-dell'utente, conducendo a errori che sono molto difficili da scoprire:
-
-@example
-function lib_func(x, y, l1, l2)
-@{
- @dots{}
- # qualche_var dovrebbe essere locale ma per una svista non lo @`e
- @var{uso della variabile} qualche_var
- @dots{}
-@}
-@end example
-
-@cindex vettori associativi, funzioni di libreria e
-@cindex libreria di funzioni @command{awk}, vettori associativi e
-@cindex funzioni, libreria di, vettori associativi e
-@cindex Tcl
-Una differente convenzione, comune nella comunit@`a Tcl, @`e quella di usare un
-solo vettore associativo che contiene i valori necessari alle funzioni di
-libreria, o ``package.'' Questo riduce significativamente il numero degli
-effettivi nomi globali in uso. Per esempio, le funzioni descritte in
-@ref{Funzioni Passwd}
-potrebbero aver usato gli elementi di vettore
-@code{@w{PW_data["inizializzato"]}},
-@code{@w{PW_data["totale"]}}, @code{@w{PW_data["contatore"]}}, e
-@code{@w{PW_data["awklib"]}}, al posto di @code{@w{_pw_inizializzato}},
-@code{@w{_pw_totale}},
-@code{@w{_pw_awklib}} e
-@code{@w{_pw_contatore}}.
-
-Le convenzioni illustrate in questa @value{SECTION} sono esattamente
-quello che indica il termine: convenzioni. Non si @`e obbligati a scrivere
-i propri programmi in questo modo: @`e solo auspicabile che lo si faccia.
-
-@node Funzioni di tipo generale
-@section Programmazione di tipo generale
-
-Questa @value{SECTION} illustra diverse funzioni che sono di uso generale nella
-programmazione.
-
-@menu
-* Funzione strtonum:: Da usare se non @`e disponibile la funzione
- predefinita @code{strtonum()}.
-* Funzione assert:: Una funzione per controllare affermazioni
- in programmi @command{awk}.
-* Funzione round:: Una funzione per eseguire arrotondamenti
- se @code{sprintf()} non lo fa correttamente.
-* Funzione random Cliff:: Il generatore Cliff di numeri casuali.
-* Funzioni ordinali:: Funzioni per usare caratteri come numeri
- e viceversa.
-* Funzione join:: Una funzione per fondere un vettore
- in una stringa.
-* Funzione getlocaltime:: Una funzione per ottenere data e ora nel
- formato desiderato.
-* Funzione readfile:: Una funzione per leggere un file intero in
- un colpo solo.
-* Apici alla shell:: Una funzione per passare stringhe
- con apici alla shell.
-@end menu
-
-@node Funzione strtonum
-@subsection Conversione di stringhe in numeri
-
-La funzione @code{strtonum()} (@pxref{Funzioni per stringhe})
-@`e un'estensione @command{gawk}. La seguente funzione
-fornisce un'implementazione per altre versioni di @command{awk}:
-
-@example
-@c file eg/lib/strtonum.awk
-# mystrtonum --- converte stringhe in numeri
-
-@c endfile
-@ignore
-@c file eg/lib/strtonum.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# February, 2004
-# Revised June, 2014
-
-@c endfile
-@end ignore
-@c file eg/lib/strtonum.awk
-function mystrtonum(str, ret, n, i, k, c)
-@{
- if (str ~ /^0[0-7]*$/) @{
- # ottale
- n = length(str)
- ret = 0
- for (i = 1; i <= n; i++) @{
- c = substr(str, i, 1)
- # index() restituisce 0 se c non @`e nella stringa,
- # e anche se c == "0"
- k = index("1234567", c)
-
- ret = ret * 8 + k
- @}
- @} else if (str ~ /^0[xX][[:xdigit:]]+$/) @{
- # esadecimale
- str = substr(str, 3) # via 0x iniziale
- n = length(str)
- ret = 0
- for (i = 1; i <= n; i++) @{
- c = substr(str, i, 1)
- c = tolower(c)
- # index() restituisce 0 se c non @`e nella stringa,
- # e anche se c == "0"
- k = index("123456789abcdef", c)
-
- ret = ret * 16 + k
- @}
- @} else if (str ~ \
- /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{
- # numero decimale, eventualmente in virgola mobile
- ret = str + 0
- @} else
- ret = "NON-UN-NUMERO"
-
- return ret
-@}
-
-# BEGIN @{ # dati per un test
-# a[1] = "25"
-# a[2] = ".31"
-# a[3] = "0123"
-# a[4] = "0xdeadBEEF"
-# a[5] = "123.45"
-# a[6] = "1.e3"
-# a[7] = "1.32"
-# a[8] = "1.32E2"
-#
-# for (i = 1; i in a; i++)
-# print a[i], strtonum(a[i]), mystrtonum(a[i])
-# @}
-@c endfile
-@end example
-
-La funzione cerca dapprima numeri ottali in stile C (base 8).
-Se la stringa in input corrisponde all'espressione regolare che descrive i
-numeri ottali, @code{mystrtonum()} esegue il ciclo per ogni carattere presente
-nella stringa. Imposta @code{k} all'indice in @code{"1234567"} della cifra
-ottale corrente.
-Il valore di ritorno sar@`a lo stesso numero della cifra, o zero
-se il carattere non c'@`e, il che succeder@`a per ogni cifra @samp{0}.
-Questo si pu@`o fare, perch@'e il test di @dfn{regexp} nell'istruzione @code{if}
-assicura che vengano scelti per
-essere convertiti solo dei numeri ottali.
-
-Una logica simile si applica al codice che ricerca e converte un
-valore esadecimale, che inizia con @samp{0x} o @samp{0X}.
-L'uso di @code{tolower()} semplifica il calcolo per trovare
-il valore numerico corretto per ogni cifra esadecimale.
-
-Infine, se la stringa corrisponde alla (piuttosto complicata) @dfn{regexp} per
-un intero decimale regolare o per un numero in virgola mobile, il calcolo
-@samp{ret = str + 0} fa s@`{@dotless{i}} che @command{awk} converta il valore in un
-numero.
-
-@`E incluso un programma di verifica commentato, in modo che la funzione possa
-essere verificata con @command{gawk} e il risultato confrontato con la funzione
-predefinita @code{strtonum()}.
-
-@node Funzione assert
-@subsection Asserzioni
-
-@cindex asserzioni
-@cindex @code{assert()}, funzione (libreria C)
-@cindex funzione @code{assert()} (libreria C)
-@cindex libreria di funzioni @command{awk}, asserzioni
-@cindex funzioni, libreria di, asserzioni
-@cindex @command{awk}, asserzioni in programmi lunghi
-Quando si scrivono grossi programmi, spesso @`e utile sapere se
-una condizione o una serie di condizioni @`e verificata oppure no.
-Prima di procedere
-con un determinato calcolo, si fa un'affermazione su cosa si crede sia
-vero. Tale affermazione @`e nota come
-@dfn{asserzione}. Il linguaggio C fornisce un file di intestazione
-@code{<assert.h>} e una corrispondente macro @code{assert()} che un
-programmatore pu@`o utilizzare per fare asserzioni.
-Se l'asserzione risulta falsa, la macro @code{assert()} predispone la
-stampa di un messaggio diagnostico che descrive la condizione che
-sarebbe dovuta essere vera ma che non lo era, e poi fa terminare
-il programma.
-In C, l'uso di @code{assert()} @`e simile a questo:
-
-@example
-#include <assert.h>
-
-int myfunc(int a, double b)
-@{
- assert(a <= 5 && b >= 17.1);
- @dots{}
-@}
-@end example
-
-Se l'asserzione @`e falsa, il programma stampa un messaggio simile a questo:
-
-@example
-prog.c:5: asserzione falsa: `a <= 5 && b >= 17.1'
-@end example
-
-@cindex @code{assert()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{assert()}
-Il linguaggio C rende possibile trasformare questa condizione in una stringa
-da
-usare per stampare il messaggio di diagnosi. Ci@`o in @command{awk} non @`e
-possibile, per cui la funzione @code{assert()} scritta in @command{awk}
-richiede anche una descrizione
-della condizione da verificare, in formato stringa.
-La funzione @`e la seguente:
-
-@example
-@c file eg/lib/assert.awk
-# assert --- Verifica una condizione. Se questa @`e falsa esce.
-
-@c endfile
-@ignore
-@c file eg/lib/assert.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May, 1993
-
-@c endfile
-@end ignore
-@c file eg/lib/assert.awk
-function assert(condizione, stringa)
-@{
- if (! condizione) @{
- printf("%s:%d: asserzione falsa: %s\n",
- FILENAME, FNR, stringa) > "/dev/stderr"
- _assert_exit = 1
- exit 1
- @}
-@}
-
-@group
-END @{
- if (_assert_exit)
- exit 1
-@}
-@end group
-@c endfile
-@end example
-
-La funzione @code{assert()} verifica il parametro @code{condizione}. Se
-@`e falso, stampa un messaggio sullo standard error, usando il parametro
-@code{stringa} per descrivere la condizione non verificata. Poi imposta la
-variabile @code{_assert_exit} a uno ed esegue l'istruzione @code{exit}.
-L'istruzione @code{exit} salta alla regola @code{END}. Se la regola @code{END}
-trova vera la variabile @code{_assert_exit}, esce immediatamente.
-
-Lo scopo della verifica nella regola @code{END} @`e quello di evitare che venga
-eseguita qualsiasi altra eventuale regola @code{END}.
-Quando un'asserzione non @`e
-verificata, il programma dovrebbe uscire immediatamente.
-Se nessuna asserzione
-fallisce, @code{_assert_exit} @`e ancora falso quando la regola @code{END} @`e
-eseguita normalmente, e le eventuali altre regole @code{END} del programma
-vengono eseguite.
-Affinch@'e tutto questo funzioni correttamente, @file{assert.awk} dev'essere il
-primo file sorgente che viene letto da @command{awk}.
-La funzione pu@`o essere usata in un programma nel seguente modo:
-
-@example
-function miafunz(a, b)
-@{
- assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1")
- @dots{}
-@}
-@end example
-
-@noindent
-Se l'asserzione non @`e verificata, si vedr@`a un messaggio simile a questo:
-
-@example
-mydata:1357: asserzione falsa: a <= 5 && b >= 17.1
-@end example
-
-@cindex @code{END}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
-@cindex criterio di ricerca @code{END}, funzione definita dall'utente @code{assert()} e
-C'@`e un piccolo problema con questa versione di @code{assert()}.
-Come visto, una regola @code{END} viene automaticamente aggiunta al programma
-che chiama @code{assert()}. Normalmente, se un programma consiste
-solo di una regola @code{BEGIN}, i file in input e/o lo standard input non
-vengono letti. Tuttavia, ora che il programma ha una regola @code{END},
-@command{awk} tenta di leggere i @value{DF} in input o lo standard input
-(@pxref{Usare BEGIN/END}), provocando molto probabilmente la sospensione del
-programma come se rimanesse in attesa di input.
-
-@cindex @code{BEGIN}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
-@cindex criterio di ricerca @code{BEGIN}, funzione definita dall'utente @code{assert()} e
-C'@`e un modo per aggirare questo problema:
-assicurarsi che la regola @code{BEGIN} termini sempre
-con un'istruzione @code{exit}.
-
-@node Funzione round
-@subsection Arrotondamento di numeri
-
-@cindex arrotondare numeri
-@cindex numeri, arrotondamento di
-@cindex libreria di funzioni @command{awk}, arrotondamento di numeri
-@cindex funzioni, libreria di, arrotondamento di numeri
-@cindex @code{print}, istruzione, funzione @code{sprintf()} e
-@cindex istruzione @code{print}, funzione @code{sprintf()} e
-@cindex @code{printf}, istruzione, funzione @code{sprintf()} e
-@cindex istruzione @code{printf}, funzione @code{sprintf()} e
-@cindex @code{sprintf()}, funzione, istruzioni @code{print}/@code{printf} e
-@cindex funzione @code{sprintf()}, istruzioni @code{print}/@code{printf} e
-Il modo in cui @code{printf} e @code{sprintf()}
-(@pxref{Printf})
-effettuano l'arrotondamento spesso dipende dalla subroutine C @code{sprintf()}
-del sistema. Su molte macchine, l'arrotondamento di @code{sprintf()} @`e
-@dfn{statistico}, il che significa che non sempre arrotonda un .5 finale per
-eccesso, contrariamente alle normali aspettative. Nell'arrotondamento
-statistico, .5 arrotonda alla cifra pari, anzich@'e sempre per eccesso, cos@`{@dotless{i}}
-1.5 arrotonda a 2 e 4.5 arrotonda a 4. Ci@`o significa che se si sta usando un
-formato che fa arrotondamenti (p.es. @code{"%.0f"}), si dovrebbe controllare
-quello che fa il sistema che si sta usando. La seguente funzione esegue un
-arrotondamento tradizionale; potrebbe essere utile nel caso in cui
-l'istruzione @code{printf}
-di @command{awk} che si sta usando faccia degli arrotondamenti statistici:
-
-@cindex @code{round()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{round()}
-@example
-@c file eg/lib/round.awk
-# round.awk --- effettua arrotondamento tradizionale
-@c endfile
-@ignore
-@c file eg/lib/round.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August, 1996
-@c endfile
-@end ignore
-@c file eg/lib/round.awk
-
-function round(x, ival, aval, frazione)
-@{
- ival = int(x) # parte intera, int() fa un troncamento
-
- # vedere se c'@`e la parte frazionale
- if (ival == x) # nessuna parte frazionale
- return ival # nessun decimale
-
- if (x < 0) @{
- aval = -x # valore assoluto
- ival = int(aval)
- frazione = aval - ival
- if (frazione >= .5)
- return int(x) - 1 # -2.5 --> -3
- else
- return int(x) # -2.3 --> -2
- @} else @{
- frazione = x - ival
- if (frazione >= .5)
- return ival + 1
- else
- return ival
- @}
-@}
-@c endfile
-@c don't include test harness in the file that gets installed
-
-# codice per testare, commentato
-# @{ print $0, round($0) @}
-@end example
-
-@node Funzione random Cliff
-@subsection Il generatore di numeri casuali Cliff
-@cindex numeri casuali, generatore Cliff
-@cindex Cliff, generatore di numeri casuali
-@cindex casuali, numeri, generatore Cliff di
-@cindex funzioni, libreria di, numeri casuali Cliff
-
-Il
-@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, generatore di numeri casuali Cliff}
-@`e un generatore di numeri casuali molto semplice che ``passa il test della sfera
-del rumore per la casualit@`a non mostrando di avere alcuna struttura.''
-@`E programmato in modo molto semplice, in meno di 10 righe di codice
-@command{awk}:
-
-@cindex @code{cliff_rand()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{cliff_rand()}
-@example
-@c file eg/lib/cliff_rand.awk
-# cliff_rand.awk --- generare numeri casuali con algoritmo di Cliff
-@c endfile
-@ignore
-@c file eg/lib/cliff_rand.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# December 2000
-@c endfile
-@end ignore
-@c file eg/lib/cliff_rand.awk
-
-BEGIN @{ _cliff_seme = 0.1 @}
-
-function cliff_rand()
-@{
- _cliff_seme = (100 * log(_cliff_seme)) % 1
- if (_cliff_seme < 0)
- _cliff_seme = - _cliff_seme
- return _cliff_seme
-@}
-@c endfile
-@end example
-
-Questo algoritmo richiede un ``seme'' iniziale di 0,1. Ogni nuovo valore
-usa il seme corrente come input per il calcolo.
-Se la funzione predefinita @code{rand()}
-(@pxref{Funzioni numeriche})
-non @`e abbastanza casuale, si pu@`o tentare di usare al suo posto questa funzione.
-
-@node Funzioni ordinali
-@subsection Tradurre tra caratteri e numeri
-
-@cindex libreria di funzioni @command{awk}, valori di carattere come numeri
-@cindex funzioni, libreria di, valori di carattere come numeri
-@cindex carattere, valore come numero
-@cindex numeri, come valori di carattere
-Un'implementazione commerciale di @command{awk} fornisce una funzione
-predefinita @code{ord()}, che prende un carattere e restituisce il valore
-numerico per quel carattere nella rappresentazione dei caratteri
-di quella particolare macchina. Se la
-stringa passata a @code{ord()} ha pi@`u di un carattere, viene usato solo il
-primo.
-
-L'inverso di questa funzione @`e @code{chr()} (dalla funzione con lo stesso nome
-in Pascal), che, dato un numero, restituisce il corrispondente carattere.
-Entrambe le funzioni si possono scrivere molto bene usando @command{awk};
-non vi @`e nessun reale motivo per inglobarle come funzioni predefinite
-@command{awk}:
-
-@cindex @code{ord()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{ord()}
-@cindex @code{chr()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{chr()}
-@cindex @code{_ord_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_ord_init()}
-@example
-@c file eg/lib/ord.awk
-# ord.awk --- implementa ord e chr
-
-# Identificatori globali:
-# _ord_: valori numerici indicizzati da caratteri
-# _ord_init: funzione per inizializzare _ord_
-@c endfile
-@ignore
-@c file eg/lib/ord.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# 16 January, 1992
-# 20 July, 1992, revised
-@c endfile
-@end ignore
-@c file eg/lib/ord.awk
-
-BEGIN @{ _ord_init() @}
-
-function _ord_init( basso, alto, i, t)
-@{
- basso = sprintf("%c", 7) # BEL @`e ascii 7
- if (basso == "\a") @{ # ascii regolare
- basso = 0
- alto = 127
- @} else if (sprintf("%c", 128 + 7) == "\a") @{
- # ascii, con il primo bit a 1 (mark)
- basso = 128
- alto = 255
- @} else @{ # ebcdic(!)
- basso = 0
- alto = 255
- @}
-
- for (i = basso; i <= alto; i++) @{
- t = sprintf("%c", i)
- _ord_[t] = i
- @}
-@}
-@c endfile
-@end example
-
-@cindex serie di caratteri (codifiche dei caratteri da parte della macchina)
-@cindex ASCII
-@cindex EBCDIC
-@cindex Unicode
-@cindex bit di parit@`a (in ASCII)
-@cindex @dfn{mark}, bit di parit@`a (in ASCII)
-Alcune spiegazioni riguardo ai numeri usati da @code{_ord_init()}
-non guastano.
-La serie di caratteri pi@`u importante oggi in uso @`e nota come
-ASCII.@footnote{La situazione sta per@`o
-cambiando: molti sistemi usano Unicode, una serie di caratteri molto ampia
-che comprende ASCII al suo interno.
-Nei sistemi che supportano interamente Unicode,
-un carattere pu@`o occupare fino a 32 bit, facendo diventare
-i semplici test usati qui eccessivamente complessi.}
-Sebbene un byte a
-8 bit possa contenere 256 valori distinti (da 0 a 255), ASCII definisce solo i
-caratteri che usano i valori da 0 a 127.@footnote{ASCII
-@`e stato esteso in molti paesi per usare i valori da 128 a 255 includendo
-i caratteri specifici del paese. Se il sistema in uso si avvale di queste
-estensioni, si pu@`o semplificare @code{_ord_init()} per eseguire un ciclo da
-0 a 255.} Nel lontano passato,
-almeno un produttore di microcomputer
-@c Pr1me, blech
-ha usato ASCII, ma con una parit@`a di tipo @dfn{mark}, cio@`e con il bit pi@`u a
-sinistra sempre a 1. Questo significa che su questi sistemi i caratteri
-ASCII hanno valori numerici da 128 a 255.
-Infine, i grandi elaboratori centrali usano la serie di caratteri EBCDIC, che
-prevede tutti i 256 valori.
-Ci sono altre serie di caratteri in uso su alcuni sistemi pi@`u vecchi, ma non
-vale la pena di considerarli:
-
-@example
-@c file eg/lib/ord.awk
-function ord(str, c)
-@{
- # solo il primo carattere @`e d'interesse
- c = substr(str, 1, 1)
- return _ord_[c]
-@}
-
-function chr(c)
-@{
- # trasforma c in un numero aggiungendo uno 0
- return sprintf("%c", c + 0)
-@}
-@c endfile
-
-#### programma di verifica ####
-# BEGIN @{
-# for (;;) @{
-# printf("immetti un carattere: ")
-# if (getline var <= 0)
-# break
-# printf("ord(%s) = %d\n", var, ord(var))
-# @}
-# @}
-@c endfile
-@end example
-
-Un ovvio miglioramento a queste funzioni @`e quello di spostare il codice per la
-funzione @code{@w{_ord_init}} nel corpo della regola @code{BEGIN}.
-Il programma @`e
-stato scritto inizialmente in questo modo per comodit@`a di sviluppo.
-C'@`e un ``programma di verifica'' in una regola @code{BEGIN}, per verificare
-la funzione. @`E commentato, per poter essere eventualmente usato in produzione.
-
-@node Funzione join
-@subsection Trasformare un vettore in una sola stringa
-
-@cindex libreria di funzioni @command{awk}, trasformare vettori in stringhe
-@cindex funzioni, libreria di, trasformare vettori in stringhe
-@cindex stringhe, trasformare vettori in
-@cindex vettori, trasformare in stringhe
-Quando si fanno elaborazioni su stringhe, spesso @`e utile poter unire
-tutte le stringhe di un vettore in una lunga stringa. La funzione seguente,
-@code{join()}, svolge questo compito. Verr@`a utilizzata nel seguito in diversi
-programmi applicativi
-@iftex
-(@pxrefil{Programmi di esempio}).
-@end iftex
-@ifnottex
-(@pxref{Programmi di esempio}).
-@end ifnottex
-
-La buona progettazione di una funzione @`e importante; la funzione dev'essere
-generale, ma potrebbe anche avere un ragionevole comportamento di default.
-Viene chiamata con un vettore e anche con gli indici iniziale e finale degli
-elementi del vettore da riunire.
-Questo presuppone che gli indici del vettore
-siano numerici---una supposizione logica, dato che il vettore probabilmente @`e
-stato creato con @code{split()}
-(@pxref{Funzioni per stringhe}):
-
-@cindex @code{join()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{join()}
-@example
-@c file eg/lib/join.awk
-# join.awk --- trasforma un vettore in una stringa
-@c endfile
-@ignore
-@c file eg/lib/join.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/lib/join.awk
-
-function join(vettore, iniz, fine, separ, risultato, i)
-@{
- if (separ == "")
- separ = " "
- else if (separ == SUBSEP) # valore magico
- separ = ""
- risultato = vettore[iniz]
- for (i = iniz + 1; i <= fine; i++)
- risultato = risultato separ vettore[i]
- return risultato
-@}
-@c endfile
-@end example
-
-Un ulteriore argomento opzionale @`e il separatore da usare quando si uniscono
-nuovamente le stringhe. Se il chiamante fornisce un valore non nullo,
-@code{join()} usa quello; se non viene fornito,
-per default ha un valore nullo.
-In questo caso, @code{join()} usa uno spazio singolo come separatore
-di default
-per le stringhe. Se il valore @`e uguale a @code{SUBSEP},
-@code{join()} unisce le stringhe senza un separatore tra di esse.
-@code{SUBSEP} serve come valore ``magico'' per indicare che potrebbe non esserci
-un separatore tra le stringhe componenti.@footnote{Sarebbe bello
-se @command{awk} avesse un operatore di assegnamento per la concatenazione.
-La mancanza di un esplicito operatore per la concatenazione rende le operazioni
-sulle stringhe pi@`u difficili di quanto potrebbero essere.}
-
-@node Funzione getlocaltime
-@subsection Gestione dell'ora del giorno
-
-@cindex libreria di funzioni @command{awk}, gestire ora del giorno (marcature temporali)
-@cindex funzioni, libreria di, gestione delle ore del giorno
-@cindex data e ora, formattate
-@cindex marcature temporali, formattate
-@cindex ora del giorno, gestire
-Le funzioni @code{systime()} e @code{strftime()} descritte nella
-@ref{Funzioni di tempo}
-forniscono la funzionalit@`a minima necessaria per visualizzare l'ora del giorno
-in una forma intelligibile. Sebbene @code{strftime()} offra un'ampia gamma di
-formattazioni, i formati di controllo non sono facili da ricordare o
-intuitivamente ovvii quando si legge un programma.
-
-La seguente funzione, @code{getlocaltime()}, riempie un vettore fornito
-dall'utente con informazioni sul tempo preformattate. Restituisce una stringa
-con data e ora corrente formattata come nel programma di utilit@`a @command{date}:
-
-@cindex @code{getlocaltime()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getlocaltime()}
-@example
-@c file eg/lib/gettime.awk
-# getlocaltime.awk --- ottiene l'ora del giorno in un formato usabile
-@c endfile
-@ignore
-@c file eg/lib/gettime.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993
-#
-@c endfile
-@end ignore
-@c file eg/lib/gettime.awk
-
-# Restituisce una stringa nel formato dell'output di date(1)
-# Riempie l'argomento del vettore time con valori individuali:
-# time["second"] -- secondi (0 - 59)
-# time["minute"] -- minuti (0 - 59)
-# time["hour"] -- ore (0 - 23)
-# time["althour"] -- ore (0 - 12)
-# time["monthday"] -- giorno del mese (1 - 31)
-# time["month"] -- mese dell'anno (1 - 12)
-# time["monthname"] -- nome del mese
-# time["shortmonth"] -- nome breve del mese
-# time["year"] -- anno modulo 100 (0 - 99)
-# time["fullyear"] -- anno completo
-# time["weekday"] -- giorno della settimana (domenica = 0)
-# time["altweekday"] -- giorno della settimana (luned@`{@dotless{i}} = 0)
-# time["dayname"] -- nome del giorno della settimana
-# time["shortdayname"] -- nome breve del giorno della settimana
-# time["yearday"] -- giorno dell'anno (0 - 365)
-# time["timezone"] -- abbreviazione del nome della zona di fuso orario
-# time["ampm"] -- designazione di AM o PM
-# time["weeknum"] -- numero della settimana, domenica primo giorno
-# time["altweeknum"] -- numero della settimana, luned@`{@dotless{i}} primmo giorno
-
-function getlocaltime(ora, ret, adesso, i)
-@{
- # ottiene data e ora una volta sola,
- # evitando chiamate di sistema non necessarie
- adesso = systime()
-
- # restituisce l'output in stile date(1)
-@c lun 8 giu 2015, 20.39.38, CEST
-@c "%a %e %b %Y , %H.%M.%S, %Z"
- ret = strftime("%a %e %b %Y, %H.%M.%S, %Z", adesso)
-
- # clear out target array
- delete time
-
- # immette i valori, forzando i valori numerici
- # a essere numerici aggiungendo uno 0
- time["second"] = strftime("%S", adesso) + 0
- time["minute"] = strftime("%M", adesso) + 0
- time["hour"] = strftime("%H", adesso) + 0
- time["althour"] = strftime("%I", adesso) + 0
- time["monthday"] = strftime("%d", adesso) + 0
- time["month"] = strftime("%m", adesso) + 0
- time["monthname"] = strftime("%B", adesso)
- time["shortmonth"] = strftime("%b", adesso)
- time["year"] = strftime("%y", adesso) + 0
- time["fullyear"] = strftime("%Y", adesso) + 0
- time["weekday"] = strftime("%w", adesso) + 0
- time["altweekday"] = strftime("%u", adesso) + 0
- time["dayname"] = strftime("%A", adesso)
- time["shortdayname"] = strftime("%a", adesso)
- time["yearday"] = strftime("%j", adesso) + 0
- time["timezone"] = strftime("%Z", adesso)
- time["ampm"] = strftime("%p", adesso)
- time["weeknum"] = strftime("%U", adesso) + 0
- time["altweeknum"] = strftime("%W", adesso) + 0
-
- return ret
-@}
-@c endfile
-@end example
-
-Gli indici di stringa sono pi@`u facili da usare e leggere rispetto ai
-vari formati
-richiesti da @code{strftime()}. Il programma @code{alarm} illustrato in
-@ref{Programma alarm}
-usa questa funzione.
-Una progettazione pi@`u generica della funzione @code{getlocaltime()}
-avrebbe permesso all'utente di fornire un valore di data e ora
-opzionale da usare al posto della data/ora corrente.
-
-@node Funzione readfile
-@subsection Leggere un intero file in una sola volta
-
-Spesso @`e conveniente avere il contenuto di un intero file disponibile
-in memoria, visto
-come un'unica stringa. Un modo chiaro e semplice per far ci@`o potrebbe essere
-questo:
-
-@example
-function readfile(file, temp, contenuto)
-@{
- if ((getline temp < file) < 0)
- return
-
- contenuto = temp
- while (getline temp < file) > 0)
- contenuto = contenuto RT tmp
-
- close(file)
- return contenuto
-@}
-@end example
-
-Questa funzione legge da @code{file} un record alla volta, ricostruendo
-l'intero contenuto del file nella variabile locale @code{contenuto}.
-Funziona, ma non @`e detto che sia efficiente.
-
-La funzione seguente, basata su un suggerimento di Denis Shirokov,
-legge l'intero contenuto del file in un colpo solo:
-
-@cindex @code{readfile()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{readfile()}
-@example
-@c file eg/lib/readfile.awk
-# readfile.awk --- legge un intero file in un colpo solo
-@c endfile
-@ignore
-@c file eg/lib/readfile.awk
-#
-# Idea originale di Denis Shirokov, cosmogen@@gmail.com, aprile 2013
-#
-@c endfile
-@end ignore
-@c file eg/lib/readfile.awk
-
-function readfile(file, temp, salva_rs)
-@{
- salva_rs = RS
- RS = "^$"
- getline temp < file
- close(file)
- RS = salva_rs
-
- return temp
-@}
-@c endfile
-@end example
-
-Funziona impostando @code{RS} a @samp{^$}, un'espressione regolare che
-non trova nessuna corrispondenza se il file ha un contenuto.
-@command{gawk}
-legge i dati dal file contenuto in @code{temp}, tentando di trovare una
-corrispondenza con @code{RS}.
-La ricerca dopo ogni lettura non ha mai successo, ma termina
-rapidamente, e quindi @command{gawk} inserisce in
-@code{temp} l'intero contenuto del file.
-(@xref{Record} per informazioni su @code{RT} e @code{RS}.)
-
-Se @code{file} @`e vuoto, il valore di ritorno @`e la stringa vuota.
-Quindi, il codice chiamante pu@`o usare qualcosa simile a questo:
-
-@example
-contenuto = readfile("/qualche/percorso")
-if (length(contenuto) == 0)
- # file vuoto @dots{}
-@end example
-
-La verifica serve a determinare se il file @`e vuoto o no. Una verifica
-equivalente potrebbe essere @samp{contenuto == ""}.
-
-@xref{Esempio di estensione Readfile} per una funzione di estensione
-anch'essa finalizzata a leggere un intero file in memoria.
-
-@node Apici alla shell
-@subsection Stringhe con apici da passare alla shell
-
-@c included by permission
-@ignore
-Date: Sun, 27 Jul 2014 17:16:16 -0700
-Message-ID: <CAKuGj+iCF_obaCLDUX60aSAgbfocFVtguG39GyeoNxTFby5sqQ@mail.gmail.com>
-Subject: Useful awk function
-From: Mike Brennan <mike@madronabluff.com>
-To: Arnold Robbins <arnold@skeeve.com>
-@end ignore
-
-Michael Brennan propone il seguente modello di programma,
-da lui usato spesso:
-
-@example
-#! /bin/sh
-
-awkp='
- @dots{}
- '
-
-@var{specifica_programma_da_eseguire} | awk "$awkp" | /bin/sh
-@end example
-
-Per esempio, un suo programma chiamato @command{flac-edit}@footnote{I
-file con suffisso @dfn{flac} contengono normalmente dei brani musicali.
-@command{metaflac} @`e un programma che permette di modificare
-le informazioni [@dfn{metadati}] contenute all'inizio di un file di tipo
-@dfn{flac}.} ha questa forma:
-
-@example
-$ @kbd{flac-edit -song="Whoope! That's Great" file.flac}
-@end example
-
-@command{flac-edit} genera in output il seguente script, da passare alla
-shell (@file{/bin/sh}) per essere eseguito:
-
-@example
-chmod +w file.flac
-metaflac --remove-tag=TITLE file.flac
-LANG=en_US.88591 metaflac --set-tag=TITLE='Whoope! That'"'"'s Great' file.flac
-chmod -w file.flac
-@end example
-
-Si noti la necessit@`a di gestire gli apici nello script da passare alla shell.
-La funzione
-@code{shell_quote()} li prepara nel formato richiesto.
-@code{SINGLE} @`e la stringa di un solo
-carattere @code{"'"} e @code{QSINGLE} @`e la stringa di tre caratteri
-@code{"\"'\""}:
-
-@example
-@c file eg/lib/shellquote.awk
-# shell_quote --- pone tra apici un argomento da passare alla shell
-@c endfile
-@ignore
-@c file eg/lib/shellquote.awk
-#
-# Michael Brennan
-# brennan@@madronabluff.com
-# September 2014
-@c endfile
-@end ignore
-@c file eg/lib/shellquote.awk
-
-function shell_quote(s, # parametro
- SINGLE, QSINGLE, i, X, n, ret) # variabili locali
-@{
- if (s == "")
- return "\"\""
-
- SINGLE = "\x27" # apice singolo
- QSINGLE = "\"\x27\"" # apice singolo incapsulato
- n = split(s, X, SINGLE)
-
- ret = SINGLE X[1] SINGLE
- for (i = 2; i <= n; i++)
- ret = ret QSINGLE SINGLE X[i] SINGLE
-
- return ret
-@}
-@c endfile
-@end example
-
-@node Gestione File Dati
-@section Gestione di @value{DF}
-
-@cindex file, gestione di
-@cindex gestione di file
-@cindex libreria di funzioni @command{awk}, gestire file di dati
-@cindex funzioni, libreria di, gestire file di dati
-Questa @value{SECTION} presenta funzioni utili per gestire
-@value{DF} da riga di comando.
-
-@menu
-* Funzione filetrans:: Una funzione per gestire il passaggio da un
- file in input al successivo.
-* Funzione rewind:: Una funzione per rileggere il file in input.
-* Controllo di file:: Controllare che i file in input siano
- accessibili.
-* File vuoti:: Controllare se i file in input sono vuoti.
-* Ignorare assegnamenti di variabili:: Trattare assegnamenti di variabili.
- come nomi di file.
-@end menu
-
-@node Funzione filetrans
-@subsection Trovare i limiti dei @value{DF}
-
-@cindex file, gestione di, limiti dei file-dati
-@cindex file, 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
-@command{awk} (@pxref{BEGIN/END}).
-Una volta noi (gli autori di @command{gawk}) siamo venuti in contatto
-con un utente che
-erroneamemnte pensava che le regole @code{BEGIN} venissero eseguite all'inizio
-di ogni @value{DF} e le regole @code{END} alla fine di ogni @value{DF}.
-
-Quando lo abbiamo informato che
-non era cos@`{@dotless{i}}, ci ha chiesto di aggiungere un nuovo criterio di ricerca speciale
-a @command{gawk}, chiamato @code{BEGIN_FILE} e @code{END_FILE}, che avesse il
-comportamento desiderato. Ci ha fornito anche il codice per far questo.
-
-Non @`e stato necessario aggiungere a @command{gawk} questi criteri di ricerca
-speciali; il lavoro si pu@`o fare tranquillamente usando @command{awk}, come
-illustrato nel seguente programma di libreria. @`E strutturato in modo da
-chiamare due funzioni fornite dall'utente, @code{a_inizio_file()} e
-@code{a_fine_file()}, all'inizio e alla fine di ogni @value{DF}. Oltre a risolvere
-il problema in sole nove(!) righe di codice,
-questa soluzione @`e @emph{portabile}; il
-programma funziona con qualsiasi implementazione di @command{awk}:
-
-@example
-# transfile.awk
-#
-# Dare all'utente un aggancio per il passaggio
-# da un file in input a quello successivo
-#
-# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
-# ciascuna delle quali @`e invocata
-# quando il file, rispettivamente,
-# inizia e finisce.
-@c #
-@c # Arnold Robbins, arnold@@skeeve.com, Public Domain
-@c # January 1992
-
-FILENAME != _nome_file_vecchio @{
- if (_nome_file_vecchio != "")
- a_fine_file(_nome_file_vecchio)
- _nome_file_vecchio = FILENAME
- a_inizio_file(FILENAME)
-@}
-
-END @{ a_fine_file(FILENAME) @}
-@end example
-
-Questo file [transfile.awk] dev'essere caricato prima del programma
-``principale'' dell'utente,
-in modo che la regola ivi contenuta venga eseguita per prima.
-
-Questa regola dipende dalla variabile di @command{awk} @code{FILENAME}, che
-cambia automaticamente per ogni nuovo @value{DF}. Il @value{FN} corrente viene
-salvato in una variabile privata, @code{_nome_file_vecchio}. Se @code{FILENAME} non @`e
-uguale a @code{_nome_file_vecchio}, inizia l'elaborazioone di un nuovo @value{DF} ed
-@`e necessario chiamare @code{a_fine_file()} per il vecchio file. Poich@'e
-@code{a_fine_file()} dovrebbe essere chiamato solo se un file @`e stato elaborato, il
-programma esegue prima un controllo per assicurarsi che @code{_nome_file_vecchio} non
-sia la stringa nulla. Il programma assegna poi il valore corrente di
-@value{FN} a @code{_nome_file_vecchio} e chiama @code{a_inizio_file()} per il file.
-Poich@'e, come tutte le variabili di @command{awk}, @code{_nome_file_vecchio} @`e
-inizializzato alla stringa nulla, questa regola viene eseguita correttamente
-anche per il primo @value{DF}.
-
-Il programma contiene anche una regola @code{END} per completare l'elaborazione
-per l'ultimo file. Poich@'e questa regola @code{END} viene prima di qualsiasi
-regola @code{END} contenuta nel programma ``principale'',
-@code{a_fine_file()} viene
-chiamata per prima. Ancora una volta, l'utilit@`a di poter avere pi@`u regole
-@code{BEGIN} ed @code{END} dovrebbe risultare chiara.
-
-@cindex @code{a_inizio_file()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{a_inizio_file()}
-@cindex @code{a_fine_file()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{a_fine_file()}
-Se lo stesso @value{DF} compare due volte di fila sulla riga di comando,
-@code{a_fine_file()} e @code{a_inizio_file()} non vengono eseguite alla fine del primo
-passaggio e all'inizio del secondo passaggio.
-La versione seguente risolve il problema:
-
-@example
-@c file eg/lib/ftrans.awk
-# ftrans.awk --- gestisce il passaggio da un file dati al successivo
-#
-# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
-@c endfile
-@ignore
-@c file eg/lib/ftrans.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# November 1992
-@c endfile
-@end ignore
-@c file eg/lib/ftrans.awk
-
-FNR == 1 @{
- if (_filename_ != "")
- a_fine_file(_filename_)
- _filename_ = FILENAME
- a_inizio_file(FILENAME)
-@}
-
-END @{ a_fine_file(_filename_) @}
-@c endfile
-@end example
-
-@iftex
-La
-@end iftex
-@ref{Programma wc}
-mostra come utilizzare questa funzione di libreria e come ci@`o
-semplifichi la scrittura del programma principale.
-
-@cindex sidebar, Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?
-@ifdocbook
-@docbook
-<sidebar><title>Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?</title>
-@end docbook
-
-
-Ci si chieder@`a, probabilmente: perch@'e, se le funzioni @code{a_inizio_file()} e
-@code{a_fine_file()} possono eseguire il compito, @command{gawk} prevede i
-criteri di
-ricerca @code{BEGINFILE} e @code{ENDFILE}?
-
-Buona domanda. Normalmente, se @command{awk} non riesce ad aprire un file,
-questo fatto
-provoca un errore fatale immediato. In tal caso, per una funzione definita
-dall'utente non vi @`e alcun modo di affrontare il problema, giacch@'e la
-chiamata verrebbe effettuata
-solo dopo aver aperto il file e letto il primo record.
-Quindi, la ragione principale di @code{BEGINFILE} @`e quella di dare un
-``aggancio'' per gestire i file che non posso essere elaborati.
-@code{ENDFILE} esiste per simmetria, e perch@'e consente facilmente
-una pulizia "file per file". Per maggiori informazioni si faccia
-riferimento alla @ref{BEGINFILE/ENDFILE}.
-
-@docbook
-</sidebar>
-@end docbook
-@end ifdocbook
-
-@ifnotdocbook
-@cartouche
-@center @b{Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?}
-
-
-
-Ci si chieder@`a, probabilmente: perch@'e, se le funzioni @code{a_inizio_file()} e
-@code{a_fine_file()} possono eseguire il compito, @command{gawk} prevede i
-criteri di
-ricerca @code{BEGINFILE} e @code{ENDFILE}?
-
-Buona domanda. Normalmente, se @command{awk} non riesce ad aprire un file,
-questo fatto
-provoca un errore fatale immediato. In tal caso, per una funzione definita
-dall'utente non vi @`e alcun modo di affrontare il problema, giacch@'e la
-chiamata verrebbe effettuata
-solo dopo aver aperto il file e letto il primo record.
-Quindi, la ragione principale di @code{BEGINFILE} @`e quella di dare un
-``aggancio'' per gestire i file che non posso essere elaborati.
-@code{ENDFILE} esiste per simmetria, e perch@'e consente facilmente
-una pulizia "file per file". Per maggiori informazioni si faccia
-riferimento alla @ref{BEGINFILE/ENDFILE}.
-@end cartouche
-@end ifnotdocbook
-
-@node Funzione rewind
-@subsection Rileggere il file corrente
-
-@cindex file, leggere un
-@cindex file, rileggere un
-Un'altra richiesta per una nuova funzione predefinita @`e stata per
-una funzione per rileggere il file corrente.
-L'utente che l'ha richiesta non voleva dover usare @code{getline}
-(@pxref{Getline})
-all'interno di un ciclo.
-
-Comunque, se non si @`e nella regola @code{END}, @`e piuttosto facile
-fare in modo di chiudere il corrente file in input immediatamente
-e ricominciare a leggerlo dall'inizio.
-In mancanza di un nome migliore, chiameremo la funzione @code{rewind()}:
-
-@cindex @code{rewind()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{rewind()}
-@example
-@c file eg/lib/rewind.awk
-# rewind.awk --- ricarica il file corrente e ricomincia a leggerlo
-@c endfile
-@ignore
-@c file eg/lib/rewind.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# September 2000
-@c endfile
-@end ignore
-@c file eg/lib/rewind.awk
-
-function rewind( i)
-@{
- # sposta in alto i rimanenti argomenti
- for (i = ARGC; i > ARGIND; i--)
- ARGV[i] = ARGV[i-1]
-
- # assicurarsi che gawk sappia raggiungerli
- ARGC++
-
- # fa s@`{@dotless{i}} che il file corrente sia il prossimo a essere letto
- ARGV[ARGIND+1] = FILENAME
-
- # do it
- nextfile
-@}
-@c endfile
-@end example
-
-La funzione @code{rewind()} dipende dalla variabile @code{ARGIND}
-(@pxref{Variabili auto-assegnate}), che @`e specifica di @command{gawk}. Dipende anche
-dalla parola chiave @code{nextfile} (@pxref{Istruzione nextfile}).
-Perci@`o, non si dovrebbe chiamarla da una regola @code{ENDFILE}.
-(Non sarebbe peraltro necessario, perch@'e @command{gawk} legge il file
-successivo non appena la regola @code{ENDFILE} finisce!)
-
-Occorre prestare attenzione quando si chiama @code{rewind()}. Si pu@`o
-provocare una ricorsione infinita se non si sta attenti. Ecco un
-esempio di uso:
-
-@example
-$ @kbd{cat dati}
-@print{} a
-@print{} b
-@print{} c
-@print{} d
-@print{} e
-
-$ cat @kbd{test.awk}
-@print{} FNR == 3 && ! riavvolto @{
-@print{} riavvolto = 1
-@print{} rewind()
-@print{} @}
-@print{}
-@print{} @{ print FILENAME, FNR, $0 @}
-
-$ @kbd{gawk -f rewind.awk -f test.awk dati }
-@print{} data 1 a
-@print{} data 2 b
-@print{} data 1 a
-@print{} data 2 b
-@print{} data 3 c
-@print{} data 4 d
-@print{} data 5 e
-@end example
-
-@node Controllo di file
-@subsection Controllare che i @value{DF} siano leggibili
-
-@cindex risoluzione di problemi, leggibilit@`a file-dati
-@cindex leggibilit@`a, file-dati@comma{} controllare la
-@cindex file, non elaborare
-Normalmente, se si fornisce ad @command{awk} un @value{DF} che non @`e leggibile,
-il programma
-si arresta con un errore fatale. Ci sono casi in cui sarebbe preferibile
-ignorare semplicemente questi file e proseguire.@footnote{Il criterio di
-ricerca speciale @code{BEGINFILE} (@pxref{BEGINFILE/ENDFILE}) fornisce un
-meccanismo alternativo per trattare i file che non sono leggibili.
-Tuttavia, il codice qui proposto fornisce una soluzione portabile.}
-Si pu@`o far questo facendo precedere il proprio programma @command{awk} dal
-seguente programma:
-
-@cindex @code{readable.awk}, programma
-@example
-@c file eg/lib/readable.awk
-# readable.awk --- file di libreria per saltare file non leggibili
-@c endfile
-@ignore
-@c file eg/lib/readable.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# October 2000
-# December 2010
-@c endfile
-@end ignore
-@c file eg/lib/readable.awk
-
-BEGIN @{
- for (i = 1; i < ARGC; i++) @{
- if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
- || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
- continue # assegnamento di variabile o standard input
- else if ((getline aperdere < ARGV[i]) < 0) # file non leggibile
- delete ARGV[i]
- else
- close(ARGV[i])
- @}
-@}
-@c endfile
-@end example
-
-@cindex risoluzione di problemi, funzione @code{getline}
-@cindex comando @code{getline}, risoluzione di problemi
-@cindex @code{getline}, comando, risoluzione di problemi
-Questo codice funziona, perch@'e l'errore di @code{getline} non @`e fatale.
-Rimuovendo l'elemento da @code{ARGV} con @code{delete}
-si tralascia il file (perch@'e non @`e pi@`u nella lista).
-Si veda anche @ref{ARGC e ARGV}.
-
-Poich@'e per i nomi delle variabili @command{awk} si possono usare solo lettere
-dell'alfabeto inglese, di proposito il controllo con espressioni regolari
-non usa classi di
-carattere come @samp{[:alpha:]} e @samp{[:alnum:]}
-(@pxref{Espressioni tra parentesi quadre}).
-
-@node File vuoti
-@subsection Ricerca di file di lunghezza zero
-
-Tutte le implementazioni note di @command{awk} ignorano senza
-mandare alcun messaggio i file di
-lunghezza zero. Questo @`e un effetto collaterale del ciclo implicito di
-@command{awk} "leggi un record e confrontalo con le regole": quando
-@command{awk} cerca di leggere un record da un file vuoto, riceve immediatamente
-un'indicazione di fine-file [@dfn{end-of-file}], chiude il file,
-e prosegue con il
-successivo @value{DF} presente nella riga di comando, @emph{senza}
-eseguire alcun codice
-di programma @command{awk} a livello di utente.
-
-Usando la variabile @code{ARGIND} di @command{gawk}
-(@pxref{Variabili predefinite}), @`e possibile accorgersi quando un @value{DF}
-@`e stato saltato. Simile al file di libreria illustrato in
-@ref{Funzione filetrans}, il seguente file di libreria chiama una funzione
-di nome @code{zerofile()} che l'utente deve fornire. Gli argomenti passati
-sono il @value{FN} e la posizione del file in @code{ARGV}:
-
-@cindex @code{zerofile.awk}, programma
-@example
-@c file eg/lib/zerofile.awk
-# zerofile.awk --- file di libreria per elaborare file in input vuoti
-@c endfile
-@ignore
-@c file eg/lib/zerofile.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# June 2003
-@c endfile
-@end ignore
-@c file eg/lib/zerofile.awk
-
-BEGIN @{ Argind = 0 @}
-
-ARGIND > Argind + 1 @{
- for (Argind++; Argind < ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-
-ARGIND != Argind @{ Argind = ARGIND @}
-
-END @{
- if (ARGIND > Argind)
- for (Argind++; Argind <= ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-@c endfile
-@end example
-
-La variabile definita dall'utente @code{Argind} permette al programma
-@command{awk}
-di tracciare il suo percorso all'interno di @code{ARGV}. Ogniqualvolta il
-programma rileva che @code{ARGIND} @`e maggiore di @samp{Argind + 1}, vuol dire
-che uno o pi@`u file vuoti sono stati tralasciati. L'azione chiama poi
-@code{zerofile()} per ogni file che @`e stato saltato, incrementando
-ogni volta @code{Argind}.
-
-La regola @samp{Argind != ARGIND} tiene semplicemente aggiornato @code{Argind}
-nel caso che non ci siano file vuoti.
-
-Infine, la regola @code{END} prende in considerazione il caso di un qualsiasi
-file vuoto alla fine degli argomenti nella riga di comando. Si noti che nella
-condizione del ciclo @code{for}, la verifica usa l'operatore @samp{<=}, non
-@samp{<}.
-
-@node Ignorare assegnamenti di variabili
-@subsection Trattare assegnamenti di variabile come @value{FNS}
-
-@cindex assegnamenti di variabile, visti come nomi di file
-@cindex file, nomi di, assegnamenti di variabile visti come
-@cindex nomi di file, assegnamenti di variabile visti come
-Occasionalmente, potrebbe essere pi@`u opportuno che @command{awk} non elabori gli
-assegnamenti di variabile presenti sulla riga di comando
-(@pxref{Opzioni di assegnamento}).
-In particolare, se si ha un @value{FN} che contiene un carattere @samp{=},
-@command{awk} tratta il @value{FN} come un assegnamento e non lo elabora.
-
-Alcuni utenti hanno suggerito un'opzione aggiuntiva da riga di comando per
-@command{gawk} per disabilitare gli assegnamenti dati sulla riga di comando.
-Comunque, poche righe di codice di programmazione in un file di libreria
-hanno lo stesso effetto:
-
-@cindex @code{noassign.awk}, programma
-@cindex programma @code{noassign.awk}
-@example
-@c file eg/lib/noassign.awk
-# noassign.awk --- file di libreria per evitare la necessit@`a
-# di una speciale opzione per disabilitare gli assegnamenti da
-# riga di comando
-@c endfile
-@ignore
-@c file eg/lib/noassign.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# October 1999
-@c endfile
-@end ignore
-@c file eg/lib/noassign.awk
-
-function disable_assigns(argc, argv, i)
-@{
- for (i = 1; i < argc; i++)
- if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
- argv[i] = ("./" argv[i])
-@}
-
-BEGIN @{
- if (Disabilita_variabili)
- disable_assigns(ARGC, ARGV)
-@}
-@c endfile
-@end example
-
-Il programma va poi eseguito in questo modo:
-
-@example
-awk -v Disabilita_variabili=1 -f noassign.awk -f vostro_programma.awk *
-@end example
-
-La funzione esegue un ciclo che esamina ogni argomento.
-Antepone @samp{./} a
-qualsiasi argomento che abbia la forma di un assegnamento
-di variabile, trasformando cos@`{@dotless{i}} quell'argomento in un @value{FN}.
-
-L'uso di @code{Disabilita_variabili} consente di disabilitare assegnamenti di
-variabile dati sulla riga di comando al momento dell'invocazione,
-assegnando alla variabile un valore @dfn{vero}.
-Se non viene impostata la variabile @`e inizializzata a zero (cio@`e
-@dfn{falso}), e gli argomenti sulla riga di comando
-non vengono modificati.
-
-@node Funzione getopt
-@section Elaborare opzioni specificate sulla riga di comando
-
-@cindex libreria di funzioni @command{awk}, opzioni sulla riga di comando
-@cindex funzioni, libreria di, opzioni sulla riga di comando
-@cindex riga di comando, opzioni, elaborazione di
-@cindex opzioni sulla riga di comando, elaborazione di
-@cindex funzioni, libreria di, libreria C
-@cindex argomenti, elaborazione di
-La maggior parte dei programmi di utilit@`a su sistemi compatibili con POSIX
-prevedono opzioni presenti sulla riga di comando che possono essere usate per
-cambiare il modo in cui un programma si comporta. @command{awk} @`e un esempio di
-tali programmi (@pxref{Opzioni}).
-Spesso le opzioni hanno degli @dfn{argomenti} (cio@`e, dati che servono al
-programma per eseguire correttamente le opzioni specificate
-sulla riga di comando).
-Per esempio, l'opzione @option{-F} di @command{awk} richiede di usare la stringa
-specificata
-come separatore di campo. La prima occorrenza, sulla riga di comando, di
-@option{--} o di una stringa che non inizia con @samp{-} segnala la fine
-delle opzioni.
-
-@cindex @code{getopt()}, funzione (libreria C)
-@cindex funzione @code{getopt()} (libreria C)
-I moderni sistemi Unix hanno una funzione C chiamata @code{getopt()} per
-elaborare gli argomenti presenti
-sulla riga di comando. Il programmatore fornisce una
-stringa che descrive le opzioni, ognuna delle quali consiste di
-una sola lettera. Se un'opzione richiede un
-argomento, nella stringa l'opzione @`e seguita da due punti.
-A @code{getopt()} vengono anche
-passati il numero e i valori degli argomenti presenti sulla riga di comando
-e viene chiamata in un ciclo.
-@code{getopt()} scandisce gli argomenti della riga di comando cercando
-le lettere delle opzioni.
-A ogni passaggio del ciclo restituisce un carattere
-singolo che rappresenta la successiva lettera di opzione trovata, o @samp{?}
-se viene trovata un'opzione non prevista.
-Quando restituisce @minus{}1, non ci sono ulteriori
-opzioni da trattare sulla riga di comando.
-
-Quando si usa @code{getopt()}, le opzioni che non prevedono argomenti
-possono essere raggruppate.
-Inoltre, le opzioni che hanno argomenti richiedono obbligatoriamente che
-l'argomento sia specificato.
-L'argomento pu@`o seguire immediatamente la lettera
-dell'opzione, o pu@`o costituire un argomento separato sulla riga di comando.
-
-Dato un ipotetico programma che ha tre opzioni sulla riga di comando,
-@option{-a}, @option{-b} e @option{-c}, dove
-@option{-b} richiede un argomento, tutti i seguenti sono modi validi per
-invocare il programma:
-
-@example
-programma -a -b pippo -c dati1 dati2 dati3
-programma -ac -bpippo -- dati1 dati2 dati3
-programma -acbpippo dati1 dati2 dati3
-@end example
-
-Si noti che quando l'argomento @`e raggruppato con la sua opzione,
-la parte rimanente
-dell'argomento @`e considerato come argomento dell'opzione.
-In quest'esempio, @option{-acbpippo} indica che tutte le opzioni
-@option{-a}, @option{-b} e @option{-c} sono presenti,
-e che @samp{pippo} @`e l'argomento dell'opzione @option{-b}.
-
-@code{getopt()} fornisce quattro variabili esterne a disposizione del
-programmatore:
-
-@table @code
-@item optind
-L'indice nel vettore dei valori degli argomenti (@code{argv}) dove si pu@`o
-trovare il primo argomento sulla riga di comando che non sia un'opzione.
-
-@item optarg
-Il valore (di tipo stringa) dell'argomento di un'opzione.
-
-@item opterr
-Solitamente @code{getopt()} stampa un messaggio di errore quando trova un'opzione
-non valida. Impostando @code{opterr} a zero si disabilita questa funzionalit@`a.
-(un'applicazione potrebbe voler stampare un proprio messaggio di errore.)
-
-@item optopt
-La lettera che rappresenta l'opzione sulla riga di comando.
-@end table
-
-Il seguente frammento di codice C mostra come @code{getopt()} potrebbe
-elaborare gli argomenti della riga di comando per @command{awk}:
-
-@example
-int
-main(int argc, char *argv[])
-@{
- @dots{}
- /* stampa un appropriato messaggio */
- opterr = 0;
- while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{
- switch (c) @{
- case 'f': /* file */
- @dots{}
- break;
- case 'F': /* separatore di campo */
- @dots{}
- break;
- case 'v': /* assegnamento di variabile */
- @dots{}
- break;
- case 'W': /* estensione */
- @dots{}
- break;
- case '?':
- default:
- messaggio_di_aiuto();
- break;
- @}
- @}
- @dots{}
-@}
-@end example
-
-Incidentalmente, @command{gawk} al suo interno usa la funzione GNU
-@code{getopt_long()} per elaborare sia le normali opzioni che quelle lunghe
-in stile GNU
-(@pxref{Opzioni}).
-
-L'astrazione fornita da @code{getopt()} @`e molto utile ed @`e piuttosto comoda
-anche nei programmi @command{awk}. Di seguito si riporta una versione
-@command{awk} di @code{getopt()}. Questa funzione mette in evidenza uno dei
-maggiori punti deboli di @command{awk}, che @`e quello di essere molto carente
-nella manipolazione di caratteri singoli. Sono necessarie ripetute chiamate a
-@code{substr()} per accedere a caratteri singoli.
-(@pxref{Funzioni per stringhe}).@footnote{Questa funzione
-@`e stata scritta prima che @command{gawk} acquisisse la capacit@`a di
-dividere le stringhe in caratteri singoli usando @code{""} come separatore.
-@`E stata lasciata cos@`{@dotless{i}}, poich@'e l'uso di @code{substr()} @`e pi@`u portabile.}
-
-La spiegazione della funzione viene data
-man mano che si elencano i pezzi di codice che la compongono:
-
-@cindex @code{getopt()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getopt()}
-@example
-@c file eg/lib/getopt.awk
-# getopt.awk --- imita in awk la funzione di libreria C getopt(3)
-@c endfile
-@ignore
-@c file eg/lib/getopt.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-#
-# Initial version: March, 1991
-# Revised: May, 1993
-@c endfile
-@end ignore
-@c file eg/lib/getopt.awk
-
-# Variabili esterne:
-# Optind -- indice in ARGV del primo argomento che non @`e un'opzione
-# Optarg -- valore di tipo stringa dell'argomento dell'opzione corrente
-# Opterr -- se diverso da zero, viene stampato un messaggio diagnostico
-# Optopt -- lettera dell'opzione corrente
-
-# Restituisce:
-# -1 alla fine delle opzioni
-# "?" per un'opzione non riconosciuta
-# <c> un carattere che rappresenta l'opzione corrente
-
-# Dati privati:
-# _opti -- indice in un'opzione multipla, p.es., -abc
-@c endfile
-@end example
-
-La funzione inizia con commenti che elencano e descrivono le variabili globali
-utilizzate, spiegano quali sono i valori di ritorno, il loro significato, e
-ogni altra variabile che @`e
-``esclusiva'' a questa funzione di libreria. Tale
-documentazione @`e essenziale per qualsiasi programma, e in modo particolare per
-le funzioni di libreria.
-
-La funzione @code{getopt()} dapprima controlla che sia stata effettivamente
-chiamata con una stringa di opzioni (il parametro @code{opzioni}). Se
-@code{opzioni} ha lunghezza zero, @code{getopt()} restituisce immediatamente
-@minus{}1:
-
-@cindex @code{getopt()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getopt()}
-@example
-@c file eg/lib/getopt.awk
-function getopt(argc, argv, opzioni, unaopz, i)
-@{
- if (length(opzioni) == 0) # nessuna opzione specificata
- return -1
-
-@group
- if (argv[Optind] == "--") @{ # fatto tutto
- Optind++
- _opti = 0
- return -1
-@end group
- @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{
- _opti = 0
- return -1
- @}
-@c endfile
-@end example
-
-Il successivo controllo cerca la fine delle opzioni. Due trattini
-(@option{--}) marcano la fine delle opzioni da riga di comando, e lo stesso
-fa qualsiasi
-argomento sulla riga di comando che non inizi con @samp{-}. @code{Optind} @`e
-usato per scorrere il vettore degli argomenti presenti sulla riga di comando;
-mantiene il suo valore attraverso chiamate successive a @code{getopt()}, perch@'e
-@`e una variabile globale.
-
-L'espressione regolare che viene usata, @code{@w{/^-[^:[:space:]/}},
-chiede di cercare un
-@samp{-} seguito da qualsiasi cosa che non sia uno spazio vuoto o un carattere
-di due punti. Se l'argomento corrente sulla riga di comando non corrisponde a
-quest'espressione regolare, vuol dire che non si tratta di un'opzione, e
-quindi viene terminata l'elaborazione delle opzioni. Continuando:
-
-@example
-@c file eg/lib/getopt.awk
- if (_opti == 0)
- _opti = 2
- unaopz = substr(argv[Optind], _opti, 1)
- Optopt = unaopz
- i = index(opzioni, unaopz)
- if (i == 0) @{
- if (Opterr)
- printf("%c -- opzione non ammessa\n", unaopz) > "/dev/stderr"
- if (_opti >= length(argv[Optind])) @{
- Optind++
- _opti = 0
- @} else
- _opti++
- return "?"
- @}
-@c endfile
-@end example
-
-La variabile @code{_opti} tiene traccia della posizione nell'argomento
-della riga di comando correntemente in esame
-(@code{argv[Optind]}). Se opzioni multiple sono
-raggruppate con un @samp{-} (p.es., @option{-abx}), @`e necessario
-restituirle all'utente una per volta.
-
-Se @code{_opti} @`e uguale a zero, viene impostato a due, ossia all'indice
-nella
-stringa del successivo carattere da esaminare (@samp{-}, che @`e alla
-posizione uno viene ignorato).
-La variabile @code{unaopz} contiene il carattere,
-ottenuto con @code{substr()}. Questo @`e salvato in @code{Optopt} per essere
-usato dal programma principale.
-
-Se @code{unaopz} non @`e nella stringa delle opzioni @code{opzioni},
-si tratta di un'opzione
-non valida. Se @code{Opterr} @`e diverso da zero, @code{getopt()} stampa un
-messaggio di errore sullo @dfn{standard error} che @`e simile al messaggio
-emesso dalla versione C di @code{getopt()}.
-
-Poich@'e l'opzione non @`e valida, @`e necessario tralasciarla e passare al successivo
-carattere di opzione. Se @code{_opti} @`e maggiore o uguale alla lunghezza
-dell'argomento corrente della riga di comando, @`e necessario passare al
-successivo argomento, in modo che @code{Optind} venga incrementato e
-@code{_opti} sia reimpostato a zero. In caso contrario, @code{Optind} viene
-lasciato com'@`e e @code{_opti} viene soltanto incrementato.
-
-In ogni caso, poich@'e l'opzione non @`e valida, @code{getopt()} restituisce
-@code{"?"}. Il programma principale pu@`o esaminare @code{Optopt} se serve
-conoscere quale lettera di opzione @`e quella non valida. Proseguendo:
-
-@example
-@c file eg/lib/getopt.awk
- if (substr(opzioni, i + 1, 1) == ":") @{
- # ottiene un argomento di opzione
- if (length(substr(argv[Optind], _opti + 1)) > 0)
- Optarg = substr(argv[Optind], _opti + 1)
- else
- Optarg = argv[++Optind]
- _opti = 0
- @} else
- Optarg = ""
-@c endfile
-@end example
-
-Se l'opzione richiede un argomento, la lettera di opzione @`e seguita da due punti
-nella stringa @code{opzioni}. Se rimangono altri caratteri nell'argomento
-corrente sulla riga di comando (@code{argv[Optind]}), il resto di quella stringa
-viene assegnato a @code{Optarg}. Altrimenti, viene usato il successivo
-argomento sulla riga di comando (@samp{-xFOO} piuttosto che
-@samp{@w{-x FOO}}). In
-entrambi i casi, @code{_opti} viene reimpostato a zero, perch@'e non ci sono altri
-caratteri da esaminare nell'argomento corrente sulla riga di comando.
-Continuando:
-
-@example
-@c file eg/lib/getopt.awk
- if (_opti == 0 || _opti >= length(argv[Optind])) @{
- Optind++
- _opti = 0
- @} else
- _opti++
- return unaopz
-@}
-@c endfile
-@end example
-
-Infine, se @code{_opti} @`e zero o maggiore della lunghezza dell'argomento
-corrente sulla riga di comando, significa che l'elaborazione di
-quest'elemento in @code{argv} @`e
-terminata, quindi @code{Optind} @`e incrementato per
-puntare al successivo elemento in @code{argv}. Se nessuna delle condizioni @`e
-vera, viene incrementato solo @code{_opti}, cosicch@'e la successiva lettera di
-opzione pu@`o essere elaborata con la successiva chiamata a @code{getopt()}.
-
-La regola @code{BEGIN} inizializza sia @code{Opterr} che @code{Optind} a uno.
-@code{Opterr} viene impostato a uno, perch@'e il comportamento di default per
-@code{getopt()} @`e quello di stampare un messaggio diagnostico dopo aver visto
-un'opzione non valida. @code{Optind} @`e impostato a uno, perch@'e non
-c'@`e alcun motivo
-per considerare il nome del programma, che @`e in @code{ARGV[0]}:
-
-@example
-@c file eg/lib/getopt.awk
-BEGIN @{
- Opterr = 1 # il default @`e eseguire una diagnosi
- Optind = 1 # salta ARGV[0]
-
- # programma di controllo
- if (_getopt_test) @{
- while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
- printf("c = <%c>, Optarg = <%s>\n",
- _go_c, Optarg)
- printf("argomenti che non sono opzioni:\n")
- for (; Optind < ARGC; Optind++)
- printf("\tARGV[%d] = <%s>\n",
- Optind, ARGV[Optind])
- @}
-@}
-@c endfile
-@end example
-
-Il resto della regola @code{BEGIN} @`e un semplice programma di controllo. Qui
-sotto si riportano i risultati di
-due esecuzioni di prova
-del programma di controllo:
-
-@example
-$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x}
-@print{} c = <a>, Optarg = <>
-@print{} c = <c>, Optarg = <>
-@print{} c = <b>, Optarg = <ARG>
-@print{} argomenti che non sono opzioni:
-@print{} ARGV[3] = <bax>
-@print{} ARGV[4] = <-x>
-
-$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc}
-@print{} c = <a>, Optarg = <>
-@error{} x -- opzione non ammessa
-@print{} c = <?>, Optarg = <>
-@print{} argomenti che non sono opzioni:
-@print{} ARGV[4] = <xyz>
-@print{} ARGV[5] = <abc>
-@end example
-
-In entrambe le esecuzioni, il primo @option{--} fa terminare gli argomenti dati
-ad @command{awk}, in modo che @command{awk} non tenti di interpretare le opzioni
-@option{-a}, etc. come sue opzioni.
-
-@quotation NOTA
-Dopo che @code{getopt()} @`e terminato,
-il codice a livello utente deve eliminare tutti gli elementi
-di @code{ARGV} da
-1 a @code{Optind}, in modo che @command{awk} non tenti di elaborare le opzioni
-sulla riga di comando come @value{FNS}.
-@end quotation
-
-Usare @samp{#!} con l'opzione @option{-E} pu@`o essere d'aiuto per evitare
-conflitti tra le opzioni del proprio programma e quelle di @command{gawk},
-poich@'e l'opzione @option{-E} fa s@`{@dotless{i}} che @command{gawk} abbandoni
-l'elaborazione di ulteriori opzioni.
-(@pxref{@dfn{Script} eseguibili} e
-@ifnotdocbook
-@pxref{Opzioni}).
-@end ifnotdocbook
-@ifdocbook
-@ref{Opzioni}).
-@end ifdocbook
-
-Molti degli esempi presentati in
-@ref{Programmi di esempio},
-usano @code{getopt()} per elaborare i propri argomenti.
-
-@node Funzioni Passwd
-@section Leggere la lista degli utenti
-
-@cindex libreria di funzioni @command{awk}, leggere la lista degli utenti
-@cindex funzioni, libreria di, leggera la lista degli utenti
-@cindex utenti, leggere la lista degli
-@cindex lista degli utenti@comma{} leggere la
-@cindex @code{PROCINFO}, vettore
-@cindex vettore @code{PROCINFO}
-Il vettore @code{PROCINFO}
-(@pxref{Variabili predefinite})
-d@`a accesso ai numeri ID reale ed effettivo dell'utente e del gruppo e, se
-disponibili, alla serie di gruppi ulteriori a cui l'utente appartiene.
-Comunque, poich@'e questi sono numeri, non forniscono informazioni molto utili per
-l'utente medio. Bisogna trovare un modo per reperire informazioni
-sull'utente associate con i numeri ID dell'utente e del gruppo. Questa
-@value{SECTION} illustra una raccolta di funzioni per ottenere le informazioni
-dalla lista gli utenti. @xref{Funzioni Group} per una raccolta di
-funzioni simili per ottenere informazioni dalla lista dei gruppi.
-
-@cindex @code{getpwent()}, funzione (libreria C)
-@cindex funzione @code{getpwent()} (libreria C)
-@cindex @code{getpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwent()}
-@cindex utenti, informazioni riguardo agli, ottenere
-@cindex login, informazioni
-@cindex account, informazioni sugli
-@cindex password, file delle
-@cindex file delle password
-Lo standard POSIX non definisce il file dove sono mantenute le informazioni
-degli utenti. Invece, fornisce il file d'intestazione @code{<pwd.h>}
-e diverse @dfn{subroutine} del linguaggio C per ottenere informazioni sugli
-utenti. La funzione primaria @`e @code{getpwent()}, che sta per ``get password
-entry''. La ``password'' proviene dal file originale della lista
-degli utenti, @file{/etc/passwd}, che contiene le informazioni sugli utenti
-assieme alle password criptate (da cui il nome).@footnote{Questo @`e
-vero per le versioni pi@`u antiche di Unix. In quelle pi@`u recenti,
-la @dfn{password} di ogni utente @`e stata trasferita nel file @file{/etc/shadow},
-un file non accessibile dall'utente normale. La struttura del file
-@file{/etc/passwd} @`e rimasta la stessa, ma al posto del campo @dfn{password}
-c'@`e una @code{x}.}
-
-@cindex @command{pwcat}, programma
-Sebbene un programma @command{awk} possa semplicemente leggere
-@file{/etc/passwd} direttamente, questo file pu@`o non contenere tutte le
-informazioni su tutti gli utenti del sistema.@footnote{Capita spesso che le
-informazioni sulla password siano memorizzate in una lista in rete.} Per
-essere sicuri di poter produrre una versione leggibile e completa della banca
-dati degli utenti, @`e necessario scrivere un piccolo programma in C che chiama
-@code{getpwent()}. @code{getpwent()} viene definita in modo da restituire un
-puntatore a una @code{struct passwd}. Ogni volta che viene chiamata,
-restituisce l'elemento successivo della lista. Quando non ci sono pi@`u
-elementi, restituisce @code{NULL}, il puntatore nullo. Quando accade ci@`o, il
-programma C dovrebbe chiamare @code{endpwent()} per chiudere la lista..
-Quel che segue @`e @command{pwcat}, un programma in C che ``concatena'' la
-lista delle password:
-
-@example
-@c file eg/lib/pwcat.c
-/*
- * pwcat.c
- *
- * Genera una versione stampabile della lista delle password.
- */
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-/*
- * Arnold Robbins, arnold@@skeeve.com, May 1993
- * Public Domain
- * December 2010, move to ANSI C definition for main().
- */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-#include <stdio.h>
-#include <pwd.h>
-
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-int
-main(int argc, char **argv)
-@{
- struct passwd *p;
-
- while ((p = getpwent()) != NULL)
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#ifdef ZOS_USS
- printf("%s:%ld:%ld:%s:%s\n",
- p->pw_name, (long) p->pw_uid,
- (long) p->pw_gid, p->pw_dir, p->pw_shell);
-#else
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
- printf("%s:%s:%ld:%ld:%s:%s:%s\n",
- p->pw_name, p->pw_passwd, (long) p->pw_uid,
- (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
-@c endfile
-@ignore
-@c file eg/lib/pwcat.c
-#endif
-@c endfile
-@end ignore
-@c file eg/lib/pwcat.c
-
- endpwent();
- return 0;
-@}
-@c endfile
-@end example
-
-Se non si conosce il linguaggio C, non @`e il caso di preoccuparsi.
-L'output di @command{pwcat} @`e la lista degli utenti, nel formato
-tradizionale del file @file{/etc/passwd} con campi separati da due punti.
-I campi sono:
-
-@table @asis
-@item Login name
-Il nome di login dell'utente.
-
-@item Encrypted password
-La password criptata dell'utente. Pu@`o non essere disponibile su alcuni sistemi.
-
-@item User-ID
-L'ID numerico dell'utente.
-(Su alcuni sistemi, @`e un numero di formato @code{long} [32bit]
-del linguaggio C, e non nel formato @code{int} [16bit].
-Quindi, lo cambieremo in @code{long} per sicurezza.)
-
-@item Group-ID
-L'ID di gruppo numerico dell'utente.
-(Valgono le stesse considerazioni su @code{long} al posto di @code{int}.)
-
-@item Full name
-Il nome completo dell'utente, e talora altre informazioni associate
-all'utente.
-
-@item Home directory
-La directory di login (o ``home'') (nota ai programmatori di shell come
-@code{$HOME}).
-
-@item Login shell
-Il programma che viene eseguito quando l'utente effettua l'accesso. Questo @`e
-comunemente una shell, come Bash.
-@end table
-
-Di seguito si riportano alcune righe di un possibile output di @command{pwcat}:
-
-@cindex Jacobs, Andrew
-@cindex Robbins, Arnold
-@cindex Robbins, Miriam
-@example
-$ @kbd{pwcat}
-@print{} root:x:0:1:Operator:/:/bin/sh
-@print{} nobody:x:65534:65534::/:
-@print{} daemon:x:1:1::/:
-@print{} sys:x:2:2::/:/bin/csh
-@print{} bin:x:3:3::/bin:
-@print{} arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/sh
-@print{} miriam:x:112:10:Miriam Robbins:/home/miriam:/bin/sh
-@print{} andy:x:113:10:Andy Jacobs:/home/andy:/bin/sh
-@dots{}
-@end example
-
-Dopo quest'introduzione, di seguito si riporta un gruppo di funzioni per
-ottenere informazioni sugli utenti. Ci sono diverse funzioni, che
-corrispondono alle omonime funzioni C:
-
-@cindex @code{_pw_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_pw_init()}
-@example
-@c file eg/lib/passwdawk.in
-# passwd.awk --- accedere alle informazioni del file delle password
-@c endfile
-@ignore
-@c file eg/lib/passwdawk.in
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised October 2000
-# Revised December 2010
-@c endfile
-@end ignore
-@c file eg/lib/passwdawk.in
-
-BEGIN @{
- # modificare per adattarlo al sistema in uso
- _pw_awklib = "/usr/local/libexec/awk/"
-@}
-
-function _pw_init( oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
-@{
- if (_pw_inizializzato)
- return
-
- oldfs = FS
- oldrs = RS
- olddol0 = $0
- using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
- using_fpat = (PROCINFO["FS"] == "FPAT")
- FS = ":"
- RS = "\n"
-
- pwcat = _pw_awklib "pwcat"
- while ((pwcat | getline) > 0) @{
- _pw_byname[$1] = $0
- _pw_byuid[$3] = $0
- _pw_bycount[++_pw_totale] = $0
- @}
- close(pwcat)
- _pw_contatore = 0
- _pw_inizializzato = 1
- FS = oldfs
- if (using_fw)
- FIELDWIDTHS = FIELDWIDTHS
- else if (using_fpat)
- FPAT = FPAT
- RS = oldrs
- $0 = olddol0
-@}
-@c endfile
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, programma @code{pwcat}
-@cindex criterio di ricerca @code{BEGIN}, programma @code{pwcat}
-La regola @code{BEGIN} imposta una variabile privata col nome
-della directory in cui si
-trova @command{pwcat}.
-Poich@'e @`e destinata a essere usata da una routine di
-libreria di @command{awk}, si @`e scelto di metterla in
-@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
-essere messa in una directory differente.
-
-La funzione @code{_pw_init()} mette tre copie delle informazioni sull'utente in
-tre vettori associativi. I vettori sono indicizzati per nome-utente
-(@code{_pw_byname}), per numero di ID-utente (@code{_pw_byuid}), e per ordine di
-occorrenza (@code{_pw_bycount}).
-La variabile @code{_pw_inizializzato} @`e usata per
-efficienza, poich@'e in questo modo @code{_pw_init()}
-viene chiamata solo una volta.
-
-@cindex @code{PROCINFO}, vettore, verificare la divisione in campi
-@cindex vettore @code{PROCINFO}, verificare la divisione in campi
-@cindex @code{getline}, comando, funzione definita dall'utente, @code{_pw_init()}
-@cindex comando @code{getline}, funzione definita dall'utente, @code{_pw_init()}
-Poich@'e questa funzione usa @code{getline} per leggere informazioni da
-@command{pwcat}, dapprima salva i valori di @code{FS}, @code{RS} e @code{$0}.
-Annota nella variabile @code{using_fw} se la suddivisione in campi
-usando @code{FIELDWIDTHS} @`e attiva o no.
-Far questo @`e necessario, poich@'e queste funzioni potrebbero essere chiamate da
-qualsiai parte all'interno di un programma dell'utente, e l'utente pu@`o
-suddividere i record in campi a suo piacimento.
-Ci@`o rende possibile ripristinare il corretto meccanismo di suddivisione dei
-campi in un secondo momento. La verifica pu@`o restituire solo @dfn{vero} per
-@command{gawk}.
-Il risultato pu@`o essere @dfn{falso} se si usa
-@code{FS} o @code{FPAT},
-o in qualche altra implementazione di @command{awk}.
-
-Il codice che controlla se si sta usando @code{FPAT}, utilizzando
-@code{using_fpat} e @code{PROCINFO["FS"]}, @`e simile.
-
-La parte principale della funzione usa un ciclo per leggere le righe della
-lista, suddividere le righe in campi, e poi memorizzare la riga
-all'interno di ogni vettore a seconda delle necessit@`a. Quando il ciclo @`e
-completato, @code{@w{_pw_init()}} fa pulizia chiudendo la @dfn{pipe},
-impostando @code{@w{_pw_inizializzato}} a uno, e ripristinando @code{FS}
-(e @code{FIELDWIDTHS} o @code{FPAT}
-se necessario), @code{RS} e @code{$0}.
-L'uso di @code{@w{_pw_contatore}} verr@`a spiegato a breve.
-
-@cindex @code{getpwnam()}, funzione (libreria C)
-@cindex funzione @code{getpwnam()} (libreria C)
-La funzione @code{getpwnam()} ha un nome utente come argomento di tipo
-stringa. Se
-quell'utente @`e presente nella lista, restituisce la riga appropriata.
-Altrimenti, il riferimento a un elemento inesistente del vettore
-aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
-
-@cindex @code{getpwnam()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwnam()}
-@example
-@group
-@c file eg/lib/passwdawk.in
-function getpwnam(nome)
-@{
- _pw_init()
- return _pw_byname[nome]
-@}
-@c endfile
-@end group
-@end example
-
-@cindex @code{getpwuid()}, funzione (libreria C)
-@cindex funzione @code{getpwuid()} (libreria C)
-In modo simile, la funzione @code{getpwuid()} ha per argomento
-il numero ID di un utente.
-Se un utente con quel numero si trova nella lista, restituisce la riga
-appropriata. Altrimenti restituisce la stringa nulla:
-
-@cindex @code{getpwuid()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwuid()}
-@example
-@c file eg/lib/passwdawk.in
-function getpwuid(uid)
-@{
- _pw_init()
- return _pw_byuid[uid]
-@}
-@c endfile
-@end example
-
-@cindex @code{getpwent()}, funzione (libreria C)
-@cindex funzione @code{getpwent()} (libreria C)
-La funzione @code{getpwent()} scorre semplicemnte la lista, un elemento
-alla volta. Usa @code{_pw_contatore} per tener traccia della posizione corrente
-nel vettore @code{_pw_bycount}:
-
-@cindex @code{getpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getpwent()}
-@example
-@c file eg/lib/passwdawk.in
-function getpwent()
-@{
- _pw_init()
- if (_pw_contatore < _pw_totale)
- return _pw_bycount[++_pw_contatore]
- return ""
-@}
-@c endfile
-@end example
-
-@cindex @code{endpwent()}, funzione (libreria C)
-@cindex funzione @code{endpwent()} (libreria C)
-La funzione @code{@w{endpwent()}} reimposta @code{@w{_pw_contatore}} a zero,
-in modo che chiamate successive a @code{getpwent()} ricomincino da capo:
-
-@cindex @code{endpwent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{endpwent()}
-@example
-@c file eg/lib/passwdawk.in
-function endpwent()
-@{
- _pw_contatore = 0
-@}
-@c endfile
-@end example
-
-In questa serie di funzioni, il fatto che ogni subroutine chiami
-@code{@w{_pw_init()}}
-per inizializzare il vettore della lista utenti risponde a una precisa
-scelta progettuale.
-Il lavoro necessario per eseguire un processo separato che generi la
-lista degli utenti, e l'I/O per esaminarla, si ha solo se il programma
-principale dell'utente chiama effettivamente una di queste funzioni.
-Se questo
-file di libreria viene caricato assieme a un programma dell'utente, ma non
-viene mai chiamata nessuna delle routine, non c'@`e nessun lavoro aggiuntivo
-richiesto in fase di esecuzione.
-(L'alternativa @`e quella di spostare il corpo di @code{@w{_pw_init()}}
-all'interno di una regola @code{BEGIN}, che esegua sempre @command{pwcat}.
-Questo semplifica il codice ma richiede di eseguire un processo extra
-il cui risultato potrebbe non essere mai utilizzato dal programma.)
-
-A sua volta, chiamare ripetutamente @code{_pw_init()} non @`e troppo
-dispendioso, perch@'e la
-variabile @code{_pw_inizializzato} permette di evitare di leggere
-i dati relativi agli utenti pi@`u di una
-volta. Se la preoccupazione @`e quella di minimizzare il tempo di
-esecuzione del programma @command{awk},
-il controllo di @code{_pw_inizializzato} potrebbe essere spostato
-al di fuori di @code{_pw_init()} e duplicato in tutte le altre funzioni.
-In pratica, questo non @`e necessario, poich@'e la maggior parte dei
-programmi di @command{awk}
-@`e I/O-bound@footnote{I programmi si distinguono tradizionalemente in
-CPU-bound e I/O-bound. Quelli CPU-bound effettuano elaborazioni che non
-richiedono molta attivit@`a di I/O, come ad esempio la preparazione di una
-tavola di numeri primi. Quelli I/O bound leggono dei file, ma richiedono
-poca attivit@`a di elaborazione per ogni record letto.},
-e una tale modifica complicherebbe inutilmente il codice.
-
-Il programma @command{id} in @ref{Programma id}
-usa queste funzioni.
-
-@node Funzioni Group
-@section Leggere la lista dei gruppi
-
-@cindex libreria di funzioni @command{awk}, leggere la lista dei gruppi
-@cindex funzioni, libreria di, leggere la lista dei gruppi
-@cindex gruppi, lista dei, leggere la
-@cindex lista dei gruppi, leggere la
-@cindex @code{PROCINFO}, vettore, e appartenenza a gruppi
-@cindex @code{getgrent()}, funzione (libreria C)
-@cindex funzione @code{getgrent()} (libreria C)
-@cindex @code{getgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrent()}
-@cindex gruppi@comma{} informazioni su
-@cindex account, informazioni sugli
-@cindex gruppi, file dei
-@cindex file dei gruppi
-Molto di quel che @`e stato detto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni Passwd}
-vale anche per la lista dei gruppi. Sebbene questa sia tradizionalmente
-contenuta in
-un file ben noto (@file{/etc/group}) in un altrettanto noto formato,
-lo standard
-POSIX prevede solo una serie di routine della libreria C
-(@code{<grp.h>} e @code{getgrent()})
-per accedere a tali informazioni.
-Anche se il file suddetto @`e disponibile, potrebbe non contenere delle
-informazioni
-complete. Perci@`o, come per la lista degli utenti, @`e necessario avere un
-piccolo programma in C che genera la lista dei gruppi come suo output.
-@command{grcat}, un programma in C che fornisce la lista dei gruppi,
-@`e il seguente:
-
-@cindex @command{grcat}, programma C
-@cindex programma C, @command{grcat}
-@example
-@c file eg/lib/grcat.c
-/*
- * grcat.c
- *
- * Genera una versione stampabile della lista dei gruppi.
- */
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-/*
- * Arnold Robbins, arnold@@skeeve.com, May 1993
- * Public Domain
- * December 2010, move to ANSI C definition for main().
- */
-
-/* Per OS/2, non fare nulla. */
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-#ifndef HAVE_GETGRENT
-int main() { return 0; }
-#else
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
-#include <stdio.h>
-#include <grp.h>
-
-int
-main(int argc, char **argv)
-@{
- struct group *g;
- int i;
-
- while ((g = getgrent()) != NULL) @{
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#ifdef ZOS_USS
- printf("%s:%ld:", g->gr_name, (long) g->gr_gid);
-#else
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
- printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
- (long) g->gr_gid);
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#else
- printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
-#endif
-@c endfile
-@end ignore
-@c file eg/lib/grcat.c
- for (i = 0; g->gr_mem[i] != NULL; i++) @{
- printf("%s", g->gr_mem[i]);
-@group
- if (g->gr_mem[i+1] != NULL)
- putchar(',');
- @}
-@end group
- putchar('\n');
- @}
- endgrent();
- return 0;
-@}
-@c endfile
-@ignore
-@c file eg/lib/grcat.c
-#endif /* HAVE_GETGRENT */
-@c endfile
-@end ignore
-@end example
-
-Ciascuna riga nella lista dei gruppi rappresenta un gruppo. I campi sono
-separati da due punti e rappresentano le seguenti informazioni:
-
-@table @asis
-@item Nome del gruppo
-Il nome del gruppo.
-
-@item Password del gruppo
-La password del gruppo criptata. In pratica, questo campo non viene mai usato;
-normalmente @`e vuoto o impostato a @samp{x}.
-
-@item Numero ID del gruppo
-Il numero ID del gruppo in formato numerico;
-l'associazione del nome al numero dev'essere univoca all'interno di questo file.
-(Su alcuni sistemi, @`e un numero nel formato @code{long} [32bit]
-del linguaggio C, e non nel formato @code{int} [16bit].
-Quindi, lo cambieremo in @code{long} per sicurezza.)
-
-@item Lista dei membri del gruppo
-Una lista di nomi utente separati da virgole.
-Questi utenti sono i membri del gruppo.
-I sistemi Unix moderni consentono agli utenti di appartenere a
-diversi gruppi simultaneamente. Se il sistema in uso @`e uno di questi, ci sono
-elementi in @code{PROCINFO} che vanno da @code{"group1"} fino a
-@code{"group@var{N}"} per quei numeri di ID di gruppo.
-(Si noti che @code{PROCINFO} @`e un'estensione @command{gawk};
-@pxref{Variabili predefinite}.)
-@end table
-
-Di seguito si riporta quel che @command{grcat} potrebbe produrre:
-
-@example
-$ @kbd{grcat}
-@print{} wheel:x:0:arnold
-@print{} nogroup:x:65534:
-@print{} daemon:x:1:
-@print{} kmem:x:2:
-@print{} staff:x:10:arnold,miriam,andy
-@print{} other:x:20:
-@dots{}
-@end example
-
-Qui ci sono le funzioni per ottenere informazioni relative alla lista dei
-gruppi. Ce ne sono diverse, costruite sul modello delle omonime funzioni della
-libreria C:
-
-@cindex @code{getline}, comando, funzione definita dall'utente, @code{_gr_init()}
-@cindex comando @code{getline}, funzione definita dall'utente, @code{_gr_init()}
-@cindex @code{_gr_init()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{_gr_init()}
-@example
-@c file eg/lib/groupawk.in
-# group.awk --- funzioni per il trattamento del file dei gruppi
-@c endfile
-@ignore
-@c file eg/lib/groupawk.in
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised October 2000
-# Revised December 2010
-@c endfile
-@end ignore
-@c line break on _gr_init for smallbook
-@c file eg/lib/groupawk.in
-
-BEGIN @{
- # Modificare in base alla struttura del proprio sistema
- _gr_awklib = "/usr/local/libexec/awk/"
-@}
-
-function _gr_init( oldfs, oldrs, olddol0, grcat,
- using_fw, using_fpat, n, a, i)
-@{
- if (_gr_inizializzato)
- return
-
- oldfs = FS
- oldrs = RS
- olddol0 = $0
- using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
- using_fpat = (PROCINFO["FS"] == "FPAT")
- FS = ":"
- RS = "\n"
-
- grcat = _gr_awklib "grcat"
- while ((grcat | getline) > 0) @{
- if ($1 in _gr_byname)
- _gr_byname[$1] = _gr_byname[$1] "," $4
- else
- _gr_byname[$1] = $0
- if ($3 in _gr_bygid)
- _gr_bygid[$3] = _gr_bygid[$3] "," $4
- else
- _gr_bygid[$3] = $0
-
- n = split($4, a, "[ \t]*,[ \t]*")
- for (i = 1; i <= n; i++)
- if (a[i] in _gr_groupsbyuser)
- _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
- else
- _gr_groupsbyuser[a[i]] = $1
-
- _gr_bycount[++_gr_contatore] = $0
- @}
- close(grcat)
- _gr_contatore = 0
- _gr_inizializzato++
- FS = oldfs
- if (using_fw)
- FIELDWIDTHS = FIELDWIDTHS
- else if (using_fpat)
- FPAT = FPAT
- RS = oldrs
- $0 = olddol0
-@}
-@c endfile
-@end example
-
-La regola @code{BEGIN} imposta una variabile privata con il nome della
-directory in cui si trova @command{grcat}.
-Poich@'e @`e destinata a essere usata da una routine di
-libreria di @command{awk}, si @`e scelto di metterla in
-@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
-essere messa in una directory differente.
-
-Queste routine seguono le stesse linee generali delle routine per formare la
-lista degli utenti (@pxref{Funzioni Passwd}).
-La variabile @code{@w{_gr_inizializzato}} @`e usata per
-essere sicuri che la lista venga letta una volta sola.
-La funzione @code{@w{_gr_init()}} dapprima salva @code{FS},
-@code{RS} e
-@code{$0}, e poi imposta @code{FS} e @code{RS} ai valori da usare nel
-passare in rassegna le informazioni di gruppo. Inoltre
-viene annotato se si stanno usando @code{FIELDWIDTHS} o @code{FPAT}, per
-poter poi
-ripristinare il meccanismo di suddivisione in campi appropriato.
-
-Le informazioni sui gruppi sono memorizzate in diversi vettori associativi.
-I vettori sono indicizzati per nome di gruppo (@code{@w{_gr_byname}}), per
-numero ID del gruppo (@code{@w{_gr_bygid}}), e per posizione nella lista
-(@code{@w{_gr_bycount}}). C'@`e un vettore aggiuntivo indicizzato per nome utente
-(@code{@w{_gr_groupsbyuser}}), che @`e una lista, separata da spazi, dei
-gruppi ai quali ciascun utente appartiene.
-
-Diversamente dalla lista degli utenti, @`e possibile avere pi@`u record
-nella lista per lo stesso gruppo. Questo @`e frequente quando un gruppo ha
-un gran numero di membri. Un paio di tali voci potrebbero essere come queste:
-
-@example
-tvpeople:x:101:johnny,jay,arsenio
-tvpeople:x:101:david,conan,tom,joan
-@end example
-
-Per questo motivo, @code{_gr_init()} controlla se un nome di gruppo o un numero
-di ID di gruppo @`e stato gi@`a visto. Se cos@`{@dotless{i}} fosse, i nomi utente vanno
-semplicemente concatenati con la precedente lista di utenti.@footnote{C'@`e un
-piccolo problema col codice appena illustrato. Supponiamo che la prima volta
-non ci siano nomi. Questo codice aggiunge i nomi con una virgola iniziale.
-Inoltre non controlla che ci sia un @code{$4}.}
-
-Infine, @code{_gr_init()} chiude la @dfn{pipe} a @command{grcat}, ripristina
-@code{FS} (e @code{FIELDWIDTHS} o @code{FPAT}, se necessario), @code{RS} e
-@code{$0}, inizializza @code{_gr_contatore} a zero
-(per essere usato pi@`u tardi), e rende @code{_gr_inizializzato} diverso da zero.
-
-@cindex @code{getgrnam()}, funzione (libreria C)
-@cindex funzione @code{getgrnam()} (libreria C)
-La funzione @code{getgrnam()} ha come argomento un nome di gruppo, e se quel
-gruppo esiste, viene restituito.
-
-Altrimenti, il riferimento a un elemento inesistente del vettore
-aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
-
-@cindex @code{getgrnam()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrnam()}
-@example
-@c file eg/lib/groupawk.in
-function getgrnam(group)
-@{
- _gr_init()
- return _gr_byname[group]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgrgid()}, funzione (libreria C)
-@cindex funzione @code{getgrgid()} (libreria C)
-La funzione @code{getgrgid()} @`e simile; ha come argomento un numero ID di
-gruppo e controlla le informazioni assiciate con quell'ID di gruppo:
-
-@cindex @code{getgrgid()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrgid()}
-@example
-@c file eg/lib/groupawk.in
-function getgrgid(gid)
-@{
- _gr_init()
- return _gr_bygid[gid]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgruser()}, funzione (libreria C)
-@cindex funzione @code{getgruser()} (libreria C)
-La funzione @code{getgruser()} non ha un equivalente in C. Ha come argomento un
-nome-utente e restituisce l'elenco dei gruppi di cui l'utente @`e membro:
-
-@cindex @code{getgruser()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgruser()}
-@example
-@c file eg/lib/groupawk.in
-function getgruser(user)
-@{
- _gr_init()
- return _gr_groupsbyuser[user]
-@}
-@c endfile
-@end example
-
-@cindex @code{getgrent()}, funzione (libreria C)
-@cindex funzione @code{getgrent()} (libreria C)
-La funzione @code{getgrent()} scorre la lista un elemento alla volta.
-Usa @code{_gr_contatore} per ricordare la posizione corrente nella lista:
-
-@cindex @code{getgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{getgrent()}
-@example
-@c file eg/lib/groupawk.in
-function getgrent()
-@{
- _gr_init()
- if (++_gr_contatore in _gr_bycount)
- return _gr_bycount[_gr_contatore]
- return ""
-@}
-@c endfile
-@end example
-
-@cindex @code{endgrent()}, funzione (libreria C)
-@cindex funzione @code{endgrent()} (libreria C)
-La funzione @code{endgrent()} reimposta @code{_gr_contatore} a zero in modo che
-@code{getgrent()} possa ricominciare da capo:
-
-@cindex @code{endgrent()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{endgrent()}
-@example
-@c file eg/lib/groupawk.in
-function endgrent()
-@{
- _gr_contatore = 0
-@}
-@c endfile
-@end example
-
-Come con le routine per la lista degli utenti, ogni funzione chiama
-@code{_gr_init()} per inizializzare i vettori.
-Cos@`{@dotless{i}} facendo si avr@`a il solo
-lavoro aggiuntivo di eseguire @command{grcat} se queste funzioni vengono
-usate (rispetto a spostare il corpo di @code{_gr_init()} all'interno della
-regola @code{BEGIN}).
-
-La maggior parte del lavoro consiste nell'ispezionare la lista e nel
-costruire i vari vettori associativi. Le funzioni che l'utente chiama sono
-di per s@'e molto semplici, poich@'e si appoggiano sui vettori associativi di
-@command{awk} per fare il lavoro.
-
-Il programma @command{id} in @ref{Programma id}
-usa queste funzioni.
-
-@node Visitare vettori
-@section Attraversare vettori di vettori
-
-@iftex
-La
-@end iftex
-@ref{Vettori di vettori} trattava come @command{gawk}
-avere a disposizione vettori di vettori. In particolare, qualsiasi elemento di
-un vettore pu@`o essere uno scalare o un altro vettore. La funzione
-@code{isarray()} (@pxref{Funzioni per i tipi})
-permette di distinguere un vettore
-da uno scalare.
-La seguente funzione, @code{walk_array()}, attraversa ricorsivamente
-un vettore, stampando gli indici e i valori di ogni elemento.
-Viene chiamata col vettore e con una stringa che contiene il nome
-del vettore:
-
-@cindex @code{walk_array()}, funzione definita dall'utente
-@cindex funzione definita dall'utente, @code{walk_array()}
-@example
-@c file eg/lib/walkarray.awk
-function walk_array(vett, nome, i)
-@{
- for (i in vett) @{
- if (isarray(vett[i]))
- walk_array(vett[i], (nome "[" i "]"))
- else
- printf("%s[%s] = %s\n", nome, i, vett[i])
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-Funziona eseguendo un ciclo su ogni elemento del vettore. Se un dato elemento
-@`e esso stesso un vettore, la funzione chiama s@'e stessa ricorsivamente,
-passando il sottovettore e una nuova stringa che rappresenta l'indice corrente.
-In caso contrario, la funzione stampa semplicemente il nome, l'indice e il
-valore dell'elemento.
-Qui di seguito si riporta un programma principale che ne mostra l'uso:
-
-@example
-BEGIN @{
- a[1] = 1
- a[2][1] = 21
- a[2][2] = 22
- a[3] = 3
- a[4][1][1] = 411
- a[4][2] = 42
-
- walk_array(a, "a")
-@}
-@end example
-
-Quando viene eseguito, il programma produce il seguente output:
-
-@example
-$ @kbd{gawk -f walk_array.awk}
-@print{} a[1] = 1
-@print{} a[2][1] = 21
-@print{} a[2][2] = 22
-@print{} a[3] = 3
-@print{} a[4][1][1] = 411
-@print{} a[4][2] = 42
-@end example
-
-La funzione appena illustrata stampa semplicemente il nome e il valore
-di ogni elemento costituito da un vettore scalare. Comunque @`e facile
-generalizzarla, passandole il nome di una funzione da chiamare
-quando si attraversa un vettore. La funzione modificata @`e simile a questa:
-
-@example
-@c file eg/lib/processarray.awk
-function process_array(vett, nome, elab, do_arrays, i, nuovo_nome)
-@{
- for (i in vett) @{
- nuovo_nome = (nome "[" i "]")
- if (isarray(vett[i])) @{
- if (do_arrays)
- @@elab(nuovo_nome, vett[i])
- process_array(vett[i], nuovo_nome, elab, do_arrays)
- @} else
- @@elab(nuovo_nome, vett[i])
- @}
-@}
-@c endfile
-@end example
-
-Gli argomenti sono i seguenti:
-
-@table @code
-@item vett
-Il vettore.
-
-@item nome
-Il nome del vettore (una stringa).
-
-@item elab
-Il nome della funzione da chiamare.
-
-@item do_arrays
-Se vale @dfn{vero}, la funzione pu@`o gestire elementi che sono sottovettori.
-@end table
-
-Se devono essere elaborati sottovettori, questo vien fatto prima di
-attraversarne altri.
-
-Quando viene eseguita con la seguente struttura, la funzione produce lo stesso
-risultato della precedente versione di @code{walk_array()}:
-
-@example
-BEGIN @{
- a[1] = 1
- a[2][1] = 21
- a[2][2] = 22
- a[3] = 3
- a[4][1][1] = 411
- a[4][2] = 42
-
- process_array(a, "a", "do_print", 0)
-@}
-
-function do_print(nome, elemento)
-@{
- printf "%s = %s\n", nome, elemento
-@}
-@end example
-
-@node Sommario funzioni di libreria
-@section Riassunto
-
-@itemize @value{BULLET}
-@item
-Leggere i programmi @`e un eccellente metodo per imparare la "buona
-programmazione". Le funzioni e i programmi contenuti in questo @value{CHAPTER}
-e nel successivo si propongo questo obiettivo.
-
-@item
-Quando si scrivono funzioni di libreria di uso generale, si deve stare attenti
-ai nomi da dare alle variabili globali, facendo in modo che non entrino in
-conflitto con le variabili di un programma dell'utente.
-
-@item
-Le funzioni descritte qui appartengono alle seguenti categorie:
-
-@c nested list
-@table @asis
-@item Problemi generali
-Conversione di numeri in stringhe, verifica delle asserzioni, arrotondamenti,
-generazione di numeri casuali, conversione di caratteri in numeri, unione di
-stringhe, ottenimento di informazioni su data e ora facilmente usabili,
-e lettura di un intero file in una volta sola
-
-@item Gestione dei @value{DF}
-Annotazione dei limiti di un @value{DF}, rilettura del file corrente,
-ricerca di
-file leggibili, ricerca di file di lunghezza zero, e trattamento degli
-assegnamenti di variabili fatti sulla riga comando come @value{FNS}
-
-@item Elaborazione di opzioni sulla riga di comando
-Una versione @command{awk} della funzione del C standard @code{getopt()}
-
-@item Lettura dei file degli utenti e dei gruppi
-Due serie di routine equivalenti alle versioni disponibili nella libreria
-del linguaggio C
-
-@item Attraversamento di vettori di vettori
-Due funzioni che attraversano un vettore di vettori fino in fondo
-@end table
-@c end nested list
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi con le librerie
-@section Esercizi
-
-@enumerate
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{File vuoti}, abbiamo illustrato il programma @file{zerofile.awk},
-che fa uso della variabile di @command{gawk} @code{ARGIND}. Questo problema pu@`o
-essere risolto senza dipendere da @code{ARGIND}? Se s@`{@dotless{i}}, come?
-
-@ignore
-# zerofile2.awk --- same thing, portably
-
-BEGIN @{
- ARGIND = Argind = 0
- for (i = 1; i < ARGC; i++)
- Fnames[ARGV[i]]++
-
-@}
-FNR == 1 @{
- while (ARGV[ARGIND] != FILENAME)
- ARGIND++
- Seen[FILENAME]++
- if (Seen[FILENAME] == Fnames[FILENAME])
- do
- ARGIND++
- while (ARGV[ARGIND] != FILENAME)
-@}
-ARGIND > Argind + 1 @{
- for (Argind++; Argind < ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-ARGIND != Argind @{
- Argind = ARGIND
-@}
-END @{
- if (ARGIND < ARGC - 1)
- ARGIND = ARGC - 1
- if (ARGIND > Argind)
- for (Argind++; Argind <= ARGIND; Argind++)
- zerofile(ARGV[Argind], Argind)
-@}
-@end ignore
-
-@item
-Come esercizio collegato, rivedere quel codice per gestire il caso in cui un
-valore contenuto in @code{ARGV} sia un assegnamento di variabile.
-
-@ignore
-@c June 13 2015: Antonio points out that this is answered in the text. Ooops.
-@item
-@ref{Visitare vettori} ha illustrato una funzione che ispezionava un vettore
-multidimensionale per stamparlo. Comunque, ispezionare un vettore ed elaborare
-ogni elemento @`e un'operazione generica. Generalizzare la funzione
-@code{walk_array()} agggiungendo un parametro aggiuntivo chiamato
-@code{elab}.
-
-Quindi, all'interno del ciclo, invece di stampare l'indice e il valore
-dell'elemento del vettore, usare la sintassi della chiamata indiretta a una
-funzione (@pxref{Chiamate indirette})
-su @code{elab}, passandole l'indice e il valore.
-
-Nel chiamare @code{walk_array()}, si passa il nome di una
-funzione definita dall'utente che aspetta di ricevere un indice e un valore
-per poi elaborare l'elemento.
-
-Verificare la nuova versione stampando il vettore; si dovrebbe ottenere un
-output identico a quello della versione originale.
-@end ignore
-
-@end enumerate
-@c EXCLUDE END
-
-@node Programmi di esempio
-@chapter Programmi utili scritti in @command{awk}
-@cindex @command{awk}, programmi, esempi di
-@cindex programmi @command{awk}, esempi di
-@cindex esempi di programmi @command{awk}
-
-@c FULLXREF ON
-@iftex
-Il
-@end iftex
-@ref{Funzioni di libreria},
-ha prospettato l'idea che la lettura di programmi scritti in un certo
-linguaggio possa aiutare a imparare quel linguaggio. Questo
-@value{CHAPTER} ripropone lo stesso tema, presentando una miscellanea di
-programmi @command{awk} per il piacere di leggerli.
-@c FULLXREF OFF
-@ifnotinfo
-Ci sono tre @value{SECTIONS}.
-La prima spiega come eseguire i programmi descritti in questo
-@value{CHAPTER}.
-
-La seconda illustra la versione @command{awk}
-di parecchi comuni programmi di utilit@`a disponibili in POSIX.
-Si presuppone che si abbia gi@`a una certa familiarit@`a con questi programmi,
-e che quindi i problemi a loro legati siano facilmente comprensibili.
-Riscrivendo questi programmi in @command{awk},
-ci si pu@`o focalizzare sulle particolarit@`a di @command{awk} nella
-risoluzione dei problemi di programmazione.
-
-La terza sezione @`e una collezione di programmi interessanti.
-Essi mirano a risolvere un certo numero di differenti problemi di
-manipolazione e di gestione dati. Molti dei programmi sono brevi, per
-evidenziare la capacit@`a di @command{awk} di fare molte cose usando solo
-poche righe di codice.
-@end ifnotinfo
-
-Molti di questi programmi usano le funzioni di libreria che sono state presentate
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}.
-
-@menu
-* Eseguire esempi:: Come eseguire questi esempi.
-* Cloni:: Cloni di programmi di utilit@`a comuni.
-* Programmi vari:: Alcuni interessanti programmi in
- @command{awk}.
-* Sommario dei programmi:: Sommario dei programmi.
-* Esercizi sui programmi:: Esercizi.
-@end menu
-
-@node Eseguire esempi
-@section Come eseguire i programmi di esempio.
-
-
-Per eseguire un dato programma, si procederebbe tipicamente cos@`{@dotless{i}}:
-
-@example
-awk -f @var{programma} -- @var{opzioni} @var{file}
-@end example
-
-@noindent
-Qui, @var{programma} @`e il nome del programma @command{awk} (p.es.
-@file{cut.awk}), @var{opzioni} sono le opzioni sulla riga di comando
-per il programma che iniziano con un @samp{-}, e @var{file} sono i
-@value{DF} in input.
-
-Se il sistema prevede il meccanismo @samp{#!} di specifica di un
-@dfn{interprete}
-(@pxref{@dfn{Script} eseguibili}),
-si pu@`o invece eseguire direttamente un programma:
-
-@example
-cut.awk -c1-8 i_miei_file > risultati
-@end example
-
-Se @command{awk} non @`e @command{gawk}, pu@`o invece essere necessario usare:
-
-@example
-cut.awk -- -c1-8 i_miei_file > risultati
-@end example
-
-@node Cloni
-@section Reinventare la ruota per divertimento e profitto
-@cindex programmi POSIX, implementazione in @command{awk}
-@cindex POSIX, programmi, implementazione in @command{awk}
-
-Questa @value{SECTION} presenta un certo numero di programmi di utilit@`a
-POSIX implementati in @command{awk}. Riscrivere questi programmi in
-@command{awk} @`e spesso divertente,
-perch@'e gli algoritmi possono essere espressi molto chiaramente, e il codice
-@`e normalmente molto semplice e conciso. Ci@`o @`e possibile perch@'e @command{awk}
-facilita molto le cose al programmatore.
-
-Va precisato che questi programmi non sono necessariamente scritti per
-sostituire le versioni installate sul sistema in uso.
-Inoltre, nessuno di questi programmi @`e del tutto aderente ai pi@`u recenti
-standard POSIX. Questo non @`e un problema; il loro scopo
-@`e di illustrare la programmazione in linguaggio @command{awk} che serve nel
-``mondo reale''.
-
-I programmi sono presentati in ordine alfabetico.
-
-@menu
-* Programma cut:: Il programma di utilit@`a @command{cut}.
-* Programma egrep:: Il programma di utilit@`a @command{egrep}.
-* Programma id:: Il programma di utilit@`a @command{id}.
-* Programma split:: Il programma di utilit@`a @command{split}.
-* Programma tee:: Il programma di utilit@`a @command{tee}.
-* Programma uniq:: Il programma di utilit@`a @command{uniq}.
-* Programma wc:: Il programma di utilit@`a @command{wc}.
-@end menu
-
-@node Programma cut
-@subsection Ritagliare campi e colonne
-
-@cindex @command{cut}, programma di utilit@`a
-@cindex programma di utilit@`a @command{cut}
-@cindex campi, ritagliare
-@cindex colonne, ritagliare
-Il programma di utilit@`a @command{cut} seleziona, o ``taglia'' (@dfn{cut}),
-caratteri o campi dal suo standard input e li
-spedisce al suo standard output.
-I campi sono separati da caratteri TAB per default,
-ma @`e possibile fornire un'opzione dalla riga di comando per cambiare il campo
-@dfn{delimitatore} (cio@`e, il carattere che separa i campi). La definizione di
-campo di @command{cut} @`e meno generale di quella di @command{awk}.
-
-Un uso comune del comando @command{cut} potrebbe essere quello di estrarre
-i nomi degli utenti correntemente collegati al sistema, a partire
-dall'output del comando @command{who}. Per esempio, la seguente
-pipeline genera una lista in ordine alfabetico, senza doppioni, degli utenti
-correntemente collegati al sistema:
-
-@example
-who | cut -c1-8 | sort | uniq
-@end example
-
-Le opzioni per @command{cut} sono:
-
-@table @code
-@item -c @var{lista}
-Usare @var{lista} come lista di caratteri da ritagliare. Elementi
-all'interno della lista
-possono essere separati da virgole, e intervalli di caratteri possono essere
-separated da trattini. La lista
-@samp{1-8,15,22-35} specifica i caratteri da 1 a 8, 15, e da 22 a 35.
-
-@item -f @var{lista}
-Usare @var{lista} come lista di campi da ritagliare.
-
-@item -d @var{delimitatore}
-Usare @var{delimitatore} come carattere che separa i campi invece del
-carattere TAB.
-
-@item -s
-Evita la stampa di righe che non contengono il delimitatore di campo.
-@end table
-
-L'implementazione @command{awk} del comando @command{cut} usa la funzione
-di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-Il programma inizia con un commento che descrive le opzioni, le funzioni
-di libreria necessarie, e una funzione @code{sintassi()} che stampa un
-messaggio ed esce. @code{sintassi()} @`e chiamato se si specificano degli
-argomenti non validi:
-
-@cindex @code{cut.awk}, programma
-@cindex programma @code{cut.awk}
-@example
-@c file eg/prog/cut.awk
-# cut.awk --- implementa cut in awk
-@c endfile
-@ignore
-@c file eg/prog/cut.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/cut.awk
-
-# Opzioni:
-# -f lista Ritagliare campi
-# -d c Carattere di delimitazione di campo
-# -c lista Ritagliare caratteri
-#
-# -s Sopprimere righe che non contengono il delimitatore
-#
-# Richiede le funzioni di libreria getopt() e join()
-
-@group
-function sintassi()
-@{
- print("sintassi: cut [-f lista] [-d c] [-s] [file...]") > "/dev/stderr"
- print("sintassi: cut [-c lista] [file...]") > "/dev/stderr"
- exit 1
-@}
-@end group
-@c endfile
-@end example
-
-@cindex @code{BEGIN}, criterio di ricerca, eseguire programmi @command{awk} e
-@cindex criterio di ricerca @code{BEGIN}, eseguire programmi @command{awk} e
-@cindex @code{FS}, variabile, eseguire programmi @command{awk} e
-@cindex variabile @code{FS}, eseguire programmi @command{awk} e
-Subito dopo c'@`e una regola @code{BEGIN} che analizza le opzioni della riga
-di comando.
-Questa regola imposta @code{FS} a un solo carattere TAB, perch@'e quello @`e
-il separatore di campo di @command{cut} per default.
-La regola poi imposta il separatore di campo in output allo stesso valore
-del separatore di campo in input. Un ciclo che usa @code{getopt()} esamina
-le opzioni della riga di comando. Una e una sola delle variabili
-@code{per_campi} o @code{per_caratteri} @`e impostata a "vero", per indicare
-che l'elaborazione sar@`a fatta per campi o per caratteri, rispettivamente.
-Quando si ritaglia per caratteri, il separatore di campo in output @`e
-impostato alla stringa nulla:
-
-@example
-@c file eg/prog/cut.awk
-BEGIN @{
- FS = "\t" # default
- OFS = FS
- while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{
- if (c == "f") @{
- per_campi = 1
- lista_campi = Optarg
- @} else if (c == "c") @{
- per_caratteri = 1
- lista_campi = Optarg
- OFS = ""
- @} else if (c == "d") @{
- if (length(Optarg) > 1) @{
- printf("cut: usa il primo carattere di %s" \
- " come delimitatore\n", Optarg) > "/dev/stderr"
- Optarg = substr(Optarg, 1, 1)
- @}
- fs = FS = Optarg
- OFS = FS
- if (FS == " ") # mette specifica in formato awk
- FS = "[ ]"
- @} else if (c == "s")
- sopprimi = 1
- else
- sintassi()
- @}
-
- # Toglie opzioni da riga di comando
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-@c endfile
-@end example
-
-@cindex separatori di campo, spazi come
-@cindex spazi come separatori di campo
-Nella scrittura del codice si deve porre particolare attenzione quando il
-delimitatore di campo @`e uno spazio. Usare
-un semplice spazio (@code{@w{" "}}) come valore per @code{FS} @`e
-sbagliato: @command{awk} separerebbe i campi con serie di spazi,
-TAB, e/o ritorni a capo, mentre devono essere separati solo da uno spazio.
-Per far questo, salviamo il carattere di spazio originale nella variabile
-@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{"[ ]"} non
-@`e possibile usarlo direttamente per vedere se il carattere delimitatore di
-campo @`e nella stringa.
-
-Si ricordi anche che dopo che si @`e finito di usare @code{getopt()}
-(come descritto nella @ref{Funzione getopt}),
-@`e necessario
-eliminare tutti gli elementi del vettore @code{ARGV} da 1 a @code{Optind},
-in modo che @command{awk} non tenti di elaborare le opzioni della riga di comando
-come @value{FNS}.
-
-Dopo aver elaborato le opzioni della riga di comando, il programma verifica
-che le opzioni siano coerenti. Solo una tra le opzioni @option{-c}
-e @option{-f} dovrebbe essere presente, ed entrambe richiedono una lista di
-campi. Poi il programma chiama
-@code{prepara_lista_campi()} oppure @code{prepara_lista_caratteri()} per
-preparare la lista dei campi o dei caratteri:
-
-@example
-@c file eg/prog/cut.awk
- if (per_campi && per_caratteri)
- sintassi()
-
- if (per_campi == 0 && per_caratteri == 0)
- per_campi = 1 # default
-
- if (lista_campi == "") @{
- print "cut: specificare lista per -c o -f" > "/dev/stderr"
- exit 1
- @}
-
- if (per_campi)
- prepara_lista_campi()
- else
- prepara_lista_caratteri()
-@}
-@c endfile
-@end example
-
-@code{prepara_lista_campi()} pone la lista campi, usando la virgola come
-separatore, in un vettore. Poi, per
-ogni elemento del vettore, controlla che esso non sia un intervallo. Se @`e
-un intervallo, lo fa diventare un elenco. La funzione controlla l'intervallo
-specificato, per assicurarsi che il primo numero sia minore del secondo.
-Ogni numero nella lista @`e aggiunto al vettore @code{lista_c}, che
-semplicemente elenca i campi che saranno stampati. Viene usata la normale
-separazione in campi di @command{awk}. Il programma lascia ad @command{awk}
-il compito di separare i campi:
-
-@example
-@c file eg/prog/cut.awk
-function prepara_lista_campi( n, m, i, j, k, f, g)
-@{
- n = split(lista_campi, f, ",")
- j = 1 # indice in lista_c
- for (i = 1; i <= n; i++) @{
- if (index(f[i], "-") != 0) @{ # un intervallo
- m = split(f[i], g, "-")
-@group
- if (m != 2 || g[1] >= g[2]) @{
- printf("cut: lista campi errata: %s\n",
- f[i]) > "/dev/stderr"
- exit 1
- @}
-@end group
- for (k = g[1]; k <= g[2]; k++)
- lista_c[j++] = k
- @} else
- lista_c[j++] = f[i]
- @}
- ncampi = j - 1
-@}
-@c endfile
-@end example
-
-La funzione @code{prepara_lista_caratteri()} @`e pi@`u complicata di
-@code{prepara_lista_campi()}.
-L'idea qui @`e di usare la variabile di @command{gawk} @code{FIELDWIDTHS}
-(@pxref{Dimensione costante}),
-che descrive input a larghezza costante. Quando si usa una lista di
-caratteri questo @`e proprio il nostro caso.
-
-Impostare @code{FIELDWIDTHS} @`e pi@`u complicato che semplicemente elencare
-i campi da stampare. Si deve tener traccia dei campi da
-stampare e anche dei caratteri che li separano, che vanno saltati.
-Per esempio, supponiamo che si vogliano i caratteri da 1 a 8, 15,
-e da 22 a 35. Per questo si specifica @samp{-c 1-8,15,22-35}. Il valore che
-corrisponde a questo nella variabile @code{FIELDWIDTHS} @`e
-@code{@w{"8 6 1 6 14"}}. Questi sono cinque campi, e quelli da stampare
-sono @code{$1}, @code{$3}, e @code{$5}.
-I campi intermedi sono @dfn{riempitivo} (@dfn{filler}),
-ossia @`e ci@`o che separa i dati che si desidera estrarre.
-@code{lista_c} lista i campi da stampare, e @code{t} traccia l'elenco
-completo dei campi, inclusi i riempitivi:
-
-@example
-@c file eg/prog/cut.awk
-function prepara_lista_caratteri( campo, i, j, f, g, n, m, t,
- filler, ultimo, lungo)
-@{
- campo = 1 # contatore totale campi
- n = split(lista_campi, f, ",")
- j = 1 # indice in lista_c
- for (i = 1; i <= n; i++) @{
- if (index(f[i], "-") != 0) @{ # intervallo
- m = split(f[i], g, "-")
- if (m != 2 || g[1] >= g[2]) @{
- printf("cut: lista caratteri errata: %s\n",
- f[i]) > "/dev/stderr"
- exit 1
- @}
- lungo = g[2] - g[1] + 1
- if (g[1] > 1) # calcola lunghezza del riempitivo
- filler = g[1] - ultimo - 1
- else
- filler = 0
-@group
- if (filler)
- t[campo++] = filler
-@end group
- t[campo++] = lungo # lunghezza del campo
- ultimo = g[2]
- lista_c[j++] = campo - 1
- @} else @{
- if (f[i] > 1)
- filler = f[i] - ultimo - 1
- else
- filler = 0
- if (filler)
- t[campo++] = filler
- t[campo++] = 1
- ultimo = f[i]
- lista_c[j++] = campo - 1
- @}
- @}
- FIELDWIDTHS = join(t, 1, campo - 1)
- ncampi = j - 1
-@}
-@c endfile
-@end example
-
-Poi viene la regola che elabora i dati. Se l'opzione @option{-s} @`e stata
-specificata, il flag @code{sopprimi}
-@`e vero. La prima istruzione
-@code{if} accerta che il record in input abbia il separatore di
-campo. Se @command{cut} sta elaborando dei campi, e @code{sopprimi} @`e vero,
-e il carattere di separazione dei campi non @`e presente nel record, il
-record @`e ignorato.
-
-Se il record @`e valido, @command{gawk} ha gi@`a separato i dati in campi,
-usando il carattere in @code{FS} o usando campi a lunghezza fissa
-e @code{FIELDWIDTHS}. Il ciclo scorre attraverso la lista di campi che
-si dovrebbero stampare. Il campo corrispondente @`e stampato se contiene dati.
-Se il campo successivo contiene pure dei dati, il carattere di separazione @`e
-scritto tra i due campi:
-
-@example
-@c file eg/prog/cut.awk
-@{
- if (per_campi && sopprimi && index($0, fs) == 0)
- next
-
- for (i = 1; i <= ncampi; i++) @{
- if ($lista_c[i] != "") @{
- printf "%s", $lista_c[i]
- if (i < ncampi && $lista_c[i+1] != "")
- printf "%s", OFS
- @}
- @}
- print ""
-@}
-@c endfile
-@end example
-
-Questa versione di @command{cut} utilizza la variabile @code{FIELDWIDTHS} di
-@command{gawk} per ritagliare in base alla posizione dei caratteri. @`E
-possibile, in altre implementazioni di @command{awk} usare @code{substr()}
-(@pxref{Funzioni per stringhe}), ma
-la cosa @`e molto pi@`u complessa.
-La variabile @code{FIELDWIDTHS} fornisce una soluzione elegante al problema
-di suddividere la riga in input in singoli caratteri.
-
-
-@node Programma egrep
-@subsection Ricercare espressioni regolari nei file
-
-@cindex espressioni regolari, ricerca di
-@cindex ricercare, in file, espressioni regolari
-@cindex file, ricercare espressioni regolari nei
-@cindex @command{egrep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{egrep}
-Il programma di utilit@`a @command{egrep} ricerca occorrenze di espressioni
-regolari all'interno di file. Usa
-espressioni regolari che sono quasi identiche a quelle disponibili in
-@iftex
-@command{awk} (@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-@command{awk} (@pxref{Espressioni regolari}).
-@end ifnottex
-Si richiama cos@`{@dotless{i}}:
-
-@display
-@command{egrep} [@var{opzioni}] @code{'@var{espressione}'} @var{file} @dots{}
-@end display
-
-@var{espressione} @`e un'espressione regolare. Normalmente, l'espressione
-regolare @`e protetta da apici per impedire alla shell di espandere ogni
-carattere speciale come @value{FN}.
-Normalmente, @command{egrep} stampa le righe per cui @`e stata trovata una
-corrispondenza. Se nella riga di comando si richiede di operare su pi@`u di un
-@value{FN}, ogni riga in output @`e preceduta dal nome del file, e dal segno
-due punti.
-
-Le opzioni di @command{egrep} sono le seguenti:
-
-@table @code
-@item -c
-Stampa un contatore delle righe che corrispondono al criterio di ricerca,
-e non le righe stesse.
-
-@item -s
-Funziona in silenzio. Non si produce alcun output ma il codice di ritorno
-indica se il criterio di ricerca ha trovato almeno una corrispondenza.
-
-@item -v
-Inverte il senso del test. @command{egrep} stampa le righe che
-@emph{non} soddisfano il criterio di ricerca ed esce con successo se il
-criterio di ricerca non @`e soddisfatto.
-
-@item -i
-Ignora maiuscolo/minuscolo sia nel criterio di ricerca che nei dati in input.
-
-@item -l
-Stampa (elenca) solo i nomi dei file che corrispondono, e non le righe trovate.
-
-@item -e @var{espressione}
-Usa @var{espressione} come @dfn{regexp} da ricercare. Il motivo per cui
-@`e prevista l'opzione @option{-e} @`e di
-permettere dei criteri di ricerca che
-inizino con un @samp{-}.
-@end table
-
-Questa versione usa la funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e il programma di libreria che gestisce il passaggio da un file dati
-al successivo
-(@pxref{Funzione filetrans}).
-
-Il programma inizia con un commento descrittivo e poi c'@`e una regola
-@code{BEGIN}
-che elabora gli argomenti della riga di comando usando @code{getopt()}.
-L'opzione @option{-i} (ignora maiuscolo/minuscolo) @`e particolarmente facile
-da implementare con @command{gawk}; basta usare la variabile predefinita
-@code{IGNORECASE}
-(@pxref{Variabili predefinite}):
-
-@cindex @code{egrep.awk}, programma
-@cindex programma @code{egrep.awk}
-@example
-@c file eg/prog/egrep.awk
-# egrep.awk --- simula egrep in awk
-#
-@c endfile
-@ignore
-@c file eg/prog/egrep.awk
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-
-@c endfile
-@end ignore
-@c file eg/prog/egrep.awk
-# Opzioni:
-# -c conta le righe trovate
-# -s sileziosa: genera solo il codice di ritorno
-# -v inverte test, successo se @dfn{regexp} non presente
-# -i ignora maiuscolo/minuscolo
-# -l stampa solo nomi file
-# -e espressione da ricercare
-#
-# Richiede la funzione getopt() e il programma di libreria
-# che gestisce il passaggio da un file dati al successivo
-
-BEGIN @{
- while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{
- if (c == "c")
- conta_e_basta++
- else if (c == "s")
- non_stampare++
- else if (c == "v")
- inverti_test++
- else if (c == "i")
- IGNORECASE = 1
- else if (c == "l")
- solo_nomi_file++
- else if (c == "e")
- criterio_di_ricerca = Optarg
- else
- sintassi()
- @}
-@c endfile
-@end example
-
-Nel seguito c'@`e il codice che gestisce il comportamento specifico di
-@command{egrep}. Se non @`e fornito esplicitamente alcun criterio di ricerca
-tramite l'opzione @option{-e}, si usa il primo argomento sulla riga di
-comando che non sia un'opzione.
-Gli argomenti della riga di comando di @command{awk} fino ad
-@code{ARGV[Optind]} vengono cancellati,
-in modo che @command{awk} non tenti di elaborarli come file. Se
-non @`e stato specificato alcun nome di file, si usa lo standard input, e se
-@`e presente pi@`u di un nome di file, lo si annota, in modo che i @value{FNS}
-vengano scritti prima di ogni riga di output corrispondente:
-
-@example
-@c file eg/prog/egrep.awk
- if (criterio_di_ricerca == "")
- criterio_di_ricerca = ARGV[Optind++]
-
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
- if (Optind >= ARGC) @{
- ARGV[1] = "-"
- ARGC = 2
- @} else if (ARGC - Optind > 1)
- servono_nomi_file++
-
-# if (IGNORECASE)
-# criterio_di_ricerca = tolower(criterio_di_ricerca)
-@}
-@c endfile
-@end example
-
-Le ultime due righe sono solo dei commenti, in quanto non necessarie in
-@command{gawk}. Per altre versioni di
-@command{awk}, potrebbe essere necessario utilizzarle come istruzioni
-effettive (togliendo il "#").
-
-Il prossimo insieme di righe dovrebbe essere decommentato
-se non si sta usando @command{gawk}.
-Questa regola converte in minuscolo tutti i caratteri della riga in input,
-se @`e stata specificata l'opzione @option{-i}.@footnote{Inoltre, qui si
-introduce un errore subdolo; se una corrispondenza viene trovata, viene
-inviata in output la riga tradotta, non quella originale.}
-La regola @`e
-commentata perch@'e non @`e necessaria se si usa @command{gawk}:
-
-@example
-@c file eg/prog/egrep.awk
-#@{
-# if (IGNORECASE)
-# $0 = tolower($0)
-#@}
-@c endfile
-@end example
-
-La funzione @code{a_inizio_file()} @`e chiamata dalla regola in @file{ftrans.awk}
-quando ogni nuovo file viene elaborato. In questo caso, non c'@`e molto da fare;
-ci si limita a inizializzare una variabile @code{contatore_file} a zero.
-@code{contatore_file} serve a ricordare quante righe nel file corrente
-corrispondono al criterio di ricerca.
-Scegliere come nome di parametro @code{da_buttare} indica che sappiamo che
-@code{a_inizio_file()} @`e chiamata con un parametro, ma che noi non siamo
-interessati al suo valore:
-
-@example
-@c file eg/prog/egrep.awk
-function a_inizio_file(da_buttare)
-@{
- contatore_file = 0
-@}
-@c endfile
-@end example
-
-La funzione @code{endfile()} viene chiamata dopo l'elaborazione di ogni file.
-Ha influenza sull'output solo quando l'utente desidera un contatore del
-numero di righe che sono state individuate. @code{non_stampare} @`e vero nel
-caso si desideri solo il codice di
-ritorno. @code{conta_e_basta} @`e vero se si desiderano solo i contatori
-delle righe trovate. @command{egrep}
-quindi stampa i contatori solo se
-sia la stampa che il conteggio delle righe sono stati abilitati.
-Il formato di output deve tenere conto del numero di file sui quali si
-opera. Per finire, @code{contatore_file} @`e aggiunto a @code{totale}, in
-modo da stabilire qual @`e il numero totale di righe che ha soddisfatto il
-criterio di ricerca:
-
-@example
-@c file eg/prog/egrep.awk
-function endfile(file)
-@{
- if (! non_stampare && conta_e_basta) @{
- if (servono_nomi_file)
- print file ":" contatore_file
- else
- print contatore_file
- @}
-
- totale += contatore_file
-@}
-@c endfile
-@end example
-
-Si potrebbero usare i criteri di ricerca speciali @code{BEGINFILE} ed
-@code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}),
-ma in quel caso il programma funzionerebbe solo usando @command{gawk}.
-Inoltre, questo esempio @`e stato scritto prima che a @command{gawk} venissero
-aggiunti i criteri speciali @code{BEGINFILE} ed @code{ENDFILE}.
-
-La regola seguente fa il grosso del lavoro per trovare righe corrispondenti
-al criterio di ricerca fornito. La variabile
-@code{corrisponde} @`e vera se la riga @`e individuata dal criterio di ricerca.
-Se l'utente chiede invece le righe che non corrispondono, il senso di
-@code{corrisponde} @`e invertito, usando l'operatore @samp{!}.
-@code{contatore_file} @`e incrementato con il valore di
-@code{corrisponde}, che vale uno o zero, a seconda che la corrispondenza sia
-stata trovata oppure no. Se la riga non corrisponde, l'istruzione
-@code{next} passa ad esaminare il record successivo.
-
-Vengono effettuati anche altri controlli, ma soltanto se non
-si sceglie di contare le righe. Prima di tutto, se l'utente desidera solo
-il codice di ritorno (@code{non_stampare} @`e vero), @`e sufficiente sapere
-che @emph{una} riga nel file corrisponde, e si pu@`o passare al file successivo
-usando @code{nextfile}. Analogamente, se stiamo solo stampando @value{FNS},
-possiamo stampare il @value{FN}, e quindi saltare al file successivo con
-@code{nextfile}.
-Infine, ogni riga viene stampata, preceduta, se necessario, dal @value{FN} e
-dai due punti:
-
-@cindex @code{!} (punto esclamativo), operatore @code{!}
-@cindex punto esclamativo (@code{!}), operatore @code{!}
-@example
-@c file eg/prog/egrep.awk
-@{
- corrisponde = ($0 ~ criterio_di_ricerca)
- if (inverti_test)
- corrisponde = ! corrisponde
-
- contatore_file += corrisponde # 1 o 0
-
- if (! corrisponde)
- next
-
- if (! conta_e_basta) @{
- if (non_stampare)
- nextfile
-
- if (solo_nomi_file) @{
- print nome_file
- nextfile
- @}
-
- if (servono_nomi_file)
- print nome_file ":" $0
- else
- print
- @}
-@}
-@c endfile
-@end example
-
-La regola @code{END} serve a produrre il codice di ritorno corretto. Se
-non ci sono corrispondenze, il codice di ritorno @`e uno; altrimenti, @`e zero:
-
-@example
-@c file eg/prog/egrep.awk
-END @{
- exit (totale == 0)
-@}
-@c endfile
-@end example
-
-La funzione @code{sintassi()} stampa un messaggio per l'utente, nel caso
-siano state specificate opzioni non valide, e quindi esce:
-
-@example
-@c file eg/prog/egrep.awk
-function sintassi()
-@{
- print("sintassi: egrep [-csvil] [-e criterio_di_ricerca] [file ...]")\
- > "/dev/stderr"
- print("\n\tegrep [-csvil] criterio_di_ricerca [file ...]") > "/dev/stderr"
- exit 1
-@}
-@c endfile
-@end example
-
-
-@node Programma id
-@subsection Stampare informazioni sull'utente
-
-@cindex stampare informazioni utente
-@cindex utenti, informazioni riguardo agli, stampare
-@cindex @command{id}, programma di utilit@`a
-@cindex programma di utilit@`a @command{id}
-Il programma di utilit@`a @command{id} elenca i numeri identificativi (ID)
-reali ed effettivi di un utente, e l'insieme dei gruppi a cui l'utente
-appartiene, se ve ne sono.
-@command{id} stampa i numeri identificativi di utente e di gruppo solo se
-questi sono differenti da quelli reali. Se possibile, @command{id} elenca
-anche i corrispondenti nomi di utente e di gruppo.
-L'output potrebbe essere simile a questo:
-
-@example
-$ @kbd{id}
-@print{} uid=1000(arnold) gid=1000(arnold) groups=1000(arnold),4(adm),7(lp),27(sudo)
-@end example
-
-@cindex @code{PROCINFO}, vettore, e @dfn{process ID} di utente e di gruppo
-Questa informazione @`e parte di ci@`o che @`e reso disponibile dal vettore
-@code{PROCINFO} di @command{gawk} (@pxref{Variabili predefinite}).
-Comunque, il programma di utilit@`a @command{id} fornisce un output pi@`u
-comprensibile che non una semplice lista di numeri.
-
-Ecco una versione semplice di @command{id} scritta in @command{awk}.
-Usa le funzioni di libreria che riguardano il database degli utenti
-(@pxref{Funzioni Passwd})
-e le funzioni di libreria che riguardano il database dei gruppi
-(@pxref{Funzioni Group})
-contenute
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}.
-
-Il programma @`e abbastanza semplice. Tutto il lavoro @`e svolto nella regola
-@code{BEGIN}. I numeri ID di utente e di gruppo sono ottenuti da
-@code{PROCINFO}.
-Il codice @`e ripetitivo. La riga nel database degli utenti che descrive
-l'ID reale dell'utente @`e divisa in parti, separate tra loro da @samp{:}.
-Il nome @`e il primo campo. Un codice analogo @`e usato per l'ID effettivo, e
-per i numeri che descrivono i gruppi:
-
-@cindex @code{id.awk}, programma
-@cindex programma @code{id.awk}
-@example
-@c file eg/prog/id.awk
-# id.awk --- implement id in awk
-#
-# Richiede funzioni di libreria per utente e gruppo
-@c endfile
-@ignore
-@c file eg/prog/id.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised February 1996
-# Revised May 2014
-# Revised September 2014
-
-@c endfile
-@end ignore
-@c file eg/prog/id.awk
-# l'output @`e:
-# uid=12(pippo) euid=34(pluto) gid=3(paperino) \
-# egid=5(paperina) groups=9(nove),2(due),1(uno)
-
-@group
-BEGIN @{
- uid = PROCINFO["uid"]
- euid = PROCINFO["euid"]
- gid = PROCINFO["gid"]
- egid = PROCINFO["egid"]
-@end group
-
- printf("uid=%d", uid)
- pw = getpwuid(uid)
- stampa_primo_campo(pw)
-
- if (euid != uid) @{
- printf(" euid=%d", euid)
- pw = getpwuid(euid)
- stampa_primo_campo(pw)
- @}
-
- printf(" gid=%d", gid)
- pw = getgrgid(gid)
- stampa_primo_campo(pw)
-
- if (egid != gid) @{
- printf(" egid=%d", egid)
- pw = getgrgid(egid)
- stampa_primo_campo(pw)
- @}
-
- for (i = 1; ("group" i) in PROCINFO; i++) @{
- if (i == 1)
- printf(" gruppi=")
- group = PROCINFO["group" i]
- printf("%d", group)
- pw = getgrgid(group)
- stampa_primo_campo(pw)
- if (("group" (i+1)) in PROCINFO)
- printf(",")
- @}
-
- print ""
-@}
-
-function stampa_primo_campo(str, a)
-@{
- if (str != "") @{
- split(str, a, ":")
- printf("(%s)", a[1])
- @}
-@}
-@c endfile
-@end example
-
-Il test incluso nel ciclo @code{for} @`e degno di nota.
-Ogni ulteriore gruppo nel vettore @code{PROCINFO} ha come indice da
-@code{"group1"} a @code{"group@var{N}"} dove il numero
-@var{N} @`e il numero totale di gruppi ulteriori).
-Tuttavia, non si sa quanti di questi gruppi ci siano per un dato utente.
-
-Questo ciclo inizia da uno, concatena il valore di ogni iterazione con
-@code{"group"}, e poi usando l'istruzione @code{in} verifica se quella
-chiave @`e nel vettore (@pxref{Visitare elementi}). Quando @code{i} @`e
-incrementato oltre l'ultimo gruppo presente nel vettore, il ciclo termina.
-
-Il ciclo funziona correttamente anche se @emph{non} ci sono ulteriori
-gruppi; in quel caso la condizione risulta falsa fin dal primo controllo, e
-il corpo del ciclo non viene mai eseguito.
-
-La funzione @code{stampa_primo_campo()} semplicemente incapsula quelle parti di
-codice che vengono usate ripetutamente, rendendo il programma pi@`u conciso e
-ordinato.
-In particolare, inserendo in questa funzione il test per la stringa nulla
-consente di risparmiare parecchie righe di programma.
-
-
-@node Programma split
-@subsection Suddividere in pezzi un file grosso
-
-@c FIXME: One day, update to current POSIX version of split
-
-@cindex file, splitting
-@cindex @code{split}, programma di utilit@`a
-@cindex programma di utilit@`a @code{split}
-Il programma @command{split} divide grossi file di testo in pezzi pi@`u piccoli.
-La sua sintassi @`e la seguente:@footnote{Questo @`e la sintassi tradizionale.
-La versione POSIX del comando ha una sintassi differente, ma per lo scopo di
-questo programma @command{awk} la cosa non ha importanza.}
-
-@display
-@command{split} [@code{-@var{contatore}}] [@var{file}] [@var{prefisso}]
-@end display
-
-Per default,
-i file di output avranno nome @file{xaa}, @file{xab}, e cos@`{@dotless{i}} via. Ogni file
-contiene 1.000 righe, con la probabile
-eccezione dell'ultimo file. Per
-cambiare il numero di righe in ogni file, va indicato un numero sulla riga
-di comando, preceduto da un segno meno (p.es., @samp{-500} per file con 500
-righe ognuno invece che 1.000). Per modificare i nomi dei file di output in
-qualcosa del tipo
-@file{miofileaa}, @file{miofileab}, e cos@`{@dotless{i}} via, va indicato un argomento
-ulteriore che specifica il prefisso del @value{FN}.
-
-Ecco una versione di @command{split} in @command{awk}. Usa le funzioni
-@code{ord()} e @code{chr()} descritte nella
-@ref{Funzioni ordinali}.
-
-Il programma dapprima imposta i suoi valori di default, e poi controlla che
-non siano stati specificati troppi argomenti. Quindi esamina gli argomenti
-uno alla volta. Il primo
-argomento potrebbe essere un segno meno seguito da un numero. Poich@'e il
-numero in questione pu@`o apparire negativo, lo si fa diventare positivo, e
-viene usato per contare le righe. Il nome del @value{DF} @`e per ora ignorato
-e l'ultimo argomento @`e usato come prefisso per i @value{FNS} in output:
-
-@cindex @code{split.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{split.awk}
-@example
-@c file eg/prog/split.awk
-# split.awk --- comando split scritto in awk
-#
-# Richiede le funzioni di libreria ord() e chr()
-@c endfile
-@ignore
-@c file eg/prog/split.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised slightly, May 2014
-
-@c endfile
-@end ignore
-@c file eg/prog/split.awk
-# sintassi: split [-contatore] [file] [nome_in_output]
-
-BEGIN @{
- outfile = "x" # default
- contatore = 1000
- if (ARGC > 4)
- sintassi()
-
- i = 1
- if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) @{
- contatore = -ARGV[i]
- ARGV[i] = ""
- i++
- @}
- # testa argv nel caso che si legga da stdin invece che da file
- if (i in ARGV)
- i++ # salta nome file-dati
- if (i in ARGV) @{
- outfile = ARGV[i]
- ARGV[i] = ""
- @}
-
- s1 = s2 = "a"
- out = (outfile s1 s2)
-@}
-@c endfile
-@end example
-
-La regola seguente fa il grosso del lavoro. @code{contatore_t}
-(contatore temporaneo) tiene conto di
-quante righe sono state stampate sul file di output finora. Se questo
-numero supera il valore di @code{contatore}, @`e ora di chiudere il file
-corrente e di iniziare a scriverne uno nuovo.
-Le variabili @code{s1} e @code{s2} sono usate per creare i suffissi
-da apporre a @value{FN}. Se entrambi arrivano al valore @samp{z}, il file
-@`e troppo grosso. Altrimenti, @code{s1} passa alla successiva lettera
-dell'alfabeto e @code{s2} ricomincia da @samp{a}:
-
-@c else on separate line here for page breaking
-@example
-@c file eg/prog/split.awk
-@{
- if (++contatore_t > contatore) @{
- close(out)
- if (s2 == "z") @{
- if (s1 == "z") @{
- printf("split: %s @`e troppo grosso da suddividere\n",
- nome_file) > "/dev/stderr"
- exit 1
- @}
- s1 = chr(ord(s1) + 1)
- s2 = "a"
- @}
-@group
- else
- s2 = chr(ord(s2) + 1)
-@end group
- out = (outfile s1 s2)
- contatore_t = 1
- @}
- print > out
-@}
-@c endfile
-@end example
-
-@noindent
-La funzione @code{sintassi()} stampa solo un messaggio di errore ed esce:
-
-@example
-@c file eg/prog/split.awk
-function sintassi()
-@{
- print("sintassi: split [-num] [file] [nome_in_output]") > "/dev/stderr"
- exit 1
-@}
-@c endfile
-@end example
-
-Questo programma @`e un po' approssimativo; conta sul fatto che @command{awk} chiuda
-automaticamente l'ultimo file invece di farlo in una regola @code{END}.
-Un altro presupposto del programma @`e che le lettere dell'alfabeto siano
-in posizioni consecutive nella codifica in uso, il che non @`e vero per i
-sistemi che usano la codifica EBCDIC.
-
-@ifset FOR_PRINT
-Si potrebbe pensare a come eliminare l'uso di
-@code{ord()} e @code{chr()}; la cosa si pu@`o fare in modo tale da risolvere
-anche il problema posto dalla codifica EBCDIC.
-@end ifset
-
-
-@node Programma tee
-@subsection Inviare l'output su pi@`u di un file
-
-@cindex file, multipli@comma{} duplicare l'output su
-@cindex output, duplicarlo su pi@`u file
-@cindex @code{tee}, programma di utilit@`a
-@cindex programma di utilit@`a @code{tee}
-Il programma @code{tee} @`e noto come @dfn{pipe fitting} (tubo secondario).
-@code{tee} copia il suo standard input al suo standard output e inoltre lo
-duplica scrivendo sui file indicati nella riga di comando. La sua sintassi
-@`e la seguente:
-
-@display
-@command{tee} [@option{-a}] @var{file} @dots{}
-@end display
-
-L'opzione @option{-a} chiede a @code{tee} di aggiungere in fondo al file
-indicato, invece che riscriverlo dall'inizio.
-
-La regola @code{BEGIN} dapprima fa una copia di tutti gli argomenti presenti
-sulla riga di comando, in un vettore di nome @code{copia}.
-@code{ARGV[0]} non serve, e quindi non viene copiato.
-@code{tee} non pu@`o usare @code{ARGV} direttamente, perch@'e @command{awk} tenta
-di elaborare ogni @value{FN} in @code{ARGV} come dati in input.
-
-@cindex flag, variabili di tipo
-@cindex variabili di tipo indicatore [@dfn{flag}]
-Se il primo argomento @`e @option{-a}, la variabile flag
-@code{append} viene impostata a vero, e sia @code{ARGV[1]} che
-@code{copia[1]} vengono cancellati. Se @code{ARGC} @`e minore di due, nessun
-@value{FN} @`e stato fornito, e @code{tee} stampa un messaggio di sintassi ed
-esce.
-Infine, @command{awk} viene obbligato a leggere lo standard input
-impostando @code{ARGV[1]} al valore @code{"-"} e @code{ARGC} a due:
-
-@cindex @code{tee.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{tee.awk}
-@example
-@c file eg/prog/tee.awk
-# tee.awk --- tee in awk
-#
-# Copia lo standard input a tutti i file di output indicati.
-# Aggiunge in fondo se viene data l'opzione -a.
-#
-@c endfile
-@ignore
-@c file eg/prog/tee.awk
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised December 1995
-
-@c endfile
-@end ignore
-@c file eg/prog/tee.awk
-BEGIN @{
- for (i = 1; i < ARGC; i++)
- copia[i] = ARGV[i]
-
- if (ARGV[1] == "-a") @{
- append = 1
- delete ARGV[1]
- delete copia[1]
- ARGC--
- @}
- if (ARGC < 2) @{
- print "sintassi: tee [-a] file ..." > "/dev/stderr"
- exit 1
- @}
- ARGV[1] = "-"
- ARGC = 2
-@}
-@c endfile
-@end example
-
-La seguente regola @`e sufficiente da sola a eseguire il lavoro. Poich@'e non @`e
-presente alcun criterio di ricerca, la regola @`e eseguita per ogni riga di
-input. Il corpo della regola si limita a stampare la riga su ogni file
-indicato nella riga di comando, e poi sullo standard output:
-
-@example
-@c file eg/prog/tee.awk
-@{
- # spostare l'if fuori dal ciclo ne velocizza l'esecuzione
- if (append)
- for (i in copia)
- print >> copia[i]
- else
- for (i in copia)
- print > copia[i]
- print
-@}
-@c endfile
-@end example
-
-@noindent
-@`E anche possibile scrivere il ciclo cos@`{@dotless{i}}:
-
-@example
-for (i in copia)
- if (append)
- print >> copia[i]
- else
- print > copia[i]
-@end example
-
-@noindent
-Questa forma @`e pi@`u concisa, ma anche meno efficiente. L'@samp{if} @`e
-eseguito per ogni record e per ogni file di output. Duplicando il corpo
-del ciclo, l'@samp{if} @`e eseguito solo una volta per ogni record in input.
-Se ci sono
-@var{N} record in input e @var{M} file di output, il primo metodo esegue solo
-@var{N} istruzioni @samp{if}, mentre il secondo esegue
-@var{N}@code{*}@var{M} istruzioni @samp{if}.
-
-Infine, la regola @code{END} fa pulizia, chiudendo tutti i file di output:
-
-@example
-@c file eg/prog/tee.awk
-END @{
- for (i in copia)
- close(copia[i])
-@}
-@c endfile
-@end example
-
-@node Programma uniq
-@subsection Stampare righe di testo non duplicate
-
-@c FIXME: One day, update to current POSIX version of uniq
-
-@cindex stampare righe di testo non duplicate
-@cindex testo@comma{} stampare, righe non duplicate di
-@cindex @command{uniq}, programma di utilit@`a
-@cindex programma di utilit@`a @command{uniq}
-Il programma di utilit@`a @command{uniq} legge righe di dati ordinati sul suo
-standard input, e per default rimuove righe duplicate. In altre parole,
-stampa solo righe uniche; da cui il
-nome. @command{uniq} ha diverse opzioni. La sintassi @`e la seguente:
-
-@display
-@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}] [@var{file_input} [@var{file_output}]]
-@end display
-
-Le opzioni per @command{uniq} sono:
-
-@table @code
-@item -d
-Stampa solo righe ripetute (duplicate).
-
-@item -u
-Stampa solo righe non ripetute (uniche).
-
-@item -c
-Contatore righe. Quest'opzione annulla le opzioni @option{-d} e @option{-u}.
-Sia le righe ripetute che quelle non ripetute vengono contate.
-
-@item -@var{n}
-Salta @var{n} campi prima di confrontare le righe. La definizione di campo
-@`e simile al default di @command{awk}: caratteri non bianchi, separati da
-sequenze di spazi e/o TAB.
-
-@item +@var{n}
-Salta @var{n} caratteri prima di confrontare le righe. Eventuali campi
-specificati con @samp{-@var{n}} sono saltati prima.
-
-@item @var{file_input}
-I dati sono letti dal file in input specificato sulla riga di comando, invece
-che dallo standard input.
-
-@item @var{file_output}
-L'output generato @`e scritto sul file di output specificato, invece che sullo
-standard output.
-@end table
-
-Normalmente @command{uniq} si comporta come se siano state specificate entrambe
-le opzioni @option{-d} e @option{-u}.
-
-@command{uniq} usa la
-funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-Il programma inizia con una funzione @code{sintassi()} e poi con una breve
-spiegazione delle opzioni e del loro significato, sotto forma di commenti.
-La regola @code{BEGIN} elabora gli argomenti della riga di comando e le
-opzioni. Viene usato un artificio per poter impiegare @code{getopt()} con
-opzioni della forma @samp{-25},
-trattando quest'opzione come la lettera di opzione @samp{2} con
-l'argomento @samp{5}. Se si specificano due o pi@`u cifre (@code{Optarg}
-sembra essere numerico), @code{Optarg} @`e concatenato con la cifra che
-costituisce l'opzione e poi al risultato @`e addizionato zero, per trasformarlo
-in un numero. Se c'@`e solo una cifra nell'opzione, @code{Optarg} non @`e
-necessario. In tal caso, @code{Optind} dev'essere decrementata, in modo che
-@code{getopt()} la elabori quando viene nuovamente richiamato. Questo codice
-@`e sicuramente un po' intricato.
-
-Se non sono specificate opzioni, per default si stampano sia le righe
-ripetute che quelle non ripetute. Il file di output, se specificato, @`e
-assegnato a @code{file_output}. In precedenza, @code{file_output} @`e
-inizializzato allo standard output, @file{/dev/stdout}:
-
-@cindex @code{uniq.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{uniq.awk}
-@example
-@c file eg/prog/uniq.awk
-@group
-# uniq.awk --- implementa uniq in awk
-#
-# Richiede le funzioni di libreria getopt() e join()
-@end group
-@c endfile
-@ignore
-@c file eg/prog/uniq.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/uniq.awk
-
-function sintassi()
-@{
- print("sintassi: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
- exit 1
-@}
-
-# -c contatore di righe. prevale su -d e -u
-# -d solo righe ripetute
-# -u solo righe non ripetute
-# -n salta n campi
-# +n salta n caratteri, salta prima eventuali campi
-
-BEGIN @{
- contatore = 1
- file_output = "/dev/stdout"
- opts = "udc0:1:2:3:4:5:6:7:8:9:"
- while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
- if (c == "u")
- solo_non_ripetute++
- else if (c == "d")
- solo_ripetute++
- else if (c == "c")
- conta_record++
- else if (index("0123456789", c) != 0) @{
- # getopt() richiede argomenti per le opzioni
- # questo consente di gestire cose come -5
- if (Optarg ~ /^[[:digit:]]+$/)
- contatore_file = (c Optarg) + 0
- else @{
- contatore_file = c + 0
- Optind--
- @}
- @} else
- sintassi()
- @}
-
- if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
- conta_caratteri = substr(ARGV[Optind], 2) + 0
- Optind++
- @}
-
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-
- if (solo_ripetute == 0 && solo_non_ripetute == 0)
- solo_ripetute = solo_non_ripetute = 1
-
- if (ARGC - Optind == 2) @{
- file_output = ARGV[ARGC - 1]
- ARGV[ARGC - 1] = ""
- @}
-@}
-@c endfile
-@end example
-
-La funzione seguente, @code{se_sono_uguali()}, confronta la riga corrente,
-@code{$0}, con la riga precedente, @code{ultima}. Gestisce il salto di
-campi e caratteri. Se non sono stati richiesti n@'e contatori di campo n@'e
-contatori di carattere, @code{se_sono_uguali()} restituisce uno o zero a
-seconda del risultato di un semplice confronto tra le stringhe @code{ultima}
-e @code{$0}.
-
-In caso contrario, le cose si complicano. Se devono essere saltati dei campi,
-ogni riga viene suddivisa in un vettore, usando @code{split()}
-(@pxref{Funzioni per stringhe}); i campi desiderati sono poi nuovamente uniti in
-un'unica riga usando @code{join()}. Le righe ricongiunte vengono
-immagazzinate in @code{campi_ultima} e @code{campi_corrente}. Se non ci
-sono campi da saltare, @code{campi_ultima} e @code{campi_corrente} sono
-impostati a @code{ultima} e @code{$0}, rispettivamente. Infine, se
-occorre saltare dei caratteri, si usa @code{substr()} per eliminare i primi
-@code{conta_caratteri} caratteri in @code{campi_ultima} e
-@code{campi_corrente}. Le due stringhe sono poi confrontare e
-@code{se_sono_uguali()} restituisce il risultato del confronto:
-
-@example
-@c file eg/prog/uniq.awk
-function se_sono_uguali( n, m, campi_ultima, campi_corrente,\
-vettore_ultima, vettore_corrente)
-@{
- if (contatore_file == 0 && conta_caratteri == 0)
- return (ultima == $0)
-
- if (contatore_file > 0) @{
- n = split(ultima, vettore_ultima)
- m = split($0, vettore_corrente)
- campi_ultima = join(vettore_ultima, contatore_file+1, n)
- campi_corrente = join(vettore_corrente, contatore_file+1, m)
- @} else @{
- campi_ultima = ultima
- campi_corrente = $0
- @}
- if (conta_caratteri) @{
- campi_ultima = substr(campi_ultima, conta_caratteri + 1)
- campi_corrente = substr(campi_corrente, conta_caratteri + 1)
- @}
-
- return (campi_ultima == campi_corrente)
-@}
-@c endfile
-@end example
-
-Le due regole seguenti sono il corpo del programma. La prima @`e eseguita solo
-per la prima riga dei dati. Imposta @code{ultima} al record corrente
-@code{$0}, in modo che le righe di testo successive abbiano qualcosa con cui
-essere confrontate.
-
-La seconda regola fa il lavoro. La variabile @code{uguale} vale uno o zero,
-a seconda del risultato del confronto effettuato in @code{se_sono_uguali()}.
-Se @command{uniq} sta contando le righe ripetute, e le righe sono uguali,
-viene incrementata la variabile @code{contatore}.
-Altrimenti, viene stampata la riga e azzerato @code{contatore},
-perch@'e le due righe non sono uguali.
-
-Se @command{uniq} non sta contando, e se le righe sono uguali,
-@code{contatore} @`e incrementato.
-Non viene stampato niente, perch@'e l'obiettivo @`e quello di rimuovere i duplicati.
-Altrimenti, se @command{uniq} sta contando le righe ripetute e viene trovata pi@`u
-di una riga, o se @command{uniq} sta contando le righe non ripetute
-e viene trovata solo una riga, questa riga viene stampata, e @code{contatore} @`e
-azzerato.
-
-Infine, una logica simile @`e usata nella regola @code{END} per stampare
-l'ultima riga di dati in input:
-
-@example
-@c file eg/prog/uniq.awk
-NR == 1 @{
- ultima = $0
- next
-@}
-
-@{
- uguale = se_sono_uguali()
-
- if (conta_record) @{ # prevale su -d e -u
- if (uguale)
- contatore++
- else @{
- printf("%4d %s\n", contatore, ultima) > file_output
- ultima = $0
- contatore = 1 # reset
- @}
- next
- @}
-
- if (uguale)
- contatore++
- else @{
- if ((solo_ripetute && contatore > 1) ||
- (solo_non_ripetute && contatore == 1))
- print ultima > file_output
- ultima = $0
- contatore = 1
- @}
-@}
-
-END @{
- if (conta_record)
- printf("%4d %s\n", contatore, ultima) > file_output
- else if ((solo_ripetute && contatore > 1) ||
- (solo_non_ripetute && contatore == 1))
- print ultima > file_output
- close(file_output)
-@}
-@c endfile
-@end example
-
-@c FIXME: Include this?
-@ignore
-This program does not follow our recommended convention of naming
-global variables with a leading capital letter. Doing that would
-make the program a little easier to follow.
-@end ignore
-
-@ifset FOR_PRINT
-La logica per scegliere quali righe stampare rappresenta una @dfn{macchina a
-stati}, che @`e ``un dispositivo che pu@`o trovarsi in una tra un dato numero di
-condizioni stabili, a seconda della sua condizione precedente e del valore
-corrente dei suoi input.''@footnote{Questa @`e la definizione trovata
-cercando @code{define: state machine} in Google.}
-Brian Kernighan suggerisce che
-``un approccio alternativo alle macchine a stati @`e quello di mettere l'input
-in un vettore, e poi usare gli indici. @`E quasi sempre pi@`u facile da
-programmare e, per molti input in cui si pu@`o usare questo metodo,
-altrettanto veloce.'' Si consideri come riscrivere la logica di questo
-programma per seguite questo suggerimento.
-@end ifset
-
-
-
-@node Programma wc
-@subsection Contare cose
-
-@c FIXME: One day, update to current POSIX version of wc
-
-@cindex contare
-@cindex file in input, contare elementi nel
-@cindex parole, contare le
-@cindex caratteri, contare i
-@cindex righe, contare le
-@cindex @command{wc}, programma di utilit@`a
-@cindex programma di utilit@`a @command{wc}
-Il programma di utilit@`a @command{wc} (@dfn{word count}, contatore di parole)
-conta righe, parole, e caratteri in uno o pi@`u file in input. La sua sintassi
-@`e la seguente:
-
-@display
-@command{wc} [@option{-lwc}] [@var{file} @dots{}]
-@end display
-
-Se nessun file @`e specificato sulla riga di comando, @command{wc} legge il suo
-standard input. Se ci sono pi@`u file, stampa anche il contatore totale di
-tutti i file. Le opzioni e il loro significato sono i seguenti:
-
-@table @code
-@item -l
-Conta solo le righe.
-
-@item -w
-Conta solo le parole.
-Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da
-spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk}
-separa i campi nei suoi record in input.
-
-@item -c
-Conta solo i caratteri.
-@end table
-
-Implementare @command{wc} in @command{awk} @`e particolarmente elegante,
-perch@'e @command{awk} fa molto lavoro al posto nostro; divide le righe in
-parole (cio@`e, campi) e le conta, conta le righe (cio@`e, i record),
-e pu@`o facilmente dire quanto @`e lunga una riga.
-
-Questo programma usa la funzione di libreria @code{getopt()}
-(@pxref{Funzione getopt})
-e le funzioni di passaggio da un file all'altro
-(@pxref{Funzione filetrans}).
-
-Questa versione ha una differenza significativa rispetto alle versioni
-tradizionali di @command{wc}: stampa sempre i contatori rispettando l'ordine
-righe, parole e caratteri. Le versioni tradizionali rilevano l'ordine in cui
-sono specificate le opzioni @option{-l}, @option{-w} e @option{-c} sulla riga
-di comando, e stampano i contatori in quell'ordine.
-
-La regola @code{BEGIN} si occupa degli argomenti. La variabile
-@code{stampa_totale} @`e vera se pi@`u di un file @`e presente sulla
-riga di comando:
-
-@cindex @code{wc.awk}, programma di utilit@`a
-@cindex programma di utilit@`a @code{wc.awk}
-@example
-@c file eg/prog/wc.awk
-# wc.awk --- conta righe, parole, caratteri
-@c endfile
-@ignore
-@c file eg/prog/wc.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/wc.awk
-
-# Opzioni:
-# -l conta solo righe
-# -w conta solo parole
-# -c conta solo caratteri
-#
-# Il default @`e di contare righe, parole, caratteri
-#
-# Richiede le funzioni di libreria getopt()
-# e il programma di libreria che gestisce
-# il passaggio da un file dati al successivo
-
-BEGIN @{
- # consente a getopt() di stampare un messaggio se si specificano
- # opzioni non valide. Noi le ignoriamo
- while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{
- if (c == "l")
- conta_righe = 1
- else if (c == "w")
- conta_parole = 1
- else if (c == "c")
- conta_caratteri = 1
- @}
- for (i = 1; i < Optind; i++)
- ARGV[i] = ""
-
- # se nessuna opzione @`e specificata, conta tutto
- if (! conta_righe && ! conta_parole && ! conta_caratteri)
- conta_righe = conta_parole = conta_caratteri = 1
-
- stampa_totale = (ARGC - i > 1)
-@}
-@c endfile
-@end example
-
-La funzione @code{a_inizio_file()} @`e semplice; si limita ad azzerare i contatori
-di righe, parole e caratteri, e salva il valore corrente di @value{FN} in
-@code{nome_file}:
-
-@example
-@c file eg/prog/wc.awk
-function a_inizio_file(file)
-@{
- righe = parole = caratteri = 0
- nome_file = FILENAME
-@}
-@c endfile
-@end example
-
-La funzione @code{a_fine_file()} aggiunge i numeri del file corrente al totale
-di righe, parole, e caratteri. Poi stampa i numeri relativi al file appena
-letto. La funzione
-@code{a_inizio_file()} azzera i numeri relativi al @value{DF} seguente:
-
-@example
-@c file eg/prog/wc.awk
-function a_fine_file(file)
-@{
- totale_righe += righe
- totale_parole += parole
- totale_caratteri += caratteri
- if (conta_righe)
- printf "\t%d", righe
-@group
- if (conta_parole)
- printf "\t%d", parole
-@end group
- if (conta_caratteri)
- printf "\t%d", caratteri
- printf "\t%s\n", nome_file
-@}
-@c endfile
-@end example
-
-C'@`e una regola che viene eseguita per ogni riga. Aggiunge la lunghezza del record
-pi@`u uno, a @code{caratteri}.@footnote{Poich@'e @command{gawk} gestisce le
-localizzazioni in cui un carattere pu@`o occupare pi@`u di un byte, questo codice
-conta i caratteri, non i byte.}
-Aggiungere uno alla lunghezza del record
-@`e necessario, perch@'e il carattere di ritorno a capo, che separa i record
-(il valore di @code{RS}) non @`e parte del record stesso, e quindi non @`e
-incluso nella sua lunghezza. Poi, @code{righe} @`e incrementata per ogni riga
-letta, e @code{parole} @`e incrementato con il valore @code{NF}, che @`e il
-numero di ``parole'' su questa riga:
-
-@example
-@c file eg/prog/wc.awk
-# per ogni riga...
-@{
- caratteri += length($0) + 1 # aggiunge un ritorno a capo
- righe++
- parole += NF
-@}
-@c endfile
-@end example
-
-Infine, la regola @code{END} si limita a stampare i totali per tutti i file:
-
-@example
-@c file eg/prog/wc.awk
-END @{
- if (stampa_totale) @{
- if (conta_righe)
- printf "\t%d", totale_righe
- if (conta_parole)
- printf "\t%d", totale_parole
- if (conta_caratteri)
- printf "\t%d", totale_caratteri
- print "\ttotale"
- @}
-@}
-@c endfile
-@end example
-
-@node Programmi vari
-@section Un paniere di programmi @command{awk}
-
-Questa @value{SECTION} @`e un ``paniere'' che contiene vari programmi.
-Si spera che siano interessanti e divertenti.
-
-@menu
-* Programma dupword:: Trovare parole duplicate in un documento.
-* Programma alarm:: Un programma di sveglia.
-* Programma translate:: Un programma simile al programma di utilit@`a
- @command{tr}.
-* Programma labels:: Stampare etichette per lettere.
-* Programma utilizzo parole:: Un programma per produrre un contatore
- dell'uso di parole in un testo.
-* Programma riordino diario:: Eliminare righe doppie da un file di
- cronologia.
-* Programma extract :: Estrarre programmi da file sorgenti Texinfo.
-* Programma sed semplice:: Un semplice editor di flusso.
-* Programma igawk:: Un programma per fornire ad
- @command{awk} la possibilit@`a di includere
- file.
-* Programma anagram:: Trovare anagrammi da una lista di parole.
-* Programma signature:: La gente fa cose stupefacenti se ha troppo
- tempo libero.
-@end menu
-
-@node Programma dupword
-@subsection Trovare parole duplicate in un documento
-
-@cindex parole duplicate, ricerca di
-@cindex ricerca di parole
-@cindex documenti@comma{} ricerca in
-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 questo programma fa quanto segue@dots{}'' Quando il testo @`e pubblicato in rete, spesso
-le parole duplicate sono poste tra il termine di
-@iftex
-di
-@end iftex
-una 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
-e cerca le occorrenze adiacenti della stessa parola. Conserva anche
-l'ultima parola di ogni riga (nella variabile @code{precedente}) per
-confrontarla con la prima parola sulla riga successiva.
-
-@cindex Texinfo
-Le prime due istruzioni fanno s@`{@dotless{i}} che la riga sia tutta in minuscolo,
-in modo che, per esempio, ``Il'' e ``il'' risultino essere la stessa parola.
-L'istruzione successiva sostituisce i caratteri che sono non alfanumerici e
-diversi dagli
-spazi bianchi con degli spazi, in modo che neppure la punteggiatura influenzi
-i confronti.
-I caratteri sono rimpiazzati da spazi in modo che i controlli di formattazione
-non creino parole prive di senso (p.es., l'espressione Texinfo
-@samp{@@code@{NF@}} diventa @samp{codeNF}, se ci si limita a eliminare la
-punteggiatura). Il record @`e poi
-suddiviso di nuovo in campi, producendo cos@`{@dotless{i}} solo la lista delle parole
-presenti sulla riga, esclusi eventuali campi nulli.
-
-Se, dopo aver rimosso tutta la punteggiatura, non rimane alcun campo, il
-record corrente @`e saltato. In caso contrario, il programma esegue il ciclo
-per ogni parola, confrontandola con quella che la precede:
-
-@cindex @code{dupword.awk}, programma
-@cindex programma @code{dupword.awk}
-@example
-@c file eg/prog/dupword.awk
-# dupword.awk --- trova parole duplicate in un testo
-@c endfile
-@ignore
-@c file eg/prog/dupword.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# December 1991
-# Revised October 2000
-
-@c endfile
-@end ignore
-@c file eg/prog/dupword.awk
-@{
- $0 = tolower($0)
- gsub(/[^[:alnum:][:blank:]]/, " ");
- $0 = $0 # divide di nuovo in campi
- if (NF == 0)
- next
- if ($1 == prec)
- printf("%s:%d: duplicato %s\n",
- nome_file, FNR, $1)
- for (i = 2; i <= NF; i++)
- if ($i == $(i-1))
- printf("%s:%d: duplicato %s\n",
- nome_file, FNR, $i)
- prec = $NF
-@}
-@c endfile
-@end example
-
-@node Programma alarm
-@subsection Un programma di sveglia
-@cindex insonnia, cura per
-@cindex Robbins, Arnold
-@quotation
-@i{Nessuna cura contro l'insonnia @`e efficace quanto una sveglia che suona.}
-@author Arnold Robbins
-@end quotation
-@cindex Quanstrom, Erik
-@ignore
-Date: Sat, 15 Feb 2014 16:47:09 -0500
-Subject: Re: 9atom install question
-Message-ID: <l2jcvx6j6mey60xnrkb0hhob.1392500829294@email.android.com>
-From: Erik Quanstrom <quanstro@quanstro.net>
-To: Aharon Robbins <arnold@skeeve.com>
-
-yes.
-
-- erik
-
-Aharon Robbins <arnold@skeeve.com> wrote:
-
->> sleep is for web developers.
->
->Can I quote you, in the gawk manual?
->
->Thanks,
->
->Arnold
-@end ignore
-@quotation
-@i{Il sonno @`e per sviluppatori web.}
-@author Erik Quanstrom
-@end quotation
-
-@cindex tempo, sveglia, programma di esempio
-@cindex sveglia, programma di esempio
-Il seguente programma @`e un semplice programma di ``sveglia''.
-Si pu@`o specificare un'ora del giorno e un messaggio opzionale. All'ora
-specificata, il programma stampa il messaggio sullo standard output. Inoltre,
-si pu@`o specificare il numero di volte in cui il messaggio va ripetuto, e
-anche un intervallo di tempo (ritardo) tra ogni ripetizione.
-
-Questo programma usa la funzione @code{getlocaltime()}
-@iftex
-dalla
-@end iftex
-@ifnottex
-da
-@end ifnottex
-@ref{Funzione getlocaltime}.
-
-Tutto il lavoro @`e svolto nella regola @code{BEGIN}. La prima parte @`e
-il controllo degli argomenti e l'impostazione dei valori di default:
-l'intervallo prima di ripetere, il contatore, e il messaggio da stampare.
-Se l'utente ha fornito un messaggio che non contiene il carattere ASCII BEL
-(noto come carattere ``campanello'', @code{"\a"}), questo viene aggiunto al
-messaggio. (Su molti sistemi, stampare il carattere ASCII BEL genera un suono
-udibile. Quindi, quando la sveglia suona, il sistema richiama l'attenzione
-su di s@'e nel caso che l'utente non stia guardando il computer.)
-Per amor di variet@`a, questo programma usa un'istruzione @code{switch}
-(@pxref{Istruzione switch}), ma l'elaborazione potrebbe anche essere fatta
-con una serie di istruzioni @code{if}-@code{else}.
-Ecco il programma:
-
-@cindex @code{alarm.awk}, programma
-@cindex programma @code{alarm.awk}
-@example
-@c file eg/prog/alarm.awk
-# alarm.awk --- impostare una sveglia
-#
-# Richiede la funzione di libreria getlocaltime()
-@c endfile
-@ignore
-@c file eg/prog/alarm.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised December 2010
-
-@c endfile
-@end ignore
-@c file eg/prog/alarm.awk
-# sintassi: alarm a_che_ora [ "messaggio" [ contatore [ ritardo ] ] ]
-
-BEGIN @{
- # Controllo iniziale congruit@`a argomenti
- sintassi1 = "sintassi: alarm a_che_ora ['messaggio' [contatore [ritardo]]]"
- sintassi2 = sprintf("\t(%s) formato ora: ::= hh:mm", ARGV[1])
-
- if (ARGC < 2) @{
- print sintassi1 > "/dev/stderr"
- print sintassi2 > "/dev/stderr"
- exit 1
- @}
- switch (ARGC) @{
- case 5:
- ritardo = ARGV[4] + 0
- # vai al caso seguente
- case 4:
- contatore = ARGV[3] + 0
- # vai al caso seguente
- case 3:
- messaggio = ARGV[2]
- break
- default:
- if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{
- print sintassi1 > "/dev/stderr"
- print sintassi2 > "/dev/stderr"
- exit 1
- @}
- break
- @}
-
- # imposta i valori di default per quando arriva l'ora desiderata
- if (ritardo == 0)
- ritardo = 180 # 3 minuti
-@group
- if (contatore == 0)
- contatore = 5
-@end group
- if (messaggio == "")
- messaggio = sprintf("\aAdesso sono le %s!\a", ARGV[1])
- else if (index(message, "\a") == 0)
- messaggio = "\a" messaggio "\a"
-@c endfile
-@end example
-
-La successiva @value{SECTION} di codice scompone l'ora specificata in ore e
-minuti, la converte (se @`e il caso) al formato 24-ore, e poi calcola il
-relativo numero di secondi dalla mezzanotte. Poi trasforma l'ora corrente in
-un contatore dei secondi dalla
-mezzanotte. La differenza tra i due @`e il tempo di attesa che deve passare
-prima di far scattare la sveglia:
-
-@example
-@c file eg/prog/alarm.awk
- # scomponi ora della sveglia
- split(ARGV[1], ore_minuti, ":")
- ora = ore_minuti[1] + 0 # trasforma in numero
- minuto = ore_minuti[2] + 0 # trasforma in numero
-
- # ottiene ora corrente divisa in campi
- getlocaltime(adesso)
-
- # se l'ora desiderata @`e in formato 12-ore ed @`e nel pomeriggio
- # (p.es., impostare `alarm 5:30' alle 9 del mattino
- # vuol dire far suonare la sveglia alle 5:30 pomeridiane)
- # aggiungere 12 all'ora richiesta
- if (hour < 12 && adesso["hour"] > ora)
- ora += 12
-
- # imposta l'ora in secondi dalla mezzanotte
- sveglia = (ora * 60 * 60) + (minuto * 60)
-
- # ottieni l'ora corrente in secondi dalla mezzanotte
- corrente = (now["hour"] * 60 * 60) + \
- (now["minute"] * 60) + now["second"]
-
- # quanto restare appisolati
- sonno = sveglia - corrente
- if (sonno <= 0) @{
- print "alarm: l'ora @`e nel passato!" > "/dev/stderr"
- exit 1
- @}
-@c endfile
-@end example
-
-@cindex @command{sleep}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sleep}
-Infine, il programma usa la funzione @code{system()}
-(@pxref{Funzioni di I/O})
-per chiamare il programma di utilit@`a @command{sleep}. Il programma di utilit@`a
-@command{sleep} non fa altro che aspettare per il numero di secondi
-specificato. Se il codice di ritorno restituito @`e diverso da zero, il
-programma suppone che @command{sleep} sia stato interrotto ed esce. Se
-@command{sleep} @`e terminato con un codice di ritorno corretto, (zero), il
-programma stampa il messaggio in un ciclo, utilizzando ancora @command{sleep}
-per ritardare per il numero di secondi necessario:
-
-@example
-@c file eg/prog/alarm.awk
- # zzzzzz..... esci se sleep @`e interrotto
- if (system(sprintf("sleep %d", sonno)) != 0)
- exit 1
-
- # @`e ora di avvisare!
- command = sprintf("sleep %d", ritardo)
- for (i = 1; i <= contatore; i++) @{
- print messaggio
- # se il comando sleep @`e interrotto, esci
- if (system(command) != 0)
- break
- @}
-
- exit 0
-@}
-@c endfile
-@end example
-
-@node Programma translate
-@subsection Rimpiazzare o eliminare caratteri
-
-@cindex caratteri, rimpiazzare
-@cindex rimpiazzare caratteri
-@cindex @command{tr}, programma di utilit@`a
-@cindex programma di utilit@`a @command{tr}
-Il programma di utilit@`a di sistema @command{tr} rimpiazza caratteri. Per
-esempio, @`e spesso usato per trasformare lettere maiuscole in lettere minuscole
-in vista di ulteriori elaborazioni:
-
-@example
-@var{generare dei dati} | tr 'A-Z' 'a-z' | @var{elaborare dei dati} @dots{}
-@end example
-
-@command{tr} richiede due liste di caratteri.@footnote{Su alcuni sistemi
-pi@`u datati, incluso Solaris, la versione di sistema di @command{tr} pu@`o
-richiedere che le liste siano scritte come espressioni di intervallo,
-racchiuse in parentesi quadre
-(@samp{[a-z]}) e tra apici, per evitare che la shell effettui
-espansioni di @value{FN}. Questo non @`e un miglioramento.} Quando
-si elabora l'input, il primo carattere della prima lista @`e rimpiazzato con il
-primo carattere della seconda lista, il secondo carattere della prima lista @`e
-rimpiazzato con il secondo carattere della seconda lista, e cos@`{@dotless{i}} via. Se ci
-sono pi@`u caratteri nella lista ``da'' che in quella ``a'', l'ultimo carattere
-della lista ``a'' @`e usato per i restanti caratteri della lista ``da''.
-
-In un lontano passato,
-@c early or mid-1989!
-un utente propose di aggiungere una funzione di traslitterazione a
-@command{gawk}.
-@c Wishing to avoid gratuitous new features,
-@c at least theoretically
-Il programma seguente @`e stato scritto per dimostrare che la traslitterazione
-di caratteri poteva essere fatta con una funzione definita dall'utente.
-Questo programma non @`e cos@`{@dotless{i}} completo come il programma di utilit@`a di sistema
-@command{tr}, ma svolge buona parte dello stesso lavoro.
-
-Il programma @command{translate} @`e stato scritto molto prima che @command{gawk}
-fosse in grado di separare ciascun carattere di una stringa in elementi
-distinti di un vettore. Questo @`e il motivo per cui usa ripetutamente le
-funzioni predefinite @code{substr()}, @code{index()}, e @code{gsub()}
-(@pxref{Funzioni per stringhe}).
-Ci sono due funzioni. La prima, @code{traduci_stringa()},
-richiede tre argomenti:
-
-@table @code
-@item da
-Una lista di caratteri da cui traslitterare
-
-@item a
-Una lista di caratteri a cui traslitterare
-
-@item stringa
-La stringa su cui effettuare la traslitterazione
-@end table
-
-I vettori associativi facilitano molto la parte di traslitterazione.
-@code{vettore_trad} contiene i caratteri ``a'', indicizzato dai
-caratteri ``da''. Poi un semplice
-ciclo scandisce @code{da}, un carattere alla volta. Per ogni carattere
-in @code{da}, se il carattere compare in @code{stringa}
-@`e rimpiazzato con il corrispondente carattere @code{a}.
-
-La funzione @code{traducilo()} chiama @code{traduci_stringa()}, usando @code{$0}
-come stringa. Il programma principale imposta due variabili globali, @code{DA} e
-@code{A}, dalla riga di comando, e poi modifica @code{ARGV} in modo che
-@command{awk} legga dallo standard input.
-
-Infine, la regola di elaborazione si limita a chiamare @code{traducilo()}
-per ogni record:
-
-@cindex @code{translate.awk}, programma
-@cindex programma @code{translate.awk}
-@example
-@c file eg/prog/translate.awk
-# translate.awk --- fa cose simili al comando tr
-@c endfile
-@ignore
-@c file eg/prog/translate.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August 1989
-# February 2009 - bug fix
-
-@c endfile
-@end ignore
-@c file eg/prog/translate.awk
-# Bug: non gestisce cose del tipo tr A-Z a-z; deve 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'.
-
-function traduci_stringa(da, a, stringa, lf, lt, lstringa, vettore_trad,
- i, c, risultato)
-@{
- lf = length(da)
- lt = length(a)
- lstringa = length(stringa)
- for (i = 1; i <= lt; i++)
- vettore_trad[substr(da, i, 1)] = substr(a, i, 1)
- if (lt < lf)
- for (; i <= lf; i++)
- vettore_trad[substr(da, i, 1)] = substr(a, lt, 1)
- for (i = 1; i <= lstringa; i++) @{
- c = substr(stringa, i, 1)
- if (c in vettore_trad)
- c = vettore_trad[c]
- risultato = risultato c
- @}
- return risultato
-@}
-
-function traducilo(da, a)
-@{
- return $0 = traduci_stringa(da, a, $0)
-@}
-
-# programma principale
-BEGIN @{
-@group
- if (ARGC < 3) @{
- print "sintassi: translate da a" > "/dev/stderr"
- exit
- @}
-@end group
- DA = ARGV[1]
- A = ARGV[2]
- ARGC = 2
- ARGV[1] = "-"
-@}
-
-@{
- traducilo(DA, A)
- print
-@}
-@c endfile
-@end example
-
-@`E possibile effettuare la traslitterazione di caratteri in una funzione a
-livello utente, ma non @`e detto che sia efficiente, e noi (sviluppatori
-di @command{gawk}) abbiamo iniziato a prendere in considerazione l'aggiunta di una funzione.
-Tuttavia, poco dopo aver scritto questo programma, abbiamo saputo che Brian
-Kernighan aveva aggiunto le funzioni @code{toupper()} e @code{tolower()} alla
-sua versione di @command{awk} (@pxref{Funzioni per stringhe}). Queste
-funzioni gestiscono la maggior parte dei casi in cui serva la traslitterazione
-di caratteri, e quindi abbiamo deciso di limitarci ad aggiungere le stesse
-funzioni a @command{gawk}, e di disinteressarci del resto.
-
-Un miglioramento ovvio a questo programma sarebbe di impostare il vettore
-@code{vettore_trad} solo una volta, in una regola @code{BEGIN}. Tuttavia, ci@`o
-presuppone che le liste ``da'' e ``a'' non cambino mai durante tutta
-l'esecuzione del programma.
-
-Un altro miglioramento ovvio @`e di consentire l'uso di intervalli, come
-@samp{a-z}, come consentito dal programma di utilit@`a @command{tr}. Si pu@`o
-trarre ispirazione dal codice di @file{cut.awk} (@pxref{Programma cut}).
-
-
-@node Programma labels
-@subsection Stampare etichette per lettere
-
-@cindex stampare etichette per lettera
-@cindex etichette per lettera@comma{} stampare
-Ecco un programma ``del mondo-reale''@footnote{``Del mondo-reale'' @`e definito
-come ``un programma effettivamente usato per realizzare qualcosa''.}.
-Questo script legge elenchi di nomi e indirizzi, e genera etichette per
-lettera. Ogni pagina di etichette contiene 20 etichette, su due file da 10
-etichette l'una. Gli indirizzi non possono contenere pi@`u di cinque righe di
-dati. Ogni indirizzo @`e separato dal successivo da una riga bianca.
-
-L'idea di base @`e di leggere dati per 20 etichette. Ogni riga di ogni etichetta
-@`e immagazzinata nel vettore @code{riga}. L'unica regola si occupa di riempire
-il vettore @code{riga} e di stampare la pagina dopo che sono state lette 20
-etichette.
-
-La regola @code{BEGIN} si limita a impostare @code{RS} alla stringa vuota, in
-modo che @command{awk} divida un record dal successivo quando incontra una riga
-bianca.
-(@pxref{Record}).
-Inoltre imposta @code{LIMITE_LINEE} a 100,
-perch@'e 100 @`e il massimo numero di righe sulla pagina
-@iftex
-(@math{20 @cdot 5 = 100}).
-@end iftex
-@ifnottex
-@ifnotdocbook
-(20 * 5 = 100).
-@end ifnotdocbook
-@end ifnottex
-@docbook
-(20 &sdot; 5 = 100).
-@end docbook
-
-Il grosso del lavoro @`e svolto nella funzione @code{stampa_pagina()}.
-Le righe che compongono le etichette sono immagazzinate sequenzialmente nel vettore
-@code{riga}. Ma occorre stamparle in
-orizzontale: @code{riga[1]} a fianco di @code{riga[6]}, @code{riga[2]} a
-fianco di @code{riga[7]}, e cos@`{@dotless{i}} via. Questo si pu@`o fare utilizzando due
-cicli. Quello pi@`u esterno, controllato dalla variabile @code{i}, gestisce 10
-righe di dati, ovvero la stampa di due etichette una a fianco dell'altra.
-Il ciclo pi@`u interno
-controllato dalla variabile @code{j}, gestisce le singole righe che compongono
-ognuno degli indirizzi.
-Poich@'e @code{j} varia da 0 a 4, @samp{i+j} @`e la riga @code{j}-esima
-dell'indirizzo di sinistra, e @samp{i+j+5} @`e quella stampata alla sua destra.
-L'output @`e simile a quello mostrato qui sotto:
-
-@example
-riga 1 riga 6
-riga 2 riga 7
-riga 3 riga 8
-riga 4 riga 9
-riga 5 riga 10
-@dots{}
-@end example
-
-@noindent
-La stringa di formato per @code{printf} @samp{%-41s} allinea a
-sinistra i dati, e li stampa in un campo di lunghezza fissa.
-
-Come nota finale, un'ulteriore riga bianca extra viene stampata alle righe 21 e
-61, per mantenere entro i bordi l'output sulle etichette. Ci@`o dipende dalla
-particolare marca di etichette in uso quando il programma @`e stato scritto.
-Si noti anche che ci sono due righe bianche a inizio pagina e due righe
-bianche a fine pagina.
-
-La regola @code{END} si occupa di stampare l'ultima pagina di
-etichette; @`e improbabile che il numero di indirizzi da stampare sia un
-multiplo esatto di 20:
-
-@cindex @code{labels.awk}, programma
-@cindex programma @code{labels.awk}
-@example
-@c file eg/prog/labels.awk
-# labels.awk --- stampare etichette per lettera
-@c endfile
-@ignore
-@c file eg/prog/labels.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# June 1992
-# December 2010, minor edits
-@c endfile
-@end ignore
-@c file eg/prog/labels.awk
-
-# Ogni etichetta @`e 5 righe di dati, qualcuna delle quali pu@`o essere bianca.
-# I fogli con le etichetta hanno 2 righe bianche in cima alla pagina e altre 2
-# a fine pagina.
-
-BEGIN @{ RS = "" ; LIMITE_LINEE = 100 @}
-
-function stampa_pagina( i, j)
-@{
- if (NUMEROrighe <= 0)
- return
-
- printf "\n\n" # in cima
-
- for (i = 1; i <= NUMEROrighe; i += 10) @{
- if (i == 21 || i == 61)
- print ""
- for (j = 0; j < 5; j++) @{
- if (i + j > LIMITE_LINEE)
- break
- printf " %-41s %s\n", riga[i+j], riga[i+j+5]
- @}
- print ""
- @}
-
- printf "\n\n" # in fondo
-
- delete riga
-@}
-
-# regola principale
-@{
- if (contatore >= 20) @{
- stampa_pagina()
- contatore = 0
- NUMEROrighe = 0
- @}
- n = split($0, a, "\n")
- for (i = 1; i <= n; i++)
- riga[++NUMEROrighe] = a[i]
- for (; i <= 5; i++)
- riga[++NUMEROrighe] = ""
- contatore++
-@}
-
-END @{
- stampa_pagina()
-@}
-@c endfile
-@end example
-
-@node Programma utilizzo parole
-@subsection Generare statistiche sulla frequenza d'uso delle parole
-
-@cindex parole, statistica utilizzo delle
-@cindex statistica utilizzo delle parole
-
-Quando si lavora con una grande quantit@`a di testo, pu@`o essere interessante
-sapere quanto spesso ricorrono le diverse parole. Per esempio, un autore pu@`o
-fare un uso eccessivo di certe parole, e in questo caso si potrebbero
-trovare sinonimi da sostituire a
-parole che appaiono troppo spesso.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} spiega come
-scrivere un programma per contare le parole e presentare in un formato
-utile le informazioni relative alla loro frequenza.
-
-A prima vista, un programma come questo sembrerebbe essere sufficiente:
-
-@example
-# wordfreq-first-try.awk --- stampa lista frequenze utilizzo parole
-
-@{
- for (i = 1; i <= NF; i++)
- freq[$i]++
-@}
-
-END @{
- for (word in freq)
- printf "%s\t%d\n", word, freq[word]
-@}
-@end example
-
-Il programma si affida al meccanismo con cui @command{awk} divide i campi per
-default, per suddividere ogni riga in ``parole'' e usa un vettore associativo
-di nome @code{freq}, che ha per indici le singole parole, per contare il
-numero di volte che ogni parola viene usata. Nella regola @code{END}, stampa i
-contatori.
-
-Questo programma ha parecchi problemi che lo rendono praticamente inutile
-su file di testo reali:
-
-@itemize @value{BULLET}
-@item
-Il linguaggio @command{awk} considera i caratteri maiuscoli e minuscoli come
-distinti (non equivalenti). Quindi, ``barista'' e ``Barista'' sono
-considerate parole differenti. Questo non @`e un comportamento auspicabile,
-perch@'e le parole iniziano con la lettera maiuscola se sono a inizio frase in
-un testo normale, e un analizzatore di frequenze dovrebbe ignorare la
-distinzione maiuscolo/minuscolo.
-
-@item
-Le parole sono individuate usando la convenzione @command{awk} secondo cui i
-campi sono separati solo da spazi bianchi. Altri caratteri nell'input
-(tranne il ritorno a capo) non hanno alcun particolare significato per
-@command{awk}. Questo significa che i segni di interpunzione sono visti come
-parte di una parola.
-
-@item
-L'output non @`e scritto in alcun ordine utile. Si @`e probabilmente pi@`u
-interessati a sapere quali parole ricorrono pi@`u di frequente, o ad avere
-una tabella in ordine alfabetico che mostra quante volte ricorre ogni parola.
-@end itemize
-
-@cindex @command{sort}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sort}
-Il primo problema si pu@`o risolvere usando @code{tolower()} per rimuovere la
-distinzione maiuscolo/minuscolo. Il secondo problema si pu@`o risolvere usando
-@code{gsub()} per rimuovere i caratteri di interpunzione. Infine, per
-risolvere il terzo problema si pu@`o usare il programma di utilit@`a
-@command{sort} per elaborare l'output dello script @command{awk}. Ecco la
-nuova versione del programma:
-
-@cindex @code{wordfreq.awk}, programma
-@cindex programma @code{wordfreq.awk}
-@example
-@c file eg/prog/wordfreq.awk
-# wordfreq.awk --- stampa la lista con la frequenza delle parole
-
-@{
- $0 = tolower($0) # togli maiuscolo/minuscolo
- # togli interpunzione
- gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
- for (i = 1; i <= NF; i++)
- freq[$i]++
-@}
-
-@c endfile
-END @{
- for (word in freq)
- printf "%s\t%d\n", word, freq[word]
-@}
-@end example
-
-La @dfn{regexp} @code{/[^[:alnum:]_[:blank:]]/} si poteva scrivere come
-@code{/[[:punct:]]/}, ma in questo modo il caratteri trattino basso sarebbe
-stato rimosso, mentre si desidera conservarlo.
-
-Supponendo di aver salvato questo programma in un file di nome
-@file{wordfreq.awk},
-e che i dati siano in @file{file1}, il seguente comando con @dfn{pipeline}:
-
-@example
-awk -f wordfreq.awk file1 | sort -k 2nr
-@end example
-
-@noindent
-produce una tabella delle parole che appaiono in @file{file1} in ordine
-descrescente di frequenza.
-
-Il programma @command{awk} da solo gestisce adeguatamente i dati e produce
-una tabella delle frequenza che non @`e ordinata.
-L'output di @command{awk} @`e poi messo in ordine dal programma di utilit@`a
-@command{sort} e stampato sullo schermo.
-
-Le opzioni passate a @command{sort}
-richiedono un ordinamento che usi come chiave il secondo campo di ogni riga
-in input (saltando il primo campo), che le chiavi di ordinamento siano
-trattate come quantit@`a numeriche
-(altrimenti @samp{15} sarebbe stampato prima di @samp{5}), e che l'ordinamento
-sia fatto in ordine decrescente (inverso).
-
-Il comando @command{sort} potrebbe anche essere richiamato dall'interno del
-programma, cambiando l'azione da fare nella regola @code{END} a:
-
-@example
-@c file eg/prog/wordfreq.awk
-END @{
- sort = "sort -k 2nr"
- for (word in freq)
- printf "%s\t%d\n", word, freq[word] | sort
- close(sort)
-@}
-@c endfile
-@end example
-
-Questa maniera di ordinare dev'essere usata su sistemi che non hanno delle
-vere e proprie @dfn{pipe} a livello di riga di comando (o di procedura di
-comandi).
-Si veda la documentazione generale riguardo al sistema operativo per maggiori
-informazioni su come usare il programma @command{sort}.
-
-@node Programma riordino diario
-@subsection Eliminare duplicati da un file non ordinato
-
-@cindex righe, duplicate@comma{} rimuovere
-@cindex rimuovere righe duplicate
-Il programma @command{uniq}
-(@pxref{Programma uniq})
-rimuove righe duplicate da dati @emph{ordinati}.
-
-Si supponga, tuttavia, di dover rimuovere righe duplicate da un @value{DF},
-ma di voler conservare l'ordine in cui le righe sono state scritte. Un buon
-esempio di questo tipo potrebbe essere un file della cronologia dei comandi
-della shell. Il file della cronologia dei comandi
-mantiene copia di tutti i comandi che sono stati dati, e non @`e
-insolito ripetere un comando molte volte di fila. Occasionalmente si
-potrebbe voler compattare la cronologia togliendo le righe duplicate.
-Tuttavia sarebbe opportuno mantenere l'ordine originale dei comandi.
-
-Questo semplice programma fa questo. Usa due vettori. Il vettore @code{dati}
-ha come indice il testo di ogni riga.
-Per ogni riga, @code{dati[$0]} @`e incrementato di uno.
-Se una particolare riga non @`e stata ancora vista, @code{dati[$0]} @`e zero.
-In tal caso, il testo della riga @`e immagazzinato in @code{righe[contatore]}.
-Ogni elemento del vettore @code{righe} @`e un comando unico, e gli
-indici di @code{righe} indicano l'ordine in cui quelle righe sono state
-incontrate.
-La regola @code{END} stampa semplicemente le righe, in ordine:
-
-@cindex Rakitzis, Byron
-@cindex @code{histsort.awk}, programma
-@cindex programma @code{histsort.awk}
-@example
-@c file eg/prog/histsort.awk
-# histsort.awk --- compatta un file della cronologia dei comandi della shell
-# Grazie a Byron Rakitzis per l'idea generale
-@c endfile
-@ignore
-@c file eg/prog/histsort.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-@c endfile
-@end ignore
-@c file eg/prog/histsort.awk
-
-@group
-@{
- if (dati[$0]++ == 0)
- righe[++contatore] = $0
-@}
-@end group
-
-@group
-END @{
- for (i = 1; i <= contatore; i++)
- print righe[i]
-@}
-@end group
-@c endfile
-@end example
-
-Questo programma pu@`o essere un punto di partenza per generare altre
-informazioni utili.
-Per esempio, usando la seguente istruzione @code{print} nella regola
-@code{END} permette di sapere quante volte viene usato un certo comando:
-
-@example
-print dati[righe[i]], righe[i]
-@end example
-
-@noindent
-Questo si pu@`o fare perch@'e @code{dati[$0]} @`e incrementato ogni volta che una
-riga @`e stata trovata.
-
-@node Programma extract
-@subsection Estrarre programmi da un file sorgente Texinfo
-
-@cindex Texinfo, estrarre programma da file sorgente
-@cindex estrarre programma da file sorgente Texinfo
-@cindex file Texinfo, estrarre programma da
-@ifnotinfo
-Sia questo capitolo che il precedente
-(@ref{Funzioni di libreria})
-presentano un numero elevato di programmi @command{awk}.
-@end ifnotinfo
-@ifinfo
-I nodi
-@ref{Funzioni di libreria},
-e @ref{Programmi di esempio},
-sono nodi al livello pi@`u elevato, e
-contengono nodi che descrivono un numero elevato di programmi @command{awk}.
-@end ifinfo
-Se si vuole fare pratica con questi programmi, @`e fastidioso doverli
-digitare di nuovo manualmente. @`E per questo che abbiamo pensato a un programma
-in grado di estrarre parti di un file in input Texinfo e metterli in file
-separati.
-
-@cindex Texinfo
-Questo @value{DOCUMENT} @`e scritto in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
-il programma di formattazione di documenti del progetto GNU.
-Un solo file sorgente Texinfo pu@`o essere usato per produrre sia la
-documentazione stampata, usando @TeX{}, sia quella online.
-@ifnotinfo
-(Texinfo @`e esaurientemente documentato nel libro
-@cite{Texinfo---The GNU Documentation Format},
-disponibile alla Free Software Foundation,
-e anche @uref{http://www.gnu.org/software/texinfo/manual/texinfo/, online}.)
-@end ifnotinfo
-@ifinfo
-(Il linguaggio Texinfo @`e descritto esaurientemente, a partire da
-@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}.)
-@end ifinfo
-
-Per quel che ci riguarda, @`e sufficiente sapere tre cose riguardo ai file di
-input Texinfo:
-
-@itemize @value{BULLET}
-@item
-Il simbolo ``chiocciola'' (@samp{@@}) @`e speciale per
-Texinfo, proprio come la barra inversa (@samp{\}) lo @`e per il linguaggio C
-o per @command{awk}. I simboli @samp{@@} sono rappresentati nel sorgente
-Texinfo come @samp{@@@@}.
-
-@item
-I commenti iniziano con @samp{@@c} o con @samp{@@comment}.
-Il programma di estrazione file funziona usando dei commenti speciali che
-sono posti all'inizio di una riga.
-
-@item
-Righe contenenti comandi @samp{@@group} e @samp{@@end group} racchiudono testi
-di esempio che non dovrebbero andare a cavallo di due pagine.
-(Sfortunatamente, @TeX{} non @`e sempre in grado di fare le cose in maniera
-esatta, e quindi va un po' aiutato).
-@end itemize
-
-Il programma seguente, @file{extract.awk}, legge un file sorgente Texinfo
-e fa due cose, basandosi sui commenti speciali.
-Dopo aver visto il commento @samp{@w{@@c system @dots{}}},
-esegue un comando, usando il testo del comando contenuto nella
-riga di controllo e passandolo alla funzione @code{system()}
-(@pxref{Funzioni di I/O}).
-Dopo aver trovato il commento @samp{@@c file @var{nome_file}}, ogni riga
-successiva @`e spedita al file @var{nome_file}, fino a che si trova un
-commento @samp{@@c endfile}.
-Le regole in @file{extract.awk} sono soddisfatte sia quando incontrano
-@samp{@@c} che quando incontrano @samp{@@comment} e quindi la parte
-@samp{omment} @`e opzionale.
-Le righe che contengono @samp{@@group} e @samp{@@end group} sono semplicemente
-ignorate.
-@file{extract.awk} usa la funzione di libreria @code{join()}
-(@pxref{Funzione join}).
-
-I programmi di esempio nel sorgente Texinfo online di @cite{@value{TITLE}}
-(@file{gawktexi.in}) sono stati tutti inseriti tra righe @samp{file} e righe
-@samp{endfile}. La distribuzione di @command{gawk} usa una copia di
-@file{extract.awk} per estrarre i programmi di esempio e per installarne
-molti in una particolare directory dove @command{gawk} li pu@`o trovare.
-Il file Texinfo ha un aspetto simile a questo:
-
-@example
-@dots{}
-Questo programma ha una regola @@code@{BEGIN@}
-che stampa un messaggio scherzoso:
-
-@@example
-@@c file esempi/messages.awk
-BEGIN @@@{ print "Non v'allarmate!" @@@}
-@@c endfile
-@@end example
-
-Stampa anche qualche avviso conclusivo:
-
-@@example
-@@c file esempi/messages.awk
-END @@@{ print "Evitate sempre gli archeologi annoiati!" @@@}
-@@c endfile
-@@end example
-@dots{}
-@end example
-
-Il programma @file{extract.awk} inizia con l'impostare @code{IGNORECASE} a
-uno, in modo che un miscuglio di lettere maiuscole e minuscole nelle direttive
-non faccia differenza.
-
-La prima regola gestisce le chiamate a @code{system()}, controllando che sia
-stato fornito un comando (@code{NF} dev'essere almeno tre) e controllando
-anche che il comando termini con un codice di ritorno uguale a zero, che sta
-a significare che tutto @`e andato bene:
-
-@cindex @code{extract.awk}, programma
-@cindex programma @code{extract.awk}
-@example
-@c file eg/prog/extract.awk
-# extract.awk --- estrae file ed esegue programmi dal file Texinfo
-@c endfile
-@ignore
-@c file eg/prog/extract.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# May 1993
-# Revised September 2000
-@c endfile
-@end ignore
-@c file eg/prog/extract.awk
-
-BEGIN @{ IGNORECASE = 1 @}
-
-/^@@c(omment)?[ \t]+system/ @{
- if (NF < 3) @{
- e = ("extract: " FILENAME ":" FNR)
- e = (e ": riga `system' con formato errato")
- print e > "/dev/stderr"
- next
- @}
- $1 = ""
- $2 = ""
- stat = system($0)
- if (stat != 0) @{
- e = ("extract: " FILENAME ":" FNR)
- e = (e ": attenzione: system ha restituito " stat)
- print e > "/dev/stderr"
- @}
-@}
-@c endfile
-@end example
-
-@noindent
-La variabile @code{e} @`e stata usata per far s@`{@dotless{i}} che la regola
-sia agevolemente contenuta nella @value{PAGE}.
-
-La seconda regola gestisce il trasferimento di dati in un file. Verifica che
-nella direttiva sia stato fornito un @value{FN}.
-Se il nome del file non @`e quello del file corrente, il file
-corrente viene chiuso. Mantenere aperto il file corrente finch@'e non si trova
-un nuovo nome file permette di usare la ridirezione @samp{>} per stampare i
-contenuti nel file, semplificando la gestione dei file aperti.
-
-Il ciclo @code{for} esegue il lavoro. Legge le righe usando @code{getline}
-(@pxref{Getline}).
-Se si raggiunge una fine-file inattesa, viene chiamata la funzione
-@code{@w{fine_file_inattesa()}}. Se la riga @`e una riga ``endfile'',
-il ciclo viene abbandonato.
-Se la riga inizia con @samp{@@group} o @samp{@@end group}, la riga viene
-ignorata, e si passa a quella seguente. Allo stesso modo, eventuali commenti
-all'interno degli esempi vengono ignorati.
-
-Il grosso del lavoro @`e nelle poche righe che seguono. Se la riga non ha
-simboli @samp{@@}, il programma la pu@`o
-stampare cos@`{@dotless{i}} com'@`e. Altrimenti, ogni @samp{@@} a inizio parola dev'essere
-eliminato.
-Per rimuovere i simboli @samp{@@}, la riga viene divisa nei singoli elementi
-del vettore @code{a}, usando la funzione @code{split()}
-(@pxref{Funzioni per stringhe}).
-Il simbolo @samp{@@} @`e usato come carattere di separazione.
-Ogni elemento del vettore @code{a} che risulti vuoto indica due caratteri
-@samp{@@} contigui nella riga originale. Per ogni due elementi vuoti
-(@samp{@@@@} nel file originale), va inserito un solo simbolo @samp{@@} nel
-file in output.
-
-Una volta terminato di esaminare il vettore, viene chiamata la funzione @code{join()}
-specificando nella chiamata il valore di @code{SUBSEP}
-(@pxref{Vettori multidimensionali}),
-per riunire nuovamente i pezzi in una riga sola.
-La riga @`e poi stampata nel file di output:
-
-@example
-@c file eg/prog/extract.awk
-/^@@c(omment)?[ \t]+file/ @{
- if (NF != 3) @{
- e = ("extract: " FILENAME ":" FNR ": riga `file' con formato errato")
- print e > "/dev/stderr"
- next
- @}
- if ($3 != file_corrente) @{
- if (file_corrente != "")
- close(file_corrente)
- file_corrente = $3
- @}
-
- for (;;) @{
- if ((getline riga) <= 0)
- fine_file_inattesa()
- if (riga ~ /^@@c(omment)?[ \t]+endfile/)
- break
- else if (riga ~ /^@@(end[ \t]+)?group/)
- continue
- else if (riga ~ /^@@c(omment+)?[ \t]+/)
- continue
- if (index(riga, "@@") == 0) @{
- print riga > file_corrente
- continue
- @}
- n = split(riga, a, "@@")
- # if a[1] == "", vuol dire riga che inizia per @@,
- # non salvare un @@
- for (i = 2; i <= n; i++) @{
- if (a[i] == "") @{ # era un @@@@
- a[i] = "@@"
- if (a[i+1] == "")
- i++
- @}
- @}
- print join(a, 1, n, SUBSEP) > file_corrente
- @}
-@}
-@c endfile
-@end example
-
-@`E importante notare l'uso della ridirezione @samp{>} .
-L'output fatto usando @samp{>} apre il file solo la prima volta; il file resta
-poi aperto, e ogni scrittura successiva @`e aggiunta in fondo al file.
-(@pxref{Ridirezione}).
-Ci@`o rende possibile mischiare testo del programm e commenti esplicativi
-(come @`e stato fatto qui) nello stesso file sorgente, senza nessun problema.
-Il file viene chiuso solo quando viene trovato un nuovo nome di
-@value{DF} oppure alla fine del file in input.
-
-Per finire, la funzione @code{@w{fine_file_inattesa()}} stampa un
-appropriato messaggio di errore ed esce.
-La regola @code{END} gestisce la pulizia finale, chiudendo il file aperto:
-
-@example
-@c file eg/prog/extract.awk
-@group
-function fine_file_inattesa()
-@{
- printf("extract: %s:%d: fine-file inattesa, o errore\n",
- FILENAME, FNR) > "/dev/stderr"
- exit 1
-@}
-@end group
-
-END @{
- if (file_corrente)
- close(file_corrente)
-@}
-@c endfile
-@end example
-
-@node Programma sed semplice
-@subsection Un semplice editor di flusso
-
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex editori di flusso
-@cindex flusso, editori di
-Il programma di utilit@`a @command{sed} @`e un @dfn{editore di flusso},
-ovvero un programma che legge un flusso di dati, lo modifica, e scrive il file
-cos@`{@dotless{i}} modificato.
-@`E spesso usato per fare modifiche generalizzate a un grosso file, o a un
-flusso di dati generato da una @dfn{pipeline} di comandi.
-Sebbene @command{sed} sia un programma piuttosto complesso di suo, l'uso che
-se ne fa solitamente @`e di effettuare delle sostituzioni globali attraverso
-una @dfn{pipeline}:
-
-@example
-@var{comando1} < dati.originali | sed 's/vecchio/nuovo/g' | @var{comando2} > risultato
-@end example
-
-Qui, @samp{s/vecchio/nuovo/g} chiede a @command{sed} di ricercare la
-@dfn{regexp} @samp{vecchio} in ogni riga di input e di sostituirla
-dappertutto con il testo @samp{nuovo} (cio@`e, in tutte le occorrenze di
-ciascuna riga). Questo @`e simile a quello che fa la funzione di @command{awk}
-@code{gsub()}
-(@pxref{Funzioni per stringhe}).
-
-Il programma seguente, @file{awksed.awk}, accetta almeno due argomenti dalla
-riga di comando: l'espressione da ricercare e il testo con cui rimpiazzarla.
-Ogni ulteriore argomento @`e considerato
-come un nome di @value{DF} da elaborare. Se non ne viene fornito alcuno, si
-usa lo standard input:
-
-@cindex Brennan, Michael
-@cindex @command{awksed.awk}, programma
-@cindex programma @command{awksed.awk}
-@c @cindex simple stream editor
-@c @cindex stream editor, simple
-@example
-@c file eg/prog/awksed.awk
-# awksed.awk --- fa s/pippo/pluto/g usando solo print
-# Ringraziamenti a Michael Brennan per l'idea
-@c endfile
-@ignore
-@c file eg/prog/awksed.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# August 1995
-@c endfile
-@end ignore
-@c file eg/prog/awksed.awk
-
-function sintassi()
-@{
- print "sintassi: awksed espressione rimpiazzo [file...]" > "/dev/stderr"
- exit 1
-@}
-
-BEGIN @{
- # valida argomenti
- if (ARGC < 3)
- sintassi()
-
- RS = ARGV[1]
- ORS = ARGV[2]
-
- # non usare argomenti come nomi di file
- ARGV[1] = ARGV[2] = ""
-@}
-
-@group
-# guarda, mamma, senza mani!
-@{
- if (RT == "")
- printf "%s", $0
- else
- print
-@}
-@end group
-@c endfile
-@end example
-
-Il programma fa assegnamento sulla capacit@`a di @command{gawk} di avere come
-@code{RS} una @dfn{regexp},
-e anche sul fatto che @code{RT} viene impostato al testo che effettivamente
-delimita il record (@pxref{Record}).
-
-L'idea @`e di usare @code{RS} come espressione da ricercare. @command{gawk}
-automaticamente imposta @code{$0} al testo che compare tra due corrispondenze
-all'espressione di ricerca.
-Questo @`e appunto il testo che vogliamo conservare inalterato. Quindi,
-impostando @code{ORS} al testo che si vuole sostituire, una semplice
-istruzione @code{print} scrive il testo che si vuole mantenere, seguito dal
-testo che si vuole invece sostituire.
-
-C'@`e un problema in questo schema, ossia cosa fare se l'ultimo record
-non termina con un testo che corrisponde a @code{RS}. Usando un'istruzione
-@code{print} incondizionatamente stampa il testo da sostituire, il che non
-@`e corretto.
-Tuttavia, se il file non termina con del testo che corrisponde a @code{RS},
-@code{RT} @`e impostata alla stringa nulla. In tal caso, si pu@`o stampare
-@code{$0} usando @code{printf}
-(@pxref{Printf}).
-
-La regola @code{BEGIN} gestisce la preparazione, controllando che ci sia
-il numero giusto di argomenti e chiamando @code{sintassi()} se c'@`e un problema.
-Poi imposta @code{RS} e @code{ORS} dagli argomenti della riga di comando e
-imposta @code{ARGV[1]} e @code{ARGV[2]} alla stringa nulla, per impedire che
-vengano considerati dei @value{FNS}
-(@pxref{ARGC e ARGV}).
-
-La funzione @code{sintassi()} stampa un messaggio di errore ed esce.
-Per finire, l'unica regola gestisce lo schema di stampa delineato pi@`u sopra,
-usando @code{print} o @code{printf} come richiesto, a seconda del valore di
-@code{RT}.
-
-@node Programma igawk
-@subsection Una maniera facile per usare funzioni di libreria
-
-@cindex libreria di funzioni @command{awk}, programma di esempio per usare
-@cindex funzioni, librerie di, programma di esempio per usare
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Includere file}, abbiamo visto come @command{gawk} preveda la
-possibilit@`a di includere file. Tuttavia, questa @`e un'estensione @command{gawk}.
-Questa @value{SECTION} evidenzia l'utilit@`a di rendere l'inclusione di
-file disponibile per @command{awk} standard, e mostra come farlo utilizzando
-una combinazione di programmazione di shell e di @command{awk}.
-
-Usare funzioni di libreria in @command{awk} pu@`o presentare molti vantaggi.
-Incoraggia il riutilizzo di codice e la scrittura di funzioni di tipo
-generale. I programmi sono pi@`u snelli e quindi pi@`u comprensibili.
-Tuttavia, usare funzioni di libreria @`e facile solo in fase di scrittura di
-programmi @command{awk}; @`e invece complicato al momento di eseguirli,
-rendendo necessario specificare molte opzioni @option{-f}. Se @command{gawk}
-non @`e disponibile, non lo sono neppure la variabile d'ambiente @env{AWKPATH} e
-la possibilit@`a di conservare funzioni @command{awk} in una directory di
-libreria (@pxref{Opzioni}).
-Sarebbe bello poter scrivere programmi nel modo seguente:
-
-@example
-# funzioni di libreria
-@@include getopt.awk
-@@include join.awk
-@dots{}
-
-# programma principale
-BEGIN @{
- while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1)
- @dots{}
- @dots{}
-@}
-@end example
-
-Il programma seguente, @file{igawk.sh}, fornisce questo servizio.
-Simula la ricerca da parte di @command{gawk} della variabile d'ambiente
-@env{AWKPATH} e permette anche delle inclusioni @dfn{nidificate} (cio@`e,
-un file che @`e stato incluso tramite
-@code{@@include} pu@`o contenere ulteriori istruzioni @code{@@include}).
-@command{igawk} tenta di includere ogni file una volta sola, in modo che delle
-inclusioni nidificate non contengano accidentalmente una funzione di libreria
-pi@`u di una volta.
-
-@command{igawk} dovrebbe comportarsi esternamente proprio come @command{gawk}.
-Questo vuol dire che dovrebbe accettare sulla riga di comando tutti gli
-argomenti di @command{gawk}, compresa
-la capacit@`a di specificare pi@`u file
-sorgenti tramite l'opzione @option{-f}
-e la capacit@`a di mescolare istruzioni da riga di comando e file di sorgenti di
-libreria.
-
-Il programma @`e scritto usando il linguaggio della Shell POSIX
-(@command{sh}).@footnote{Una spiegazione dettagliata del linguaggio della
-@command{sh} non rientra negli intenti di questo libro. Qualche spiegazione
-sommaria viene fornita, ma se si desidera una comprensione pi@`u dettagliata, si
-dovrebbe consultare un buon libro sulla programmazione della shell.}
-Il funzionamento @`e il seguente:
-
-@enumerate
-@item
-Esegue un ciclo attraverso gli argomenti, salvando tutto ci@`o che non si presenta come
-codice sorgente @command{awk}, per quando il programma espanso sar@`a eseguito.
-
-@item
-Per ogni argomento che rappresenta del codice @command{awk}, mette l'argomento
-in una variabile di shell che verr@`a espansa. Ci sono due casi:
-
-@enumerate a
-@item
-Un testo letterale, fornito con l'opzione @option{-e} o @option{--source}.
-Questo testo viene aggiunto direttamente in fondo.
-
-@item
-@value{FNS} sorgenti, forniti con l'opzione @option{-f}. Usiamo il trucchetto
-di aggiungere @samp{@@include @var{nome_file}} in fondo ai contenuti della
-variabile di shell. Poich@'e il programma di inclusione dei file funziona
-allo stesso modo in cui funziona @command{gawk}, ne risulta che il file viene
-incluso nel programma al punto giusto.
-@end enumerate
-
-@item
-Esegue un programma (naturalmente @command{awk}) sui contenuti della variabile
-di shell per espandere le istruzioni
-@code{@@include}. Il programma espanso @`e messo in una seconda variabile di
-shell.
-
-@item
-Esegue il programma espanso richiamando @command{gawk} e tutti gli altri
-argomenti originalmente forniti dall'utente sulla riga di comando (come p.es.
-dei nomi di @value{DF}).
-@end enumerate
-
-Questo programma usa variabili di shell in quantit@`a: per immagazzinare
-argomenti della riga di comando e
-il testo del programma @command{awk} che espander@`a il programma dell'utente,
-per il programma originale dell'utente e per il programma espanso. Questo
-modo di procedere risolve potenziali
-problemi che potrebbero presentarsi se si usassero invece dei file temporanei,
-ma rende lo script un po' pi@`u complicato.
-
-La parte iniziale del programma attiva il tracciamento della shell se il primo
-argomento @`e @samp{debug}.
-
-La parte successiva esegue un ciclo che esamina ogni argomento della riga di
-comando.
-Ci sono parecchi casi da esaminare:
-
-@c @asis for docbook
-@table @asis
-@item @option{--}
-Quest'opzione termina gli argomenti per @command{igawk}. Tutto quel che segue
-dovrebbe essere passato al programma @command{awk} dell'utente senza essere
-preso in considerazione.
-
-@item @option{-W}
-Questo indica che l'opzione successiva @`e propria di @command{gawk}. Per
-facilitare l'elaborazione degli argomenti, l'opzione @option{-W} @`e aggiunta
-davanti agli argomenti rimanenti, e il
-ciclo continua. (Questo @`e un trucco di programmazione della @command{sh}.
-Non @`e il caso di preoccuparsene se non si ha familiarit@`a con il comando
-@command{sh}.)
-
-@item @option{-v}, @option{-F}
-Queste opzioni sono conservate e lasciate da gestire a @command{gawk}.
-
-@item @option{-f}, @option{--file}, @option{--file=}, @option{-Wfile=}
-Il @value{FN} @`e aggiunto alla variabile di shell @code{programma}, insieme
-a un'istruzione @code{@@include}.
-Il programma di utilit@`a @command{expr} @`e usato per eliminare la parte
-iniziale dell'argomento (p.es., @samp{--file=}).
-(La sintassi tipica di @command{sh} richiederebbe di usare il comando
-@command{echo} e il programma di utilit@`a @command{sed} per far questo.
-Sfortunatamente, alcune versioni di @command{echo} valutano le sequenze
-di protezione contenute nei loro argomenti, e questo potrebbe finire per
-alterare il testo del programma.
-L'uso di @command{expr} evita questo problema.)
-
-@item @option{--source}, @option{--source=}, @option{-Wsource=}
-Il testo sorgente @`e aggiunto in fondo a @code{programma}.
-
-@item @option{--version}, @option{-Wversion}
-@command{igawk} stampa il proprio numero di versione, esegue
-@samp{gawk --version} per ottenere l'informazione relativa alla versione di
-@command{gawk}, ed esce.
-@end table
-
-Se nessuno degli argomenti
-@option{-f}, @option{--file}, @option{-Wfile}, @option{--source},
-o @option{-Wsource} @`e stato fornito, il primo argomento che non @`e un'opzione
-dovrebbe essere il programma @command{awk}. Se non ci sono argomenti rimasti
-sulla riga di comando, @command{igawk} stampa un messaggio di errore ed esce.
-Altrimenti, il primo argomento @`e aggiunto in fondo a @code{programma}.
-In qualsiasi caso, dopo che gli argomenti sono stati elaborati,
-la variabile di shell
-@code{programma} contiene il testo completo del programma originale
-@command{awk}.
-
-Il programma @`e il seguente:
-
-@cindex @code{igawk.sh}, programma
-@cindex programma @code{igawk.sh}
-@example
-@c file eg/prog/igawk.sh
-#! /bin/sh
-# igawk --- come gawk ma abilita l'uso di @@include
-@c endfile
-@ignore
-@c file eg/prog/igawk.sh
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# July 1993
-# December 2010, minor edits
-@c endfile
-@end ignore
-@c file eg/prog/igawk.sh
-
-if [ "$1" = debug ]
-then
- set -x
- shift
-fi
-
-# Un ritorno a capo letterale,
-# per formattare correttamente il testo del programma
-n='
-'
-
-# Inizializza delle variabili alla stringa nulla
-programma=
-opts=
-
-while [ $# -ne 0 ] # ciclo sugli argomenti
-do
- case $1 in
- --) shift
- break ;;
-
- -W) shift
- # Il costrutto $@{x?'messaggio qui'@} stampa un
- # messaggio diagnostico se $x @`e la stringa nulla
- set -- -W"$@{@@?'manca operando'@}"
- continue ;;
-
- -[vF]) opts="$opts $1 '$@{2?'manca operando'@}'"
- shift ;;
-
- -[vF]*) opts="$opts '$1'" ;;
-
- -f) programma="$programma$n@@include $@{2?'manca operando'@}"
- shift ;;
-
- -f*) f=$(expr "$1" : '-f\(.*\)')
- programma="$programma$n@@include $f" ;;
-
- -[W-]file=*)
- f=$(expr "$1" : '-.file=\(.*\)')
- programma="$programma$n@@include $f" ;;
-
- -[W-]file)
- programma="$programma$n@@include $@{2?'manca operando'@}"
- shift ;;
-
- -[W-]source=*)
- t=$(expr "$1" : '-.source=\(.*\)')
- programma="$programma$n$t" ;;
-
- -[W-]source)
- programma="$programma$n$@{2?'manca operando'@}"
- shift ;;
-
- -[W-]version)
- echo igawk: version 3.0 1>&2
- gawk --version
- exit 0 ;;
-
- -[W-]*) opts="$opts '$1'" ;;
-
- *) break ;;
- esac
- shift
-done
-
-if [ -z "$programma" ]
-then
- programma=$@{1?'manca programma'@}
- shift
-fi
-
-# A questo punto, `programma' contiene il programma.
-@c endfile
-@end example
-
-Il programma @command{awk} che elabora le direttive @code{@@include}
-@`e immagazzinato nella variabile di shell @code{progr_che_espande}. Ci@`o serve
-a mantenere leggibile lo script. Questo programma @command{awk} legge
-tutto il programma dell'utente, una riga per volta, usando @code{getline}
-(@pxref{Getline}). I @value{FNS} in input e le istruzioni @code{@@include}
-sono gestiti usando una pila. Man mano che viene trovata una @code{@@include},
-il valore corrente di @value{FN} @`e
-``spinto'' sulla pila e il file menzionato nella direttiva @code{@@include}
-diventa il @value{FN} corrente. Man mano che un file @`e finito,
-la pila viene ``disfatta'', e il precedente file in input diventa nuovamente il
-file in input corrente. Il processo viene iniziato ponendo il file originale
-come primo file sulla pila.
-
-La funzione @code{percorso()} trova qual @`e il percorso completo di un file.
-Simula il comportamento di @command{gawk} quando utilizza la variabile
-d'ambiente @env{AWKPATH}
-(@pxref{AWKPATH (Variabile)}).
-Se un @value{FN} contiene una @samp{/}, non viene effettuata la ricerca del
-percorso. Analogamente, se il
-@value{FN} @`e @code{"-"}, viene usato senza alcuna modifica. Altrimenti,
-il @value{FN} @`e concatenato col nome di ogni directory nella lista dei
-percorsi, e vien fatto un tentativo per aprire il @value{FN} cos@`{@dotless{i}} generato.
-Il solo modo di controllare se un file @`e leggibile da @command{awk} @`e di
-andare avanti e tentare di leggerlo con
-@code{getline}; questo @`e quel che
-@code{percorso()} fa.@footnote{In alcune versioni molto datate di
-@command{awk}, il test @samp{getline da_buttare < t} pu@`o ripetersi in un ciclo
-infinito se il file esiste ma @`e vuoto.}
-Se il file pu@`o essere letto, viene chiuso e viene restituito il valore di
-@value{FN}:
-
-@ignore
-An alternative way to test for the file's existence would be to call
-@samp{system("test -r " t)}, which uses the @command{test} utility to
-see if the file exists and is readable. The disadvantage to this method
-is that it requires creating an extra process and can thus be slightly
-slower.
-@end ignore
-
-@example
-@c file eg/prog/igawk.sh
-progr_che_espande='
-
-function percorso(file, i, t, da_buttare)
-@{
- if (index(file, "/") != 0)
- return file
-
- if (file == "-")
- return file
-
- for (i = 1; i <= n_dir; i++) @{
- t = (lista_percorsi[i] "/" file)
-@group
- if ((getline da_buttare < t) > 0) @{
- # found it
- close(t)
- return t
- @}
-@end group
- @}
- return ""
-@}
-@c endfile
-@end example
-
-Il programma principale @`e contenuto all'interno di una regola @code{BEGIN}.
-La prima cosa che fa @`e di impostare il vettore @code{lista_percorsi} usato
-dalla funzione @code{percorso()}. Dopo aver diviso la lista usando come
-delimitatore @samp{:}, gli elementi nulli sono sostituiti da @code{"."},
-che rappresenta la directory corrente:
-
-@example
-@c file eg/prog/igawk.sh
-BEGIN @{
- percorsi = ENVIRON["AWKPATH"]
- n_dir = split(percorsi, lista_percorsi, ":")
- for (i = 1; i <= n_dir; i++) @{
- if (lista_percorsi[i] == "")
- lista_percorsi[i] = "."
- @}
-@c endfile
-@end example
-
-La pila @`e inizializzata con @code{ARGV[1]}, che sar@`a @code{"/dev/stdin"}.
-Il ciclo principale viene subito dopo. Le righe in input sono lette una dopo
-l'altra. Righe che non iniziano con @code{@@include} sono stampate cos@`{@dotless{i}} come
-sono.
-Se la riga inizia con @code{@@include}, il @value{FN} @`e in @code{$2}.
-La funzione @code{percorso()} @`e chiamata per generare il percorso completo.
-Se questo non riesce, il programma stampa un messaggio di errore e continua.
-
-Subito dopo occorre controllare se il file sia gi@`a stato incluso. Il vettore
-@code{gia_fatto} @`e indicizzato dal nome completo di ogni @value{FN} incluso
-e tiene traccia per noi di questa informazione. Se un file viene visto pi@`u
-volte, viene stampato un messaggio di avvertimento. Altrimenti il nuovo
-@value{FN} @`e aggiunto alla pila e l'elaborazione continua.
-
-Infine, quando @code{getline} giunge alla fine del file in input, il file
-viene chiuso, e la pila viene elaborata. Quando @code{indice_pila} @`e minore
-di zero, il programma @`e terminato:
-
-@example
-@c file eg/prog/igawk.sh
- indice_pila = 0
- input[indice_pila] = ARGV[1] # ARGV[1] @`e il primo file
-
- for (; indice_pila >= 0; indice_pila--) @{
- while ((getline < input[indice_pila]) > 0) @{
- if (tolower($1) != "@@include") @{
- print
- continue
- @}
- cammino = percorso($2)
-@group
- if (cammino == "") @{
- printf("igawk: %s:%d: non riesco a trovare %s\n",
- input[indice_pila], FNR, $2) > "/dev/stderr"
- continue
- @}
-@end group
- if (! (cammino in gia_fatto)) @{
- gia_fatto[cammino] = input[indice_pila]
- input[++indice_pila] = cammino # aggiungilo alla pila
- @} else
- print $2, "incluso in", input[indice_pila],
- "era gi@`a incluso in",
- gia_fatto[cammino] > "/dev/stderr"
- @}
- close(input[indice_pila])
- @}
-@}' # l'apice chiude la variabile `progr_che_espande'
-
-programma_elaborato=$(gawk -- "$progr_che_espande" /dev/stdin << EOF
-$programma
-EOF
-)
-@c endfile
-@end example
-
-Il costrutto di shell @samp{@var{comando} << @var{marcatore}} @`e chiamato
-@dfn{here document} (@dfn{documento sul posto}). Ogni riga presente nello
-script di shell fino al @var{marcatore} @`e passato in input a @var{comando}.
-La shell elabora i contenuti dell'@dfn{here document} sostituendo, dove serve,
-variabili e comandi (ed eventualmente altre cose, a seconda della shell
-in uso).
-
-Il costrutto di shell @samp{$(@dots{})} @`e chiamato @dfn{sostituzione di comando}.
-L'output del comando posto all'interno delle parentesi @`e sostituito
-nella riga di comando.
-Poich@'e il risultato @`e usato in un assegnamento di variabile,
-viene salvato come un'unica stringa di caratteri, anche se il risultato
-contiene degli spazi bianchi.
-
-Il programma espanso @`e salvato nella variabile @code{programma_elaborato}.
-Il tutto avviene secondo le fasi seguenti:
-
-@enumerate
-@item
-Si esegue @command{gawk} con il programma che gestisce le @code{@@include}
-(il valore della variabile di shell
-@code{progr_che_espande}) leggendo lo standard input.
-
-@item
-Lo standard input contiene il programma dell'utente,
-nella variabile di shell @code{programma}.
-L'input @`e passato a @command{gawk} tramite un @dfn{here document}.
-
-@item
-I risultati di questo processo sono salvati nella variabile di shell
-@code{programma_elaborato} usando la sostituzione di comando.
-@end enumerate
-
-L'ultima fase @`e la chiamata a @command{gawk} con il programma espanso,
-insieme alle opzioni originali e agli argomenti della riga di comando che
-l'utente aveva fornito:
-
-@example
-@c file eg/prog/igawk.sh
-eval gawk $opts -- '"$programma_elaborato"' '"$@@"'
-@c endfile
-@end example
-
-Il comando @command{eval} @`e una struttura della shell che riesegue
-l'elaborazione dei parametri della riga di comando. Gli apici proteggono le
-parti restanti.
-
-Questa versione di @command{igawk} @`e la quinta versione di questo programma.
-Ci sono quattro semplificazioni migliorative:
-
-@itemize @value{BULLET}
-@item
-L'uso di @code{@@include} anche per i file specificati tramite l'opzione
-@option{-f} consente di semplificare di molto la preparazione del programma
-iniziale @command{awk}; tutta l'elaborazione delle istruzioni @code{@@include}
-pu@`o essere svolta in una sola volta.
-
-@item
-Non tentare di salvare la riga letta tramite @code{getline} all'interno della
-funzione @code{percorso()} quando si controlla se il file @`e accessibile
-per il successivo uso nel programma principale semplifica notevolmente
-le cose.
-
-@item
-Usare un ciclo di @code{getline} nella regola @code{BEGIN} rende possibile
-fare tutto in un solo posto. Non @`e necessario programmare un ulteriore ciclo
-per elaborare le istruzioni @code{@@include} nidificate.
-
-@item
-Invece di salvare il programma espanso in un file temporaneo, assegnarlo a
-una variabile di shell evita alcuni potenziali problemi di sicurezza.
-Ci@`o per@`o ha lo svantaggio di basare lo script su funzionalit@`a del
-linguaggio @command{sh}, il che rende pi@`u difficile la comprensione a chi non
-abbia familiarit@`a con il comando
-@command{sh}.
-@end itemize
-
-Inoltre, questo programma dimostra come spesso valga la pena di utilizzare
-insieme la programmazione della @command{sh} e quella di @command{awk}.
-Solitamente, si pu@`o fare parecchio senza dover ricorrere alla programmazione
-di basso livello in C o C++, ed @`e spesso pi@`u facile fare certi tipi di
-manipolazioni di stringhe e argomenti usando la shell, piuttosto che
-@command{awk}.
-
-Infine, @command{igawk} dimostra che non @`e sempre necessario aggiungere nuove
-funzionalit@`a a un programma; queste possono spesso essere aggiunte in
-cima.@footnote{@command{gawk}
-@`e in grado di elaborare istruzioni @code{@@include} al suo stesso interno, per
-permettere l'uso di programmi @command{awk} come script Web CGI.}
-
-
-@node Programma anagram
-@subsection Trovare anagrammi da una lista di parole
-
-@cindex anagrammi, trovare
-Un'interessante sfida per il programmatore @`e quella di cercare @dfn{anagrammi} in una
-lista di parole (come
-@file{/usr/share/dict/italian} presente in molti sistemi GNU/Linux).
-Una parola @`e un anagramma di un'altra se entrambe le parole contengono
-le stesse lettere
-(p.es., ``branzino'' e ``bronzina'').
-
-La Colonna 2, Problema C, della seconda edizione del libro di Jon Bentley
-@cite{Programming Pearls}, presenta un algoritmo elegante.
-L'idea @`e di assegnare a parole che sono anagrammi l'una dell'altra una
-firma comune, e poi di ordinare tutte le parole in base alla loro
-firma e di stamparle.
-Il Dr.@: Bentley fa notare che prendere tutte le lettere di ogni parola ed
-elencarle in ordine alfabetico produce queste firme comuni.
-
-Il programma seguente usa vettori di vettori per riunire
-parole con la stessa firma, e l'ordinamento di vettori per stampare le
-parole trovate in ordine alfabetico:
-
-@cindex @code{anagram.awk}, programma
-@cindex programma @code{anagram.awk}
-@example
-@c file eg/prog/anagram.awk
-# anagram.awk --- Un'implementazione dell'algoritmo per trovare anagrammi
-# dalla seconda edizione
-# del libro di Jon Bentley "Programming Pearls".
-# Addison Wesley, 2000, ISBN 0-201-65788-0.
-# Colonna 2, Problema C, sezione 2.8, pp 18-20.
-@c endfile
-@ignore
-@c file eg/prog/anagram.awk
-#
-# Questo programma richiede gawk 4.0 o una versione successiva.
-# Funzionalit@`a di gawk richieste:
-# - veri vettori multidimensionali
-# - split() con separatore "" per separare ogni singolo carattere
-# - le funzioni asort() e asorti()
-#
-# Vedere http://savannah.gnu.org/projects/gawk.
-#
-# Arnold Robbins
-# arnold@@skeeve.com
-# Public Domain
-# January, 2011
-@c endfile
-@end ignore
-@c file eg/prog/anagram.awk
-
-/'s$/ @{ next @} # Salta i genitivi sassoni
-@c endfile
-@end example
-
-Il programma inizia con un'intestazione, e poi una regola per saltare
-i genitivi sassoni eventualmente contenuti nel file che contiene la lista di
-parole. La regola
-successiva costruisce la struttura dei dati. Il primo indice del vettore
-@`e rappresentato dalla firma; il secondo @`e la parola stessa:
-
-@example
-@c file eg/prog/anagram.awk
-@{
- chiave = da_parola_a_chiave($1) # costruisce la firma
- data[chiave][$1] = $1 # Immagazzina parola con questa firma
-@}
-@c endfile
-@end example
-
-La funzione @code{da_parola_a_chiave()} crea la firma.
-Divide la parola in lettere singole, mette in ordine alfabetico le lettere,
-e poi le rimette ancora insieme:
-
-@example
-@c file eg/prog/anagram.awk
-# da_parola_a_chiave --- divide parole in lettere, ordina e riunisce
-
-function da_parola_a_chiave(parola, a, i, n, risultato)
-@{
- n = split(parola, a, "")
- asort(a)
-
- for (i = 1; i <= n; i++)
- risultato = risultato a[i]
-
- return risultato
-@}
-@c endfile
-@end example
-
-Infine, la regola @code{END} percorre tutto il vettore e stampa
-le liste degli anagrammi. L'output @`e poi passato al
-comando di sistema @command{sort} perch@'e altrimenti gli
-anagrammi sarebbero elencati in ordine arbitrario:
-
-@example
-@c file eg/prog/anagram.awk
-END @{
- sort = "sort"
- for (chiave in data) @{
- # ordina parole con la stessa chiave
- n_parole = asorti(data[chiave], parole)
- if (n_parole == 1)
- continue
-
- # e stampa. Problema minore: uno spazio extra a fine di ogni riga
- for (j = 1; j <= n_parole; j++)
- printf("%s ", parole[j]) | sort
- print "" | sort
- @}
- close(sort)
-@}
-@c endfile
-@end example
-
-Ecco una piccola parte dell'output quando il programma @`e eseguito:
-
-@example
-$ @kbd{gawk -f anagram.awk /usr/share/dict/italian | grep '^b'}
-@dots{}
-baraste bastare serbata
-barasti basarti
-baratro tabarro
-barattoli ribaltato tribolata
-barbieri birberia
-barche brache
-barcollerei corbelleria
-bare erba
-bareremmo brameremo
-barili librai
-@dots{}
-@end example
-
-
-@node Programma signature
-@subsection E ora per qualcosa di completamente differente
-
-@cindex @code{signature}, programma
-@cindex programma @code{signature}
-@cindex Brini, Davide
-Il programma seguente @`e stato scritto da Davide Brini
-@c (@email{dave_br@@gmx.com})
-ed @`e pubblicato sul @uref{http://backreference.org/2011/02/03/obfuscated-awk/,
-suo sito web}.
-Serve come sua firma nel gruppo Usenet @code{comp.lang.awk}.
-Questi sono i termini da lui stabiliti per il copyright:
-
-@quotation
-Copyright @copyright{} 2008 Davide Brini
-
-Copying and distribution of the code published in this page, with or without
-modification, are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.
-@end quotation
-
-Ecco il programma:
-
-@example
-awk 'BEGIN@{O="~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c";
-printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O,
-X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O,
-O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),x-O@}'
-@end example
-@c genera l'email del tizio:
-@c dave_br@gmx.com
-
-@cindex Johansen, Chris
-Viene lasciato al lettore il piacere di stabilire cosa fa il programma.
-(Se si @`e sull'orlo della disperazione nel tentativo di comprensione, si veda
-la spiegazione di Chris Johansen,
-che @`e contenuta nel file sorgente Texinfo di questo @value{DOCUMENT}.)
-
-@ignore
-To: "Arnold Robbins" <arnold@skeeve.com>
-Date: Sat, 20 Aug 2011 13:50:46 -0400
-Subject: The GNU Awk User's Guide, Section 13.3.11
-From: "Chris Johansen" <johansen@main.nc.us>
-Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan>
-
-Arnold, tu non mi conosci, ma c'@`e un sottile legame tra noi. Mia moglie @`e
-Barbara A. Field, FAIA, GIT '65 (B. Arch.).
-
-Ho un paio di copie cartacee di "Effective Awk Programming" da
-anni, ed ora sto leggendo di nuovo la versione Kindle di "The GNU Awk User's
-Guide". Quando sono arrivato alla sezione 13.3.11, ho riformattato e
-brevemente commentato lo script di firma di Davide Brin per comprenderne il funzionamento.
-
-Mi pare che questo possa avere un valore pedagogico come esempio
-(sia pure imperfetto) del significato di spazi bianchi e commenti, e un
-punto di partenza per una tale discussione. Sicuramente ha aiutato _me_ a
-capire quel che succede. Se vuoi
-usarlo, com'@`e o modificato, sentiti libero di farlo (a condizione di
-rispettare i vincoli posti da Davide, naturalmente, che credo siano stati
-da me rispettati).
-
-Se dovessi includere questa spiegazione in una futura edizione, la inserirei
-a una certa distanza dalla sezione 13.3.11, diciamo come una nota o come
-un'appendice, in modo da non rivelare immediatamente la soluzione dell'enigma.
-
-Cordiali saluti,
---
-Chris Johansen {johansen at main dot nc dot us}
- . . . collapsing the probability wave function, sending ripples of
-certainty through the space-time continuum.
-
-
-#! /usr/bin/gawk -f
-
-# Da "13.3.11 E ora per qualcosa di completamente differente"
-# http://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program
-
-# Copyright © 2008 Davide Brini
-
-# Copying and distribution of the code published in this page, with
-# or without modification, are permitted in any medium without
-# royalty provided the copyright notice and this notice are preserved.
-
-BEGIN {
- O = "~" ~ "~"; # 1
- o = "==" == "=="; # 1
- o += +o; # 2
- x = O "" O; # 11
-
-
- while ( X++ <= x + o + o ) c = c "%c";
-
- # O vale 1
- # o vale 2
- # x vale 11
- # X vale 17
- # c vale "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
-
- printf c,
- ( x - O )*( x - O), # 100 d
- x*( x - o ) - o, # 97 a
- x*( x - O ) + x - O - o, # 118 v
- +x*( x - O ) - x + o, # 101 e
- X*( o*o + O ) + x - O, # 95 _
- X*( X - x ) - o*o, # 98 b
- ( x + X )*o*o + o, # 114 r
- x*( X - x ) - O - O, # 64 @
- x - O + ( O + o + X + x )*( o + O ), # 103 g
- X*X - X*( x - O ) - x + O, # 109 m
- O + X*( o*( o + O ) + O ), # 120 x
- +x + O + X*o, # 46 .
- x*( x - o), # 99 c
- ( o + X + x )*o*o - ( x - O - O ), # 111 0
- O + ( X - x )*( X + O ), # 109 m
- x - O # 10 \n
-}
-@end ignore
-
-@node Sommario dei programmi
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-I programmi illustrati in questo @value{CHAPTER}
-ripropongo la tesi secondo cui leggere programmi @`e una maniera eccellente
-per imparare a fare della buona programmazione.
-
-@item
-Usare @samp{#!} per rendere i programmi @command{awk} direttamente eseguibili
-ne rende pi@`u semplice l'uso. In alternativa, si pu@`o invocare un
-programma usando @samp{awk -f @dots{}}.
-
-@item
-Reimplementare programmi POSIX standard in @command{awk} @`e un esercizio
-piacevole; il potere espressivo di @command{awk} consente di scrivere tali
-programmi usando relativamente poche righe di codice, nonostante i programmi
-risultanti siano funzionalmente completi e utilizzabili.
-
-@item
-Una delle debolezze della versione standard di @command{awk} riguarda il
-lavorare con singoli caratteri. La possibilit@`a di usare @code{split()} con
-la stringa nulla come separatore pu@`o semplificare considerevolmente tale
-compito.
-
-@item
-Gli esempi proposti dimostrano l'utilit@`a delle funzioni di libreria introdotte
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}
-per un numero (sia pur piccolo) di programmi reali.
-
-@item
-Oltre a reinventare la ruota POSIX, altri programmi risolvono una serie di
-problemi interessanti, come trovare delle parole duplicate in un testo,
-stampare etichette per lettere, e trovare anagrammi.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi sui programmi
-@section Esercizi
-
-@enumerate
-@item
-Riscrivere @file{cut.awk} (@pxref{Programma cut})
-usando @code{split()} con @code{""} come separatore.
-
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Programma egrep}, @`e detto che @samp{egrep -i} potrebbe essere
-simulato in versioni di @command{awk} che non prevedono @code{IGNORECASE}
-usando @code{tolower()} sulla riga e nei criteri di ricerca. In una nota a
-pi@`e di pagina @`e anche detto che questa soluzione ha un problema: in output
-viene scritta la riga tradotta (a lettere minuscole), e non quella originale.
-Risolvere questo problema.
-@c Exercise: Fix this, w/array and new line as key to original line
-
-@item
-La versione POSIX di @command{id} accetta opzioni che controllano quali
-informazioni stampare. Modificare la versione @command{awk}
-(@pxref{Programma id}) per accettare gli stessi argomenti e funzionare allo
-stesso modo.
-
-@item
-Il programma @code{split.awk} (@pxref{Programma split}) presuppone che le
-lettere siano contigue nella codifica dei caratteri,
-il che non @`e vero per sistemi che usano la codifica EBCDIC.
-Risolvere questo problema.
-(Suggerimento: Considerare un modo diverso di analizzare l'alfabeto,
-senza appoggiarsi sulle funzioni @code{ord()} e @code{chr()}.)
-
-@item
-Nel programma @file{uniq.awk} (@pxref{Programma uniq}, la
-logica per scegliere quali righe stampare rappresenta una
-@dfn{macchina a stati},
-ossia ``un dispositivo che pu@`o essere in uno di un insieme di stati
-stabili, a seconda dello stato in cui si trovava in precedenza, e del
-valore corrente dei suoi
-input.''@footnote{Questo @`e la definizione trovata usando
-@code{define: state machine} come chiave di ricerca in Google.}
-Brian Kernighan suggerisce che
-``un approccio alternativo alle macchine a stati @`e di leggere tutto l'input
-e metterlo in un vettore, e quindi usare gli indici. @`E quasi sempre pi@`u
-semplice da programmare, e per la maggior parte degli input in cui si pu@`o
-usare, altrettanto veloce in esecuzione.'' Riscrivere la logica del
-programma seguendo questa indicazione.
-
-
-@item
-Perch@'e il programma @file{wc.awk} (@pxref{Programma wc}) non pu@`o
-limitarsi a usare il valore di @code{FNR} nella funziona @code{a_fine_file()}?
-Suggerimento: Esaminare il codice
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzione filetrans}.
-
-@ignore
-@command{wc} can't just use the value of @code{FNR} in
-@code{endfile()}. If you examine the code in @ref{Filetrans Function},
-you will see that @code{FNR} has already been reset by the time
-@code{endfile()} is called.
-@end ignore
-
-@item
-La manipolazione di singoli caratteri nel programma @command{translate}
-(@pxref{Programma translate}) @`e farraginosa usando le funzione standard
-@command{awk}. Poich@'e @command{gawk} pu@`o dividere stringhe in caratteri
-singoli usando come separatore @code{""}, come si potrebbe usare questa
-funzionalit@`a per semplificare il programma?
-
-@item
-Il programma @file{extract.awk} (@pxref{Programma extract}) @`e stato
-scritto prima che @command{gawk} avesse a disposizione la funzione
-@code{gensub()}. Usarla per semplificare il codice.
-
-@item
-Si confronti la velocit@`a di esecuzione del programma @file{awksed.awk}
-(@pxref{Programma sed semplice}) con il pi@`u diretto:
-
-@example
-BEGIN @{
- stringa = ARGV[1]
- rimpiazzo = ARGV[2]
- ARGV[1] = ARGV[2] = ""
-@}
-
-@{ gsub(stringa, rimpiazzo); print @}
-@end example
-
-@item
-Quali sono vantaggi e svantaggi di @file{awksed.awk} rispetto al vero
-programma di utilit@`a @command{sed}?
-
-@ignore
- Advantage: egrep regexps
- speed (?)
- Disadvantage: no & in replacement text
-
-Others?
-@end ignore
-
-@item
-@iftex
-Nella
-@end iftex
-@ifnottex
-In
-@end ifnottex
-@ref{Programma igawk}, si @`e detto che non tentando di salvare la riga
-letta con @code{getline} nella funzione @code{percorso()}, mentre si
-controlla l'accessibilit@`a del file da usare nel programma principale,
-semplifica notevolmente le cose. Quale problema @`e peraltro generato cos@`{@dotless{i}}
-facendo?
-@c answer, reading from "-" o /dev/stdin
-
-@cindex percorso di ricerca per file sorgente
-@cindex ricerca, percorso di, per file sorgente
-@cindex file sorgente, percorso di ricerca per
-@cindex directory, ricerca
-@item
-Come ulteriore esempio dell'idea che non sempre @`e necessario aggiungere
-nuove funzionalit@`a a un programma, si consideri l'idea di avere due file in
-una directory presente nel percorso di ricerca:
-
-@table @file
-@item default.awk
-Questo file contiene un insieme di funzioni di libreria di default, come
-@code{getopt()} e @code{assert()}.
-
-@item sito.awk
-Questo file contiene funzioni di libreria che sono specifiche di
-un sito o di un'installazione; cio@`e, funzioni sviluppate localmente.
-Mantenere due file separati consente a @file{default.awk} di essere
-modificato in seguito a nuove versioni di @command{gawk}, senza che
-l'amministratore di sistema debba ogni volta aggiornarlo aggiungendo le
-funzioni locali.
-@end table
-
-Un utente
-@c Karl Berry, karl@ileaf.com, 10/95
-ha suggerito che @command{gawk} venga modificato per leggere automaticamente
-questi file alla partenza. Piuttosto, sarebbe molto semplice
-modificare @command{igawk} per farlo. Poich@'e @command{igawk} @`e capace di
-elaborare direttive @code{@@include}
-nidificate, @file{default.awk} potrebbe contenere semplicemente la lista di
-direttive @code{@@include} con le funzioni di libreria desiderate.
-Fare questa modifica.
-
-@item
-Modificare @file{anagram.awk} (@pxref{Programma anagram}), per evitare di
-usare il programma di utilit@`a esterno @command{sort}.
-
-@end enumerate
-@c EXCLUDE END
-
-@ifnotinfo
-@part @value{PART3}Andare oltre @command{awk} con @command{gawk}
-@end ifnotinfo
-
-@ifdocbook
-La Parte III riguarda funzionalit@`a proprie di @command{gawk}.
-Contiene i seguenti capitoli:
-
-@itemize @value{BULLET}
-@item
-@ref{Funzionalit@`a avanzate}
-
-@item
-@ref{Internazionalizzazione}
-
-@item
-@ref{Debugger}
-
-@item
-@ref{Calcolo con precisione arbitraria}
-
-@item
-@ref{Estensioni dinamiche}
-@end itemize
-@end ifdocbook
-
-@node Funzionalit@`a avanzate
-@chapter Funzionalit@`a avanzate di @command{gawk}
-@cindex @command{gawk}, funzionalit@`a avanzate
-@cindex avanzate, funzionalit@`a, di @command{gawk}
-@ignore
-Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com>
-
- Found in Steve English's "signature" line:
-
-"Write documentation as if whoever reads it is a violent psychopath
-who knows where you live."
-@end ignore
-@cindex Langston, Peter
-@cindex English, Steve
-@quotation
-@i{Scrivete la documentazione supponendo che chiunque la legger@`a sia uno psicopatico
-violento, che conosce il vostro indirizzo di casa.}
-@author Steve English, citato da Peter Langston
-@end quotation
-
-Questo @value{CHAPTER} tratta delle funzionalit@`a avanzate in @command{gawk}.
-@`E un po' come un ``pacco sorpresa'' di argomenti che non sono collegati tra di
-loro in altro modo.
-Per prima cosa, vediamo un'opzione da riga di comando che consente a
-@command{gawk} di riconoscere i numeri non-decimali nei dati in input, e non
-soltanto nei programmi @command{awk}.
-Poi vengono illustrate delle funzionalit@`a speciali di @command{gawk} per
-l'ordinamento di vettori. Quindi viene trattato dettagliatamente l'I/O
-bidirezionale, di cui si @`e fatto cenno in precedenti parti di questo
-@value{DOCUMENT}, assieme ai fondamenti sulle reti TCP/IP.
-Infine, vediamo come @command{gawk}
-pu@`o tracciare il @dfn{profilo} di un programma @command{awk}, cos@`{@dotless{i}} che si
-possa ritoccarlo per migliorarne le prestazioni.
-
-@c FULLXREF ON
-Altre funzionalit@`a avanzate vengono trattate separatamente dedicando un
-@value{CHAPTER} per ciascuna di esse:
-
-@itemize @value{BULLET}
-@item
-@iftex
-Il
-@end iftex
-@ref{Internazionalizzazione}, parla di come internazionalizzare
-i propri programmi @command{awk}, in modo che parlino pi@`u lingue
-nazionali.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Debugger}, descrive il debugger dalla riga di comando disponibile
-all'interno di
-@command{gawk} per individuare errori nei programmi @command{awk}.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Calcolo con precisione arbitraria}, illustra come si pu@`o usare
-@command{gawk} per eseguire calcoli con precisione arbitraria.
-
-@item
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche},
-tratta della capacit@`a di aggiungere dinamicamente nuove funzioni predefinite a
-@command{gawk}.
-@end itemize
-@c FULLXREF OFF
-
-@menu
-* Dati non decimali:: Consentire dati di input non decimali.
-* Ordinamento di vettori:: Modi per controllare la visita di un vettore
- e il suo ordinamento.
-* I/O bidirezionale:: Comunicazione bidirezionale con un altro
- processo.
-* Reti TCP/IP:: Usare @command{gawk} per programmazione di rete.
-* Profilare:: Profilare i propri programmi @command{awk}.
-* Sommario funzionalit@`a avanzate:: Sommario delle funzionalit@`a avanzate.
-@end menu
-
-@node Dati non decimali
-@section Consentire dati di input non decimali
-@cindex opzione @option{--non-decimal-data}
-@c @cindex funzionalit@`a avanzate, dati di input non decimali
-@cindex input, dati non decimali
-@cindex costanti, non decimali
-
-Se si esegue @command{gawk} con l'opzione @option{--non-decimal-data},
-si possono avere valori in base diversa da dieci nei dati di input:
-
-@example
-$ @kbd{echo 0123 123 0x123 |}
-> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n", $1, $2, $3 @}'}
-@print{} 83, 123, 291
-@end example
-
-Affinch@'e questa funzionalit@`a sia disponibile, i programmi devono essere
-scritti in modo che @command{gawk} tratti i dati come valori numerici:
-
-@example
-$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'}
-@print{} 0123 123 0x123
-@end example
-
-@noindent
-L'istruzione @code{print} tratta le sue espressioni come se fossero stringhe.
-Sebbene i campi possano comportarsi come numeri, quando necessario,
-essi rimangono sempre stringhe, per cui @code{print} non cerca di elaborarli
-come se fossero numeri. Si deve aggiungere zero a un campo affich@'e venga
-considerato come un numero. Per esempio:
-
-@example
-$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '}
-> @kbd{@{ print $1, $2, $3}
-> @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'}
-@print{} 0123 123 0x123
-@print{} 83 123 291
-@end example
-
-Poich@'e capita comunemente di avere dati di tipo decimale con degli zeri iniziali,
-e poich@'e l'uso di questa funzionalit@`a pu@`o portare a risultati inattesi, il
-comportamento di default @`e quello lasciarla disabilitata. Se si vuole, la si
-deve richiedere esplicitamente.
-
-@cindex programmazione, convenzioni di, opzione @code{--non-decimal-data}
-@cindex @option{--non-decimal-data}, opzione, funzione @code{strtonum()} e
-@cindex @code{strtonum()}, funzione (@command{gawk}), opzione @code{--non-decimal-data} e
-@quotation ATTENZIONE
-@emph{L'uso di questa opzione non @`e consigliata.}
-Pu@`o provocare errori molto seri eseguendo vecchi programmi.
-Al suo posto @`e meglio usare la funzione @code{strtonum()} per convertire i dati
-(@pxref{Funzioni per stringhe}).
-Questo rende i programmi pi@`u facili da scrivere e pi@`u facili da leggere, e
-porta a risultati meno inattesi.
-
-Quest'opzione potrebbe sparire dalle versioni future di @command{gawk}.
-@end quotation
-
-@node Ordinamento di vettori
-@section Controllare la visita di un vettore e il suo ordinamento
-
-@command{gawk} permette di controllare l'ordine con cui un ciclo
-@samp{for (@var{indice} in @var{vettore})}
-attraversa un vettore.
-
-Inoltre, due funzioni predefinite, @code{asort()} e @code{asorti()},
-permettono di mettere in ordine i vettori sulla base, rispettivamente, dei
-valori e degli indici del vettore. Queste due funzioni danno anche il
-controllo sui criteri in base ai quali riordinare gli elementi del vettore.
-
-@menu
-* Controllare visita vettori:: Come usare PROCINFO["sorted_in"].
-* Funzioni di ordinamento di vettori:: Come usare @code{asort()} e @code{asorti()}.
-@end menu
-
-@node Controllare visita vettori
-@subsection Controllare visita vettori
-
-Per default, l'ordine secondo il quale un ciclo @samp{for (@var{indice} in
-@var{vettore})} scorre un vettore non @`e definito; in genere si basa
-sull'implementazione interna dei vettori all'interno di @command{awk}.
-
-Spesso, tuttavia, si vorrebbe poter eseguire un ciclo sugli elementi in un
-determinato ordine scelto dall'utente programmatore. Con @command{gawk}
-si pu@`o fare.
-
-@iftex
-La
-@end iftex
-@ref{Controllare visita} parla di come si possono assegnare valori speciali
-predefiniti a @code{PROCINFO["sorted_in"]} per controllare l'ordine secondo il
-quale @command{gawk} attraversa un vettore
-durante un ciclo @code{for}.
-
-Inoltre, il valore di @code{PROCINFO["sorted_in"]} pu@`o essere un nome di
-funzione.@footnote{Questo @`e il motivo per cui gli ordinamenti predefiniti
-iniziano con il carattere @samp{@@}, che non pu@`o essere usato in un
-identificatore.}
-Questo consente di scorrere un vettore sulla base di un qualsiasi criterio
-personalizzato. Gli elementi del vettore vengono ordinati in accordo col valore
-ritornato da questa funzione. La funzione che fa il confronto dovrebbe essere
-definita con almeno quattro argomenti:
-
-@example
-function confronta(i1, v1, i2, v2)
-@{
- @var{confronta gli elementi 1 e 2 in qualche modo}
- @var{return < 0; 0; o > 0}
-@}
-@end example
-
-Qui, @code{i1} e @code{i2} sono gli indici, e @code{v1} e @code{v2}
-sono i corrispondenti valori dei due elementi che si stanno confrontando.
-@code{v1} oppure @code{v2}, o entrambi, possono essere vettori se il vettore
-che si sta visitando contiene sottovettori come valori.
-(@xref{Vettori di vettori} per maggiori informazioni sui sottovettori.)
-I tre possibili valori di ritorno sono interpretati nel seguente modo:
-
-@table @code
-@item confronta(i1, v1, i2, v2) < 0
-L'indice @code{i1} viene prima dell'indice @code{i2} durante l'avanzamento
-del ciclo.
-
-@item confronta(i1, v1, i2, v2) == 0
-Gli indici @code{i1} e @code{i2}
-sono equivalenti, ma l'ordine tra loro non @`e definito.
-
-@item confronta(i1, v1, i2, v2) > 0
-L'indice @code{i1} viene dopo l'indice @code{i2} durante l'avanzamento del
-ciclo.
-@end table
-
-La prima funzione di confronto pu@`o essere usata per scorrere un vettore
-secondo l'ordine numerico degli indici:
-
-@example
-function cfr_ind_num(i1, v1, i2, v2)
-@{
- # confronto di indici numerici, ordine crescente
- return (i1 - i2)
-@}
-@end example
-
-La seconda funzione scorre un vettore secondo l'ordine delle stringhe
-dei valori degli elementi piuttosto che secondo gli indici:
-
-@example
-function cfr_val_str(i1, v1, i2, v2)
-@{
- # confronto di valori di stringa, ordine crescente
- v1 = v1 ""
- v2 = v2 ""
- if (v1 < v2)
- return -1
- return (v1 != v2)
-@}
-@end example
-
-La terza funzione di confronto restituisce dapprima tutti i numeri, e dopo
-questi le stringhe numeriche senza spazi iniziali o finali, durante
-l'avanzamento del ciclo:
-
-@example
-function cfr_val_num_str(i1, v1, i2, v2, n1, n2)
-@{
- # confronto mettendo i numeri prima dei valori di stringa,
- # ordine crescente
- n1 = v1 + 0
- n2 = v2 + 0
- if (n1 == v1)
- return (n2 == v2) ? (n1 - n2) : -1
- else if (n2 == v2)
- return 1
- return (v1 < v2) ? -1 : (v1 != v2)
-@}
-@end example
-
-Qui vediamo un programma principale che mostra come @command{gawk}
-si comporta usando ciascuna delle funzioni precedenti:
-
-@example
-BEGIN @{
- data["uno"] = 10
- data["due"] = 20
- data[10] = "uno"
- data[100] = 100
- data[20] = "due"
-
- f[1] = "cfr_ind_num"
- f[2] = "cfr_val_str"
- f[3] = "cfr_val_num_str"
- for (i = 1; i <= 3; i++) @{
- printf("Funzione di ordinamento: %s\n", f[i])
- PROCINFO["sorted_in"] = f[i]
- for (j in data)
- printf("\tdata[%s] = %s\n", j, data[j])
- print ""
- @}
-@}
-@end example
-
-I risultati dell'esecuzione del programma sono questi:
-
-@example
-$ @kbd{gawk -f compdemo.awk}
-@print{} Funzione di ordinamento: cfr_ind_num @ii{Ordinamento per indice numerico}
-@print{} data[uno] = 10
-@print{} data[due] = 20 @ii{Entrambe le stringhe sono numericamente zero}
-@print{} data[10] = uno
-@print{} data[20] = due
-@print{} data[100] = 100
-@print{}
-@print{} Funzione di ordinamento: cfr_val_str @ii{Ordinamento per valore degli}
-@print{} @ii{elementi come stringhe}
-@print{} data[uno] = 10
-@print{} data[100] = 100 @ii{La stringa 100 @`e minore della stringa 20}
-@print{} data[due] = 20
-@print{} data[20] = due
-@print{} data[10] = uno
-@print{}
-@print{} Funzione di ordinamento: cfr_val_num_str @ii{Ordinamento con tutti i}
-@print{} @ii{valori numerici prima di tutte le stringhe}
-@print{} data[uno] = 10
-@print{} data[due] = 20
-@print{} data[100] = 100
-@print{} data[20] = due
-@print{} data[10] = uno
-@end example
-
-Si provi a ordinare gli elementi di un file delle password del sistema GNU/Linux
-in base al nome d'accesso dell'utente. Il seguente programma ordina i record
-secondo una specifica posizione del campo e pu@`o essere usato per questo scopo:
-
-@example
-# passwd-sort.awk --- semplice programma per ordinare in base alla
-# posizione del campo
-# la posizione del campo @`e specificata dalla variabile globale POS
-
-function per_campo(i1, v1, i2, v2)
-@{
- # confronto per valore, come stringa, e in ordine crescente
- return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS])
-@}
-
-@{
- for (i = 1; i <= NF; i++)
- a[NR][i] = $i
-@}
-
-END @{
- PROCINFO["sorted_in"] = "per_campo"
- if (POS < 1 || POS > NF)
- POS = 1
- for (i in a) @{
- for (j = 1; j <= NF; j++)
- printf("%s%c", a[i][j], j < NF ? ":" : "")
- print ""
- @}
-@}
-@end example
-
-Il primo campo di ogni elemento del file delle password @`e il nome d'accesso
-dell'utente, e i campi sono separati tra loro da due punti.
-Ogni record definisce un sottovettore,
-con ogni campo come elemento nel sottovettore.
-L'esecuzione del programma produce
-il seguente output:
-
-@example
-$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd}
-@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin
-@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin
-@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin
-@dots{}
-@end example
-
-Il confronto normalmente dovrebbe restituire sempre lo stesso valore quando
-vien dato come argomento un preciso paio di elementi del vettore. Se viene
-restituito un risultato non coerente, l'ordine @`e indefinito. Questo
-comportamento pu@`o essere sfruttato per introdurre un ordinamento casuale in
-dati apparentemente ordinati:
-
-@example
-function ordina_a_caso(i1, v1, i2, v2)
-@{
- # ordine casuale (attenzione: potrebbe non finire mai!)
- return (2 - 4 * rand())
-@}
-@end example
-
-Come gi@`a accennato, l'ordine degli indici @`e arbitrario se due elementi
-risultano uguali. Normalmente questo non @`e un problema, ma lasciare che
-elementi di uguale valore compaiano in ordine arbitrario pu@`o essere un
-problema, specialmente quando si confrontano valori di elementi di un elenco.
-L'ordine parziale di elementi uguali pu@`o cambiare quando il vettore viene
-visitato di nuovo, se nel vettore vengono aggiunti o rimossi elementi. Un modo
-per superare l'ostacolo quando si confrontano elementi con valori uguali @`e
-quello di includere gli indici nelle regole di confronto. Si noti che questo
-potrebbe rendere meno efficiente l'attraversamento del ciclo, per cui si
-consiglia di farlo solo se necessario. Le seguenti funzioni di confronto
-impongono un ordine deterministico, e si basano sul fatto che gli indici
-(di stringa) di due elementi non sono mai uguali:
-@example
-function per_numero(i1, v1, i2, v2)
-@{
- # confronto di valori numerici (e indici), ordine decrescente
- return (v1 != v2) ? (v2 - v1) : (i2 - i1)
-@}
-
-function per_stringa(i1, v1, i2, v2)
-@{
- # confronto di valori di stringa (e indici), ordine decrescente
- v1 = v1 i1
- v2 = v2 i2
- return (v1 > v2) ? -1 : (v1 != v2)
-@}
-@end example
-
-@c Avoid using the term ``stable'' when describing the unpredictable behavior
-@c if two items compare equal. Usually, the goal of a "stable algorithm"
-@c is to maintain the original order of the items, which is a meaningless
-@c concept for a list constructed from a hash.
-
-Una funzione di confronto personalizzata spesso pu@`o semplificare
-l'attraversamento del
-ciclo ordinato, e il solo limite @`e il cielo, quando si va a progettare
-una funzione di questo tipo.
-
-Quando i confronti tra stringhe son fatti durante un'operazione di ordinamento,
-per valori di elementi che, uno o entrambi, non sono numeri, o per
-indici di elementi gestiti come stringhe, il valore di @code{IGNORECASE}
-(@pxref{Variabili predefinite}) controlla se
-i confronti trattano corrispondenti lettere maiuscole e minuscole
-come equivalenti o come distinte.
-
-Un'altra cosa da tenere a mente @`e che nel caso di sottovettori, i valori degli
-elementi possono essere a loro volta dei vettori; una funzione di confronto in
-produzione dovrebbe usare la funzione @code{isarray()}
-(@pxref{Funzioni per i tipi})
-per controllare ci@`o, e scegliere un ordinamento preciso per i sottovettori.
-
-Tutti gli ordinamenti basati su @code{PROCINFO["sorted_in"]}
-sono disabilitati in modalit@`a POSIX,
-perch@'e il vettore @code{PROCINFO} in questo caso non @`e speciale.
-
-Come nota a margine, si @`e visto che ordinare gli indici del vettore prima di
-scorrere il vettore porta a un incremento variabile dal 15% al 20% del tempo di
-esecuzione dei programmi @command{awk}. Per questo motivo l'attraversamento
-ordinato di vettori non @`e il default.
-
-@c The @command{gawk}
-@c maintainers believe that only the people who wish to use a
-@c feature should have to pay for it.
-
-@node Funzioni di ordinamento di vettori
-@subsection Ordinare valori e indici di un vettore con @command{gawk}
-
-@cindex vettori, ordinamento dei
-@cindexgawkfunc{asort}
-@cindex @code{asort()}, funzione (@command{gawk}), ordinamento di vettori
-@cindex funzione @code{asort()} (@command{gawk}), ordinamento di vettori
-@cindexgawkfunc{asorti}
-@cindex @code{asorti()}, funzione (@command{gawk}), ordinamento di vettori
-@cindex funzione @code{asorti()} (@command{gawk}), ordinamento di vettori
-@cindex @code{sort()}, funzione, ordinamento di vettori
-@cindex funzione @code{sort()}, ordinamento di vettori
-Nella maggior parte delle implementazioni di @command{awk}, ordinare un vettore
-richiede una funzione @code{sort()}. Questo pu@`o essere istruttivo per provare
-diversi algoritmi di ordinamento, ma normalmente non @`e questo lo scopo del
-programma. In @command{gawk} ci sono le funzioni predefinite @code{asort()} e
-@code{asorti()} (@pxref{Funzioni per stringhe}) per i vettori ordinati.
-Per esempio:
-
-@example
-@var{riempire il vettore} dati
-n = asort(dati)
-for (i = 1; i <= n; i++)
- @var{fare qualcosa con} dati[i]
-@end example
-
-Dopo la chiamata ad @code{asort()}, il vettore @code{dati} @`e indicizzato da 1
-a @var{n}, il numero totale di elementi in @code{dati}.
-(Questo conteggio @`e il valore di ritorno di @code{asort()}).
-@code{dati[1]} @value{LEQ} @code{dati[2]} @value{LEQ} @code{dati[3]}, e cos@`{@dotless{i}}
-via. Il confronto di default @`e basato sul tipo di elementi
-(@pxref{Tipi di variabile e confronti}).
-Tutti i valori numerici vengono prima dei valori di stringa,
-che a loro volta vengono prima di tutti i sottovettori.
-
-@cindex effetti collaterali, funzione @code{asort()}
-@cindex funzione @code{asort()}, effetti collaterali
-Un effetto collaterale rilevante nel chiamare @code{asort()} @`e che
-@emph{gli indici originali del vettore vengono persi irreparabilmente}.
-Poich@'e questo non sempre @`e opportuno, @code{asort()} accetta un
-secondo argomento:
-
-@example
-@var{populate the array} orig
-n = asort(orig, dest)
-for (i = 1; i <= n; i++)
- @var{fai qualcosaa con} dest[i]
-@end example
-
-In questo caso, @command{gawk} copia il vettore @code{orig} nel vettore
-@code{dest} e ordina @code{dest}, distruggendo i suoi indici.
-Tuttavia il vettore @code{orig} non viene modificato.
-
-Spesso, ci@`o di cui si ha bisogno @`e di ordinare per i valori degli
-@emph{indici} invece che per i valori degli elementi. Per far questo si usa la
-funzione @code{asorti()}. L'interfaccia e il comportamento sono identici a
-quelli di @code{asort()}, solo che per l'ordinamento vengono usati i valori
-degli indici, che diventano i valori del vettore risultato:
-
-@example
-@{ orig[$0] = una_funz($0) @}
-
-END @{
- n = asorti(orig, dest)
- for (i = 1; i <= n; i++) @{
- @ii{Lavora direttamente con gli indici ordinati:}
- @var{fa qualcosa con} dest[i]
- @dots{}
- @ii{Accede al vettore originale attraverso gli indici ordinati:}
- @var{fa qualcosa con} orig[dest[i]]
- @}
-@}
-@end example
-
-Fin qui, tutto bene. Ora inizia la parte interessante. Sia @code{asort()}
-che @code{asorti()} accettano un terzo argomento di stringa per controllare il
-confronto di elementi del vettore. Quando abbiamo introdotto @code{asort()} e
-@code{asorti()} nella @ref{Funzioni per stringhe}, abbiamo ignorato questo terzo
-argomento; comunque, @`e giunto il momento di descrivere come questo argomento
-influenza queste due funzioni.
-
-Fondamentalmente, il terzo argomento specifica come dev'essere ordinato il
-vettore. Ci sono due possibilit@`a. Come per @code{PROCINFO["sorted_in"]},
-quest'argomento pu@`o essere uno degli argomenti predefiniti che @command{gawk}
-fornisce (@pxref{Controllare visita}), o pu@`o essere il nome di una funzione
-definita dall'utente (@pxref{Controllare visita vettori}).
-
-Nell'ultimo caso, @emph{la funzione pu@`o confrontare gli elementi in qualunque
-modo si voglia}, prendendo in considerazione solo gli indici, solo i valori,
-o entrambi. Questo @`e estremamente potente.
-
-Una volta che il vettore @`e ordinato, @code{asort()} prende i @emph{valori} nel
-loro ordine finale e li usa per riempire il vettore risultato, mentre
-@code{asorti()} prende gli @emph{indici} nel loro ordine finale e li usa per
-riempire il vettore risultato.
-
-@cindex conteggio riferimenti, ordinamento vettori
-@quotation NOTA
-Copiare indici ed elementi non @`e dispendioso in termini di memoria.
-Internamente, @command{gawk} mantiene un @dfn{conteggio dei riferimenti} ai
-dati. Per esempio, dopo che @code{asort()} copia il primo vettore nel
-secondo, in memoria c'@`e ancora una sola copia dei dati degli elementi
-del vettore originale, ed entrambi i vettori accedono all'unica copia di
-valori che esiste in memoria.
-@end quotation
-
-@c Document It And Call It A Feature. Sigh.
-@cindex @command{gawk}, variabile @code{IGNORECASE} in
-@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
-@cindex @code{IGNORECASE}, variabile, e funzioni di ordinamento dei vettori
-@cindex variabile @code{IGNORECASE}, e funzioni di ordinamento dei vettori
-Poich@'e @code{IGNORECASE} influenza i confronti tra stringhe, il valore di
-@code{IGNORECASE} influisce anche sull'ordinamento sia con @code{asort()} che
-con @code{asorti()}.
-Si noti inoltre che l'ordinamento della localizzazione @emph{non} entra in
-gioco; i confronti sono basati solamente sul valore dei
-caratteri.@footnote{Ci@`o @`e vero perch@'e il confronto basato sulla localizzazione
-avviene solo quando si @`e in modalit@`a POSIX-compatibile, e poich@'e @code{asort()}
-e @code{asorti()} sono estensioni di @command{gawk}, esse non sono disponibili
-in quel caso.}
-
-L'esempio seguente mostra l'uso di una funzione di confronto usata con
-@code{asort()}. La funzione di confronto, @code{confronta_in_minuscolo()},
-trasforma gli elementi da confrontare in lettere minuscole, in modo da avere
-confronti che non dipendono da maiuscolo/minuscolo.
-
-@example
-# confronta_in_minuscolo --- confronta stringhe ignorando maiuscolo/minuscolo
-
-function confronta_in_minuscolo(i1, v1, i2, v2, l, r)
-@{
- l = tolower(v1)
- r = tolower(v2)
-
- if (l < r)
- return -1
- else if (l == r)
- return 0
- else
- return 1
-@}
-@end example
-
-E questo programma pu@`o essere usato per provarla:
-
-@example
-# programma di test
-
-BEGIN @{
- Letters = "abcdefghijklmnopqrstuvwxyz" \
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- split(Letters, data, "")
-
- asort(data, risultato, "confronta_in_minuscolo")
-
- j = length(risultato) # numero elementi del vettore "risultato"
- for (i = 1; i <= j; i++) @{
- printf("%s", risultato[i])
- if (i % (j/2) == 0)
- # a met@`a, la stampa del vettore va a capo
- printf("\n")
- else
- printf(" ")
- @}
-@}
-@end example
-
-Se si esegue il programma, si ottiene:
-
-@example
-$ @kbd{gawk -f confronta_in_minuscolo.awk}
-@print{} A a B b c C D d e E F f g G H h i I J j k K l L M m
-@print{} n N O o p P Q q r R S s t T u U V v w W X x y Y z Z
-@end example
-
-@node I/O bidirezionale
-@section Comunicazioni bidirezionali con un altro processo
-
-@c 8/2014. Neither Mike nor BWK saw this as relevant. Commenting it out.
-@ignore
-@cindex Brennan, Michael
-@cindex programmers, attractiveness of
-@smallexample
-@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan
-From: brennan@@whidbey.com (Mike Brennan)
-Newsgroups: comp.lang.awk
-Subject: Re: Learn the SECRET to Attract Women Easily
-Date: 4 Aug 1997 17:34:46 GMT
-@c Organization: WhidbeyNet
-@c Lines: 12
-Message-ID: <5s53rm$eca@@news.whidbey.com>
-@c References: <5s20dn$2e1@chronicle.concentric.net>
-@c Reply-To: brennan@whidbey.com
-@c NNTP-Posting-Host: asn202.whidbey.com
-@c X-Newsreader: slrn (0.9.4.1 UNIX)
-@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403
-
-On 3 Aug 1997 13:17:43 GMT, Want More Dates???
-<tracy78@@kilgrona.com> wrote:
->Learn the SECRET to Attract Women Easily
->
->The SCENT(tm) Pheromone Sex Attractant For Men to Attract Women
-
-The scent of awk programmers is a lot more attractive to women than
-the scent of perl programmers.
---
-Mike Brennan
-@c brennan@@whidbey.com
-@end smallexample
-@end ignore
-
-@cindex funzionalit@`a avanzate, processi@comma{} comunicare con
-@cindex processi, comunicazioni bidirezionali con
-Spesso @`e utile poter
-inviare dati a un programma separato che
-li elabori e in seguito leggere il risultato. Questo pu@`o essere sempre
-fatto con file temporanei:
-
-@example
-# Scrivere i dati per l'elaborazione
-filetemp = ("mieidati." PROCINFO["pid"])
-while (@var{non dipendente dai dati})
- print @var{dati} | ("sottoprogramma > " filetemp)
-close("sottoprogramma > " filetemp)
-
-# Legge il risultato, rimuove filetemp quando ha finito
-while ((getline nuovidati < filetemp) > 0)
- @var{elabora} nuovidati @var{secondo le esigenze}
-close(filetemp)
-system("rm " filetemp)
-@end example
-
-@noindent
-Questo funziona, ma non @`e elegante. Tra le altre cose, richiede che il
-programma venga eseguito in una directory che non pu@`o essere condivisa tra gli
-utenti; per esempio, @file{/tmp} non pu@`o esserlo, poich@'e potrebbe accadere che
-un altro utente stia usando un file temporaneo con lo stesso
-nome.@footnote{Michael Brennan suggerisce l'uso di @command{rand()} per
-generare @value{FNS} unici. Questo @`e un punto valido; tuttavia, i file
-temporanei rimangono pi@`u difficili da usare delle @dfn{pipe} bidirezionali.} @c 8/2014
-
-@cindex coprocessi
-@cindex input/output bidirezionale
-@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
-@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
-@cindex @command{csh}, comando, operatore @code{|&}, confronto con
-@cindex comando @command{csh}, operatore @code{|&}, confronto con
-Comunque, con @command{gawk}, @`e possibile aprire una @dfn{pipe}
-@emph{bidirezionale}
-verso un altro processo. Il secondo processo @`e chiamato @dfn{coprocesso},
-poich@'e viene eseguito in parallelo con @command{gawk}. La connessione
-bidirezionale viene creata usando l'operatore @samp{|&} (preso in prestito
-dalla shell Korn, @command{ksh}):@footnote{Questo @`e molto diverso dallo stesso
-operatore nella C shell e in Bash.}
-
-@example
-do @{
- print @var{dati} |& "sottoprogramma"
- "sottoprogramma" |& getline risultato
-@} while (@var{ci sono ancora dati da elaborare})
-close("sottoprogramma")
-@end example
-
-La prima volta che viene eseguita un'operazione I/O usando l'operatore
-@samp{|&},
-@command{gawk} crea una @dfn{pipeline} bidirezionale verso un processo figlio
-che esegue l'altro programma. L'output creato con @code{print} o con
-@code{printf} viene scritto nello standard input del programma, e il contenuto
-dello standard output del programma pu@`o essere letto dal programma
-@command{gawk} usando @code{getline}.
-Come accade coi processi avviati con @samp{|}, il sottoprogramma pu@`o
-essere un qualsiasi programma, o una @dfn{pipeline} di programmi, che pu@`o essere
-avviato dalla shell.
-
-Ci sono alcune avvertenze da tenere presenti:
-
-@itemize @value{BULLET}
-@item
-Per come funziona internamente @command{gawk}, lo standard error
-dei coprocessi va nello stesso posto dove va lo standard error del
-genitore @command{gawk}. Non @`e possibile leggere lo standard error del
-figlio separatamente.
-
-@cindex stalli
-@cindex abbracci mortali
-@cindex @dfn{deadlocks}, vedi stalli
-@cindex bufferizzazione, dell'input/output
-@cindex input/output, bufferizzazione
-@cindex @code{getline}, comando, stalli e
-@item
-La permanenza in memoria (bufferizzazione) dell'I/O del sottoprocesso potrebbe
-essere un problema. @command{gawk} automaticamente scrive su disco tutto
-l'output spedito tramite la @dfn{pipe} al coprocesso.
-Tuttavia, se il coprocesso non scrive su disco il suo output,
-@command{gawk} potrebbe bloccarsi mentre esegue una @code{getline} per leggere
-il risultato del coprocesso. Questo pu@`o portare a una situazione
-conosciuta come @dfn{stallo} (@dfn{deadlock}, abbraccio mortale), in cui ciascun
-processo rimane in attesa
-che l'altro processo faccia qualcosa.
-@end itemize
-
-@cindex @code{close()}, funzione, @dfn{pipe} bidirezionali e
-@cindex funzione @code{close()}, @dfn{pipe} bidirezionali e
-@`E possibile chiudere una @dfn{pipe} bidirezionale con un coprocesso solo in una
-direzione, fornendo un secondo argomento, @code{"to"} o @code{"from"}, alla
-funzione @code{close()} (@pxref{Chiusura file e @dfn{pipe}}).
-Queste stringhe dicono a @command{gawk} di chiudere la @dfn{pipe}, rispettivamente
-nella direzione che invia i dati al coprocesso e nella direzione che legge da
-esso.
-
-@cindex @command{sort}, programma di utilit@`a, coprocessi e
-@cindex programma di utilit@`a @command{sort}, coprocessi e
-Questo @`e particolarmente necessario per usare il programma di utilit@`a
-di sistema @command{sort} come parte di un coprocesso;
-@command{sort} deve leggere @emph{tutti} i dati di input
-prima di poter produrre un qualsiasi output.
-Il programma @command{sort} non riceve un'indicazione di fine-file
-(end-of-file) finch@'e @command{gawk} non chiude l'estremit@`a in scrittura della
-@dfn{pipe}.
-
-Una volta terminata la scrittura dei dati sul programma @command{sort},
-si pu@`o chiudere il lato @code{"to"} della @dfn{pipe}, e quindi iniziare a leggere
-i dati ordinati via @code{getline}.
-Per esempio:
-
-@example
-BEGIN @{
- comando = "LC_ALL=C sort"
- n = split("abcdefghijklmnopqrstuvwxyz", a, "")
-
- for (i = n; i > 0; i--)
- print a[i] |& comando
- close(comando, "to")
-
- while ((comando |& getline line) > 0)
- print "ricevuto", line
- close(comando)
-@}
-@end example
-
-Questo programma scrive le lettere dell'alfabeto in ordine inverso, uno per
-riga, attraverso la @dfn{pipe} bidirezionale verso @command{sort}. Poi chiude la
-direzione di scrittura della @dfn{pipe}, in modo che @command{sort} riceva
-un'indicazione di fine-file. Questo fa in modo che @command{sort} ordini i
-dati e scriva i dati ordinati nel programma @command{gawk}. Una volta che
-tutti i dati sono stati letti, @command{gawk} termina il coprocesso ed esce.
-
-Come nota a margine, l'assegnamento @samp{LC_ALL=C} nel comando @command{sort}
-assicura che @command{sort} usi l'ordinamento tradizionale di Unix (ASCII).
-Ci@`o non @`e strettamente necessario in questo caso, ma @`e bene sapere come farlo.
-
-Occorre prestare attenzione quando si chiude il lato @code{"from"} di una
-@dfn{pipe} bidirezionale; in tal caso @command{gawk} attende che il
-processo-figlio termini, il che pu@`o causare lo stallo del programma
-@command{awk} in esecuzione. (Per questo motivo, questa particolare
-funzionalit@`a @`e molto meno usata, in pratica, di quella che consente la
-possibilit@`a di chiudere il lato @code{"to"} della @dfn{pipe}.)
-
-@quotation ATTENZIONE
-Normalmente,
-@`e un errore fatale (che fa terminare il programma @command{awk})
-scrivere verso il lato @code{"to"} di una @dfn{pipe} bidirezionale che
-@`e stata chiusa, e lo stesso vale se si legge dal lato @code{"from"}
-di una @dfn{pipe} bidirezionale che sia stata chiusa.
-
-@`E possibile impostare @code{PROCINFO["@var{comando}", "NONFATAL"]}
-per far s@`{@dotless{i}} che tali operazioni non provochino la fine del programma
-@command{awk}. Se lo si fa, @`e necessario controllare il valore
-di @code{ERRNO} dopo ogni istruzione @code{print}, @code{printf},
-o @code{getline}.
-@xref{Continuazione dopo errori} per ulteriori informazioni.
-@end quotation
-
-@cindex @command{gawk}, vettore @code{PROCINFO} in
-@cindex @code{PROCINFO}, vettore, e comunicazioni attraverso le @dfn{pty}
-Per le comunicazioni bidirezionali si possono anche usare delle pseudo @dfn{tty}
-(@dfn{pty}) al posto delle @dfn{pipe}, se il sistema in uso le prevede.
-Questo vien fatto, a seconda del comando da usare, impostando un elemento
-speciale nel vettore @code{PROCINFO}
-(@pxref{Variabili auto-assegnate}),
-in questo modo:
-
-@example
-comando = "sort -nr" # comando, salvato in una variabile
-PROCINFO[comando, "pty"] = 1 # aggiorna PROCINFO
-print @dots{} |& comando # avvia la @dfn{pipe} bidirezionale
-@dots{}
-@end example
-
-@noindent
-Se il sistema in uso non ha le @dfn{pty}, o se tutte le @dfn{pty} del sistema
-sono in uso, @command{gawk} automaticamente torna a usare le @dfn{pipe}
-regolari.
-
-Usare le @dfn{pty} in genere evita i problemi di stallo del buffer descritti
-precedentemente, in cambio di un piccolo calo di prestazioni. Ci@`o dipende
-dal fatto che la gestione delle @dfn{tty} @`e fatta una riga per volta.
-Su sistemi che hanno il comando @command{stdbuf} (parte del pacchetto
-@uref{http://www.gnu.org/software/coreutils/coreutils.html,
-GNU Coreutils}), si pu@`o usare tale programma, invece delle @dfn{pty}.
-
-Si noti anche che le @dfn{pty} non sono completamente trasparenti.
-Alcuni codici di controllo binari, come @kbd{Ctrl-d} per indicare la
-condizione di file-file, sono interpetati dal gestore di @dfn{tty}
-e non sono passati all'applicazione.
-
-@quotation ATTENZIONE
-In ultima analisi, i coprocessi danno adito alla possibilit@`a di uno
-@dfn{stallo} (deadlock) tra @command{gawk} e il programma in esecuzione
-nel coprocesso. Ci@`o pu@`o succedere se si inviano ``troppi'' dati al
-coprocesso, prima di leggere dati inviati dallo stesso; entrambi i
-processi sono bloccati sulla scrittura dei dati, e nessuno dei due
-@`e disponibile a leggere quelli che sono gi@`a stati scritti dall'altro.
-Non c'@`e modo di evitare completamente una tale situazione; occorre una
-programmazione attenta, insieme alla conoscenza del comportamento del
-coprocesso.
-@end quotation
-
-@node Reti TCP/IP
-@section Usare @command{gawk} per la programmazione di rete
-@cindex funzionalit@`a avanzate, programmazione di rete
-@cindex avanzate, funzionalit@`a, programmazione di rete
-@cindex reti, programmazione di
-@cindex TCP/IP
-@cindex @code{/inet/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet/@dots{}} (in @command{gawk})
-@cindex @code{/inet4/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet4/@dots{}} (in @command{gawk})
-@cindex @code{/inet6/@dots{}}, file speciali (in @command{gawk})
-@cindex file speciali @code{/inet6/@dots{}} (in @command{gawk})
-@cindex @code{EMRED}
-@ifnotdocbook
-@quotation
-@code{EMRED}:@*
-@ @ @ @ @i{A host is a host from coast to coast,@*
-@ @ @ @ and nobody talks to a host that's close,@*
-@ @ @ @ unless the host that isn't close@*
-@ @ @ @ is busy, hung, or dead.}
-
-@code{EMRED}:@*
-@ @ @ @ @i{Un computer @`e un computer lontano o vicino,@*
-@ @ @ @ e nessuno parla con un computer vicino,@*
-@ @ @ @ a meno che il computer lontano@*
-@ @ @ @ sia occupato, fuori linea, o spento.}
-@author Mike O'Brien (noto anche come Mr.@: Protocol)
-@end quotation
-@end ifnotdocbook
-
-@docbook
-<blockquote>
-<attribution>Mike O'Brien (aka Mr.&nbsp;Protocol)</attribution>
-<literallayout class="normal"><literal>EMRED</literal>:
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>A host is a host from coast to coast,</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>and no-one can talk to host that's close,</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>unless the host that isn't close</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>is busy, hung, or dead.</emphasis></literallayout>
-</blockquote>
-@end docbook
-
-Oltre a poter aprire una @dfn{pipeline} bidirezionale verso un coprocesso
-sullo stesso sistema
-(@pxref{I/O bidirezionale}),
-@`e possibile attivare una connessione bidirezionale verso un altro processo
-o verso un altro sistema attraverso una connessione di rete IP.
-
-Si pu@`o pensare a questo semplicemente come a una @dfn{pipeline} bidirezionale
-@emph{molto lunga} verso un coprocesso.
-Il modo in cui @command{gawk} stabilisce quando usare una rete TCP/IP @`e
-mediante il riconoscimento di speciali @value{FNS} che iniziano con
-@samp{/inet/}, con @samp{/inet4/} o con @samp{/inet6/}.
-
-La sintassi completa del @value{FN} speciale @`e
-@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}.
-I componenti sono:
-
-@table @var
-@item tipo-rete
-Specifica il tipo di connessione a internet da stabilire.
-Si usa @samp{/inet4/} per usare solo IPv4, e
-@samp{/inet6/} per usare solo IPv6.
-Il semplice @samp{/inet/} (che usualmente @`e l'unica opzione) usa
-il tipo di default del sistema, quasi certamente IPv4.
-
-@item protocollo
-Il protocollo da usare sull'IP. Questo dev'essere o @samp{tcp} o
-@samp{udp}, per una connessione IP rispettivamente TCP o UDP.
-TCP dovrebbe venir usato per la maggior parte delle applicazioni.
-
-@item porta-locale
-@cindex @code{getaddrinfo()}, funzione (libreria C)
-@cindex funzione @code{getaddrinfo()} (libreria C)
-Il numero di porta TCP o UDP da usare. Si usa un numero di porta di valore
-@samp{0} quando si vuole che sia il sistema a scegliere una porta.
-Questo @`e quel che si dovrebbe fare quando si scrive un'applicazione
-cliente TCP o UDP.
-Si pu@`o usare anche un nome di un servizio noto, come @samp{smtp}
-o @samp{http}, nel qual caso @command{gawk} tenta di determinare
-il numero di porta predefinito usando la funzione C @code{getaddrinfo()}.
-
-@item host-remoto
-L'indirizzo IP o il nome di dominio completamente qualificato dell'host
-internet al quale ci si vuol connettere.
-
-@item porta-remota
-Il numero di porta TCP o UDP da usare sul particolare @var{host remoto}.
-Anche in questo caso, si usi @samp{0} se non ci sono preferenze,
-o alternativamente, un nome di servizio comunemente noto.
-@end table
-
-@cindex @command{gawk}, variabile @code{ERRNO} in
-@cindex @code{ERRNO}, variabile
-@cindex variabile @code{ERRNO}
-@quotation NOTA
-Un insuccesso nell'apertura di un socket bidirezionale dar@`a luogo alla
-segnalazione di un errore non fatale al codice chiamante.
-Il valore di @code{ERRNO} indica l'errore (@pxref{Variabili auto-assegnate}).
-@end quotation
-
-Si consideri il seguente esempio molto semplice:
-
-@example
-BEGIN @{
- Servizio = "/inet/tcp/0/localhost/daytime"
- Servizio |& getline
- print $0
- close(Servizio)
-@}
-@end example
-
-Questo programma legge la data e l'ora corrente dal server @code{daytime}
-TCP del sistema locale.
-Stampa poi il risultato e chiude la connessione.
-
-Poich@'e questo tema @`e molto ampio, l'uso di @command{gawk} per
-la programmazione TCP/IP viene documentato separatamente.
-@ifinfo
-Si veda
-@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
-@end ifinfo
-@ifnotinfo
-Si veda
-@uref{http://www.gnu.org/software/gawk/manual/gawkinet/,
-@cite{@value{GAWKINETTITLE}}},
-che fa parte della distribuzione @command{gawk},
-@end ifnotinfo
-per una introduzione e trattazione molto pi@`u completa e con molti
-esempi.
-
-@quotation NOTA
-@command{gawk} pu@`o aprire solo socket diretti. Al momento non c'@`e alcun modo
-per accedere ai servizi disponibili su Secure Socket Layer
-(SSL); questo comprende qualsiasi servizio web il cui URL inizia con
-@samp{https://}.
-@end quotation
-
-
-@node Profilare
-@section Profilare i propri programmi @command{awk}
-@cindex @command{awk}, programmi, profilare
-@cindex profilare programmi @command{awk}
-@cindex @code{awkprof.out}, file
-@cindex file @code{awkprof.out}
-
-@`E possibile tener traccia dell'esecuzione dei propri programmi @command{awk}.
-Ci@`o si pu@`o fare passando l'opzione @option{--profile} a @command{gawk}.
-Al termine dell'esecuzione, @command{gawk} crea un profilo del programma in un
-file chiamato @file{awkprof.out}. A causa dell'attivit@`a di profilazione
-l'esecuzione del programma @`e pi@`u lenta fino al 45% rispetto al normale.
-
-@cindex @option{--profile}, opzione
-@cindex opzione @option{--profile}
-Come mostrato nel seguente esempio,
-l'opzione @option{--profile} pu@`o essere usata per cambiare il nome del file
-su cui @command{gawk} scriver@`a il profilo:
-
-@example
-gawk --profile=mioprog.prof -f mioprog.awk dati1 dati2
-@end example
-
-@noindent
-Nell'esempio precedente, @command{gawk} mette il profilo in
-@file{mioprog.prof} anzich@'e in @file{awkprof.out}.
-
-Vediamo ora una sessione d'esempio che mostra un semplice programma
-@command{awk}, i suoi dati in input, e il risultato dell'esecuzione di
-@command{gawk} con l'opzione @option{--profile}. Innanzitutto, il
-programma @command{awk}:
-
-@example
-BEGIN @{ print "Prima regola BEGIN" @}
-
-END @{ print "Prima regola END" @}
-
-/pippo/ @{
- print "trovato /pippo/, perbacco"
- for (i = 1; i <= 3; i++)
- sing()
-@}
-
-@{
- if (/pippo/)
- print "l'if @`e vero"
- else
- print "l'else @`e vero"
-@}
-
-BEGIN @{ print "Seconda regola BEGIN" @}
-
-END @{ print "Seconda regola END" @}
-
-function sing( ignora)
-@{
- print "Devo essere io!"
-@}
-@end example
-
-Questi sono i dati in input:
-
-@example
-pippo
-pluto
-paperino
-pippo
-cianfrusaglie
-@end example
-
-E questo @`e il file @file{awkprof.out} che @`e il risultato dell'esecuzione
-del profilatore di @command{gawk} su questo programma e sui dati (quest'esempio
-dimostra anche che i programmatori di @command{awk} a volte si alzano molto
-presto al mattino per lavorare):
-
-@cindex @code{BEGIN}, criterio di ricerca, e profilatura
-@cindex criterio di ricerca @code{BEGIN}, e profilatura
-@cindex @code{END}, criterio di ricerca, e profilatura
-@cindex criterio di ricerca @code{END}, e profilatura
-@example
- # profilo gawk, creato Mon Sep 29 05:16:21 2014
-
- # BEGIN regola(e)
-
- BEGIN @{
- 1 print "Prima regola BEGIN"
- @}
-
- BEGIN @{
- 1 print "Seconda regola BEGIN"
- @}
-
- # Regola(e)
-
- 5 /pippo/ @{ # 2
- 2 print "trovato /pippo/, perbacco"
- 6 for (i = 1; i <= 3; i++) @{
- 6 sing()
- @}
- @}
-
- 5 @{
- 5 if (/pippo/) @{ # 2
- 2 print "l'if @`e vero"
- 3 @} else @{
- 3 print "l'else @`e vero"
- @}
- @}
-
- # END regola(e)
-
- END @{
- 1 print "Prima regola END"
- @}
-
- END @{
- 1 print "Seconda regola END"
- @}
-
-
- # Funzioni, in ordine alfabetico
-
- 6 function sing(ignora)
- @{
- 6 print "Devo essere io!"
- @}
-@end example
-
-Quest'esempio illustra molte caratteristiche fondamentali dell'output
-della profilazione.
-Queste sono:
-
-@itemize @value{BULLET}
-@item
-Il programma viene stampato nell'ordine: regole @code{BEGIN},
-regole @code{BEGINFILE},
-regole criterio di ricerca--azione,
-regole @code{ENDFILE}, regole @code{END}, e funzioni, elencate
-in ordine alfabetico.
-Le regole @code{BEGIN} ed @code{END} multiple conservano le loro
-distinte identit@`a, cos@`{@dotless{i}} come le regole @code{BEGINFILE} ed @code{ENDFILE}
-multiple.
-
-@cindex criteri di ricerca, conteggi, in un profilo
-@item
-Le regole criterio di ricerca--azione hanno due conteggi.
-Il primo conteggio, a sinistra della regola, mostra quante volte
-il criterio di ricerca della regola @`e stato @emph{testato}.
-Il secondo conteggio, alla destra della parentesi graffa aperta,
-all'interno di un commento,
-mostra quante volte l'azione della regola @`e stata @emph{eseguita}.
-La differenza tra i due indica quante volte il criterio di ricerca della regola
-@`e stato valutato come falso.
-
-@item
-Analogamente,
-il conteggio per un'istruzione @code{if}-@code{else} mostra quante volte
-la condizione @`e stata testata.
-Alla destra della parentesi graffa sinistra aperta per il corpo di @code{if}
-c'@`e un conteggio che mostra quante volte la condizione @`e stata trovata vera.
-Il conteggio per @code{else} indica
-quante volte la verifica non ha avuto successo.
-
-@cindex cicli, conteggi per l'intestazione, in un profilo
-@item
-Il conteggio per un ciclo (come @code{for}
-o @code{while}) mostra quante volte il test del ciclo @`e stato eseguito.
-(Per questo motivo, non si pu@`o solamente guardare il conteggio sulla prima
-istruzione in una regola per determinare quante volte la regola @`e stata
-eseguita. Se la prima istruzione @`e un ciclo, il conteggio @`e ingannevole.)
-
-@cindex funzioni definite dall'utente, conteggi, in un profilo
-@cindex definite dall'utente, funzioni, conteggi, in un profilo
-@item
-Per le funzioni definite dall'utente, il conteggio vicino alla parola chiave
-@code{function} indica quante volte la funzione @`e stata chiamata.
-I conteggi vicino alle istruzioni nel corpo mostrano quante volte
-quelle istruzioni sono state eseguite.
-
-@cindex @code{@{@}} (parentesi graffe)
-@cindex parentesi graffe (@code{@{@}})
-@item
-L'impaginazione usa lo stile ``K&R'' con le tabulazioni.
-Le parentesi graffe sono usate dappertutto, anche dove il corpo di un
-@code{if}, di un @code{else} o di un ciclo @`e formato da un'unica istruzione.
-
-@cindex @code{()} (parentesi), in un profilo
-@cindex parentesi (@code{()}), in un profilo
-@item
-Le parentesi vengono usate solo dov'@`e necessario, come si rileva dalla
-struttura del programma e dalle regole di precedenza.
-Per esempio, @samp{(3 + 5) * 4} significa sommare tre e cinque, quindi
-moltiplicare il totale per quattro. Di contro, @samp{3 + 5 * 4} non ha
-parentesi, e significa @samp{3 + (5 * 4)}.
-
-@ignore
-@item
-All string concatenations are parenthesized too.
-(This could be made a bit smarter.)
-@end ignore
-
-@item
-Le parentesi vengono usate attorno agli argomenti di @code{print}
-e @code{printf} solo quando l'istruzione
-@code{print} o @code{printf} @`e seguita da una ridirezione.
-Similarmente, se
-l'oggetto di una ridirezione non @`e uno scalare, viene messo tra parentesi.
-
-@item
-@command{gawk} mette dei commenti iniziali
-davanti alle regole @code{BEGIN} ed @code{END},
-alle regole @code{BEGINFILE} ed @code{ENDFILE},
-alle regole criterio_di_ricerca--azione e alle funzioni.
-
-@end itemize
-
-La versione profilata del proprio programma potrebbe non apparire esattamente
-come quella scritta durante la stesura del programma. Questo perch@'e
-@command{gawk} crea la versione profilata facendo una ``stampa elegante'' della
-sua rappresentazione interna del programma. Un vantaggio di ci@`o @`e che
-@command{gawk} pu@`o produrre una rappresentazione standard.
-Inoltre, cose come:
-
-@example
-/pippo/
-@end example
-
-@noindent
-appaiono come:
-
-@example
-/pippo/ @{
- print $0
-@}
-@end example
-
-@noindent
-che @`e corretto, ma probabilmente inatteso.
-
-@cindex profilare programmi @command{awk}, dinamicamente
-@cindex @command{gawk}, programma, profilazione dinamica
-@cindex profilazione dinamica
-Oltre a creare profili una volta completato il programma,
-@command{gawk} pu@`o generare un profilo mentre @`e in esecuzione.
-Questo @`e utile se il proprio programma @command{awk} entra in un ciclo
-infinito e si vuol vedere cosa @`e stato eseguito.
-Per usare questa funzionalit@`a, bisogna eseguire @command{gawk} con l'opzione
-@option{--profile} in background:
-
-@example
-$ @kbd{gawk --profile -f mioprog &}
-[1] 13992
-@end example
-
-@cindex @command{kill}, comando@comma{} profilazione dinamica e
-@cindex comando @command{kill}@comma{} profilazione dinamica e
-@cindex @code{USR1}, segnale, per profilazione dinamica
-@cindex @code{SIGUSR1}, segnale, per profilazione dinamica
-@cindex segnali @code{USR1}/@code{SIGUSR1}, per profilazione
-@noindent
-La shell stampa un numero di job e il numero di ID del relativo processo;
-in questo caso, 13992. Si usi il comando @command{kill} per inviare il
-segnale @code{USR1} a @command{gawk}:
-
-@example
-$ @kbd{kill -USR1 13992}
-@end example
-
-@noindent
-Come al solito, la versione profilata del programma @`e scritta nel file
-@file{awkprof.out}, o in un file differente se ne viene specificato uno
-con l'opzione @option{--profile}.
-
-Assieme al profilo regolare, come mostrato in precedenza, il file del profilo
-include una traccia di ogni funzione attiva:
-
-@example
-# `Stack' (Pila) Chiamate Funzione:
-
-# 3. paperino
-# 2. pluto
-# 1. pippo
-# -- main --
-@end example
-
-Si pu@`o inviare a @command{gawk} il segnale @code{USR1} quante volte si vuole.
-Ogni volta, il profilo e la traccia della chiamata alla funzione vengono
-aggiunte in fondo al file di profilo creato.
-
-@cindex @code{HUP}, segnale, per profilazione dinamica
-@cindex @code{SIGHUP}, segnale, per profilazione dinamica
-@cindex segnali @code{HUP}/@code{SIGHUP}, per profilazione
-Se si usa il segnale @code{HUP} invece del segnale @code{USR1}, @command{gawk}
-genera il profilo e la traccia della chiamata alla funzione ed esce.
-
-@cindex @code{INT}, segnale (MS-Windows)
-@cindex @code{SIGINT}, segnale (MS-Windows)
-@cindex segnali @code{INT}/@code{SIGINT} (MS-Windows)
-@cindex @code{QUIT}, segnale (MS-Windows)
-@cindex @code{SIGQUIT}, segnale (MS-Windows)
-@cindex segnali @code{QUIT}/@code{SIGQUIT} (MS-Windows)
-Quando @command{gawk} viene eseguito sui sistemi MS-Windows, usa i segnali
-@code{INT} e @code{QUIT} per generare il profilo, e nel
-caso del segnale @code{INT}, @command{gawk} esce. Questo perch@'e
-questi sistemi non prevedono il comando @command{kill}, per cui gli unici
-segnali che si possono trasmettere a un programma sono quelli generati dalla
-tastiera. Il segnale @code{INT} @`e generato dalle combinazioni di tasti
-@kbd{Ctrl-c} o @kbd{Ctrl-BREAK}, mentre il segnale
-@code{QUIT} @`e generato dalla combinazione di tasti @kbd{Ctrl-\}.
-
-Infine, @command{gawk} accetta anche un'altra opzione, @option{--pretty-print}.
-Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa elegante''
-del programma nel file @file{awkprof.out}, senza conteggi sull'esecuzione.
-
-@quotation NOTA
-Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma.
-Ora non pi@`u.
-@end quotation
-
-C'@`e una differenza significativa tra l'output creato durante la profilazione, e
-quello creato durante la stampa elegante. L'output della stampa elegante
-preserva i commenti originali che erano nel programma, anche se la loro
-posizione pu@`o non corrispondere esattamente alle posizioni originali che
-avevano nel codice sorgente.@footnote{@command{gawk} fa del suo meglio
-per mantenere la distinzione tra commenti posti dopo delle istruzioni e
-commenti su righe a s@'e stanti. Per limiti insiti nell'implementazione,
-non sempre questo pu@`o avvenire in maniera corretta, in particolare nel
-caso di istruzioni @code{switch}. I manutentori di @command{gawk}
-sperano di poter migliorare la situazione in una futura versione.}
-
-Comunque, per una precisa scelta progettuale, l'output della profilazione
-@emph{omette} i commenti del programma originale. Questo permette di
-concentrarsi sui dati del conteggio di esecuzione ed evita la tentazione di
-usare il profilatore per creare una stampa elegante.
-
-Oltre a ci@`o, l'output stampato in modo elegante non ha l'indentazione iniziale
-che ha l'output della profilazione. Questo rende agevole la stampa elegante
-del proprio codice una volta completato lo sviluppo, usando poi il risultato
-come versione finale del programma.
-
-Poich@'e la rappresentazione interna del programma @`e formattata per
-essere aderente al programma @command{awk} in questione, la profilatura
-e la formattazione graziosa (opzione @option{--pretty-print}) disabilitano
-automaticamente le optimizzazioni di default di @command{gawk}.
-
-La formattazione elegante mantiene anche il formato originale delle
-costanti numeriche; se sono stati usati dei valori ottali o esadecimali
-nel codice sorgente, questi compariranno nell'output nello stesso
-formato con cui sono stati inseriti.
-
-@node Sommario funzionalit@`a avanzate
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-L'opzione @option{--non-decimal-data} fa s@`{@dotless{i}} che @command{gawk} tratti
-i dati di input che hanno l'aspetto ottale ed esadecimale come valori ottali ed
-esadecimali. L'opzione dovrebbe essere usata con prudenza o non usata affatto;
-@`e preferibile l'uso di @code{strtonum()}.
-Si noti che quest'opzione potrebbe sparire nelle prossime versioni di
-@command{gawk}.
-
-@item
-Si pu@`o prendere il completo controllo dell'ordinamento nello scorrere il
-vettore con @samp{for (@var{indice} in @var{vettore})}, impostando
-@code{PROCINFO["sorted_in"]} al nome di una funzione definita dall'utente che
-fa il confronto tra elementi del vettore basandosi su indice e valore.
-
-@item
-Analogamente, si pu@`o fornire il nome di una funzione di confronto definita
-dall'utente come terzo argomento di @code{asort()} o di @command{asorti()} per
-controllare come queste funzioni ordinano i vettori. O si pu@`o fornire una delle
-stringhe di controllo predefinite che funzionano per
-@code{PROCINFO["sorted_in"]}.
-
-@item
-Si pu@`o usare l'operatore @samp{|&} per creare una @dfn{pipe} bidirezionale
-verso un coprocesso. Si legge dal coprocesso con @code{getline}, ci si
-scrive sopra con @code{print} o con @code{printf}. Usare @code{close()}
-per bloccare il coprocesso completamente o, se necessario, chiudere le
-comunicazioni bidirezionali in una direzione.
-
-@item
-Usando degli speciali @value{FNS} con l'operatore @samp{|&}, si pu@`o aprire una
-connessione TCP/IP (o UDP/IP) verso host remoti su internet. @command{gawk}
-supporta sia IPv4 che IPv6.
-
-@item
-Si possono generare profili del proprio programma con i conteggi del numero
-di esecuzione di ogni singola
-istruzione. Questo pu@`o essere d'aiuto nel determinare quali parti del programma
-potrebbero portar via la maggior parte del tempo, consentendo cos@`{@dotless{i}} di
-aggiustarli pi@`u agevolmente. Inviando il segnale @code{USR1} durante la
-profilazione @command{gawk} scrive il profilo, includendo la
-stack della chiamata alla funzione e prosegue nell'elaborazione.
-
-@item
-Si pu@`o anche fare solo una ``stampa elegante'' del programma.
-
-@end itemize
-@node Internazionalizzazione
-@chapter Internazionalizzazione con @command{gawk}
-
-Tanto tempo fa i produttori di computer
-scrivevano software che comunicava solo in inglese.
-Col passare del tempo, i venditori di hardware e di software si sono
-resi conto che se i loro sistemi avessero comunicato anche nelle lingue
-materne di paesi dove non si parlava inglese,
-ci@`o avrebbe avuto come risultato un incremento delle vendite.
-Per questo motivo, l'internazionalizzazione e la localizzazione
-di programmi e sistemi software @`e divenuta una pratica comune.
-
-@cindex internazionalizzazione, localizzazione
-@cindex @command{gawk}, internazionalizzazione e, si veda internazionalizzazione
-@cindex internazionalizzazione, localizzazione, @command{gawk} e
-Per molti anni la possibilit@`a di fornire l'internazionalizzazione
-era sostanzialmente limitata ai programmi scritti in C e C++.
-Questo @value{CHAPTER} descrive la libreria @dfn{ad hoc} utilizzata da
-@command{gawk}
-per l'internazionalizzazione e anche il modo in cui le funzionalit@`a che
-consentono l'internazionalizzazione sono rese disponibili da @command{gawk}
-a ogni programma scritto in @command{awk}.
-La disponibilit@`a dell'internazionalizzazione a livello di programma
-@command{awk} offre ulteriore flessibilit@`a agli sviluppatori di software:
-non sono pi@`u obbligati a scrivere in C o C++ quando l'internazionalizzazione
-@`e necessaria in un programma.
-
-@menu
-* I18N e L10N:: Internazionalizzazione e localizzazione.
-* Utilizzare @command{gettext}:: Come funziona il comando GNU @command{gettext}.
-* I18N per programmatore:: Funzionalit@`a per il programmatore.
-* I18N per traduttore:: Funzionalit@`a per il traduttore.
-* Esempio I18N:: Un semplice esempio di internazionalizzazione.
-* Gawk internazionalizzato:: Anche @command{gawk} @`e internazionalizzato.
-* Sommario I18N:: Sommario dell'internazionalizzazione.
-@end menu
-
-@node I18N e L10N
-@section Internazionalizzazione e localizzazione
-
-@cindex internazionalizzazione di programmi @command{awk}
-@cindex localizzazione, si veda internazionalizzazione@comma{} localizzazione
-@cindex localizzazione
-@dfn{Internazionalizzazione} significa scrivere (o modificare) un programma
-una volta sola,
-in maniera tale che possa usare pi@`u di una lingua senza
-bisogno di ulteriori modifiche al file sorgente.
-@dfn{Localizzazione}
-significa fornire i dati necessari perch@'e un programma
-internazionalizzato sia in grado di funzionare con una data lingua.
-Questi termini si riferiscono comunemente a funzionalit@`a quali la lingua
-usata per stampare messaggi di errore, quella usata per leggere
-risposte, e alle informazioni
-relative al modo di leggere e di stampare dati di tipo numerico o valutario.
-
-@node Utilizzare @command{gettext}
-@section Il comando GNU @command{gettext}
-
-@cindex internazionalizzare un programma
-@cindex @command{gettext}, libreria
-@cindex libreria @command{gettext}
-@command{gawk} usa il comando GNU @command{gettext} per rendere disponibili
-le proprie funzionalit@`a di internazionalizzazione.
-L'attenzione del comando GNU @command{gettext} @`e rivolta principalmente
-ai messaggi: stringhe di caratteri stampate da un programma, sia
-direttamente sia usando la formattazione prevista dalle istruzioni
-@code{printf} o @code{sprintf()}.@footnote{Per alcuni sistemi operativi,
-la relativa versione di @command{gawk}
-non supporta il comando GNU @command{gettext}.
-Per questo motivo, queste funzionalit@`a non sono disponibili nel caso
-si stia lavorando con uno di questi sistemi operativi. Siamo spiacenti.}
-
-@cindex portabilit@`a, libreria @command{gettext} e
-Quando si usa il comando GNU @command{gettext}, ogni applicazione ha il
-proprio @dfn{dominio di testo}. Questo @`e un nome unico come,
-p.es., @samp{kpilot} o @samp{gawk},
-che identifica l'applicazione.
-Un'applicazione completa pu@`o avere pi@`u componenti: programmi scritti
-in C o C++, come pure script di @command{sh} o di @command{awk}.
-Tutti i componenti usano lo stesso dominio di testo.
-
-Per andare sul concreto, si supponga di scrivere un'applicazione
-chiamata @command{guide}. L'internazionalizzazione per quest'applicazione
-pu@`o essere implementata seguendo nell'ordine i passi qui delineati:
-
-@enumerate
-@item
-Il programmatore esamina i sorgenti di tutti i componenti dell'applicazione
-@command{guide} e prende nota di ogni stringa che potrebbe aver bisogno
-di traduzione.
-Per esempio, @code{"`-F': option required"} @`e una stringa che sicuramente
-necessita di una traduzione.
-Una tabella che contenga stringhe che sono nomi di opzioni @emph{non}
-necessita di traduzione.
-(P.es., l'opzione di @command{gawk} @option{--profile}
-dovrebbe restare immutata, a prescindere dalla lingua locale).
-
-@cindex @code{textdomain()}, funzione (libreria C)
-@cindex funzione @code{textdomain()} (libreria C)
-@item
-Il programmatore indica il dominio di testo dell'applicazione
-(@command{"guide"}) alla libreria @command{gettext},
-chiamando la funzione @code{textdomain()}.
-
-@cindex @code{.pot}, file
-@cindex file @code{.pot}
-@cindex @dfn{portable object template} (.pot), file
-@cindex file, @dfn{portable object template} (.pot)
-@item
-I messaggi dell'applicazione che vanno tradotti sono estratti dal codice
-sorgente e messi in un file di tipo
-@dfn{portable object template}
-[modello di oggetto portabile]
-di nome @file{guide.pot},
-che elenca le stringhe e le relative traduzioni.
-Le traduzioni sono inizialmente vuote
-(esiste la struttura che definisce la stringa tradotta, ma la stringa
-tradotta @`e una stringa nulla).
-Il messaggio originale (normalmente in inglese) @`e utilizzato come chiave
-di riferimento per le traduzioni.
-
-@cindex @code{.po}, file
-@cindex file @code{.po}
-@cindex @dfn{portable object} file (.po)
-@cindex file, @dfn{portable object} (.po)
-@item
-Per ogni lingua per cui sia disponibile un traduttore, il file
-@file{guide.pot} @`e copiato in un file di tipo
-@dfn{portable object}
-[oggetto portabile]
-(dal suffisso @code{.po})
-e le traduzioni sono effettuate su quel file,
-che viene distribuito con l'applicazione.
-Per esempio, potrebbe esserci un file @file{it.po} per la traduzione italiana.
-
-@cindex @code{.gmo}, file
-@cindex file @code{.gmo}
-@cindex @dfn{message object} file (.mo)
-@cindex file, @dfn{message object} (.mo)
-@item
-Il file @file{.po} di ogni lingua @`e convertito in un formato binario,
-detto @dfn{message object} (file @file{.gmo}).
-Un file di tipo @dfn{message object} contiene i messaggi originali e le loro
-traduzioni in un formato binario che facilita il ritrovamento delle
-traduzioni quando l'applicazione viene eseguita.
-
-@item
-Quando @command{guide} @`e compilato e installato, i file binari contenenti le
-traduzioni sono installati in una directory standard.
-
-@cindex @code{bindtextdomain()}, funzione (libreria C)
-@cindex funzione @code{bindtextdomain()} (libreria C)
-@item
-Durante la fase di prova e sviluppo, @`e possibile chiedere a @command{gettext}
-di usare un file @file{.gmo} in una directory diversa da quella standard,
-usando la funzione @code{bindtextdomain()}.
-
-@cindex @code{.gmo}, file, specificare la directory di
-@cindex file @code{.gmo}, specificare la directory di
-@cindex @dfn{message object} file (.mo), specificare la directory di
-@cindex file, @dfn{message object} (.mo), specificare la directory di
-@item
-Quando viene eseguito, il programma @command{awk} @command{guide} cerca ogni
-stringa da tradurre facendo una chiamata a @code{gettext()}. La stringa
-ricevuta in ritorno @`e la stringa tradotta, se @`e stata trovata, o la stringa
-originale, se una traduzione non @`e disponibile.
-
-@item
-Se necessario, @`e possibile procurarsi dei messaggi tradotti da un dominio di
-testo diverso da quello proprio dell'applicazione, senza dover altalenare fra
-questo secondo dominio e quello dell'applicazione.
-@end enumerate
-
-@cindex @code{gettext()}, funzione (libreria C)
-@cindex funzione @code{gettext()} (libreria C)
-In C (o C++), la marcatura della stringa la ricerca dinamica
-della traduzione si fanno inserendo ogni stringa da tradurre in una chiamata
-a @code{gettext()}:
-
-@example
-printf("%s", gettext("Don't Panic!\n"));
-@end example
-
-Gli strumenti software che estraggono messaggi dal codice sorgente
-individuano tutte le stringhe racchiuse nelle chiamate a @code{gettext()}.
-
-@cindex @code{_} (trattino basso), macro C
-@cindex trattino basso (@code{_}), macro C
-Gli sviluppatori del comando GNU @command{gettext}, riconoscendo che
-continuare a immettere @samp{gettext(@dots{})} @`e sia faticoso che poco
-elegante da vedere, usano la macro @samp{_} (un trattino basso) per
-facilitare la cosa:
-
-@example
-/* Nel file di intestazione standard: */
-#define _(str) gettext(str)
-
-/* Nel testo del programma: */
-printf("%s", _("Don't Panic!\n"));
-@end example
-
-@cindex internazionalizzazione, localizzazione, categorie di localizzazione
-@cindex @command{gettext}, libreria, categorie di localizzazione
-@cindex libreria @command{gettext}, categorie di localizzazione
-@cindex categorie di localizzazione
-@noindent
-Questo permette di ridurre la digitazione extra a solo tre caratteri per
-ogni stringa da tradurre e inoltre migliora di molto la leggibit@`a.
-
-Ci sono @dfn{categorie} di localizzazione per tipi diversi di informazioni
-legate a una particolare localizzazione.
-Le categorie di localizzazione note a @command{gettext} sono:
-
-@table @code
-@cindex @code{LC_MESSAGES}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_MESSAGES}
-@item LC_MESSAGES
-Testo dei messaggi. Questa @`e la categoria di default usata all'interno di
-@command{gettext}, ma @`e possibile specificarne esplicitamente una differente,
-se necessario. (Questo non @`e quasi mai necessario.)
-
-@cindex ordinare caratteri in lingue differenti
-@cindex @code{LC_COLLATE}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_COLLATE}
-@item LC_COLLATE
-Informazioni sull'ordinamento alfabetico (cio@`e, come caratteri diversi e/o
-gruppi di carattere sono ordinati in un dato linguaggio).
-@c ad esempio i vari caratteri accentati in italiano, vanno ordinati
-@c insieme alla loro lettera "principale" (e @`e @'e).
-
-@cindex @code{LC_CTYPE}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_CTYPE}
-@item LC_CTYPE
-Informazioni sui singoli caratteri (alfabetico, numerico, maiuscolo
-o minuscolo, etc.), come pure sulla codifica dei caratteri.
-@ignore
-In June 2001 Bruno Haible wrote:
-- Description of LC_CTYPE: It determines both
- 1. character encoding,
- 2. character type information.
- (For example, in both KOI8-R and ISO-8859-5 the character type information
- is the same - cyrillic letters could as 'alpha' - but the encoding is
- different.)
-@end ignore
-Quest'informazione @`e utilizzata per stabilire le classi di caratteri come
-definite nello standard POSIX, nelle espressioni regolari,
-come p. es. @code{/[[:alnum:]]/}
-(@pxref{Espressioni tra parentesi quadre}).
-
-@cindex informazioni di tipo monetario, localizzazione
-@cindex monete, simboli di, nella localizzazione
-@cindex simboli di monete, nella localizzazione
-@cindex monete, rappresentazioni di, nella localizzazione
-@cindex rappresentazioni di monete, nella localizzazione
-@cindex @code{LC_MONETARY}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_MONETARY}
-@item LC_MONETARY
-Le informazioni di tipo monetario, quali il simbolo della moneta, e se
-il simbolo va prima o dopo il valore numerico.
-
-@cindex @code{LC_NUMERIC}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_NUMERIC}
-@item LC_NUMERIC
-Informazioni di tipo numerico, quali il carattere da usare per separare le
-cifre decimali e quello per separare le migliaia.@footnote{Gli americani usano
-una virgola ogni tre cifre decimali, e un punto per separare la parte decimale
-di un numero, mentre molti europei (fra cui gli italiani) fanno esattamente
-l'opposto: 1,234.56 invece che 1.234,56.}
-
-@cindex tempo, localizzazione e
-@cindex date, informazioni relative alla localizzazione
-@cindex @code{LC_TIME}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_TIME}
-@item LC_TIME
-Informazioni relative alle date e alle ore,
-come l'uso di ore nel formato a 12 ore oppure a 24 ore, il mese stampato
-prima o dopo il giorno in una data, le abbreviazioni dei mesi nella lingua
-locale, e cos@`{@dotless{i}} via.
-
-@cindex @code{LC_ALL}, categoria di localizzazione
-@cindex categoria di localizzazione @code{LC_ALL}
-@item LC_ALL
-Tutte le categorie viste sopra. (Non molto utile nel contesto del comando
-@command{gettext}.)
-@end table
-
-@quotation NOTA
-@cindex @env{LANGUAGE}, variabile d'ambiente
-@cindex variabile d'ambiente @env{LANGUAGE}
-Come descritto in @ref{Localizzazioni}, le variabili d'ambiente
-che hanno lo stesso nome delle categorie di localizzazione
-(@env{LC_CTYPE}, @env{LC_ALL}, etc.) influenzano il comportamento di
-@command{gawk} (e quello di altri programmi di utilit@`a).
-
-Solitamente, queste variabili influenzano anche il modo con cui
-la libreria @code{gettext} trova le traduzioni. Tuttavia, la
-variabile d'ambiente @env{LANGUAGE} prevale sulle variabili
-della famiglia @env{LC_@var{xxx}}. Molti sistemi GNU/Linux possono
-aver definito questa variabile senza esplicitamente notificarlo
-all'utente, e questo potrebbe far s@`{@dotless{i}} che @command{gawk} non riesca a
-trovare le traduzioni corrette. Se si incontra questa situazione,
-occorre controllare se la variabile d'ambiente @env{LANGUAGE} @`e
-definita, e, in questo caso, va usato il comando @command{unset}
-per rimuoverla.
-@end quotation
-
-Per il test di traduzioni dei messaggi inviati da @command{gawk} stesso, si pu@`o
-impostare la variabile d'ambiente @env{GAWK_LOCALE_DIR}. Si veda la
-documentazione per la funzione C @code{bindtextdomain()}, e si veda anche
-@ref{Altre variabili d'ambiente}.
-
-@node I18N per programmatore
-@section Internazionalizzare programmi @command{awk}
-@cindex programmi @command{awk}, internazionalizzare
-@cindex internazionalizzazione di programmi @command{awk}
-
-@command{gawk} prevede le seguenti variabili per l'internazionalizzazione:
-
-@table @code
-@cindex @code{TEXTDOMAIN}, variabile
-@cindex variabile @code{TEXTDOMAIN}
-@item TEXTDOMAIN
-Questa variabile indica il dominio di testo dell'applicazione.
-Per compatibilit@`a con il comando GNU @command{gettext}, il valore di default
-@`e @code{"messages"}.
-
-@cindex internazionalizzazione, localizzazione, stringhe marcate
-@cindex stringhe, marcare per localizzazione
-@item _"questo @`e un messaggio da tradurre"
-Costanti di tipo stringa marcate con un trattino basso iniziale
-sono candidate per essere tradotte al momento dell'esecuzione del
-programma @command{gawk}.
-Costanti di tipo stringa non precedute da un trattino basso non
-verranno tradotte.
-@end table
-
-@command{gawk} fornisce le seguenti funzioni al servizio
-dell'internazionalizzazione:
-
-@table @code
-@cindexgawkfunc{dcgettext}
-@item @code{dcgettext(@var{string}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
-Restituisce la traduzione di @var{stringa} nel
-dominio di testo @var{dominio} per la categoria di localizzazione @var{categoria}.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-Se si assegna un valore a @var{categoria}, dev'essere una stringa uguale a
-una delle categorie di localizzazione note, descritte
-@ifnotinfo
-nella precedente @value{SECTION}.
-@end ifnotinfo
-@ifinfo
-@ref{Utilizzare @command{gettext}}.
-@end ifinfo
-Si deve anche specificare un dominio di testo. Si usi @code{TEXTDOMAIN} se
-si desidera usare il dominio corrente.
-
-@quotation ATTENZIONE
-L'ordine degli argomenti per la versione @command{awk}
-della funzione @code{dcgettext()} @`e differente, per una scelta di progetto,
-dall'ordine degli argomenti passati alla funzione C che ha lo stesso nome.
-L'ordine della versione @command{awk} @`e stato scelto per amore di
-semplicit@`a e per consentire di avere dei valori di default per gli
-argomenti che fossero il pi@`u possibile simili, come stile, a quello di
-@command{awk}.
-@end quotation
-
-@cindexgawkfunc{dcngettext}
-@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
-Restituisce la forma, singolare o plurale, da usare a seconda del valore
-di @var{numero} per la
-traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
-@var{dominio} per la categoria di localizzazione @var{categoria}.
-@var{stringa1} @`e la variante al singolare in inglese di un messaggio,
-e @var{stringa2} @`e la variante al plurale in inglese dello stesso messaggio.
-Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
-Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
-
-Valgono le stesse osservazioni riguardo all'ordine degli argomenti
-fatte a proposito della funzione @code{dcgettext()}.
-
-@cindex @code{.gmo}, file, specificare la directory di
-@cindex file @code{.gmo}, specificare la directory di
-@cindex @dfn{message object} file (.mo), specificare la directory di
-@cindex file, @dfn{message object} (.mo), specificare la directory di
-@cindexgawkfunc{bindtextdomain}
-@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio} ]@code{)}
-Cambia la directory nella quale
-@command{gettext} va a cercare i file @file{.gmo}, per il caso in cui questi
-non possano risiedere nelle posizioni standard
-(p.es., in fase di test).
-Restituisce la directory alla quale @var{dominio} @`e ``collegato''.
-
-Il @var{dominio} di default @`e il valore di @code{TEXTDOMAIN}.
-Se l'argomento @var{directory} @`e impostato alla stringa nulla (@code{""}),
-@code{bindtextdomain()} restituisce il collegamento corrente applicabile
-al @var{dominio} specificato.
-@end table
-
-Per usare queste funzionalit@`a in un programma @command{awk},
-va seguita la procedura qui indicata:
-
-@enumerate
-@cindex @code{BEGIN}, criterio di ricerca, variabile @code{TEXTDOMAIN} e
-@cindex criterio di ricerca @code{BEGIN}, variabile @code{TEXTDOMAIN} e
-@cindex @code{TEXTDOMAIN}, variabile, criterio di ricerca @code{BEGIN} e
-@cindex variabile @code{TEXTDOMAIN}, criterio di ricerca @code{BEGIN} e
-@item
-Impostare la variabile @code{TEXTDOMAIN} al dominio di testo del
-programma. @`E meglio fare ci@`o all'interno di una regola @code{BEGIN}
-(@pxref{BEGIN/END}),
-ma si pu@`o anche fare dalla riga di comando, usando l'opzione @option{-v}
-(@pxref{Opzioni}):
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide"
- @dots{}
-@}
-@end example
-
-@cindex @code{_} (trattino basso), stringa traducibile
-@cindex trattino basso (@code{_}), stringa traducibile
-@item
-Marcare tutte le stringhe traducibili anteponendo loro un
-trattino basso (@samp{_}). Il trattino @emph{deve} essere adiacente ai
-doppi apici di apertura della stringa. Per esempio:
-
-@example
-print _"hello, world"
-x = _"you goofed"
-printf(_"Number of users is %d\n", nusers)
-@end example
-
-@item
-Se le stringhe da visualizzare sono create dinamicamente, @`e ancora possibile
-tradurle, usando la funzione predefinita @code{dcgettext()}:@footnote{I miei
-ringraziamenti a Bruno Haible per questo esempio.}
-
-@example
-if (assonnato)
- messaggio = dcgettext("%d clienti mi scocciano\n", "adminprog")
-else
- messaggio = dcgettext("mi diverto con %d clienti\n", "adminprog")
-printf(messaggio, numero_clienti)
-@end example
-
-In questo esempio, la chiamata a @code{dcgettext()} specifica un diverso
-dominio di testo (@code{"adminprog"}) in cui trovare il
-messaggio, ma usa la categoria di default @code{"LC_MESSAGES"}.
-
-Il precedente esempio funziona solo se @code{numero_clienti} @`e un numero maggiore
-di uno.
-Per questo esempio sarebbe pi@`u appropriato usare la funzione @code{dcngettext()}:
-
-@example
-if (assonnato)
- messaggio = dcngettext("%d cliente mi scoccia\n",
- "%d clienti mi scocciano\n",
- numero_clienti, "adminprog")
-else
- messaggio = dcngettext("mi diverto con %d cliente\n",
- "mi diverto con %d clienti\n",
- numero_clienti, "adminprog")
-printf(messaggio, numero_clienti)
-@end example
-
-
-@cindex @code{LC_MESSAGES}, categoria di localizzazione, funzione @code{bindtextdomain()} di (@command{gawk})
-@item
-In fase di sviluppo, si pu@`o scegliere di tenere il file @file{.gmo}
-in una directory a parte, solo per provarlo. Ci@`o si fa
-con la funzione predefinita @code{bindtextdomain()}:
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide" # dominio di testo regolare
- if (Testing) @{
- # dove trovare il file in prova
- bindtextdomain("testdir")
- # joe si occupa del programma adminprog
- bindtextdomain("../joe/testdir", "adminprog")
- @}
- @dots{}
-@}
-@end example
-
-@end enumerate
-
-@xref{Esempio I18N}
-per un programma di esempio che illustra i passi da seguire per creare
-e usare traduzioni nei programmi @command{awk}.
-
-@node I18N per traduttore
-@section Traduzione dei programmi @command{awk}
-
-@cindex @code{.po}, file
-@cindex file @code{.po}
-@cindex @dfn{portable object} file (.po)
-@cindex file, @dfn{portable object} (.po)
-Dopo aver marcato le stringhe che si desidera tradurre in un programma,
-queste vanno estratte per creare il file iniziale @file{.pot}.
-Durante la traduzione, @`e spesso utile modificare l'ordine nel quale
-gli argomenti passati a @code{printf} vengono stampati.
-
-L'opzione da riga di comando @option{--gen-pot} di @command{gawk} serve a
-estrarre i messaggi, ed @`e esposta qui di seguito.
-Dopo di che, verr@`a illustrata la possibilit@`a di modificare l'ordine
-in cui l'istruzione @code{printf} stampa gli argomenti che le sono passati
-in fase di esecuzione.
-
-@menu
-* Estrazione di stringhe:: Estrarre stringhe marcate.
-* Ordinamento di printf:: Riordinare argomenti @code{printf}
-* Portabilit@`a nell'I18N:: Problemi di portabilit@`a a livello di @command{awk}.
-@end menu
-
-@node Estrazione di stringhe
-@subsection Estrarre stringhe marcate
-@cindex stringhe, estrazione di
-@cindex stringhe marcate, estrazione di
-@cindex @option{--gen-pot}, opzione
-@cindex opzione @option{--gen-pot}
-@cindex opzioni sulla riga di comando, estrazione stringhe
-@cindex riga di comando, opzioni, estrazione stringhe
-@cindex stringhe marcate, estrazione di (internazionalizzazione)
-@cindex marcate, estrazione di stringhe (internazionalizzazione)
-@cindex estrazione di stringhe marcate (internazionalizzazione)
-
-@cindex @option{--gen-pot}, opzione
-@cindex opzione @option{--gen-pot}
-Una volta che il programma @command{awk} funziona, e tutte le stringhe
-sono state marcate ed @`e stato impostato (e forse fissato) il dominio di
-testo, @`e ora di preparare le traduzioni.
-Per prima cosa, usando l'opzione di riga di comando @option{--gen-pot},
-si crea il file iniziale @file{.pot}:
-
-@example
-gawk --gen-pot -f guide.awk > guide.pot
-@end example
-
-@cindex @code{xgettext}, programma di utilit@`a
-@cindex programma di utilit@`a @code{xgettext}
-Quando viene chiamato specificando @option{--gen-pot}, @command{gawk} non
-esegue il programma. Il programma viene esaminato come al solito, e tutte
-le stringhe che sono state marcate per essere tradotte vengono scritte nello
-standard output, nel formato di un file Portable Object di GNU
-@command{gettext}.
-L'output comprende anche quelle stringhe costanti che appaiono come primo
-argomento della funzione @code{dcgettext()} o come primo e secondo
-argomento della funzione @code{dcngettext()}.@footnote{Il comando di utilit@`a
-@command{xgettext} che fa parte del pacchetto distribuito come
-@command{gettext} @`e in grado di gestire i file di tipo @file{.awk}.}
-Il file @file{.pot} cos@`{@dotless{i}} generato
-andrebbe distribuito insieme al programma @command{awk}; i traduttori
-potranno eventualmente utilizzarlo per preparare delle traduzioni, le quali
-potranno a loro volta essere distribuite.
-@xref{Esempio I18N}
-per una lista esauriente dei passi necessari per creare e testare
-traduzioni per il programma @command{guide}.
-
-@node Ordinamento di printf
-@subsection Riordinare argomenti di @code{printf}
-
-@cindex @code{printf}, istruzione, specificatori di posizione
-@cindex istruzione @code{printf}, specificatori posizionali
-@cindex posizionali, specificatori, istruzione @code{printf}
-@cindex specificatori posizionali, istruzione @code{printf}
-Le stringhe di formattazione per @code{printf} e @code{sprintf()}
-(@pxref{Printf})
-hanno un problema speciale con le traduzioni.
-Si consideri il seguente esempio:@footnote{Questo esempio @`e preso in
-prestito dal manuale del comando GNU @command{gettext}.}
-
-@example
-printf(_"String `%s' has %d characters\n",
- string, length(string)))
-@end example
-
-Una possibile traduzione in italiano di questo messaggio potrebbe essere:
-
-@example
-"%d @`e la lunghezza della stringa `%s'\n"
-@end example
-
-Il problema dovrebbe essere ovvio: l'ordine delle specifiche di
-formattazione @`e differente da quello originale!
-@code{gettext()}, che pure pu@`o restituire la stringa tradotta
-in fase di esecuzione, non @`e in grado di cambiare l'ordine degli argomenti
-nella chiamata a @code{printf}.
-
-Per risolvere questo problema, gli specificatori di formato di @code{printf}
-possono avere un elemento in pi@`u, facoltativo, detto @dfn{specificatore
-posizionale}. Per esempio:
-
-@example
-"%2$d @`e la lunghezza della stringa `%1$s'\n"
-@end example
-
-Qui, lo specificatore posizionale consiste in un numero intero, che indica
-quale argomento utilizzare, seguito da un carattere @samp{$}.
-I numeri partono da uno, e la stringa di formattazione vera e propria
-@emph{non} @`e inclusa. Quindi, nell'esempio seguente, @samp{stringa} @`e
-il primo argomento e @samp{length(stringa)} @`e il secondo:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{stringa = "Non v\47allarmate!"}
-> @kbd{printf "%2$d caratteri compongono \"%1$s\"\n",}
-> @kbd{stringa, length(stringa)}
-> @kbd{@}'}
-@print{} 16 caratteri compongono "Non v\47allarmate!"
-@end example
-
-Se presenti, gli specificatori posizionali precedono, nella specifica di
-formato, i flag, la larghezza del campo e/o la precisione.
-
-Gli specificatori posizionali possono essere usati anche se si specifica una
-larghezza dinamica dei campi, e della capacit@`a di precisione:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{printf("%*.*s\n", 10, 20, "hello")}
-> @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")}
-> @kbd{@}'}
-@print{} hello
-@print{} hello
-@end example
-
-@quotation NOTA
-Se si usa @samp{*} con uno specificatore posizionale, il carattere @samp{*}
-viene per primo, seguito dal numero che indica la posizione, a sua volta
-seguito dal @samp{$}.
-Ci@`o pu@`o parere poco intuitivo.
-@end quotation
-
-@cindex istruzione @code{printf}, specificatori posizionali, frammisti a formati standard
-@cindex @code{printf}, istruzione, specificatori posizionali, frammisti a formati standard
-@cindex specificatori posizionali, istruzione @code{printf}, frammisti a formati standard
-@cindex formato, specificatori di, frammisti a specificatori posizionali non standard
-@cindex specificatori di formato, frammisti a specificatori posizionali non standard
-@command{gawk} non consente di mischiare specificatori di formato standard
-con altri contenenti degli specificatori posizionali in una stessa stringa di
-formato:
-
-@example
-$ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "ciao" @}'}
-@error{} gawk: riga com.:1: fatale: `count$' va usato per tutti
-@error{} i formati o per nessuno
-@end example
-
-@quotation NOTA
-Ci sono alcuni casi patologici in cui @command{gawk} potrebbe non inviare
-alcun messaggio diagnostico, anche quando sarebbe necessario.
-In tali casi, l'output pu@`o non essere quello atteso.
-Rimane sempre una pessima idea quella di tentare di mischiare i formati,
-anche se @command{gawk} non riesce ad accorgersene.
-@end quotation
-
-Sebbene gli specificatori posizionali possano essere usati direttamente nei
-programmi @command{awk}, il motivo per cui sono stati introdotti @`e perch@'e
-siano d'aiuto nel produrre traduzioni corrette della stringa di
-formattazione in lingue differenti da quella nella quale il programma @`e stato
-originariamente scritto.
-
-@node Portabilit@`a nell'I18N
-@subsection Problemi di portabilit@`a a livello di @command{awk}
-
-@cindex portabilit@`a, internazionalizzazione e
-@cindex internazionalizzazione, localizzazione, portabilit@`a e
-Le funzionalit@`a di internazionalizzazione di @command{gawk} sono state
-appositamente implementate per avere il minimo impatto possibile sulla
-portabilit@`a, verso altre versioni di @command{awk}, dei programmi
-@command{awk} che ne fanno uso.
-Si consideri questo programma:
-
-@example
-BEGIN @{
- TEXTDOMAIN = "guide"
- if (Test_Guide) # da impostare tramite -v
- bindtextdomain("/test/guide/messages")
- print _"don't panic!"
-@}
-@end example
-
-@noindent
-Per il modo in cui @`e scritto, non funzioner@`a con altre versioni di
-@command{awk}.
-Tuttavia, @`e in realt@`a quasi portabile, e richiede modifiche minime:
-
-@itemize @value{BULLET}
-@cindex @code{TEXTDOMAIN}, variabile, portabilit@`a e
-@cindex variabile @code{TEXTDOMAIN}, portabilit@`a e
-@item
-Le assegnazioni di valori a @code{TEXTDOMAIN} non avranno effetto alcuno,
-perch@'e @code{TEXTDOMAIN} non @`e una variabile speciale in altre
-implementazioni di @command{awk}.
-
-@item
-Versioni Non-GNU di @command{awk} considerano le stringhe marcate
-come la concatenazione di una variabile di nome @code{_} con la stringa che
-viene subito dopo.@footnote{Questo @`e
-un buon materiale per una gara di ``Oscurit@`a @command{awk}''.}
-Tipicamente, la variabile @code{_} ha come valore la stringa nulla
-(@code{""}), il che produce come risultato la stringa
-originale.
-
-@item
-Definendo delle funzioni ``fittizie'' per sostituire @code{dcgettext()},
-@code{dcngettext()} e @code{bindtextdomain()}, il programma @command{awk}
-pu@`o essere reso eseguibile, ma
-tutti i messaggi verranno inviati nella lingua originale del programma.
-Per esempio:
-
-@cindex @code{bindtextdomain()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{bindtextdomain()} (@command{gawk}), portabilit@`a e
-@cindex @code{dcgettext()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{dcgettext()} (@command{gawk}), portabilit@`a e
-@cindex @code{dcngettext()}, funzione (@command{gawk}), portabilit@`a e
-@cindex funzione @code{dcngettext()} (@command{gawk}), portabilit@`a e
-@example
-@c file eg/lib/libintl.awk
-function bindtextdomain(dir, domain)
-@{
- return dir
-@}
-
-function dcgettext(string, domain, category)
-@{
- return string
-@}
-
-function dcngettext(string1, string2, number, domain, category)
-@{
- return (number == 1 ? string1 : string2)
-@}
-@c endfile
-@end example
-
-@item
-L'uso di specificazioni posizionali in @code{printf} o
-@code{sprintf()} @emph{non} @`e portabile.
-Per supportare @code{gettext()} nella programmazione in linguaggio C,
-molte versioni C di @code{sprintf()} supportano specificatori posizionali.
-Ma la cosa funziona solo se nella chiamata di funzione sono stati specificati
-argomenti a sufficienza. Molte
-versioni di @command{awk} passano i formati e gli argomenti di @code{printf},
-senza modificarli, alla funzione di libreria in linguaggio C @code{sprintf()},
-ma solo un formato e un argomento alla volta. Quel che succede se si usa una
-specificazione posizionale resta indeterminato.
-Tuttavia, poich@'e le specificazioni posizionali sono usate principalmente
-per le stringhe di formattazione @emph{tradotte}, e poich@'e le versioni
-non-GNU di @command{awk} non utilizzano mai le stringhe tradotte, ci@`o non
-dovrebbe, in pratica, causare problemi.
-@end itemize
-
-@node Esempio I18N
-@section Un semplice esempio di internazionalizzazione.
-
-Vediamo ora un esempio dettagliato di come internazionalizzare e localizzare
-un semplice programma @command{awk}, usando come nostro programma sorgente
-originale il file @file{guide.awk}:
-
-@example
-@c file eg/prog/guide.awk
-BEGIN @{
- TEXTDOMAIN = "guide"
- bindtextdomain(".") # per la fase di test
- print _"Don't Panic"
- print _"The Answer Is", 42
- print "Pardon me, Zaphod who?"
-@}
-@c endfile
-@end example
-
-@noindent
-Eseguire @samp{gawk --gen-pot} per creare il file @file{.pot}:
-
-@example
-$ @kbd{gawk --gen-pot -f guide.awk > guide.pot}
-@end example
-
-@noindent
-Questo produce:
-
-@example
-@c file eg/data/guide.po
-#: guide.awk:4
-msgid "Don't Panic"
-msgstr ""
-
-#: guide.awk:5
-msgid "The Answer Is"
-msgstr ""
-
-@c endfile
-@end example
-
-Questo modello di @dfn{portable object} va salvato e riutilizzato per ogni
-lingua in cui l'applicazione viene tradotta. La stringa @code{msgid} @`e
-seguita dalla stringa originale da tradurre, e la stringa @code{msgstr}
-conterr@`a la traduzione.
-
-@quotation NOTA
-Le stringhe non aventi come prefisso un trattino basso non sono inserite
-nel file @file{guide.pot}.
-@end quotation
-
-Successivamente, i messaggi devono essere tradotti.
-Questa @`e una traduzione in un ipotetico dialetto dell'inglese,
-chiamato ``Mellow'':@footnote{Forse sarebbe meglio chiamarlo
-``Hippy.'' Meglio non indagare oltre.}
-
-@example
-@group
-$ @kbd{cp guide.pot guide-mellow.po}
-@var{Aggiungere traduzioni al file} guide-mellow.po @dots{}
-@end group
-@end example
-
-@noindent
-Ecco le traduzioni:
-
-@example
-@c file eg/data/guide-mellow.po
-#: guide.awk:4
-msgid "Don't Panic"
-msgstr "Hey man, relax!"
-
-#: guide.awk:5
-msgid "The Answer Is"
-msgstr "Like, the scoop is"
-
-@c endfile
-@end example
-
-@cindex Linux
-@cindex GNU/Linux
-Il passo successivo @`e di creare la directory che contenga il file binario
-con le traduzioni dei messaggi (file .mo [message object]) e
-creare in quella directory il file @file{guide.mo}.
-Si presume che il file in questione debba essere usato nella localizzazione
-@code{en_US.UTF-8}, perch@'e si deve usare un nome di localizzazione che sia
-noto alle routine del comando C @command{gettext}.
-La disposizione delle directory qui utilizzata @`e standard per il comando
-GNU @command{gettext} sui sistemi GNU/Linux. Altre versioni di
-@command{gettext} possono usare una disposizione differente:
-
-@example
-$ @kbd{mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES}
-@end example
-
-@cindex @code{.po}, file, conversione in @code{.mo}
-@cindex file @code{.po}, conversione in @code{.mo}
-@cindex @code{.mo}, file, conversione da @code{.po}
-@cindex file @code{.mo}, conversione da @code{.po}
-@cindex @dfn{portable object} file (.po), conversione in @dfn{message object} file
-@cindex file, @dfn{portable object} (.po), conversione in @dfn{message object} file
-@cindex @dfn{message object} file (.mo), conversione da @dfn{portable object} file
-@cindex file, @dfn{message object} (.mo), conversione da @dfn{portable object} file
-@cindex @command{msgfmt}, programma di utilit@`a
-@cindex programma di utilit@`a @command{msgfmt}
-Il programma di utilit@`a @command{msgfmt} effettua la conversione dal file
-leggibile, in formato testo, @file{.po} nel file, in formato binario,
-@file{.mo}.
-Per default, @command{msgfmt} crea un file di nome @file{messages}.
-A questo file dev'essere assegnato un nome appropriato, e va messo nella
-directory predisposta (usando l'opzione @option{-o}) in modo che
-@command{gawk} sia in grado di trovarlo:
-
-@example
-$ @kbd{msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo}
-@end example
-
-Infine, eseguiamo il programma per provare se funziona:
-
-@example
-$ @kbd{gawk -f guide.awk}
-@print{} Hey man, relax!
-@print{} Like, the scoop is 42
-@print{} Pardon me, Zaphod who?
-@end example
-
-Se le tre funzioni che rimpiazzano @code{dcgettext()}, @code{dcngettext()},
-e @code{bindtextdomain()}
-(@pxref{Portabilit@`a nell'I18N})
-sono contenute in un file di nome @file{libintl.awk},
-@`e possibile eseguire @file{guide.awk} senza modificarlo, nel modo seguente:
-
-@example
-$ @kbd{gawk --posix -f guide.awk -f libintl.awk}
-@print{} Don't Panic
-@print{} The Answer Is 42
-@print{} Pardon me, Zaphod who?
-@end example
-
-@node Gawk internazionalizzato
-@section @command{gawk} stesso @`e internazionalizzato
-
-Il comando @command{gawk} stesso @`e stato internazionalizzato
-usando il pacchetto GNU @command{gettext}.
-(GNU @command{gettext} @`e descritto in
-maniera esauriente in
-@ifinfo
-@inforef{Top, , GNU @command{gettext} utilities, gettext, GNU @command{gettext} utilities}.)
-@end ifinfo
-@ifnotinfo
-@uref{http://www.gnu.org/software/gettext/manual/,
-@cite{GNU @command{gettext} utilities}}.)
-@end ifnotinfo
-Al momento in cui questo libro @`e stato scritto, la versione pi@`u recente di
-GNU @command{gettext} @`e
-@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.19.4.tar.gz,
-@value{PVERSION} 0.19.4}.
-
-Se esiste una traduzione dei messaggi di @command{gawk},
-@command{gawk} invia messaggi, avvertimenti, ed errori fatali
-utilizzando la lingua locale.
-
-@node Sommario I18N
-@section Sommario
-@itemize @value{BULLET}
-@item
-Internazionalizzazione significa scrivere un programma in modo che
-possa interagire in molte lingue senza che sia necessario cambiare il codice
-sorgente.
-Localizzazione significa fornire i dati necessari perch@'e un programma
-internazionalizzato possa interagire usando una determinata lingua.
-
-@item
-@command{gawk} usa il comando GNU @command{gettext} per consentire
-l'internazionalizzazione e la localizzazione di programmi @command{awk}.
-Un dominio di testo di un programma identifica il programma, e consente di
-raggruppare tutti i messaggi e gli altri dati del programma in un solo posto.
-
-@item
-Si marcano le stringhe in un programma da tradurre preponendo loro un
-trattino basso. Una volta fatto questo, queste stringhe sono estratte
-in un file @file{.pot}. Questo file @`e copiato, per ogni lingua, in un file
-@file{.po} e i file @file{.po} sono
-compilati in file @file{.gmo} che saranno usati in fase di
-esecuzione del programma.
-
-@item
-@`E possibile usare specificazioni posizionali con le istruzioni
-@code{sprintf()} e @code{printf} per modificare la posizione del valore
-degli argomenti nelle stringhe di formato e nell'output. Ci@`o @`e utile nella
-traduzione di stringhe di
-formattazione dei messaggi.
-
-@item
-Le funzionalit@`a di internazionalizzazione sono state progettate in modo
-da poter essere facilmente gestite in un programma @command{awk} standard.
-
-@item
-Anche il comando @command{gawk} @`e stato internazionalizzato e viene
-distribuito con traduzioni in molte lingue dei messaggi inviati in fase di
-esecuzione.
-
-@end itemize
-
-
-@node Debugger
-@chapter Effettuare il debug dei programmi @command{awk}
-@cindex debug dei programmi @command{awk}
-
-@c The original text for this chapter was contributed by Efraim Yawitz.
-@c FIXME: Add more indexing.
-
-Sarebbe bello se i programmi per il calcolatore funzionassero perfettamente la
-prima volta che vengono eseguiti, ma nella vita reale questo accade raramente,
-qualunque sia la complessit@`a dei programmi. Perci@`o la maggior parte dei
-linguaggi di programmazione hanno a disposizione degli strumenti che facilitano
-la ricerca di errori (@dfn{debugging}) nei programmi, e @command{awk} non fa
-eccezione.
-
-Il @dfn{debugger} di @command{gawk} @`e di proposito costruito sul modello del
-debugger da riga di comando
-@uref{http://www.gnu.org/software/gdb/, GNU Debugger (GDB)}.
-Se si ha familiarit@`a con GDB, sar@`a facile imparare come usare @command{gawk}
-per eseguire il debug dei propri programmi.
-
-@menu
-* Debugging:: Introduzione al debugger di @command{gawk}.
-* Esempio di sessione di debug:: Esempio di sessione di debug.
-* Lista dei comandi di debug:: Principali comandi di debug.
-* Supporto per Readline:: Supporto per Readline.
-* Limitazioni:: Limitazioni e piani per il futuro.
-* Sommario sul debug:: Sommario sul debug.
-@end menu
-
-@node Debugging
-@section Introduzione al debugger di @command{gawk}
-
-Questa @value{SECTION}, dopo un'introduzione sul debug in generale, inizia
-la trattazione del debug in @command{gawk}.
-
-@menu
-* Nozioni sul debug:: Generalit@`a sul debug.
-* Terminologia nel debug:: Ulteriori nozioni sul debug.
-* Debug di Awk:: Eseguire il debug di Awk.
-@end menu
-
-@node Nozioni sul debug
-@subsection Generalit@`a sul debug
-
-(Se si sono usati dei debugger in altri linguaggi, si pu@`o andare direttamente
-alla @ref{Debug di Awk}.)
-
-Naturalmente, un programma di debug non pu@`o correggere gli errori al posto del
-programmatore, perch@'e non pu@`o sapere quello che il programmatore o gli utenti
-considerano un ``bug'' e non una ``funzionalit@`a''. (Talvolta, anche noi umani
-abbiamo difficolt@`a nel determinarlo.)
-In quel caso, cosa ci si pu@`o aspettare da un tale strumento? La risposta
-dipende dal linguaggio su cui si effettua il debug, comunque in generale ci si
-pu@`o attendere almeno questo:
-
-@itemize @value{BULLET}
-@item
-La possibilit@`a di osservare l'esecuzione delle istruzioni di un programma una
-per una, dando al programmatore l'opportunit@`a di pensare a quel che accade a
-una scala temporale di secondi, minuti od ore, piuttosto che alla scala dei
-nanosecondi alla quale normalmente viene eseguito il codice.
-
-@item
-L'opportunit@`a, non solo di osservare passivamente le operazioni del progamma,
-ma di controllarlo e tentare diversi percorsi di esecuzione, senza dover
-modificare i file sorgenti.
-
-@item
-La possibilit@`a di vedere i valori o i dati nel programma in qualsiasi punto
-dell'esecuzione, e anche di cambiare i dati al volo, per vedere come questo
-influisca su ci@`o che accade dopo. (Questo include spesso la capacit@`a di
-esaminare le strutture interne dei dati oltre alle variabili che
-sono state effettivamente definite nel codice del programma.)
-
-@item
-La possibilit@`a di ottenere ulteriori informazioni sullo stato del programma
-o anche sulle sue strutture interne.
-@end itemize
-
-Tutti questi strumenti sono di grande aiuto e permettono di usare l'abilit@`a
-che si possiede e la comprensione che si ha degli obiettivi del programma
-per trovare dove si verificano i problemi (o, in alternativa, per
-comprendere meglio la logica di un programma funzionante, di cui si sia
-l'autore, o anche di un programma scritto da altri).
-
-@node Terminologia nel debug
-@subsection Concetti fondamentali sul debug
-
-Prima di entrare nei dettagli, dobbiamo introdurre diversi
-importanti concetti che valgono per tutti i debugger.
-La seguente lista definisce i termini usati nel resto di
-questo @value{CHAPTER}:
-
-@table @dfn
-@cindex @dfn{stack frame}
-@item Stack frame
-Durante la loro esecuzione i programmi normalmente chiamano delle funzioni.
-Una funzione pu@`o a sua volta chiamarne un'altra, o pu@`o richiamare se stessa
-(ricorsione). La
-catena di funzioni chiamate (il programma principale chiama A, che chiama B,
-che chiama C) pu@`o essere vista come una pila di funzioni in esecuzione: la
-funzione correntemente in esecuzione @`e quella in cima alla pila, e quando
-questa finisce (ritorna al chiamante),
-quella immediatamente sotto diventa la funzione
-attiva. Tale pila (@dfn{stack}) @`e chiamata @dfn{call stack} (pila delle chiamate).
-
-Per ciascuna funzione della pila delle chiamate (@dfn{call stack}), il sistema
-mantiene un'area di dati che contiene i parametri della funzione, le variabili
-locali e i valori di ritorno, e anche ogni altra informazione ``contabile''
-necessaria per gestire la pila delle chiamate. Quest'area di dati @`e chiamata
-@dfn{stack frame}.
-
-Anche @command{gawk} segue questo modello, e permette l'accesso alla pila
-delle chiamate e a ogni @dfn{stack frame}. @`E possibile esaminare la pila
-delle chiamate, e anche sapere da dove ciascuna funzione sulla pila @`e stata
-invocata. I comandi che stampano la pila delle chiamate stampano anche le
-informazioni su ogni @dfn{stack frame} (come vedremo pi@`u avanti in dettaglio).
-
-@item Punto d'interruzione
-@cindex breakpoint
-@cindex punto d'interruzione
-Durante le operazioni di debug, spesso si preferisce lasciare che il programma
-venga eseguito finch@'e non raggiunge un certo punto, e da quel punto in poi si
-continua l'esecuzione un'istruzione alla volta. Il modo per farlo @`e quello di
-impostare un @dfn{punto d'interruzione} all'interno del programma. Un punto
-d'interruzione @`e il punto dove l'esecuzione del programma dovrebbe
-interrompersi (fermarsi), in modo da assumere il controllo dell'esecuzione del
-programma. Si possono aggiungere e togliere quanti punti d'interruzione si
-vogliono.
-
-@item Punto d'osservazione
-@cindex @dfn{watchpoint}
-@cindex punto d'osservazione
-Un punto d'osservazione @`e simile a un punto d'interruzione. La differenza @`e
-che i punti d'interruzione sono orientati attorno al codice; fermano il
-programma quando viene raggiunto un certo punto nel codice. Un punto
-d'osservazione, invece, fa fermare il programma quando @`e stato
-cambiato il @emph{valore di un dato}. Questo @`e utile, poich@'e a volte succede
-che una variabile riceva un valore errato, ed @`e difficile rintracciare il punto
-dove ci@`o accade solo leggendo il codice sorgente.
-Usando un punto d'osservazione, si pu@`o fermare il programma in qualunque punto
-vi sia un'assegnazione di variabile, e di solito si individua il codice che
-genera l'errore abbastanza velocemente.
-@end table
-
-@node Debug di Awk
-@subsection Il debug di @command{awk}
-
-Il debug di un programma @command{awk} ha delle particolarit@`a proprie, che
-non sono presenti in programmi scritti in altri linguaggi.
-
-Prima di tutto, il fatto che i programmi @command{awk} ricevano generalmente
-l'input riga per riga da uno o pi@`u file e operino su tali righe usando regole
-specifiche, rende particolarmente agevole organizzare l'esame
-dell'esecuzione del programma facendo riferimento a tali regole.
-Come vedremo, ogni
-regola @command{awk} viene trattata quasi come una chiamata di funzione, col
-proprio specifico blocco di istruzioni.
-
-Inoltre, poich@'e @command{awk} @`e un linguaggio deliberatamente molto
-conciso, @`e facile perdere di vista tutto ci@`o che avviene ``dentro''
-ogni riga di codice @command{awk}. Il debugger d@`a l'opportunit@`a di
-guardare le singole istruzioni primitive la cui esecuzione @`e innescata
-dai comandi di alto livello di @command{awk}.
-
-@node Esempio di sessione di debug
-@section Esempio di sessione di debug di @command{gawk}
-@cindex esempio di sessione di debug
-@cindex debug, esempio di sessione
-
-Per illustrare l'uso di @command{gawk} come debugger, vediamo un esempio di
-sessione di debug. Come esempio verr@`a usata l'implementazione @command{awk}
-del comando POSIX @command{uniq} descritta in precedenza (@pxref{Programma
-uniq}).
-
-@menu
-* Invocazione del debugger:: Come far partire il debugger.
-* Trovare il bug:: Trovare il bug.
-@end menu
-
-@node Invocazione del debugger
-@subsection Come avviare il debugger
-@cindex avviare il debugger
-@cindex debugger, come avviarlo
-@cindex debugger, comandi del, si veda comando del debugger
-
-Per avviare il debugger in @command{gawk} si richiama il comando esattamente
-come al solito, specificando solo un'opzione aggiuntiva,
-@option{--debug}, o la corrispondente opzione breve @option{-D}.
-I file (o il file) che contengono
-il programma e ogni codice ulteriore sono immessi sulla riga di comando come
-argomenti a una o pi@`u opzioni @option{-f}. (@command{gawk} non @`e progettato per
-eseguire il debug di programmi scritti sulla riga di comando, ma solo per
-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}
-@end example
-
-@noindent
-dove entrambi i file @file{getopt.awk} e @file{uniq.awk} sono in @env{$AWKPATH}.
-(Gli utenti esperti di GDB o debugger simili dovrebbero tener presente che
-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.)
-L'opzione @option{-1} @`e un'opzione per @file{uniq.awk}.
-
-Invece di eseguire direttamente il programma sul @file{file_di_input}, come
-@command{gawk} farebbe normalmente, il debugger semplicemente carica
-i file sorgenti del programma, li compila internamente, e poi mostra
-la riga d'invito:
-
-@example
-gawk>
-@end example
-
-@noindent
-da dove si possono impartire i comandi al debugger. Sin qui non @`e
-stato ancora eseguito nessun codice.
-
-@node Trovare il bug
-@subsection Trovare il bug
-
-Poniamo di avere un problema usando (una versione difettosa di)
-@file{uniq.awk} nella modalit@`a ``salta-campi'', perch@'e sembra che non
-catturi le righe che dovrebbero essere identiche dopo aver saltato il primo
-campo, come:
-
-@example
-awk, ecco un programma meraviglioso!
-gawk, ecco un programma meraviglioso!
-@end example
-
-Questo potrebbe accadere se noi pensassimo (come in C) che i campi in un record
-siano numerati prendendo come base lo zero, per cui, invece di scrivere:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file+1, n)
-campi_corrente = join(vettore_corrente, contatore_file+1, m)
-@end example
-
-@noindent
-abbiamo scritto:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file, n)
-campi_corrente = join(vettore_corrente, contatore_file, m)
-@end example
-
-La prima cosa da fare quando si tenta di indagare su un problema come questo @`e
-quella di mettere un punto d'interruzione (@dfn{breakpoint}) nel programma, in modo
-da poterlo vedere al lavoro e catturare quello che non va. Una posizione
-ragionevole per un punto d'interruzione in @file{uniq.awk} @`e all'inizio della
-funzione @code{se_sono_uguali()}, che confronta la riga corrente con la precedente.
-Per impostare il punto d'interruzione, usare il comando @code{b} (@dfn{breakpoint}):
-
-@example
-gawk> @kbd{b se_sono_uguali}
-@print{} Breakpoint 1 impostato al file `uniq.awk', riga 63
-@end example
-
-Il debugger mostra il file e il numero di riga dove si trova il punto
-d'interruzione. Ora bisogna immettere @samp{r} o @samp{run} e il programma
-viene eseguito fino al primo punto d'interruzione:
-
-@example
-gawk> @kbd{r}
-@print{} Partenza del programma:
-@print{} Mi fermo in Rule ...
-@print{} Breakpoint 1, se_sono_uguali(n, m, campi_ultima, campi_corrente,
-@print{} vettore_ultima, vettore_corrente)
-@print{} a `uniq.awk':63
-@print{} 63 if (contatore_file == 0 && conta_caratteri == 0)
-gawk>
-@end example
-
-Ora possiamo osservare cosa accade all'interno del nostro programma.
-Prima di tutto, vediamo come siamo arrivati a questo punto. Sulla riga di
-comando battiamo @samp{bt} (che sta per ``backtrace''), e il debugger risponde
-con un listato degli @dfn{stack frame} correnti:
-
-@example
-gawk> @kbd{bt}
-@print{} #0 se_sono_uguali(n, m, campi_ultima, campi_corrente,
-@print{} vettore_ultima, vettore_corrente)
-@print{} a `uniq.awk':63
-@print{} #1 in main() a `uniq.awk':88
-@end example
-
-Questo ci dice che la funzione @code{se_sono_uguali()} @`e stata chiamata
-dal programma principale alla riga 88 del file @file{uniq.awk}. (Questo non
-sorprende, perch@'e @`e questa l'unica chiamata a @code{se_sono_uguali()} nel
-programma, per@`o in programmi
-pi@`u complessi, sapere chi ha chiamato una funzione e con quali parametri pu@`o
-essere la chiave per trovare l'origine del problema.)
-
-Ora che siamo in @code{se_sono_uguali()}, possiamo iniziare a guardare i valori di
-alcune variabili. Immaginiamo di battere @samp{p n}
-(@code{p} sta per @dfn{print} [stampa]). Ci aspetteremo di vedere il valore di
-@code{n}, un parametro di @code{se_sono_uguali()}. In realt@`a, il debugger
-ci d@`a:
-
-@example
-gawk> @kbd{p n}
-@print{} n = untyped variable
-@end example
-
-@noindent
-In questo caso, @code{n} @`e una variabile locale non inizializzata, perch@'e la
-funzione @`e stata chiamata senza argomenti (@pxref{Chiamate di funzione}).
-
-Una variabile pi@`u utile da visualizzare potrebbe essere la seguente:
-
-@example
-gawk> @kbd{p $0}
-@print{} $0 = "gawk, ecco un programma meraviglioso!"
-@end example
-
-@noindent
-All'inizio questo potrebbe lasciare un tantino perplessi, perch@'e @`e la seconda
-riga dell'input del test. Vediamo @code{NR}:
-
-@example
-gawk> @kbd{p NR}
-@print{} NR = 2
-@end example
-
-@noindent
-Come si pu@`o vedere, @code{se_sono_uguali()} @`e stata chiamata solo per la seconda
-riga del file. Naturalmente, ci@`o accade perch@'e il nostro programma contiene
-una regola per @samp{NR == 1}:
-
-@example
-NR == 1 @{
- ultima = $0
- next
-@}
-@end example
-
-Bene, controlliamo che questa funzioni correttamente:
-
-@example
-gawk> @kbd{p ultima}
-@print{} ultima = "awk, ecco un programma meraviglioso!"
-@end example
-
-Tutto ci@`o che @`e stato fatto fin qui ha verificato che il programma funziona
-come previsto fino alla chiamata a @code{se_sono_uguali()} compresa; quindi
-il problema dev'essere all'interno di questa funzione. Per indagare
-ulteriormente, iniziamo a ``scorrere una ad una'' le righe di
-@code{se_sono_uguali()}. Cominciamo col battere @samp{n} (per ``next''
-[successivo]):
-
-@example
-gawk> @kbd{n}
-@print{} 66 if (contatore_file > 0) @{
-@end example
-
-Questo ci dice che @command{gawk} ora @`e pronto per eseguire la riga 66, che
-decide se assegnare alle righe il trattamento speciale ``salta-campi''
-indicato dall'opzione sulla riga di comando @option{-1}. (Si noti che abbiamo
-saltato da dov'eravamo prima, alla riga 63, a qui, perch@'e la condizione nella
-riga 63, @samp{if (contatore_file == 0 && conta_caratteri == 0)}, era falsa.)
-
-Continuando a scorrere le righe, ora raggiungiamo la divisione del record
-corrente e dell'ultimo:
-
-@example
-gawk> @kbd{n}
-@print{} 67 n = split(ultima, vettore_ultima)
-gawk> @kbd{n}
-@print{} 68 m = split($0, vettore_corrente)
-@end example
-
-A questo punto, potremmo stare a vedere in quante parti il nostro record
-@`e stato suddiviso, quindi proviamo a osservare:
-
-@example
-gawk> @kbd{p n m vettore_ultima vettore_corrente}
-@print{} n = 5
-@print{} m = untyped variable
-@print{} vettore_ultima = array, 5 elements
-@print{} vettore_corrente = untyped variable
-@end example
-
-@noindent
-(Il comando @code{p} pu@`o accettare pi@`u argomenti, analogamente
-all'istruzione di @command{awk} @code{print}.)
-
-Questo ci lascia piuttosto perplessi. Tutto ci@`o che abbiamo trovato @`e che ci
-sono cinque elementi in @code{vettore_ultima}; @code{m} e @code{vettore_corrente} non hanno valori
-perch@'e siamo alla riga 68 che non @`e ancora stata eseguita. Questa
-informazione @`e abbastanza utile (ora sappiamo che nessuna delle parole @`e stata
-lasciata fuori accidentalmente), ma sarebbe desiderabile vedere i valori
-del vettore.
-
-Una prima possibilit@`a @`e quella di usare degli indici:
-
-@example
-gawk> @kbd{p vettore_ultima[0]}
-@print{} "0" non presente nel vettore `vettore_ultima'
-@end example
-
-@noindent
-Oops!
-
-@example
-gawk> @kbd{p vettore_ultima[1]}
-@print{} vettore_ultima["1"] = "awk,"
-@end example
-
-Questo metodo sarebbe piuttosto lento per un vettore con 100 elementi, per cui
-@command{gawk} fornisce una scorciatoia (che fa venire in mente un altro
-linguaggio che non nominiamo):
-
-@example
-gawk> @kbd{p @@vettore_ultima}
-@print{} vettore_ultima["1"] = "awk,"
-@print{} vettore_ultima["2"] = "ecco"
-@print{} vettore_ultima["3"] = "un"
-@print{} vettore_ultima["4"] = "programma"
-@print{} vettore_ultima["5"] = "meraviglioso!"
-@end example
-
-Finora, sembra che tutto vada bene. Facciamo un altro passo,
-o anche due:
-
-@example
-gawk> @kbd{n}
-@print{} 69 campi_ultima = join(vettore_ultima, contatore_file, n)
-gawk> @kbd{n}
-@print{} 70 campi_corrente = join(vettore_corrente, contatore_file, m)
-@end example
-
-Bene, eccoci arrivati al nostro errore (ci spiace di aver rovinato la
-sorpresa).
-Quel che avevamo in mente era di unire i campi a partire dal secondo per
-creare il record virtuale da confrontare, e se il primo campo aveva il numero
-zero, questo avrebbe funzionato. Vediamo quel che abbiamo finora:
-
-@example
-gawk> @kbd{p campi_ultima campi_corrente}
-@print{} campi_ultima = "awk, ecco un programma meraviglioso!"
-@print{} campi_corrente = "gawk, ecco un programma meraviglioso!"
-@end example
-
-Ehi! queste frasi suonano piuttosto familiari! Sono esattamente i nostri
-record di input originali, inalterati. Pensandoci un po' (il cervello umano @`e
-ancora il miglior strumento di debug), ci si rende conto che eravamo fuori di
-uno!
-
-Usciamo dal debugger:
-
-@example
-gawk> @kbd{q}
-@print{} Il programma @`e in esecuzione. Esco comunque (y/n)? @kbd{y}
-@end example
-
-@noindent
-Quindi modifichiamo con un editore di testo:
-
-@example
-campi_ultima = join(vettore_ultima, contatore_file+1, n)
-campi_corrente = join(vettore_corrente, contatore_file+1, m)
-@end example
-
-@noindent
-e il problema @`e risolto!
-
-@node Lista dei comandi di debug
-@section I principali comandi di debug
-
-L'insieme dei comandi del debugger di @command{gawk} pu@`o essere diviso nelle
-seguenti categorie:
-
-@itemize @value{BULLET}
-
-@item
-Controllo di punti d'interruzione
-
-@item
-Controllo di esecuzione
-
-@item
-Vedere e modificare dati
-
-@item
-Lavorare con le pile
-
-@item
-Ottenere informazioni
-
-@item
-Comandi vari
-@end itemize
-
-Ciascuna di esse @`e trattata nelle sottosezioni che seguono.
-Nelle descrizioni seguenti, i comandi che possono essere abbreviati
-mostrano l'abbreviazione su una seconda riga di descrizione.
-Un nome di comando del debugger pu@`o essere anche troncato se la parte gi@`a scritta
-non @`e ambigua. Il debugger ha la capacit@`a predefinita di ripetere
-automaticamente il precedente comando semplicemente battendo @kbd{Invio}.
-Questo vale per i comandi @code{list}, @code{next}, @code{nexti},
-@code{step}, @code{stepi} e @code{continue} quando sono eseguiti senza
-argomenti.
-
-@menu
-* Controllo dei breakpoint:: Controllo dei punti d'interruzione.
-* Controllo esecuzione debugger:: Controllo di esecuzione.
-* Vedere e modificare dati:: Vedere e modificare dati.
-* Stack di esecuzione:: Lavorare con le pile.
-* Informazioni sul debugger:: Ottenere informazioni sullo stato del
- programma e del debugger.
-* Comandi vari del debugger:: Comandi vari del debugger.
-@end menu
-
-@node Controllo dei breakpoint
-@subsection Controllo dei punti d'interruzione
-
-Come abbiamo gi@`a visto, la prima cosa che si dovrebbe fare in una sessione di
-debug @`e quella di definire dei punti d'interruzione, poich@'e altrimenti il
-programma verr@`a eseguito come se non fosse sotto il debugger. I comandi per
-controllare i punti d'interruzione sono:
-
-@table @asis
-@cindex comando del debugger, @code{b} (alias per @code{break})
-@cindex comando del debugger, @code{break}
-@cindex @code{break}, comando del debugger
-@cindex @code{b}, comando del debugger (alias per @code{break})
-@cindex impostare un punto d'interruzione
-@cindex breakpoint, impostare
-@cindex punto d'interruzione (breakpoint), impostare
-@item @code{break} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
-@itemx @code{b} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
-Senza argomenti, imposta un punto d'interruzione alla prossima istruzione
-da eseguire nello @dfn{stack frame} selezionato.
-Gli argomenti possono essere uno dei seguenti:
-
-@c @asis for docbook
-@c nested table
-@table @asis
-@item @var{n}
-Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
-corrente.
-
-@item @var{nome-file}@code{:}@var{n}
-Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
-@var{nome-file}.
-
-@item @var{funzione}
-Imposta un punto d'interruzione all'ingresso (la prima istruzione eseguibile)
-della funzione @var{funzione}.
-@end table
-
-A ogni punto d'interruzione @`e assegnato un numero che pu@`o essere usato per
-cancellarlo dalla lista dei punti d'interruzione usando il comando
-@code{delete}.
-
-Specificando un punto d'interruzione, si pu@`o fornire anche una condizione.
-Questa @`e
-un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger
-valuta ogni volta che viene raggiunto quel punto d'interruzione. Se la
-condizione @`e vera, il debugger ferma l'esecuzione e rimane in attesa di un
-comando. Altrimenti, continua l'esecuzione del programma.
-
-@cindex comando del debugger, @code{clear}
-@cindex @code{clear}, comando del debugger
-@cindex cancellare punto d'interruzione da una determinata posizione
-@cindex punto d'interruzione in una determinata posizione, come cancellare
-@cindex breakpoint, come cancellare
-@item @code{clear} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Senza argomenti, cancella ogni eventuale punto d'interruzione all'istruzione
-successiva
-da eseguirsi nello @dfn{stack frame} selezionato. Se il programma si ferma in
-un punto d'interruzione, quel punto d'interruzione viene cancellato in modo
-che il programma non si fermi pi@`u in quel punto.
-Gli argomenti possono essere uno tra i seguenti:
-
-@c nested table
-@table @asis
-@item @var{n}
-Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
-file sorgente corrente.
-
-@item @var{nome-file}@code{:}@var{n}
-Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
-file sorgente @var{nome-file}.
-
-@item @var{funzione}
-Cancella il punto (o i punti) d'interruzione impostato/i all'ingresso della
-funzione @var{funzione}.
-@end table
-
-@cindex comando del debugger, @code{condition}
-@cindex @code{condition}, comando del debugger
-@cindex condizione dei punti d'interruzione
-@item @code{condition} @var{n} @code{"@var{espressione}"}
-Aggiunge una condizione al punto d'interruzione o al punto d'osservazione
-esistente @var{n}. La condizione @`e un'espressione @command{awk}
-@emph{racchiusa tra doppi apici} che il debugger valuta ogni volta che viene
-raggiunto il punto d'interruzione o il punto d'osservazione. Se la condizione @`e
-vera, il debugger ferma l'esecuzione e attende l'immissione di un comando.
-Altrimenti, il debugger continua l'esecuzione del programma. Se l'espressione
-della condizione non viene specificata, tutte le condizioni esistenti vengono
-rimosse (cio@`e, il punto d'interruzione o di osservazione viene considerato
-incondizionato).
-
-@cindex comando del debugger, @code{d} (alias per @code{delete})
-@cindex comando del debugger, @code{delete}
-@cindex @code{delete}, comando del debugger
-@cindex @code{d}, comando del debugger (alias per @code{delete})
-@cindex cancellare punto d'interruzione per numero
-@cindex punto d'interruzione, cancellare per numero
-@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-Cancella i punti d'interruzione specificati o un intervallo di punti
-d'interruzione. Se non vengono forniti argomenti, cancella tutti i
-punti d'interruzione esistenti.
-
-@cindex comando del debugger, @code{disable}
-@cindex @code{disable}, comando del debugger
-@cindex disabilitare punto d'interruzione
-@cindex punto d'interruzione, come disabilitare o abilitare
-@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}]
-Disabilita punti d'interruzione specificati o un intervallo di essi. Senza
-argomenti, disabilita tutti i punti d'interruzione.
-
-@cindex comando del debugger, @code{e} (alias per @code{enable})
-@cindex comando del debugger, @code{enable}
-@cindex @code{enable}, comando del debugger
-@cindex @code{e}, comando del debugger (alias per @code{enable})
-@cindex abilitare un punto d'interruzione
-@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
-Abilita specifici punti d'interruzione o un intervallo di essi. Senza
-argomenti, abilita tutti i punti d'interruzione.
-Opzionalmente, si pu@`o specificare come abilitare i punti d'interruzione:
-
-@c nested table
-@table @code
-@item del
-Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
-programma si ferma in quel punto.
-
-@item once
-Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
-programma si ferma in quel punto.
-@end table
-
-@cindex comando del debugger, @code{ignore}
-@cindex @code{ignore}, comando del debugger
-@cindex ignorare un punto d'interruzione
-@item @code{ignore} @var{n} @var{contatore}
-Ignora il punto d'interruzione numero @var{n} le successive
-@var{contatore} volte in cui viene raggiunto.
-
-@cindex comando del debugger, @code{t} (alias per @code{tbreak})
-@cindex comando del debugger, @code{tbreak}
-@cindex @code{tbreak}, comando del debugger
-@cindex @code{t}, comando del debugger (alias per @code{tbreak})
-@cindex punto d'interruzione temporaneo
-@cindex temporaneo, punto d'interruzione
-@item @code{tbreak} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-@itemx @code{t} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Imposta un punto d'interruzione temporaneo (abilitato solo per la prima volta
-che viene raggiunto). Gli argomenti sono gli stessi di @code{break}.
-@end table
-
-@node Controllo esecuzione debugger
-@subsection Controllo di esecuzione
-
-Dopo che i punti d'interruzione sono pronti, si pu@`o iniziare l'esecuzione del
-programma, osservando il suo comportamento. Ci sono pi@`u comandi per
-controllare l'esecuzione del programma di quelli visti nei precedenti esempi:
-
-@table @asis
-@cindex comando del debugger, @code{commands}
-@cindex @code{commands}, comando del debugger
-@cindex comando del debugger, @code{silent}
-@cindex @code{silent}, comando del debugger
-@cindex comando del debugger, @code{end}
-@cindex @code{end}, comando del debugger
-@cindex punto d'interruzione, comandi
-@cindex comandi da eseguire al punto d'interruzione
-@item @code{commands} [@var{n}]
-@itemx @code{silent}
-@itemx @dots{}
-@itemx @code{end}
-Imposta una lista di comandi da eseguire subito dopo l'arresto del programma in
-un punto d'interruzione o di osservazione. @var{n} @`e il numero del punto
-d'interruzione o di osservazione. Se non si specifica un numero, viene usato
-l'ultimo numero che @`e stato specificato. I comandi veri e propri seguono,
-a cominciare dalla riga successiva, e hanno termine col comando @code{end}.
-Se il comando @code{silent} @`e nella lista, i consueti messaggi sull'arresto del
-programma a un punto d'interruzione e la riga sorgente non vengono stampati.
-Qualsiasi comando nella lista che riprende l'esecuzione (p.es.,
-@code{continue}) pone fine alla lista (un @code{end} implicito), e i comandi
-successivi vengono ignorati.
-Per esempio:
-
-@example
-gawk> @kbd{commands}
-> @kbd{silent}
-> @kbd{printf "Un punto d'interruzione silenzioso; i = %d\n", i}
-> @kbd{info locals}
-> @kbd{set i = 10}
-> @kbd{continue}
-> @kbd{end}
-gawk>
-@end example
-
-@cindex comando del debugger, @code{c} (alias per @code{continue})
-@cindex comando del debugger, @code{continue}
-@cindex @code{continue}, comando del debugger
-@item @code{continue} [@var{contatore}]
-@itemx @code{c} [@var{contatore}]
-Riprende l'esecuzione del programma. Se si riparte da un punto d'interruzione
-e viene specificato @var{contatore}, il punto d'interruzione in quella
-posizione viene ignorato per le prossime @var{contatore} volte prima di
-fermarsi nuovamente.
-
-@cindex comando del debugger, @code{finish}
-@cindex @code{finish}, comando del debugger
-@item @code{finish}
-Esegue fino a quando lo stack frame selezionato completa l'esecuzione.
-Stampa il valore restituito.
-
-@cindex comando del debugger, @code{n} (alias per @code{next})
-@cindex comando del debugger, @code{next}
-@cindex @code{next}, comando del debugger
-@cindex @code{n}, comando del debugger (alias per @code{next})
-@cindex esecuzione di un solo passo, nel debugger
-@item @code{next} [@var{contatore}]
-@itemx @code{n} [@var{contatore}]
-Continua l'esecuzione alla successiva riga sorgente, saltando le chiamate di
-funzione. L'argomento @var{contatore} controlla il numero di ripetizioni
-dell'azione, come in @code{step}.
-
-@cindex comando del debugger, @code{ni} (alias per @code{nexti})
-@cindex comando del debugger, @code{nexti}
-@cindex @code{nexti}, comando del debugger
-@cindex @code{ni}, comando del debugger (alias for @code{nexti})
-@item @code{nexti} [@var{contatore}]
-@itemx @code{ni} [@var{contatore}]
-Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
-
-@cindex comando del debugger, @code{return}
-@cindex @code{return}, comando del debugger
-@item @code{return} [@var{valore}]
-Cancella l'esecuzione di una chiamata di funzione. Se @var{valore} (una
-stringa o un numero) viene specificato, @`e usato come valore di ritorno della
-funzione. Se usato in un frame diverso da quello pi@`u interno (la funzione
-correntemente in esecuzione; cio@`e, il frame numero 0), ignora tutti i frame
-pi@`u interni di quello selezionato, e il chiamante del frame selezionato
-diventa il frame pi@`u interno.
-
-@cindex comando del debugger, @code{r} (alias per @code{run})
-@cindex comando del debugger, @code{run}
-@cindex @code{run}, comando del debugger
-@cindex @code{r}, comando del debugger (alias per @code{run})
-@item @code{run}
-@itemx @code{r}
-Avvia/riavvia l'esecuzione del programma. Quando il programma viene riavviato,
-il debugger mantiene i punti d'interruzione e di osservazione, la cronologia
-dei comandi, la visualizzazione automatica di variabili, e le opzioni del
-debugger.
-
-@cindex comando del debugger, @code{s} (alias per @code{step})
-@cindex comando del debugger, @code{step}
-@cindex @code{step}, comando del debugger
-@cindex @code{s}, comando del debugger (alias per @code{step})
-@item @code{step} [@var{contatore}]
-@itemx @code{s} [@var{contatore}]
-Continua l'esecuzione finch@'e il controllo non raggiunge una diversa riga del
-sorgente nello @dfn{stack frame} corrente, eseguendo ogni funzione chiamata
-all'interno della riga. Se viene fornito l'argomento @var{contatore},
-esegue il numero di istruzioni specificate prima di fermarsi, a meno che non
-s'imbatta in un punto d'interruzione o di osservazione.
-
-@cindex comando del debugger, @code{si} (alias per @code{stepi})
-@cindex comando del debugger, @code{stepi}
-@cindex @code{stepi}, comando del debugger
-@cindex @code{si}, comando del debugger (alias per @code{stepi})
-@item @code{stepi} [@var{contatore}]
-@itemx @code{si} [@var{contatore}]
-Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
-(Per una spiegazione su cosa s'intende per ``istruzione'' in @command{gawk},
-si veda l'output mostrato sotto @code{dump} nella
-@ref{Comandi vari del debugger}.)
-
-@cindex comando del debugger, @code{u} (alias per @code{until})
-@cindex comando del debugger, @code{until}
-@cindex @code{until}, comando del debugger
-@cindex @code{u}, comando del debugger (alias per @code{until})
-@item @code{until} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-@itemx @code{u} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
-Senza argomenti, prosegue l'esecuzione finch@'e non viene raggiunta una riga
-dopo la riga corrente nello @dfn{stack frame} corrente.
-Se viene specificato un argomento,
-prosegue l'esecuzione finch@'e non viene raggiunto il punto specificato, o
-lo @dfn{stack frame} corrente non termina l'esecuzione.
-@end table
-
-@node Vedere e modificare dati
-@subsection Vedere e modificare dati
-
-I comandi per vedere e modificare variabili all'interno di @command{gawk} sono:
-
-@table @asis
-@cindex comando del debugger, @code{display}
-@cindex @code{display}, comando del debugger
-@item @code{display} [@var{var} | @code{$}@var{n}]
-Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista di
-visualizzazione. Il valore della variabile o del campo @`e visualizzato ogni
-volta che il programma s'interrompe.
-Ogni variabile aggiunta alla lista @`e identificata da un numero univoco:
-
-@example
-gawk> @kbd{display x}
-@print{} 10: x = 1
-@end example
-
-@noindent
-La riga qui sopra mostra il numero di elemento assegnato, il nome della
-variabile e il suo
-valore corrente. Se la variabile di display fa riferimento a un parametro di
-funzione, @`e cancellata silenziosamente dalla lista non appena l'esecuzione
-raggiunge un contesto dove la variabile con quel nome non esiste pi@`u.
-Senza argomenti, @code{display} mostra i valori correnti degli elementi della
-lista.
-
-@cindex comando del debugger, @code{eval}
-@cindex @code{eval}, comando del debugger
-@cindex valutare espressioni, nel debugger
-@item @code{eval "@var{istruzioni awk}"}
-Valuta @var{istruzioni awk} nel contesto del programma in esecuzione.
-Si pu@`o fare qualsiasi cosa che un programma @command{awk} farebbe: assegnare
-valori a variabili, chiamare funzioni, e cos@`{@dotless{i}} via.
-
-@item @code{eval} @var{param}, @dots{}
-@itemx @var{istruzioni awk}
-@itemx @code{end}
-Questa forma di @code{eval} @`e simile alla precedente, solo che permette di
-definire
-``variabili locali'' che esistono nel contesto delle @var{istruzioni awk},
-invece di usare variabili o parametri di funzione gi@`a definiti nel programma.
-
-@cindex comando del debugger, @code{p} (alias per @code{print})
-@cindex comando del debugger, @code{print}
-@cindex @code{print}, comando del debugger
-@cindex @code{p}, comando del debugger (alias per @code{print})
-@cindex stampare variabili, nel debugger
-@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}]
-@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}]
-Stampa i valori di una o pi@`u variabili o campi di @command{gawk}.
-I campi devono essere indicizzati usando delle costanti:
-
-@example
-gawk> @kbd{print $3}
-@end example
-
-@noindent
-Questo stampa il terzo campo del record di input (se il campo specificato non
-esiste, stampa il @samp{campo nullo}). Una variabile pu@`o essere un elemento di
-un vettore, avente come indice una
-stringa di valore costante. Per stampare
-il contenuto di un vettore, si deve anteporre il simbolo @samp{@@} al nome del
-vettore:
-
-@example
-gawk> @kbd{print @@a}
-@end example
-
-@noindent
-L'esempio stampa gli indici e i corrispondenti valori di tutti gli elementi
-del vettore @code{a}.
-
-@cindex comando del debugger, @code{printf}
-@cindex @code{printf}, comando del debugger
-@item @code{printf} @var{formato} [@code{,} @var{arg} @dots{}]
-Stampa un testo formattato. Il @var{formato} pu@`o includere sequenze di
-protezione, come @samp{\n}
-(@pxref{Sequenze di protezione}).
-Non viene stampato nessun ritorno a capo che non sia stato specificato
-esplicitamente.
-
-@cindex comando del debugger, @code{set}
-@cindex @code{set}, comando del debugger
-@cindex assegnare valori a variabili, nel debugger
-@item @code{set} @var{var}@code{=}@var{valore}
-Assegna un valore costante (numero o stringa) a una variabile o a un campo di
-@command{awk}.
-I valori di stringa devono essere racchiusi tra doppi apici
-(@code{"}@dots{}@code{"}).
-
-Si possono impostare anche delle variabili speciali di @command{awk}, come
-@code{FS}, @code{NF}, @code{NR}, e cos@`{@dotless{i}} via.
-
-@cindex comando del debugger, @code{w} (alias per @code{watch})
-@cindex comando del debugger, @code{watch}
-@cindex @code{watch}, comando del debugger
-@cindex @code{w}, comando del debugger (alias per @code{watch})
-@cindex impostare un punto d'osservazione
-@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
-@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
-Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista dei
-punti d'osservazione. Il debugger quindi interrompe il programma ogni volta
-che il valore della variabile o del campo cambia. A ogni elemento osservato
-viene assegnato un numero che pu@`o essere usato per cancellarlo dalla lista
-usando il comando @code{unwatch} [non-osservare pi@`u].
-
-Definendo un punto d'osservazione, si pu@`o anche porre una condizione, che @`e
-un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger valuta
-ogni volta che viene raggiunto il punto d'osservazione. Se la condizione @`e
-vera, il debugger interrompe l'esecuzione e rimane in attesa di un comando.
-Altrimenti, @command{gawk} prosegue nell'esecuzione del programma.
-
-@cindex comando del debugger, @code{undisplay}
-@cindex @code{undisplay}, comando del debugger
-@cindex interruzione visualizzazioni automatiche, nel debugger
-@item @code{undisplay} [@var{n}]
-Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
-argomenti) dalla lista delle visualizzazioni automatiche.
-
-@cindex comando del debugger, @code{unwatch}
-@cindex @code{unwatch}, comando del debugger
-@cindex cancellare punto d'osservazione
-@item @code{unwatch} [@var{n}]
-Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
-argomenti) dalla lista dei punti d'osservazione.
-
-@end table
-
-@node Stack di esecuzione
-@subsection Lavorare con lo stack
-
-Ogni volta che si esegue un programma che contiene chiamate di funzione,
-@command{gawk} mantiene una pila contenente la lista delle chiamate di funzione
-che hanno portato al punto in cui il programma si trova in ogni momento. @`E
-possibile vedere a che punto si trova il programma, e anche muoversi
-all'interno della pila per vedere qual era lo stato delle cose nelle funzioni
-che hanno chiamato quella in cui ci si trova. I comandi per far questo sono:
-
-@table @asis
-@cindex comando del debugger, @code{bt} (alias per @code{backtrace})
-@cindex comando del debugger, @code{backtrace}
-@cindex comando del debugger, @code{where} (alias per @code{backtrace})
-@cindex @code{backtrace}, comando del debugger
-@cindex @code{bt}, comando del debugger (alias per @code{backtrace})
-@cindex @code{where}, comando del debugger
-@cindex @code{where}, comando del debugger (alias per @code{backtrace})
-@cindex chiamate, @dfn{stack} (pila) delle, mostrare nel debugger
-@cindex @dfn{stack} (pila) delle chiamate, mostrare nel debugger
-@cindex pila (@dfn{stack}) delle chiamate, mostrare nel debugger
-@cindex tracciatura a ritroso, mostrare nel debugger
-@item @code{backtrace} [@var{contatore}]
-@itemx @code{bt} [@var{contatore}]
-@itemx @code{where} [@var{contatore}]
-Stampa a ritroso una traccia di tutte le chiamate di funzione (stack frame), o
-i dei @var{contatore} frame pi@`u interni se @var{contatore} > 0. Stampa i
-@var{contatore} frame pi@`u esterni se @var{contatore} < 0. La tracciatura a
-ritroso mostra il nome e gli argomenti di ciascuna funzione, il sorgente
-@value{FN}, e il numero di riga. L'alias @code{where} per @code{backtrace}
-viene mantenuto per i vecchi utenti di GDB che potrebbero essere abituati a
-quel comando.
-
-@cindex comando del debugger, @code{down}
-@cindex @code{down}, comando del debugger
-@item @code{down} [@var{contatore}]
-Sposta @var{contatore} (default 1) frame sotto la pila verso il frame pi@`u interno.
-Poi seleziona e stampa il frame.
-
-@cindex comando del debugger, @code{f} (alias per @code{frame})
-@cindex comando del debugger, @code{frame}
-@cindex @code{frame}, comando del debugger
-@cindex @code{f}, comando del debugger (alias per @code{frame})
-@item @code{frame} [@var{n}]
-@itemx @code{f} [@var{n}]
-Seleziona e stampa lo @dfn{stack frame} @var{n}. Il frame 0 @`e quello
-correntemente in esecuzione, o il frame @dfn{pi@`u interno}, (chiamata di
-funzione); il frame 1 @`e il frame che ha chiamato quello pi@`u interno. Il frame
-col numero pi@`u alto @`e quello per il programma principale. Le informazioni
-stampate comprendono il numero di frame, i nomi delle funzioni e degli
-argomenti, i file sorgenti e le righe sorgenti.
-
-@cindex comando del debugger, @code{up}
-@cindex @code{up}, comando del debugger
-@item @code{up} [@var{contatore}]
-Sposta @var{contatore} (default 1) frame sopra la pila verso il frame pi@`u
-esterno. Poi seleziona e stampa il frame.
-@end table
-
-@node Informazioni sul debugger
-@subsection Ottenere informazioni sullo stato del programma e del debugger
-
-Oltre che vedere i valori delle variabili, spesso si ha necessit@`a di ottenere
-informazioni di altro tipo sullo stato del programma e dello stesso ambiente di
-debug. Il debugger di @command{gawk} ha un comando che fornisce
-quest'informazione, chiamato convenientemente @code{info}. @code{info}
-@`e usato con uno dei tanti argomenti che dicono esattamente quel che si vuol
-sapere:
-
-@table @asis
-@cindex comando del debugger, @code{i} (alias per @code{info})
-@cindex comando del debugger, @code{info}
-@cindex @code{info}, comando del debugger
-@cindex @code{i}, comando del debugger (alias per @code{info})
-@item @code{info} @var{cosa}
-@itemx @code{i} @var{cosa}
-Il valore di @var{cosa} dovrebbe essere uno dei seguenti:
-
-@c nested table
-@table @code
-@item args
-@cindex mostrare argomenti delle funzioni, nel debugger
-@cindex debugger, mostrare argomenti delle funzioni
-Elenca gli argomenti del frame selezionato.
-
-@item break
-@cindex mostrare punti d'interruzione, nel debugger
-@cindex debugger, mostrare punti d'interruzione
-Elenca tutti i punti d'interruzione attualmente impostati.
-
-@item display
-@cindex visualizzazioni automatiche, nel debugger
-@cindex debugger, visualizzazioni automatiche
-Elenca tutti gli elementi della lista delle visualizzazioni automatiche.
-
-@item frame
-@cindex descrizione degli @dfn{stack frame} delle chiamate, nel debugger
-@cindex debugger, descrizione degli @dfn{stack frame} delle chiamate
-D@`a una descrizione degli @dfn{stack frame} selezionati.
-
-@item functions
-@cindex elencare definizioni delle funzioni, nel debugger
-@cindex debugger, elencare definizioni delle funzioni
-Elenca tutte le definizioni delle funzioni compresi i @value{FNS} e
-i numeri di riga.
-
-@item locals
-@cindex mostrare variabili locali, nel debugger
-@cindex debugger, mostrare variabili locali
-Elenca le variabili locali dei frame selezionati.
-
-@item source
-@cindex mostrare il nome del file sorgente corrente, nel debugger
-@cindex debugger, mostrare il nome del file sorgente corrente
-Stampa il nome del file sorgente corrente. Ogni volta che il programma si
-interrompe, il file sorgente corrente @`e il file che contiene l'istruzione
-corrente. Quando il debugger viene avviato per la prima volta, il file
-sorgente corrente @`e il primo file incluso attraverso l'opzione @option{-f}.
-Il comando @samp{list @var{nome-file}:@var{numero-riga}} pu@`o essere usato in
-qualsiasi momento per cambiare il sorgente corrente.
-
-@item sources
-@cindex mostrare tutti i file sorgente, nel debugger
-@cindex debugger, mostrare tutti i file sorgenti
-Elenca tutti i sorgenti del programma.
-
-@item variables
-@cindex elencare tutte le variabili locali, nel debugger
-@cindex debugger, elencare tutte le variabili locali
-Elenca tutte le variabili locali.
-
-@item watch
-@cindex mostrare i punti d'osservazione, nel debugger
-@cindex debugger, mostrare i punti d'osservazione
-Elenca tutti gli elementi della lista dei punti d'osservazione.
-@end table
-@end table
-
-Ulteriori comandi permettono di avere il controllo sul debugger, la capacit@`a di
-salvare lo stato del debugger e la capacit@`a di eseguire comandi del debugger
-da un file. I comandi sono:
-
-@table @asis
-@cindex comando del debugger, @code{o} (alias per @code{option})
-@cindex comando del debugger, @code{option}
-@cindex @code{option}, comando del debugger
-@cindex @code{o}, comando del debugger (alias per @code{option})
-@cindex visualizzare le opzioni del debugger
-@cindex debugger, opzioni del
-@item @code{option} [@var{nome}[@code{=}@var{valore}]]
-@itemx @code{o} [@var{nome}[@code{=}@var{valore}]]
-Senza argomenti, visualizza le opzioni del debugger disponibili e i loro valori
-correnti. @samp{option @var{nome}} mostra il valore corrente dell'opzione
-cos@`{@dotless{i}} denominata. @samp{option @var{nome}=@var{valore}} assegna
-un nuovo valore all'opzione.
-Le opzioni disponibili sono:
-
-@c nested table
-@c asis for docbook
-@table @asis
-@item @code{history_size}
-@cindex debugger, dimensione della cronologia
-Imposta il numero massimo di righe da mantenere nel file della cronologia
-@file{./.gawk_history}. Il valore di default @`e 100.
-
-@item @code{listsize}
-@cindex debugger, numero di righe nella lista di default
-Specifica il numero di righe che @code{list} deve stampare. Il valore di
-default @`e 15.
-
-@item @code{outfile}
-@cindex ridirezionare l'output di @command{gawk}, nel debugger
-@cindex debugger, ridirezionare l'output di @command{gawk}
-Invia l'output di @command{gawk} in un file; l'output del debugger @`e
-visualizzato comunque anche
-nello standard output. Assegnare come valore stringa vuota (@code{""})
-reimposta l'output solo allo standard output.
-
-@item @code{prompt}
-@cindex debugger, prompt
-Cambia la riga per l'immissione dei comandi del debugger. Il valore di
-default @`e @samp{@w{gawk> }}.
-
-@item @code{save_history} [@code{on} | @code{off}]
-@cindex debugger, file della cronologia
-Salva la cronologia dei comandi nel file @file{./.gawk_history}.
-L'impostazione di default @`e @code{on}.
-
-@item @code{save_options} [@code{on} | @code{off}]
-@cindex salvataggio opzioni debugger
-@cindex debugger, salvataggio opzioni
-Salva le opzioni correnti nel file @file{./.gawkrc} all'uscita.
-L'impostazione di default @`e @code{on}.
-Le opzioni sono lette di nuovo all'avvio della sessione successiva.
-
-@item @code{trace} [@code{on} | @code{off}]
-@cindex istruzioni, tener traccia delle, nel debugger
-@cindex debugger, tener traccia delle istruzioni
-Attiva o disattiva il tracciamento delle istruzioni. L'impostazione di default
-@`e @code{off}.
-@end table
-
-@item @code{save} @var{nome-file}
-Salva i comandi eseguiti nella sessione corrente nel @value{FN} indicato,
-in modo da poterli ripetere in seguito usando il comando @command{source}.
-
-@item @code{source} @var{nome-file}
-@cindex debugger, leggere comandi da un file
-Esegue comandi contenuti in un file; un errore in un comando non impedisce
-l'esecuzione dei comandi successivi. In un file di comandi sono consentiti
-i commenti (righe che iniziano con @samp{#}).
-Le righe vuote vengono ignorate; esse @emph{non}
-ripetono l'ultimo comando.
-Non si pu@`o riavviare il programma mettendo pi@`u di un comando @code{run}
-nel file. Inoltre, la lista dei comandi pu@`o includere altri comandi
-@code{source}; in ogni caso, il debugger di @command{gawk} non richiama lo
-stesso file pi@`u di una volta per evitare ricorsioni infinite.
-
-Oltre al comando @code{source}, o al posto di esso, si possono usare le opzioni
-sulla riga di comando @option{-D @var{file}} o @option{--debug=@var{file}}
-per eseguire comandi da un file in maniera non interattiva
-(@pxref{Opzioni}).
-@end table
-
-@node Comandi vari del debugger
-@subsection Comandi vari del debugger
-
-Ci sono alcuni altri comandi che non rientrano nelle precedenti categorie,
-come i seguenti:
-
-@table @asis
-@cindex comando del debugger, @code{dump}
-@cindex @code{dump}, comando del debugger
-@item @code{dump} [@var{nome-file}]
-Riversa il @dfn{byte code} del programma nello standard output o nel file
-definito in @var{nome-file}. Questo stampa una rappresentazione delle
-istruzioni interne che @command{gawk} esegue per implementare i comandi
-@command{awk} in un programma. Ci@`o pu@`o essere molto istruttivo, come
-dimostra il seguente riversamento parziale del codice offuscato di
-Davide Brini (@pxref{Programma signature}):
-
-@c FIXME: This will need updating if num-handler branch is ever merged in.
-@smallexample
-gawk> @kbd{dump}
-@print{} # BEGIN
-@print{}
-@print{} [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk]
-@print{} [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc280] Op_match :
-@print{} [ 1:0xfcc1e0] Op_store_var : O
-@print{} [ 1:0xfcc2e0] Op_push_i : "==" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc340] Op_push_i : "==" [MALLOC|STRING|STRCUR]
-@print{} [ 1:0xfcc320] Op_equal :
-@print{} [ 1:0xfcc200] Op_store_var : o
-@print{} [ 1:0xfcc380] Op_push : o
-@print{} [ 1:0xfcc360] Op_plus_i : 0 [MALLOC|NUMCUR|NUMBER]
-@print{} [ 1:0xfcc220] Op_push_lhs : o [do_reference = true]
-@print{} [ 1:0xfcc300] Op_assign_plus :
-@print{} [ :0xfcc2c0] Op_pop :
-@print{} [ 1:0xfcc400] Op_push : O
-@print{} [ 1:0xfcc420] Op_push_i : "" [MALLOC|STRING|STRCUR]
-@print{} [ :0xfcc4a0] Op_no_op :
-@print{} [ 1:0xfcc480] Op_push : O
-@print{} [ :0xfcc4c0] Op_concat : [expr_count = 3] [concat_flag = 0]
-@print{} [ 1:0xfcc3c0] Op_store_var : x
-@print{} [ 1:0xfcc440] Op_push_lhs : X [do_reference = true]
-@print{} [ 1:0xfcc3a0] Op_postincrement :
-@print{} [ 1:0xfcc4e0] Op_push : x
-@print{} [ 1:0xfcc540] Op_push : o
-@print{} [ 1:0xfcc500] Op_plus :
-@print{} [ 1:0xfcc580] Op_push : o
-@print{} [ 1:0xfcc560] Op_plus :
-@print{} [ 1:0xfcc460] Op_leq :
-@print{} [ :0xfcc5c0] Op_jmp_false : [target_jmp = 0xfcc5e0]
-@print{} [ 1:0xfcc600] Op_push_i : "%c" [MALLOC|STRING|STRCUR]
-@print{} [ :0xfcc660] Op_no_op :
-@print{} [ 1:0xfcc520] Op_assign_concat : c
-@print{} [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440]
-@print{}
-@dots{}
-@print{}
-@print{} [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""]
-@print{} [ :0xfcc140] Op_no_op :
-@print{} [ :0xfcc1c0] Op_atexit :
-@print{} [ :0xfcc640] Op_stop :
-@print{} [ :0xfcc180] Op_no_op :
-@print{} [ :0xfcd150] Op_after_beginfile :
-@print{} [ :0xfcc160] Op_no_op :
-@print{} [ :0xfcc1a0] Op_after_endfile :
-gawk>
-@end smallexample
-
-@cindex comando del debugger, @code{exit}
-@cindex @code{exit}, comando del debugger
-@cindex uscire dal debugger
-@cindex debugger, uscire dal
-@item @code{exit}
-Esce dal debugger.
-Si veda la voce @samp{quit}, pi@`u avanti in quest'elenco.
-
-@cindex comando del debugger, @code{h} (alias per @code{help})
-@cindex comando del debugger, @code{help}
-@cindex @code{help}, comando del debugger
-@cindex @code{h}, comando del debugger (alias per @code{help})
-@item @code{help}
-@itemx @code{h}
-Stampa una lista di tutti i comandi del debugger di @command{gawk} con un breve
-sommario su come usarli. @samp{help @var{comando}} stampa l'informazione sul
-comando @var{comando}.
-
-@cindex comando del debugger, @code{l} (alias per @code{list})
-@cindex comando del debugger, @code{list}
-@cindex @code{list}, comando del debugger
-@cindex @code{l}, comando del debugger (alias per @code{list})
-@item @code{list} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
-@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
-Stampa le righe specificate (per default 15) dal file sorgente corrente
-o il file chiamato @var{nome-file}. I possibili argomenti di @code{list}
-sono i seguenti:
-
-@c nested table
-@table @asis
-@item @code{-} (Meno)
-Stampa righe prima delle ultime righe stampate.
-
-@item @code{+}
-Stampa righe dopo le ultime righe stampate.
-@code{list} senza argomenti fa la stessa cosa.
-
-@item @var{n}
-Stampa righe centrate attorno alla riga numero @var{n}.
-
-@item @var{n}--@var{m}
-Stampa righe dalla numero @var{n} alla numero @var{m}.
-
-@item @var{nome-file}@code{:}@var{n}
-Stampa righe centrate attorno alla riga numero @var{n} nel file sorgente
-@var{nome-file}. Questo comando pu@`o cambiare il file sorgente corrente.
-
-@item @var{funzione}
-Stampa righe centrate attorno all'inizio della funzione @var{function}.
-Questo comando pu@`o cambiare il file sorgente corrente.
-@end table
-
-@cindex comando del debugger, @code{q} (alias per @code{quit})
-@cindex comando del debugger, @code{quit}
-@cindex @code{quit}, comando del debugger
-@cindex @code{q}, comando del debugger (alias per @code{quit})
-@cindex uscire dal debugger
-@cindex debugger, uscire dal
-@item @code{quit}
-@itemx @code{q}
-Esce dal debugger. Fare il debug @`e divertente, ma noi tutti a volte
-dobbiamo far fronte ad altri impegni nella vita, e talvolta troviamo il bug
-e possiamo tranquillamente passare a quello successivo! Come abbiamo visto
-prima, se si sta eseguendo un programma, il debugger avverte quando si batte
-@samp{q} o @samp{quit}, in modo da essere sicuri di voler realmente abbandonare
-il debug.
-
-@cindex comando del debugger, @code{trace}
-@cindex @code{trace}, comando del debugger
-@item @code{trace} [@code{on} | @code{off}]
-Abilita o disabilita la stampa continua delle istruzioni che si stanno per
-eseguire, assieme alle righe di @command{awk} che implementano.
-L'impostazione di default @`e @code{off}.
-
-@`E auspicabile che la maggior parte dei ``codici operativi'' (o ``opcode'')
-in queste istruzioni siano sufficientemente autoesplicativi, e l'uso di
-@code{stepi} e @code{nexti} mentre @code{trace} @`e abilitato li render@`a
-familiari.
-
-@end table
-
-@node Supporto per Readline
-@section Supporto per Readline
-@cindex completamento dei comandi nel debugger
-@cindex espansione della cronologia, nel debugger
-@cindex debugger, completamento dei comandi nel
-
-Se @command{gawk} @`e compilato con
-@uref{http://cnswww.cns.cwru.edu/php/chet/readline/readline.html, la libreria
-GNU Readline}, ci si pu@`o avvantaggiare delle sue funzionalit@`a riguardanti il
-completamento dei comandi della libreria e l'espansione della cronologia. Sono
-disponibili i seguenti tipi di completamento:
-
-@table @asis
-@item Completamentto dei comandi
-Nomi dei comandi.
-
-@item Completamento del @value{FN} del sorgente
-@value{FFNS} dei sorgenti. I relativi comandi sono
-@code{break},
-@code{clear},
-@code{list},
-@code{tbreak}
-e
-@code{until}.
-
-@item Completamento di argomento
-Argomenti di un comando non numerici.
-I relativi comandi sono @code{enable} e @code{info}.
-
-@item Completamento del nome di variabile
-Interessa i nomi delle variabili globali, e gli argomenti di funzione nel
-contesto corrente se
-il programma @`e in esecuzione. I relativi comandi sono
-@code{display},
-@code{print},
-@code{set}
-e
-@code{watch}.
-
-@end table
-
-@node Limitazioni
-@section Limitazioni
-
-Si spera che il lettore trovi il debugger di @command{gawk} utile e piacevole
-da usare, ma come accade per ogni programma, specialmente nelle sue prime
-versioni, ha ancora delle limitazioni. Quelle di cui @`e bene essere al corrente sono:
-
-@itemize @value{BULLET}
-@item
-Nella versione presente, il debugger non d@`a una spiegazione dettagliata
-dell'errore che
-si @`e commesso quando si immette qualcosa che il debugger ritiene sbagliato.
-La risposta invece @`e solamente @samp{syntax error}. Quando si arriva a capire
-l'errore commesso, tuttavia, ci si sentir@`a come un vero guru.
-
-@item
-@c NOTE: no comma after the ref{} on purpose, due to following
-@c parenthetical remark.
-Se si studiano i ``dump'' dei codici operativi
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Comandi vari del debugger}
-(o se si ha gi@`a familiarit@`a con i comandi interni di @command{gawk}),
-ci si render@`a conto che gran parte della manipolaziona interna di dati
-in @command{gawk}, cos@`{@dotless{i}} come in molti interpreti, @`e fatta su di una pila.
-@code{Op_push}, @code{Op_pop}, e simili sono il pane quotidiano di
-gran parte del codice di @command{gawk}.
-
-Sfortunatamente, al momento, il debugger di @command{gawk} non consente
-di esaminare i contenuti della pila.
-Cio@`e, i risultati intermedi della valutazione delle espressioni sono sulla
-pila, ma non @`e possibile stamparli. Invece, possono essere stampate solo
-quelle variabili che sono state definite nel programma. Naturalmente, un
-espediente per cercare di rimediare @`e di usare pi@`u variabili esplicite in
-fase di debug e
-poi cambiarle di nuovo per ottenere un codice forse pi@`u difficile da
-comprendere, ma pi@`u ottimizzato.
-
-@item
-Non c'@`e alcun modo per guardare ``dentro'' al processo della compilazione delle
-espressioni regolari per vedere se corrispondono a quel che si intendeva.
-Come programmatore
-di @command{awk}, ci si aspetta che chi legge conosca il significato di
-@code{/[^[:alnum:][:blank:]]/}.
-
-@item
-Il debugger di @command{gawk} @`e progettato per essere usato eseguendo un
-programma (con tutti i suoi parametri) dalla riga di comando, come descritto
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Invocazione del debugger}. Non c'@`e alcun modo (al momento) di modificare
-o di ``entrare dentro'' l'esecuzione di un programma.
-Questo sembra ragionevole per un linguaggio che @`e usato principalmente per
-eseguire programmi piccoli e che non richiedono molto tempo di esecuzione.
-
-@item
-Il debugger di @command{gawk} accetta solo codice sorgente fornito con
-l'opzione @option{-f}.
-@end itemize
-
-@ignore
-@c 11/2016: This no longer applies after all the type cleanup work that's been done.
-C'@`e un altro punto che vale la pena di trattare. I debugger convenzionali
-vengono eseguiti in un processo (e quindi in una parte di memoria)
-separato dal programma su cui eseguono il debug (il @dfn{debuggato}, se
-si vuole).
-
-Il debugger di @command{gawk} @`e diverso; @`e parte integrante di @command{gawk}.
-Ci@`o rende possibile, in rari casi, che @command{gawk} diventi un eccellente
-dimostratore del principio d'indeterminazione di Heisenberg, secondo il quale
-il solo atto di osservare una cosa pu@`o modificarla. Si consideri il seguente
-esempio:@footnote{Grazie a Hermann Peifer per quest'esempio.}
-
-@example
-$ @kbd{cat test.awk}
-@print{} @{ print typeof($1), typeof($2) @}
-$ @kbd{cat test.data}
-@print{} abc 123
-$ @kbd{gawk -f test.awk test.data}
-@print{} strnum strnum
-@end example
-
-Questo @`e quel che ci si aspetta: il campo data ha l'attributo STRNUM
-(@pxref{Tipi di variabile}). Ora vediamo cosa accade quando questo programma
-viene eseguito sotto il debugger:
-
-@example
-$ @kbd{gawk -D -f test.awk test.data}
-gawk> @kbd{w $1} @ii{Imposta un punto d'osservazione su} $1
-@print{} Watchpoint 1: $1
-gawk> @kbd{w $2} @ii{Imposta il punto d'osservazione su} $2
-@print{} Watchpoint 2: $2
-gawk> @kbd{r} @ii{Avvia il programma}
-@print{} Partenza del programma:
-@print{} Mi fermo in Rule ...
-@print{} Watchpoint 1: $1 @ii{Scatta punto d'osservazione}
-@print{} Old value: ""
-@print{} New value: "abc"
-@print{} main() a `test.awk':1
-@print{} 1 @{ print typeof($1), typeof($2) @}
-gawk> @kbd{n} @ii{Prosegui @dots{}}
-@print{} Watchpoint 2: $2 @ii{Scatta punto d'osservazione}
-@print{} Old value: ""
-@print{} New value: "123"
-@print{} main() a `test.awk':1
-@print{} 1 @{ print typeof($1), typeof($2) @}
-gawk> @kbd{n} @ii{Prende il risultato da} typeof()
-@print{} strnum number @ii{Il risultato per} $2 @ii{non @`e corretto}
-@c "normally" o "abnormally" @`e in inglese senza possibilit@`a di modifiche.
-@print{} Programma completato normally, valore in uscita: 0
-gawk> @kbd{quit}
-@end example
-
-In questo caso, la richiesta di confrontare il nuovo valore di @code{$2}
-con quello vecchio ha richiesto che @command{gawk} lo valutasse e
-stabilisse che era proprio un numero, e questo @`e riflesso nel risultato di
-@code{typeof()}.
-
-Casi come questi in cui il debugger non @`e trasparente rispetto all'esecuzione
-del programma dovrebbero essere rari. Nel caso che se ne trovi uno, si
-prega di segnalarlo (@pxref{Bug}).
-@end ignore
-
-@ignore
-Look forward to a future release when these and other missing features may
-be added, and of course feel free to try to add them yourself!
-@end ignore
-
-@node Sommario sul debug
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Raramente i programmi funzionano bene al primo colpo. Trovare gli errori
-che contengono
-viene chiamato @dfn{debugging}, e un programma che aiuta a trovarli @`e un
-@dfn{debugger}. @command{gawk} ha un debugger incorporato che funziona in
-modo molto simile al debugger GNU, GDB.
-
-@item
-I debugger possono eseguire il programma un'istruzione per volta, esaminare e
-cambiare i
-valori delle variabili e dei vettori, e fanno tante altre cose per
-permettere di comprendere cosa sta facendo effettivamente il programma in un
-dato momento (a differenza del comportamento atteso).
-
-@item
-Come la maggior parte dei debugger, il debugger di @command{gawk} funziona in
-termini di stack frame, e si possono inserire sia punti d'interruzione
-(interruzioni a un certo punto del codice) sia punti d'osservazione
-(interruzioni quando il valore di un dato cambia).
-
-@item
-La serie di comandi del debugger @`e abbastanza completa, e permette di
-monitorare i
-punti d'interruzione, l'esecuzione, la visualizzazione e la
-modifica dei dati, di lavorare con le pile, ottenere informazioni, e di
-svolgere altri compiti.
-
-@item
-Se la libreria GNU Readline @`e disponibile al momento della compilazione di
-@command{gawk}, viene usata dal debugger per fornire la cronologia della riga
-di comando e delle modifiche apportate durante il debug.
-
-@item
-Normalmente, il debugger non influenza il programma che sta controllando,
-ma questo pu@`o succedere occasionalmente.
-
-@end itemize
-
-@node Calcolo con precisione arbitraria
-@chapter Calcolo con precisione arbitraria con @command{gawk}
-@cindex precisione arbitraria
-@cindex precisione multipla
-@cindex precisione infinita
-@cindex virgola mobile, numeri in@comma{} precisione arbitraria
-
-In questo @value{CHAPTER} si introducono alcuni concetti base su come i
-computer
-eseguono i calcoli e si definiscono alcuni termini importanti.
-Si continua poi descrivendo il calcolo in virgola mobile,
-che @`e quello che @command{awk} usa per tutte le sue operazioni aritmetiche,
-e si prosegue con
-una trattazione del calcolo in virgola mobile con precisione arbitraria,
-una funzionalit@`a disponibile solo in @command{gawk}. Si passa poi a
-illustrare i numeri interi a precisione arbitraria e si conclude con una
-descrizione di alcuni punti sui quali @command{gawk} e lo standard POSIX non
-sono esattamente in accordo.
-
-@quotation NOTA
-La maggior parte degli utenti di @command{gawk} pu@`o saltare senza patemi
-d'animo
-questo capitolo. Tuttavia, se si vogliono eseguire calcoli scientifici con
-@command{gawk}, questo @`e il luogo adatto per imparare a farlo.
-@end quotation
-
-@menu
-* Aritmetica del computer:: Una rapida introduzione alla matematica del
- computer.
-* Definizioni matematiche:: Definizione dei termini usati.
-* Funzionalit@`a MPFR:: Funzionalit@`a MPFR in @command{gawk}.
-* Cautela col calcolo in VM:: Cose da sapere.
-* Interi a precisione arbitraria:: Calcolo con numeri interi a precisione
- arbitraria con @command{gawk}.
-* Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente.
-* Sommario virgola mobile:: Sommario della trattazione della
- virgola mobile.
-@end menu
-
-@node Aritmetica del computer
-@section Una descrizione generale dell'aritmetica del computer
-
-Sinora, abbiamo avuto a che fare con dati come numeri o stringhe. Ultimamente,
-comunque, i computer rappresentano ogni cosa in termini di @dfn{cifre binarie},
-o @dfn{bit}. Una cifra decimale pu@`o assumere uno di 10 valori: da zero a
-nove. Una cifra binaria pu@`o assumere uno di due valori: zero o uno. Usando
-il sistema binario, i computer (e i programmi per computer) possono
-rappresentare e manipolare dati numerici e dati costituiti da caratteri. In
-generale, tanti pi@`u bit @`e possibile usare per rappresentare una determinata
-cosa, tanto maggiore sar@`a l'intervallo dei possibili valori che essa potr@`a
-assumere.
-
-I moderni calcolatori possono eseguire calcoli numerici in almeno due modi, e
-spesso anche di pi@`u. Ogni tipo di calcolo usa una diversa rappresentazione
-(organizzazione dei bit) dei numeri. Le modalit@`a di calcolo che ci interessano
-sono:
-
-@table @asis
-@item Calcolo decimale
-Questo @`e il tipo di calcolo che s'impara alle scuole elementari, usando
-carta e penna (o anche una calcolatrice). In teoria, i numeri possono avere un
-numero arbitrario di cifre su ambo i lati del separatore decimale, e il
-risultato di un'operazione @`e sempre esatto.
-
-Alcuni sistemi moderni possono eseguire calcoli decimali direttamente,
-tramite apposite istruzioni disponibili
-nell'hardware dell'elaboratore, ma normalmente si ha necessit@`a di una speciale
-libreria software che consenta di effettuare le operazioni desiderate.
-Ci sono anche librerie che svolgono i calcoli decimali interamente
-per via software.
-
-Anche se alcuni utenti si aspettano che @command{gawk} effettui delle
-operazioni usando numeri in base decimale,@footnote{Non sappiamo perch@'e se
-lo aspettino, ma @`e cos@`{@dotless{i}}.} non @`e questo quello che succede.
-
-@item La matematica coi numeri interi
-A scuola ci hanno insegnato che i valori interi erano quei numeri privi di una
-parte frazionaria, come 1, 42, o @minus{}17.
-Il vantaggio dei numeri interi @`e che essi rappresentano dei valori in maniera
-esatta. Lo svantaggio @`e che i numeri rappresentabili sono limitati.
-
-@cindex senza segno, interi
-@cindex segno, interi senza
-@cindex interi senza segno
-Nei calcolatori, i valori interi sono di due tipi: @dfn{con segno} e
-@dfn{senza segno}. I valori con segno possono essere negativi o positivi,
-mentre i valori senza segno sono sempre maggiori o uguali a zero.
-
-Nei sistemi informatici, il calcolo con valori interi @`e esatto, ma il possibile
-campo di variazione dei valori @`e limitato. L'elaborazione con numeri interi @`e
-pi@`u veloce di quella con numeri a virgola mobile.
-
-@item La matematica coi numeri a virgola mobile
-I numeri a virgola mobile rappresentano quelli che a scuola sono chiamati
-numeri ``reali'' (cio@`e, quelli che hanno una parte frazionaria, come
-3.1415927). Il vantaggio dei numeri a virgola mobile @`e che essi possono
-rappresentare uno spettro di valori molto pi@`u ampio di quello rappresentato dai
-numeri interi. Lo svantaggio @`e che ci sono numeri che essi non possono
-rappresentare in modo esatto.
-
-I computer moderni possono eseguire calcoli su valori a virgola mobile
-nell'hardware dell'elaboratore, entro un intervallo di valori limitato.
-Ci sono inoltre librerie di programmi che consentono calcoli, usando numeri a
-virgola mobile, di precisione arbitraria.
-
-POSIX @command{awk} usa numeri a virgola mobile a @dfn{doppia precisione},
-che possono gestire pi@`u cifre rispetto ai numeri a virgola mobile a
-@dfn{singola precisione}. @command{gawk} ha inoltre funzionalit@`a, descritte
-in dettaglio pi@`u sotto, che lo mettono in grado di eseguire
-calcoli con i numeri a virgola mobile con precisione arbitraria.
-@end table
-
-I calcolatori operano con valori interi e a virgola mobile su diversi
-intervalli. I valori interi normalmente hanno una dimensione di 32 bit o 64 bit.
-I valori a virgola mobile a singola precisione occupano 32 bit, mentre i
-valori a virgola mobile a doppia precisione occupano 64 bit. I valori a
-virgola mobile sono sempre con segno. Il possibile campo di variazione dei
-valori @`e mostrato in @ref{table-numeric-ranges}.
-
-@float Tabella,table-numeric-ranges
-@caption{Intervalli dei valori per diverse rappresentazioni numeriche}
-@multitable @columnfractions .34 .33 .33
-@headitem Rappresentazione numerica @tab Valore minimo @tab Valore massimo
-@item Interi con segno a 32-bit @tab @minus{}2.147.483.648 @tab 2.147.483.647
-@item Interi senza segno a 32-bit @tab 0 @tab 4.294.967.295
-@item Interi con segno a 64-bit @tab @minus{}9.223.372.036.854.775.808 @tab 9.223.372.036.854.775.807
-@item Interi senza segno a 64-bit @tab 0 @tab 18.446.744.073.709.551.615
-@iftex
-@item Virgola mobile, singola precisione (circa) @tab @math{1,175494^{-38}} @tab @math{3,402823^{38}}
-@item Virgola mobile, doppia precisione (circa) @tab @math{2,225074^{-308}} @tab @math{1,797693^{308}}
-@end iftex
-@ifinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494e-38 @tab 3,402823e38
-@item Virgola mobile, doppia precisione (circa) @tab 2,225074e-308 @tab 1,797693e308
-@end ifinfo
-@ifnottex
-@ifnotinfo
-@item Virgola mobile, singola precisione (circa) @tab 1,175494@sup{-38} @tab 3,402823@sup{38}
-@item Virgola mobile, singola precisione (circa) @tab 2,225074@sup{-308} @tab 1,797693@sup{308}
-@end ifnotinfo
-@end ifnottex
-@end multitable
-@end float
-
-@node Definizioni matematiche
-@section Altre cose da sapere
-
-Il resto di questo @value{CHAPTER} usa un certo numero di termini. Di seguito
-vengono date alcune definizioni informali che dovrebbero essere utili
-per la lettura di questo documento:
-
-@table @dfn
-@item Accuratezza
-L'accuratezza del calcolo sui numeri a virgola mobile indica di quanto si
-avvicina il calcolo al valore reale (calcolato con carta e penna).
-
-@item Errore
-La differenza tra quello che il risultato di un calcolo ``dovrebbe dare''
-e quello che effettivamente d@`a. @`E meglio minimizzare l'errore quanto pi@`u
-possibile.
-
-@item Esponente
-L'ordine di grandezza di un valore;
-alcuni bit in un valore a virgola mobile contengono l'esponente.
-
-@item Inf
-Un valore speciale che rappresenta l'infinito. Le operazioni tra un qualsiasi
-numero e l'infinito danno infinito.
-
-@item Mantissa
-Un valore a virgola mobile @`e formato dalla mantissa moltiplicata per 10
-alla potenza dell'esponente. Per esempio, in @code{1,2345e67},
-la mantissa @`e @code{1,2345}.
-
-@item Modalit@`a di arrotondamento
-Come i numeri vanno arrotondati, per eccesso o per difetto, quando necessario.
-Maggiori dettagli verranno forniti in seguito.
-
-@item NaN
-``Not a number'' (Non un Numero).@footnote{Grazie a Michael
-Brennan per questa descrizione, che abbiamo parafrasato, e per gli esempi.} Un
-valore speciale che risulta da un calcolo che non ha risposta come numero
-reale. In tal caso, i programmi possono o ricevere un'eccezione di virgola
-mobile, o restituire @code{NaN} come risultato. Lo standard IEEE 754
-consiglia che i sistemi restituiscano @code{NaN}. Alcuni esempi:
-
-@table @code
-@item sqrt(-1)
-La radice quadrata di @minus{}1 ha senso nell'insieme dei numeri complessi,
-ma non nell'insieme dei numeri reali,
-per cui il risultato @`e @code{NaN}.
-
-@item log(-8)
-Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()},
-per cui il risultato @`e @code{NaN}.
-@end table
-
-@item Normalizzato (formato)
-Come la mantissa (vedi oltre in questa lista) @`e usualmente memorizzata. Il
-valore viene aggiustato in modo che il primo bit sia sempre uno,
-e in questo modo l'uno iniziale @`e supposto presente (per come viene
-generato il numero), ma non @`e memorizzato fisicamente.
-Questo fornisce un bit di precisione in pi@`u.
-
-@item Precisione
-Il numero di bit usati per rappresentare un numero a virgola mobile.
-Pi@`u sono i bit, e maggiore @`e l'intervallo di cifre che si possono
-rappresentare.
-Le precisioni binaria e decimale sono legate in modo approssimativo, secondo
-la formula:
-
-@display
-@iftex
-@math{prec = 3.322 @cdot dps}
-@end iftex
-@ifnottex
-@ifnotdocbook
-@var{prec} = 3.322 * @var{dps}
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>
-@end docbook
-@end display
-
-@noindent
-Qui, @emph{prec} indica la precisione binaria
-(misurata in bit) e @emph{dps} (abbreviazione di "decimal places")
-indica le cifre decimali.
-
-@item Stabilit@`a
-Dal@uref{http://en.wikipedia.org/wiki/Numerical_stability,
-l'articolo di Wikipedia sulla stabilit@`a numerica}:
-``I calcoli per i quali si pu@`o dimostrare che non amplificano gli errori di
-approssimazione sono chiamati @dfn{numericamente stabili}.''
-@end table
-
-Si veda @uref{http://en.wikipedia.org/wiki/Accuracy_and_precision,
-l'articolo di Wikipedia su accuratezza e precisione} per maggiori informazioni
-su questi due termini.
-
-Sui computer moderni, l'unit@`a di calcolo in virgola mobile usa la
-rappresentazione e le operazioni definite dallo standard IEEE 754.
-Tre dei tipi definiti nello standard IEEE 754 sono:
-32-bit singola precisione,
-64-bit doppia precisione e
-128-bit quadrupla precisione.
-Lo standard specifica anche formati a precisione estesa
-per consentire una maggiore precisione e campi di variazione degli esponenti
-pi@`u ampi. (@command{awk} usa solo il formato a 64-bit doppia precisione.)
-
-@ref{table-ieee-formats} elenca la precisione e i valori di campo
-dell'esponente per i principali formati binari IEEE 754.
-
-@float Tabella,table-ieee-formats
-@caption{Valori per i principali formati IEEE}
-@multitable @columnfractions .20 .20 .20 .20 .20
-@headitem Nome @tab Bit totali @tab Precisione @tab Esponente minimo @tab Esponente massimo
-@item Singola @tab 32 @tab 24 @tab @minus{}126 @tab +127
-@item Doppia @tab 64 @tab 53 @tab @minus{}1022 @tab +1023
-@item Quadrupla @tab 128 @tab 113 @tab @minus{}16382 @tab +16383
-@end multitable
-@end float
-
-@quotation NOTA
-I numeri che descrivono la precisione includono la cifra 1 iniziale
-implicita, il che equivale ad avere un bit in pi@`u nella mantissa.
-@end quotation
-
-@node Funzionalit@`a MPFR
-@section Funzionalit@`a per il calcolo a precisione arbitraria in @command{gawk}
-
-Per default, @command{gawk} usa i valori in virgola mobile a doppia precisione
-disponibili nell'hardware del sistema su cui viene eseguito.
-Tuttavia, se @`e stato compilato in modo da includere questa funzionalit@`a
-ed @`e stata specificata
-l'opzione da riga di comando @option{-M}, @command{gawk} usa le librerie
-@uref{http://www.mpfr.org, GNU MPFR} e @uref{http://gmplib.org, GNU MP} (GMP)
-per effettuare calcoli sui numeri con una precisione arbitraria.
-Si pu@`o verificare se il supporto a MPFR @`e disponibile in questo modo:
-
-@example
-$ @kbd{gawk --version}
-@print{} GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
-@print{} Copyright (C) 1989, 1991-2015 Free Software Foundation.
-@dots{}
-@end example
-
-@noindent
-(I numeri di versione visualizzati possono essere diversi. Non importa;
-l'importante @`e che siano presenti GNU MPFR e GNU MP
-nel testo restituito.)
-
-Inoltre, ci sono alcuni elementi disponibili nel vettore @code{PROCINFO}
-per fornire informazioni sulle librerie MPFR e GMP
-(@pxref{Variabili auto-assegnate}).
-
-La libreria MPFR d@`a un controllo accurato sulle precisioni e sulle modalit@`a di
-arrotondamento, e d@`a risultati correttamente arrotondati, riproducibili e
-indipendenti dalla piattaforma. Con l'opzione da riga di comando @option{-M},
-tutti gli operatori aritmetici e le funzioni in virgola mobile possono
-produrre risultati a ogni livello di precisione supportato da MPFR.
-
-Due variabili predefinite, @code{PREC} e @code{ROUNDMODE},
-danno il controllo sulla precisione di elaborazione e sulla modalit@`a di
-arrotondamento. La precisione e la modalit@`a di arrotondamento sono impostate
-a livello globale per ogni operazione da eseguire.
-@xref{Impostare la precisione} e
-@iftex
-la
-@end iftex
-@ref{Impostare modi di arrotondare}
-per maggiori informazioni.
-
-@node Cautela col calcolo in VM
-@section Calcolo in virgola mobile: @dfn{Caveat Emptor}!
-
-@quotation
-@i{L'ora di matematica @`e ostica!}
-@author Teen Talk Barbie, luglio 1992
-@end quotation
-
-Questa @value{SECTION} fornisce un quadro dettagliato dei problemi che
-si presentano quando si eseguono molti calcoli in virgola
-mobile.@footnote{C'@`e un saggio molto bello
-@uref{http://www.validlab.com/goldberg/paper.pdf, sul calcolo in
-virgola mobile} di David Goldberg, ``What Every Computer Scientist Should Know
-About Floating-Point Arithmetic,''
-@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03): 5-48. Vale la pena di
-leggerlo, se si @`e interessati a scendere nei dettagli, per@`o richiede delle
-conoscenze informatiche.}
-Le spiegazioni fornite valgono sia per il calcolo in virgola mobile
-effettuato direttamente dall'hardware del computer, sia per quello
-ottenuto tramite il software per la precisione arbitraria.
-
-@quotation ATTENZIONE
-Le informazioni fornite in questa sede sono deliberatamente di tipo generale.
-Se si devono eseguire calcoli complessi col computer, si dovrebbero prima
-ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto.
-@end quotation
-
-@menu
-* Inesattezza nei calcoli:: La matematica in virgola mobile non @`e
- esatta.
-* Ottenere la precisione:: Ottenere pi@`u precisione richiede qualche
- sforzo.
-* Tentare di arrotondare:: Aggiungere cifre di precisione e arrotondare.
-* Impostare la precisione:: Come impostare la precisione.
-* Impostare modi di arrotondare:: Impostare le modalit@`a di arrotondamento.
-@end menu
-
-@node Inesattezza nei calcoli
-@subsection La matematica in virgola mobile non @`e esatta
-
-Le rappresentazioni e i calcoli con numeri a virgola mobile binari sono
-inesatti. Semplici valori come 0,1 non possono essere rappresentati in modo
-preciso usando numeri a virgola mobile binari, e la limitata precisione dei
-numeri a virgola mobile significa che piccoli cambiamenti nell'ordine delle
-operazioni o la precisione di memorizzazione di operazioni
-intermedie pu@`o cambiare il
-risultato. Per rendere la situazione pi@`u difficile, nel calcolo in virgola
-mobile con precisione arbitraria, si pu@`o impostare la precisione prima di
-eseguire un calcolo, per@`o non si pu@`o sapere con certezza quale sar@`a
-il numero di cifre decimali esatte nel risultato finale.
-
-@menu
-* Rappresentazioni inesatte:: I numeri non sono rappresentati esattamente.
-* Confronti tra valori in VM:: Come confrontare valori in virgola mobile.
-* Gli errori si sommano:: Gli errori diventano sempre maggiori.
-@end menu
-
-@node Rappresentazioni inesatte
-@subsubsection Molti numeri non possono essere rappresentati esattamente
-
-Perci@`o, prima di iniziare a scrivere del codice, si dovrebbe pensare
-al risultato che si vuole effettivamente ottenere e a cosa realmente accade.
-Si considerino i due numeri nel seguente esempio:
-
-@example
-x = 0.875 # 1/2 + 1/4 + 1/8
-y = 0.425
-@end example
-
-Diversamente dal numero in @code{y}, il numero memorizzato in @code{x}
-@`e rappresentabile esattamente nel formato binario, perch@'e pu@`o essere
-scritto come somma finita di una o pi@`u frazioni i cui denominatori sono tutti
-multipli di due.
-Quando @command{gawk} legge un numero a virgola mobile dal sorgente di un
-programma, arrotonda automaticamente quel numero alla precisione, quale che
-sia, supportata dal computer in uso. Se si tenta di stampare il contenuto
-numerico di una variabile usando una stringa di formato in uscita di
-@code{"%.17g"}, il valore restituito pu@`o non essere lo stesso numero assegnato
-a quella variabile:
-
-@example
-$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425}
-> @kbd{ printf("%0.17g, %0.17g\n", x, y) @}'}
-@print{} 0.875, 0.42499999999999999
-@end example
-
-Spesso l'errore @`e talmente piccolo da non essere neppure notato, e se @`e stato
-notato, si pu@`o sempre specificare il grado di precisione si vuole nell'output.
-In genere questo @`e una stringa di formato come @code{"%.15g"} che, se usata
-nell'esempio precedente, d@`a luogo a un output identico all'input.
-
-@node Confronti tra valori in VM
-@subsubsection Fare attenzione quando si confrontano valori
-
-Poich@'e la rappresentazione interna del computer
-pu@`o discostarsi, sia pur di poco, dal valore
-esatto, confrontare dei valori a virgola mobile per vedere se sono esattamente
-uguali @`e generalmente una pessima idea. Questo @`e un esempio in cui tale
-confronto non funziona come dovrebbe:
-
-@example
-$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 0
-@end example
-
-Il metodo generalmente seguito per confrontare valori a virgola mobile
-consiste nel controllare se la differenza tra loro @`e minore di un certo valore
-(chiamato @dfn{delta}, o @dfn{tolleranza}). Quel che si deve decidere @`e qual
-@`e il valore minimo di delta
-adeguato. Il codice per far ci@`o @`e qualcosa del genere:
-
-@example
-delta = 0.00001 # per esempio
-differenza = abs(a) - abs(b) # sottrazione dei due valori
-if (differenza < delta)
- # va bene
-else
- # non va bene
-@end example
-
-@noindent
-(Si presuppone che sia stata definita in qualche parte del programma una
-semplice funzione che restituisce il valore assoluto di un numero,
-chiamata @code{abs()}.)
-
-@node Gli errori si sommano
-@subsubsection Gli errori diventano sempre maggiori
-
-La perdita di accuratezza in un singolo calcolo con numeri a virgola mobile
-generalmente non dovrebbe destare preoccupazione. Tuttavia, se si calcola un
-valore che @`e una sequenza di operazioni in virgola mobile, l'errore si pu@`o
-accumulare e influire sensibilmente sul risultato del calcolo stesso.
-Qui sotto vediamo un tentativo di calcolare il valore di @value{PI} usando
-una delle sue rappresentazioni
-come somma di una serie di numeri:
-
-@example
-BEGIN @{
- x = 1.0 / sqrt(3.0)
- n = 6
- for (i = 1; i < 30; i++) @{
- n = n * 2.0
- x = (sqrt(x * x + 1) - 1) / x
- printf("%.15f\n", n * x)
- @}
-@}
-@end example
-
-Quando viene eseguito, gli errori iniziali si propagano nei calcoli
-successivi, facendo terminare il ciclo prematuramente dopo un tentativo di
-divisione per zero:
-
-@example
-$ @kbd{gawk -f pi.awk}
-@print{} 3.215390309173475
-@print{} 3.159659942097510
-@print{} 3.146086215131467
-@print{} 3.142714599645573
-@dots{}
-@print{} 3.224515243534819
-@print{} 2.791117213058638
-@print{} 0.000000000000000
-@error{} gawk: pi.awk:6: fatale: tentativo di dividere per zero
-@end example
-
-Ecco un altro esempio in cui l'inaccuratezza nelle rappresentazioni interne
-porta a un risultato inatteso:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # esegue il ciclo cinque volte (?)}
-> @kbd{i++}
-> @kbd{print i}
-> @kbd{@}'}
-@print{} 4
-@end example
-
-@node Ottenere la precisione
-@subsection Ottenere la precisione voluta
-
-Pu@`o il calcolo con precisione arbitraria dare risultati esatti? Non ci sono
-risposte facili. Le regole standard dell'algebra spesso non valgono
-nei calcoli con precisione arbitraria.
-Tra le altre cose, le leggi distributiva e associativa non sono rispettate
-completamente, e l'ordine dell'operazione pu@`o essere importante per
-il calcolo.
-Errori di arrotondamento, perdite di precisione che si accumulano, e
-valori molto vicini allo zero sono spesso causa di problemi.
-
-Quando @command{gawk} verifica l'eguaglianza delle espressioni
-@samp{0.1 + 12.2} e @samp{12.3} usando l'aritmetica a doppia precisione della
-macchina, decide che non sono uguali! (@xref{Confronti tra valori in VM}.)
-Si pu@`o ottenere il risultato cercato aumentando la precisione; 56 bit in
-questo caso sono sufficienti:
-
-@example
-$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 1
-@end example
-
-Se aggiungere pi@`u bit @`e una buona cosa, aggiungerne ancora di pi@`u
-@`e meglio?
-Ecco cosa succede se si usa un valore di @code{PREC} ancora pi@`u alto:
-
-@example
-$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
-@print{} 0
-@end example
-
-Non @`e un bug di @command{gawk} o della libreria MPFR.
-@`E facile dimenticare che il numero finito di bit usato per memorizzare il
-valore spesso @`e solo un'approssimazione dopo un opportuno arrotondamento. Il
-test di uguaglianza riesce se e solo se @emph{tutti} i bit dei due operandi
-sono esattamente gli stessi. Poich@'e questo non @`e necessariamente vero dopo un
-calcolo in virgola mobile con una determinata precisione e con una modalit@`a di
-arrotondamento valida, un test di eguaglianza convenzionale potrebbe non
-riuscire. Invece, il test riesce confrontando i due numeri per vedere se la
-differenza tra di loro rientra in un delta accettabile.
-
-In applicazioni dove sono sufficienti fino a 15 cifre decimali,
-il calcolo in doppia precisione eseguito dall'hardware del computer
-pu@`o essere una buona soluzione,
-e in genere @`e pi@`u veloce. Per@`o bisogna tener presente che ogni operazione in
-virgola mobile pu@`o subire un nuovo errore di arrotondamento con conseguenze
-catastrofiche, come si @`e visto nel precedente tentativo di calcolare il valore
-di @value{PI}.
-In tali casi una precisione supplementare pu@`o aumentare la stabilit@`a e
-l'accuratezza del calcolo.
-
-Oltre a ci@`o, bisogna tenere conto del fatto che
-addizioni ripetute non sono necessariamente equivalenti a una moltiplicazione
-nell'aritmetica in virgola mobile. Nell'esempio visto in
-@ref{Gli errori si sommano}:
-
-@example
-$ @kbd{gawk 'BEGIN @{}
-> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # ciclo eseguito cinque volte (?)}
-> @kbd{i++}
-> @kbd{print i}
-> @kbd{@}'}
-@print{} 4
-@end example
-
-@noindent
-non @`e detto che, scegliendo per @code{PREC} un valore arbitrariamente alto, si
-riesca a ottenere il risultato corretto. La riformulazione del problema in
-questione @`e spesso il modo corretto di comportari in tali situazioni.
-
-@node Tentare di arrotondare
-@subsection Tentare di aggiungere bit di precisione e arrotondare
-
-Invece dell'aritmetica in virgola mobile con precisione arbitraria,
-spesso tutto ci@`o di cui si ha bisogno @`e un aggiustamento della logica
-o di un diverso ordine delle operazioni nei calcoli.
-La stabilit@`a e l'accuratezza del calcolo di @value{PI}
-nel primo esempio possono essere migliorata usando la seguente semplice
-trasformazione algebrica:
-
-@example
-(sqrt(x * x + 1) - 1) / x @equiv{} x / (sqrt(x * x + 1) + 1)
-@end example
-
-@noindent
-Dopo aver fatto questo cambiamento, il programma converge verso
-@value{PI} in meno di 30 iterazioni:
-
-@example
-$ @kbd{gawk -f pi2.awk}
-@print{} 3.215390309173473
-@print{} 3.159659942097501
-@print{} 3.146086215131436
-@print{} 3.142714599645370
-@print{} 3.141873049979825
-@dots{}
-@print{} 3.141592653589797
-@print{} 3.141592653589797
-@end example
-
-@node Impostare la precisione
-@subsection Impostare la precisione
-
-@command{gawk} usa una precisione di lavoro a livello globale; non tiene
-traccia della precisione e accuratezza dei singoli numeri. Eseguendo
-un'operazione aritmetica o chiamando una funzione predefinita, il risultato
-viene arrotondato alla precisione di lavoro. La precisione di lavoro di default
-@`e di 53 bit, modificabile usando la variabile predefinita @code{PREC}. Si pu@`o
-anche impostare il valore a una delle stringhe predefinite (non importa se
-scritte in maiuscolo o minuscolo) elencate in
-@ref{table-predefined-precision-strings},
-per emulare un formato binario che segue lo standard IEEE 754.
-
-@float Tabella,table-predefined-precision-strings
-@caption{Stringhe di precisione predefinita per @code{PREC}}
-@multitable {@code{"double"}} {12345678901234567890123456789012345}
-@headitem @code{PREC} @tab formato binario IEEE 754
-@item @code{"half"} @tab 16-bit mezza precisione
-@item @code{"single"} @tab 32-bit singole precisione di base
-@item @code{"double"} @tab 64-bit doppia precisione di base
-@item @code{"quad"} @tab 128-bit quadrupla precisione di base
-@item @code{"oct"} @tab 256-bit ottupla precisione
-@end multitable
-@end float
-
-Il seguente esempio illustra gli effetti del cambiamento di precisione
-sulle operazioni aritmetiche:
-
-@example
-$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0}
-> @kbd{PREC = "double"; print x + 0 @}'}
-@print{} 1e-400
-@print{} 0
-@end example
-
-@quotation ATTENZIONE
-Diffidare delle costanti in virgola mobile! Quando si legge una costante in
-virgola mobile dal codice sorgente di un programma, @command{gawk} usa la
-precisione di default (quella del formato @code{double} di C), a meno che non
-venga richiesto, tramite la variabile speciale @code{PREC} fornita
-sulla riga di comando, di memorizzarla internamente come un numero MPFR.
-Cambiare la precisione tramite @code{PREC} nel testo del programma @emph{non}
-cambia la precisione di una costante.
-
-Se si deve rappresentare una costante in virgola mobile con una precisione
-maggiore di quella di default e non @`e possibile usare un assegnamento a
-@code{PREC} da riga di comando, si dovrebbe definire la costante o come
-stringa, o come numero razionale, ove possibile. L'esempio seguente illustra le
-differenze tra i diversi modi di stampare una costante in virgola mobile:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'}
-@print{} 0.1000000000000000055511151
-$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'}
-@print{} 0.1000000000000000000000000
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'}
-@print{} 0.1000000000000000000000000
-$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
-@print{} 0.1000000000000000000000000
-@end example
-@end quotation
-
-@node Impostare modi di arrotondare
-@subsection Impostare la modalit@`a di arrotondamento
-
-La variabile @code{ROUNDMODE} permette di controllare a livello di programma
-la modalit@`a di arrotondamento.
-La corrispondenza tra @code{ROUNDMODE} e le modalit@`a di arrotondamento IEEE
-@`e mostrata in @ref{table-gawk-rounding-modes}.
-
-@float Tabella,table-gawk-rounding-modes
-@caption{Modalit@`a di arrotondamento in @command{gawk} }
-@multitable @columnfractions .45 .30 .25
-@headitem Modalit@`a di arrotondamento @tab Nome IEEE @tab @code{ROUNDMODE}
-@item Arrotonda al pi@`u vicino, o a un numero pari @tab @code{roundTiesToEven} @tab @code{"N"} o @code{"n"}
-@item Arrotonda verso infinito @tab @code{roundTowardPositive} @tab @code{"U"} o @code{"u"}
-@item Arrotonda verso meno infinito @tab @code{roundTowardNegative} @tab @code{"D"} o @code{"d"}
-@item Arrotonda verso zero (troncamento) @tab @code{roundTowardZero} @tab @code{"Z"} o @code{"z"}
-@item Arrotonda al pi@`u vicino, o per eccesso @tab @code{roundTiesToAway} @tab @code{"A"} o @code{"a"}
-@end multitable
-@end float
-
-@code{ROUNDMODE} ha @code{"N"} come valore di default, ovvero si usa la
-modalit@`a di arrotondamento IEEE 754 @code{roundTiesToEven}.
-In @ref{table-gawk-rounding-modes}, il valore @code{"A"} seleziona
-@code{roundTiesToAway}. Questo @`e applicabile solo se la versione in uso
-della libreria MPFR lo supporta; altrimenti, l'impostazione di @code{ROUNDMODE}
-ad @code{"A"} non ha alcun effetto.
-
-La modalit@`a di default @code{roundTiesToEven} @`e la pi@`u preferita, ma allo
-stesso tempo
-la meno intuitiva. Questo metodo fa la cosa ovvia per la maggior parte dei
-valori, arrotondandoli per eccesso o per difetto alla cifra pi@`u prossima.
-Per esempio, arrotondando 1.132 alle due cifre decimali si ottiene 1.13,
-e 1.157 viene arrotondato a 1.16.
-
-Tuttavia, se si deve arrotondare un valore posto esattamente a met@`a strada,
-le cose non funzionano come probabilmente si insegna a scuola.
-In questo caso, il numero @`e arrotondato alla cifra @emph{pari} pi@`u prossima.
-Cos@`{@dotless{i}} arrotondando 0.125 alle due cifre si arrotonda per difetto a 0.12,
-ma arrotondando 0.6875 alle tre cifre si arrotonda per eccesso a 0.688.
-Probabilmente ci si @`e gi@`a imbattuti in questa modalit@`a di arrotondamento
-usando @code{printf} per formattare numeri a virgola mobile.
-Per esempio:
-
-@example
-BEGIN @{
- x = -4.5
- for (i = 1; i < 10; i++) @{
- x += 1.0
- printf("%4.1f => %2.0f\n", x, x)
- @}
-@}
-@end example
-
-@noindent
-produce il seguente output quando viene eseguito sul sistema
-dell'autore:@footnote{@`E possibile che l'output sia completamente diverso, se la
-libreria C presente nel sistema in uso non si conforma, per @code{printf},
-alla regola IEEE 754
-di arrotondamento al valore pari in caso di equidistanza.}
-
-@example
--3.5 => -4
--2.5 => -2
--1.5 => -2
--0.5 => 0
- 0.5 => 0
- 1.5 => 2
- 2.5 => 2
- 3.5 => 4
- 4.5 => 4
-@end example
-
-La teoria che sta dietro alla regola
-@code{roundTiesToEven} @`e che gli arrotondamenti di
-valori equidistanti in eccesso e in difetto si distribuiscono pi@`u o meno
-uniformemente, con la possibile conseguenza che errori di arrotondamento
-ripetuti tendono ad annullarsi a vicenda. Questa @`e la modalit@`a di
-arrotondamento di default per funzioni e operatori di calcolo secondo IEEE 754.
-
-Le altre modalit@`a di arrotondamento sono usate raramente. Gli arrotondamenti
-verso l'infinito (@code{roundTowardPositive}) e verso il meno infinito
-(@code{roundTowardNegative}) vengono spesso usati per eseguire calcoli su
-intervalli, dove si adotta questa modalit@`a di arrotondamento per calcolare
-i limiti superiore e inferiore per l'intervallo di valori in uscita.
-La modalit@`a
-@code{roundTowardZero} pu@`o essere usata per convertire numeri a virgola mobile
-in numeri interi. La modalit@`a di arrotondamento @code{roundTiesToAway}
-arrotonda il risultato al numero pi@`u vicino, e in caso di equidistanza
-arrotonda per eccesso.
-
-Qualche esperto di analisi numerica dir@`a che la scelta dello stile di
-arrotondamento ha un grandissimo impatto sul risultato finale, e consiglier@`a
-di attendere sino al risultato finale dopo ogni arrotondamento. Invece,
-spesso si possono evitare problemi legati a errori di arrotondamento
-impostando all'inizio la precisione a un valore sufficientemente maggiore
-della precisione desiderata, in modo che il cumulo degli errori di
-arrotondamento non influisca sul
-risultato finale. Se si ha il dubbio che i risultati del calcolo contengano
-un'accumulazione di errori di arrotondamento, occorre, per accertare la cosa,
-controllare se si verifica una differenza significativa nell'output
-cambiando la modalit@`a di arrotondamento.
-
-@node Interi a precisione arbitraria
-@section Aritmetica dei numeri interi a precisione arbitraria con @command{gawk}
-@cindex numeri interi a precisione arbitraria
-@cindex interi a precisione arbitraria
-@cindex precisione arbitraria, interi a
-
-Quando viene specificata l'opzione @option{-M},
-@command{gawk} esegue tutti i calcoli sui numeri interi usando gli interi a
-precisione arbitraria della libreria GMP. Qualsiasi numero che appaia come un
-intero in un sorgente o in un @value{DF} @`e memorizzato come intero a precisione
-arbitraria. La dimensione del numero intero ha come limite solo la memoria
-disponibile. Per esempio, il seguente programma calcola
-@iftex
-@math{5^{4^{3^{2}}}},
-@end iftex
-@ifinfo
-5^4^3^2,
-@end ifinfo
-@ifnottex
-@ifnotinfo
-5@sup{4@sup{3@sup{2}}},
-@end ifnotinfo
-@end ifnottex
-il cui risultato @`e oltre i limiti degli ordinari valori a virgola mobile a
-doppia precisione dei processori:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{}
-> @kbd{x = 5^4^3^2}
-> @kbd{print "numero di cifre =", length(x)}
-> @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)}
-> @kbd{@}'}
-@print{} numero di cifre = 183231
-@print{} 62060698786608744707 ... 92256259918212890625
-@end example
-
-Se invece si dovesse calcolare lo stesso valore usando valori a virgola mobile
-con precisione arbitraria, la precisione necessaria per il risultato corretto
-(usando
-la formula
-@iftex
-@math{prec = 3.322 @cdot dps})
-sarebbe @math{3.322 @cdot 183231},
-@end iftex
-@ifnottex
-@ifnotdocbook
-@samp{prec = 3.322 * dps})
-sarebbe 3.322 x 183231,
-@end ifnotdocbook
-@end ifnottex
-@docbook
-<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>)
-would be
-<emphasis>prec</emphasis> = 3.322 &sdot; 183231,
-@end docbook
-o 608693.
-
-Il risultato di un'operazione aritmetica tra un intero e un valore a virgola
-mobile @`e un valore a virgola mobile con precisione uguale alla precisione di
-lavoro. Il seguente programma calcola l'ottavo termine nella successione di
-Sylvester@footnote{Weisstein, Eric W.
-@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
-@w{(@url{http://mathworld.wolfram.com/SylvestersSequence.html}).}}
-usando una ricorrenza:
-
-@example
-$ @kbd{gawk -M 'BEGIN @{}
-> @kbd{s = 2.0}
-> @kbd{for (i = 1; i <= 7; i++)}
-> @kbd{s = s * (s - 1) + 1}
-> @kbd{print s}
-> @kbd{@}'}
-@print{} 113423713055421845118910464
-@end example
-
-Il risultato mostrato differisce dal numero effettivo,
-113.423.713.055.421.844.361.000.443,
-perch@'e la precisione di default di 53 bit non @`e suffciente per rappresentare
-esattamente il risultato in virgola mobile. Si pu@`o o aumentare la precisione
-(in questo caso bastano 100 bit), o sostituire la costante in virgola mobile
-@samp{2.0} con un intero, per eseguire tutti i calcoli usando l'aritmetica con
-gli interi per ottenere l'output corretto.
-
-A volte @command{gawk} deve convertire implicitamente un intero con precisione
-arbitraria in un valore a virgola mobile con precisione arbitraria.
-Ci@`o si rende necessario
-principalmente perch@'e la libreria MPFR non sempre prevede l'interfaccia
-necessaria per elaborare interi a precisione arbitraria o numeri di tipo
-eterogeneo come richiesto da un'operazione o funzione. In tal caso, la
-precisione viene impostata al minimo valore necessario per una conversione
-esatta, e non viene usata la precisione di lavoro. Se
-questo non @`e quello di cui si ha bisogno o che si vuole, si pu@`o ricorrere a un
-sotterfugio e convertire preventivamente l'intero in un valore a virgola
-mobile, come qui di seguito:
-
-@example
-gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
-@end example
-
-Si pu@`o evitare completamente questo passaggio specificando il numero come
-valore a virgola mobile fin dall'inizio:
-
-@example
-gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
-@end example
-
-Si noti che, per questo specifico esempio, probabilmente @`e meglio
-semplicemente specificare:
-
-@example
-gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
-@end example
-
-Dividendo due interi a precisione arbitraria con @samp{/} o con @samp{%}, il
-risultato @`e tipicamente un valore a virgola mobile con precisione arbitraria
-(a meno che il risultato non sia un numero intero esatto).
-Per eseguire divisioni intere o calcolare moduli con interi a precisione
-arbitraria, usare la funzione predefinita
-@code{intdiv()} (@pxref{Funzioni numeriche}).
-
-Si pu@`o simulare la funzione @code{intdiv()} in @command{awk} standard
-usando questa funzione definita dall'utente:
-
-@example
-@c file eg/lib/intdiv.awk
-# intdiv --- fa una divisione intera
-
-@c endfile
-@ignore
-@c file eg/lib/intdiv.awk
-#
-# Arnold Robbins, arnold@@skeeve.com, Public Domain
-# July, 2014
-#
-# Name changed from div() to intdiv()
-# April, 2015
-
-@c endfile
-
-@end ignore
-@c file eg/lib/intdiv.awk
-function intdiv(numerator, denominator, result)
-@{
- split("", result)
-
- numerator = int(numerator)
- denominator = int(denominator)
- result["quotient"] = int(numerator / denominator)
- result["remainder"] = int(numerator % denominator)
-
- return 0.0
-@}
-@c endfile
-@end example
-
-Il seguente programma d'esempio, proposto da Katie Wasserman,
-usa @code{intdiv()} per
-calcolare le cifre di @value{PI} al numero di cifre significative
-che si @`e scelto di impostare:
-
-@example
-@c file eg/prog/pi.awk
-# pi.awk --- calcola le cifre di pi
-@c endfile
-@c endfile
-@ignore
-@c file eg/prog/pi.awk
-#
-# Katie Wasserman, katie@@wass.net
-# August 2014
-@c endfile
-@end ignore
-@c file eg/prog/pi.awk
-
-BEGIN @{
- cifre = 100000
- due = 2 * 10 ^ cifre
- pi = due
- for (m = cifre * 4; m > 0; --m) @{
- d = m * 2 + 1
- x = pi * m
- intdiv(x, d, risultato)
- pi = risultato["quotient"]
- pi = pi + due
- @}
- print pi
-@}
-@c endfile
-@end example
-
-@ignore
-Date: Wed, 20 Aug 2014 10:19:11 -0400
-To: arnold@skeeve.com
-From: Katherine Wasserman <katie@wass.net>
-Subject: Re: computation of digits of pi?
-
-Arnold,
-
->The program that you sent to compute the digits of pi using div(). Is
->that some standard algorithm that every math student knows? If so,
->what's it called?
-
-It's not that well known but it's not that obscure either
-
-It's Euler's modification to Newton's method for calculating pi.
-
-Take a look at lines (23) - (25) here: http://mathworld.wolfram.com/PiFormulas.htm
-
-The algorithm I wrote simply expands the multiply by 2 and works from the innermost expression outwards. I used this to program HP calculators because it's quite easy to modify for tiny memory devices with smallish word sizes.
-
-http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
-
--Katie
-@end ignore
-
-Quando gli fu chiesto dell'algoritmo usato, Katie rispose:
-
-@quotation
-Non @`e quello pi@`u noto ma nemmeno quello pi@`u incomprensibile.
-@`E la variante di Eulero al metodo di Newton per il calcolo del Pi greco.
-Si vedano le righe (23) - (25) nel sito:
-@uref{http://mathworld.wolfram.com/PiFormulas.html}.
-
-L'algoritmo che ho scritto semplicemente espande il moltiplicare per 2 e
-lavora dall'espressione pi@`u interna verso l'esterno. Ho usato questo per
-programmare delle calcolatrici HP perch@'e @`e piuttosto facile da adattare ai
-dispositivi di scarsa memoria con dimensioni di parola piuttosto piccole.
-Si veda
-@uref{http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899}.
-@end quotation
-
-@node Problemi virgola mobile POSIX
-@section Confronto tra standard e uso corrente
-
-Per diverso tempo, @command{awk} ha convertito le stringhe dall'aspetto non
-numerico nel valore numerico zero, quando richiesto. Per di pi@`u, la
-definizione originaria del linguaggio e lo standard POSIX originale prevedevano
-che @command{awk} riconoscesse solo i numeri decimali (base 10), e non i numeri
-ottali (base 8) o esadecimali (base 16).
-
-Le modifiche nel linguaggio degli standard POSIX 2001 e 2004 possono essere
-interpretate nel senso che @command{awk} debba fornire delle funzionalit@`a
-aggiuntive. Queste sono:
-
-@itemize @value{BULLET}
-@item
-Interpretazione del valore dei dati a virgola mobile specificati in notazione
-esadecimale (p.es., @code{0xDEADBEEF}). (Da notare: valore dei dati letti,
-@emph{non} costanti facenti parte del codice sorgente.)
-
-@item
-Supporto per i valori a virgola mobile speciali IEEE 754 ``not a number''
-(NaN), pi@`u infinito (``inf'') e meno infinito (``@minus{}inf'').
-In particolare, il formato per questi valori @`e quello specificato dallo
-standard C ISO 1999, che non distingue maiuscole/minuscole e pu@`o consentire
-caratteri aggiuntivi dipendenti dall'implementazione dopo il @samp{nan}, e
-consentire o @samp{inf} o @samp{infinity}.
-@end itemize
-
-Il primo problema @`e che entrambe le modifiche sono deviazioni evidenti
-dalla prassi consolidata:
-
-@itemize @value{BULLET}
-@item
-Il manutentore di @command{gawk} crede che supportare i valori a virgola mobile
-esadecimali, nello specifico, sia sbagliato, e che non sia mai stata intenzione
-dell'autore originale di introdurlo nel linguaggio.
-
-@item
-Consentire che stringhe completamente alfabetiche abbiano valori numerici
-validi @`e anch'essa una deviazione molto marcata dalla prassi consolidata.
-@end itemize
-
-Il secondo problema @`e che il manutentore di @command{gawk} crede che questa
-interpretazione dello standard, che richiede una certa dimestichezza col
-linguaggio giuridico per essere compresa, non sempre @`e stata
-colta dai normali sviluppatori. In altre parole, ``Sappiamo come siete
-arrivati sin qui, ma non pensiamo che questo sia il posto dove volete essere.''
-
-Recependo queste argomentazioni, e cercando nel contempo di assicurare la
-compatibilit@`a con le versioni precedenti dello standard, lo standard POSIX 2008
-ha aggiunto delle formulazioni esplicite per consentire l'uso da parte di
-@command{awk}, solo a richiesta, dei valori a virgola mobile esadecimali e
-dei valori speciali
-``@dfn{not a number}'' e infinito.
-
-Sebbene il manutentore di @command{gawk} continui a credere che introdurre
-queste funzionalit@`a sia sconsigliabile, ci@`o nonostante, sui sistemi che
-supportano i valori in virgola mobile IEEE, sembra giusto fornire
-@emph{qualche}
-possibilit@`a di usare i valori NaN e infinito. La soluzione implementata
-in @command{gawk} @`e questa:
-
-@itemize @value{BULLET}
-@item
-Se @`e stata specificata l'opzione da riga di comando @option{--posix},
-@command{gawk} non
-interviene. I valori di stringa sono passati direttamente alla funzione
-@code{strtod()} della libreria di sistema, e se quest'ultima restituisce
-senza errori un valore numerico,
-esso viene usato.@footnote{L'avete voluto, tenetevelo.}
-Per definizione, i risultati non sono portabili su diversi sistemi;
-e sono anche piuttosto sorprendenti:
-
-@example
-$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'}
-@print{} nan
-$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'}
-@print{} 3735928559
-@end example
-
-@item
-Senza l'opzione @option{--posix}, @command{gawk} interpreta i quattro valori di stringa
-@samp{+inf},
-@samp{-inf},
-@samp{+nan}
-e
-@samp{-nan}
-in modo speciale, producendo i corrispondenti valori numerici speciali.
-Il segno iniziale serve per segnalare a @command{gawk} (e all'utente)
-che il valore @`e realmente numerico. I numeri a virgola mobile esadecimali
-non sono consentiti (a meno di non usare anche @option{--non-decimal-data},
-che @emph{non} @`e consigliabile). Per esempio:
-
-@example
-$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
-@print{} 0
-$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
-@print{} nan
-$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
-@print{} 0
-@end example
-
-@command{gawk} ignora la distinzione maiuscole/minuscole nei quattro valori
-speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa.
-@end itemize
-
-@node Sommario virgola mobile
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-La maggior parte dell'aritmetica al calcolatore @`e fatta usando numeri interi
-oppure
-valori a virgola mobile. L'@command{awk} standard usa valori a virgola mobile
-a doppia precisione.
-
-@item
-Nei primi anni '90 Barbie disse erroneamente, ``L'ora di matematica @`e
-ostica!'' Sebbene la matematica non sia ostica, l'aritmetica a virgola
-mobile non @`e proprio come la
-matematica ``carta e penna'', e bisogna prestare attenzione:
-
-@c nested list
-@itemize @value{MINUS}
-@item
-Non tutti i numeri possono essere rappresentati in modo esatto.
-
-@item
-Per confrontare dei valori bisognerebbe usare un delta, invece di farlo
-direttamente con @samp{==} e @samp{!=}.
-
-@item
-Gli errori si accumulano.
-
-@item
-Le operazioni non sempre sono esattamente associative o distributive.
-@end itemize
-
-@item
-Aumentare l'accuratezza pu@`o essere d'aiuto, ma non @`e una panacea.
-
-@item
-Spesso, aumentare la precisione e poi arrotondare al numero di cifre
-desiderato produce risultati soddisfacenti.
-
-@item
-Specificare l'opzione @option{-M} (o @option{--bignum}) per abilitare
-il calcolo MPFR.
-Usare @code{PREC} per impostare la precisione in bit, e
-@code{ROUNDMODE} per impostare la modalit@`a di arrotondamento tra quelle
-previste nello standard IEEE 754.
-
-@item
-Specificando l'opzione @option{-M}, @command{gawk} esegue calcoli su interi a precisione
-arbitraria usando la libreria GMP. In tal modo si ha una maggiore velocit@`a e
-una pi@`u efficiente allocazione dello spazio rispetto all'uso di MPFR per
-eseguire gli stessi calcoli.
-
-@item
-Ci sono diverse aree per quanto attiene ai numeri a virgola mobile in cui
-@command{gawk} @`e in disaccordo con lo standard POSIX.
-@`E importante averlo ben presente.
-
-@item
-In generale, non vi @`e alcun bisogno di essere eccessivamente diffidenti verso i
-risultati del calcolo in virgola mobile. La lezione da ricordare @`e che
-il calcolo in virgola mobile @`e sempre pi@`u complesso di quello che si fa con
-carta e penna. Per trarre vantaggio dalla potenza del calcolo in virgola
-mobile, bisogna conoscere i suoi limiti e stare all'interno di essi.
-Per la maggior parte degli usi occasionali del calcolo in virgola mobile, si
-possono ottenere i risultati attesi semplicemente arrotondando la
-visualizzazione dei risultati finali al giusto numero di cifre decimali
-significative.
-
-@item
-Come consiglio generale, evitare di rappresentare dati numerici in maniera
-tale da far sembrare che la precisione sia maggiore di quella effettivamente
-necessaria.
-
-@end itemize
-
-@node Estensioni dinamiche
-@chapter Scrivere estensioni per @command{gawk}
-@cindex estensioni caricate dinamicamente
-@cindex dinamiche, estensioni
-
-@`E possibile aggiungere nuove funzioni, scritte in C o C++, a @command{gawk}
-usando librerie caricate dinamicamente. Questa funzionalit@`a @`e disponibile
-su sistemi che supportano le funzioni C @code{dlopen()} e @code{dlsym()}.
-Questo @value{CHAPTER} descrive come creare estensioni usando codice scritto
-in C o C++.
-
-Chi @`e completamente digiuno di programmazione in C pu@`o tranquillamente
-saltare questo @value{CHAPTER}, ma potrebbe valer la pena di dare un'occhiata
-alla documentazione sulle estensioni che sono installate insieme a
-@command{gawk} (@pxref{Esempi di estensione}),
-e alle informazioni sul progetto @code{gawkextlib} (@pxref{gawkextlib}).
-Gli esempi di estensione sono automaticamente compilati e installati quando
-si installa @command{gawk}.
-
-@quotation NOTA
-Se si specifica l'opzione @option{--sandbox}, le estensioni non sono
-disponibili
-(@pxref{Opzioni}).
-@end quotation
-
-@menu
-* Introduzione alle estensioni:: Cos'@`e un'estensione.
-* Licenza delle estensioni:: Una nota riguardo al tipo di licenza.
-* Panoramica sul meccanismo delle estensioni:: Una panoramica sul meccanismo
- delle estensioni.
-* Descrizione dell'API delle estensioni:: Una descrizione completa dell'API.
-* Trovare le estensioni:: Come @command{gawk} trova le estensioni
- compilate.
-* Esempio di estensione:: Esempio di codice C di un'estensione.
-* Esempi di estensione:: Le estensioni di esempio incluse con
- @command{gawk}.
-* gawkextlib:: Il progetto @code{gawkextlib}.
-* Sommario delle estensioni:: Sommario delle estensioni.
-* Esercizi sulle estensioni:: Esercizi.
-@end menu
-
-@node Introduzione alle estensioni
-@section Cos'@`e un'estensione
-
-@cindex plug-in
-Un'@dfn{estensione} (talora chiamata @dfn{plug-in}) @`e un frammento di codice
-compilato esternamente che @command{gawk} pu@`o caricare in fase di esecuzione
-per ottenere funzionalit@`a ulteriori, che vanno ad aggiungersi a quelle di
-@command{gawk} descritte nel resto di questo @value{DOCUMENT}.
-
-Le estensioni sono utili perch@'e consentono (ovviamente) di estendere le
-funzionalit@`a di @command{gawk}. Per esempio, possono permettere l'uso di
-@dfn{chiamate di sistema} (come @code{chdir()} per cambiare directory)
-e di altre routine di libreria C potenzialmente utili. Come per la maggior
-parte del software, ``il cielo @`e il limite''; se si riesce a immaginare
-qualcosa che si vuol fare e che @`e possibile programmare in C o C++,
-si pu@`o scrivere un'estensione che lo faccia!
-
-Le estensioni sono scritte in C o C++, usando l'API (@dfn{Application
-Programming Interface}) definita per questo scopo dagli sviluppatori di
-@command{gawk}. Il resto di questo @value{CHAPTER} descrive
-le possibilit@`a offerte dall'API e come usarle,
-e illustra una piccola estensione di esempio. Inoltre, sono documentati
-gli esempi di estensione inclusi nella distribuzione di @command{gawk}
-e viene descritto il progetto @code{gawkextlib}.
-@ifclear FOR_PRINT
-@xref{Progetto delle estensioni}, per una disamina degli obiettivi e del
-progetto del meccanismo delle estensioni.
-@end ifclear
-@ifset FOR_PRINT
-Si veda @uref{http://www.gnu.org/software/gawk/manual/html_node/estensione-Design.html}
-per una disamina degli obiettivi e del
-progetto del meccanismo delle estensioni.
-@end ifset
-
-@node Licenza delle estensioni
-@section Tipo di licenza delle estensioni
-
-Ogni estensione dinamica dev'essere distribuita in base a una licenza che sia
-compatibile con la licenza GNU GPL (@pxref{Copia}).
-
-Per far sapere a @command{gawk} che la licenza @`e quella corretta,
-l'estensione deve definire il simbolo globale
-@code{plugin_is_GPL_compatibile}. Se tale simbolo non @`e stato definito,
-@command{gawk} termina con un messaggio di errore fatale al momento del
-caricamente dell'estensione.
-
-Il tipo dichiarato per il suddetto simbolo dev'essere @code{int}. Esso non
-deve tuttavia essere presente in ogni sezione allocata.
-Il controllo in essere si limita a constatare che quel simbolo esiste a
-livello globale.
-Qualcosa del genere pu@`o essere sufficiente:
-
-@example
-int plugin_is_GPL_compatible;
-@end example
-
-@node Panoramica sul meccanismo delle estensioni
-@section Una panoramica sul funzionamento ad alto livello
-
-La comunicazione tra
-@command{gawk} e un'estensione @`e bidirezionale. Dapprima, quando
-un'estensione @`e caricata, @command{gawk} le passa un puntatore a una struttura
-(@code{struct}) i cui campi sono dei puntatori di funzione.
-@ifnotdocbook
-Questo si pu@`o vedere in @ref{figura-carica-estensione}.
-@end ifnotdocbook
-@ifdocbook
-Questo si pu@`o vedere in @inlineraw{docbook, <xref linkend="figura-carica-estensione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-carica-estensione
-@caption{Caricamento dell'estensione}
-@ifclear SMALLPRINT
-@center @image{api-figura1, , , Caricamento dell'estensione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura1, 11cm, , Caricamento dell'estensione}
-@end ifset
-
-@end float
-@end ifnotdocbook
-
-@docbook
-<figure id="figura-carica-estensione" float="0">
-<title>Caricamento dell'estensione</title>
-<mediaobject>
-<imageobject role="web"><imagedata fileref="api-figura1.png" format="PNG"/></imageobject>
-</mediaobject>
-</figure>
-@end docbook
-
-L'estensione @`e in grado di chiamare funzioni all'interno di @command{gawk}
-utilizzando questi puntatori a funzione, in fase di esecuzione, senza aver
-bisogno di accedere (in fase di compilazione), ai simboli di @command{gawk}.
-Uno di questi puntatori a funzione punta a una funzione che serve per
-``registrare'' nuove funzioni.
-@ifnotdocbook
-Questo @`e mostrato in @ref{figura-registrare-una-nuova-funzione}.
-@end ifnotdocbook
-@ifdocbook
-Questo @`e shown in @inlineraw{docbook, <xref linkend="figura-registrare-una-nuova-funzione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-registrare-una-nuova-funzione
-@caption{Registrare una nuova funzione}
-@ifclear SMALLPRINT
-@center @image{api-figura2, , , Registrare una nuova funzione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura2, 11cm , , Registrare una nuova funzione}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-Nella direzione opposta, l'estensione registra le sue nuove funzioni
-con @command{gawk} passando dei puntatori che puntano alle funzioni che
-implementano la nuova funzionalit@`a, (p.es. @code{do_chdir()}). @command{gawk}
-associa il puntatore a funzione con un nome ed @`e in grado di chiamarlo in
-seguito, usando una convenzione di chiamata predefinita.
-@ifnotdocbook
-Questo @`e mostrato in @ref{figura-chiamata-nuova-funzione}.
-@end ifnotdocbook
-@ifdocbook
-Questo @`e mostrato in @inlineraw{docbook, <xref linkend="figura-chiamata-nuova-funzione"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-chiamata-nuova-funzione
-@caption{Chiamata della nuova funzione}
-@ifclear SMALLPRINT
-@center @image{api-figura3, , , Chiamata della nuova funzione}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{api-figura3,11cm , , Chiamata della nuova funzione}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-La funzione @code{do_@var{xxx}()}, a sua volta, utilizza i puntatori a
-funzione nella struttura (@code{struct}) API per svolgere il proprio compito,
-come aggiornare variabili o vettori, stampare messaggi, impostare la
-variabile @code{ERRNO}, e cos@`{@dotless{i}} via.
-
-Delle macro di servizio rendono la chiamata effettuata utilizzando
-i puntatori simile a quella delle funzioni normali, in modo che il codice
-sorgente delle estensioni rimanga sufficientemente leggibile e comprensibile.
-
-Sebbene tutto ci@`o possa sembrare piuttosto complesso, il risultato @`e che il
-codice sorgente dell'estensione @`e abbastanza intuitivo da scrivere e da
-leggere. Lo si pu@`o constatare nell'estensione di esempio
-@file{filefuncs.c}
-(@pxref{Esempio di estensione}), come pure nel codice @file{testext.c},
-che testa l'interfaccia di programmazione (API).
-
-Ecco alcuni ulteriori dettagli:
-
-@itemize @value{BULLET}
-@item
-L'API fornisce accesso ai valori delle variabili @command{gawk}
-@code{do_@var{xxx}}, che memorizzano opzioni della riga di comando come
-@code{do_lint}, @code{do_profiling}, e cos@`{@dotless{i}} via (@pxref{Variabili dell'estensione API}).
-Questi valori sono solo informativi: un'estensione non pu@`o modificarli
-all'interno di @command{gawk}. Oltre a ci@`o, il tentativo di assegnare loro
-dei valori produce un errore quando l'estensione viene compilata.
-
-@item
-L'API fornisce anche i numeri che identificano la specifica versione di
-@command{gawk}, in modo che un'estensione possa controllare se il
-comando @command{gawk} che l'ha caricata @`e in grado di supportare le
-funzionalit@`a utilizzate nell'estensione. (Discrepanze tra le versioni
-``non dovrebbero'' accadere, ma si sa come vanno @emph{queste} cose.)
-@xref{Versione dell'estensione} per ulteriori dettagli.
-@end itemize
-
-@node Descrizione dell'API delle estensioni
-@section Una descrizione completa dell'API
-@cindex estensioni, API delle
-@cindex API, delle estensioni
-
-Il codice sorgente scritto in C o C++ per un'estensione deve includere il
-file di intestazione
-@file{gawkapi.h}, che dichiara le funzioni e definisce i tipi di dati
-usati per comunicare con @command{gawk}.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-(non breve) @value{SECTION} descrive l'API in detttaglio.
-
-@menu
-* Intro funzioni API delle estensioni:: Introduzione alle funzioni dell'API.
-* Tipi di dati generali:: I tipi di dati.
-* Funzioni di allocazione memoria:: Funzioni per allocare memoria.
-* Funzioni di costruzione:: Funzioni per creare valori.
-* Funzioni di registrazione:: Funzioni per registrare cose con
- @command{gawk}.
-* Stampare messaggi:: Funzioni per stampare messaggi.
-* Aggiornare @code{ERRNO}:: Funzioni per aggiornare @code{ERRNO}.
-* Richiedere valori:: Come ottenere un valore.
-* Accedere ai parametri:: Funzioni per accedere ai parametri.
-* Accedere alla tabella simboli:: Funzioni per accedere alle variabili
- globali
-* Manipolazione di vettori:: Funzioni per lavorare coi vettori.
-* Ridirezione API:: Come accedere alla ridirezioni e
- modificarle.
-* Variabili dell'estensione API:: Variabili fornite dall'API.
-* Codice predefinito di un'estensione API:: Codice predefinito di
- interfaccia API.
-* Modifiche dalla versione API 1:: Modifiche dalla versione 1 dell'API.
-@end menu
-
-@node Intro funzioni API delle estensioni
-@subsection Introduzione alle funzioni dell'API
-
-L'accesso a funzionalit@`a interne a @command{gawk} @`e effettuato
-con una chiamata che usa i puntatori a funzione resi disponibili
-all'estensione.
-
-Puntatori a funzioni API sono previsti per i seguenti tipi di operazioni:
-
-@itemize @value{BULLET}
-@item
-Allocare, riallocare e liberare memoria.
-
-@item
-Registrare funzioni. Si possono registrare:
-
-@c nested list
-@itemize @value{MINUS}
-@item
-Funzioni di estensione
-@item
-Funzioni ausiliarie di pulizia (@dfn{callbacks})
-@item
-Una stringa di caratteri che identifica la versione
-@item
-Funzioni per analizzare l'input
-@item
-Funzioni per modificare l'output
-@item
-Processori bidirezionali
-@end itemize
-
-Tutti questi elementi sono spiegati dettagliatamente nel resto di questo @value{CHAPTER}.
-
-@item
-Stampare messaggi fatali, di avvertimento e quelli generati dall'opzione
-``lint''.
-
-@item
-Modificare @code{ERRNO} o annullarne il valore.
-
-@item
-Accedere a parametri, compresa la possibilit@`a di definire come vettore
-un parametro ancora indefinito.
-
-@item
-Accedere alla "tabella dei simboli": procurarsi il valore di una variabile
-globale, crearne una nuova o modificarne una gi@`a esistente.
-
-@item
-Creare ed eliminare valori nascosti; ci@`o rende possibile usare un
-particolare valore per pi@`u di una variabile, e pu@`o migliorare parecchio
-le prestazioni.
-
-@item
-Manipolare vettori:
-
-@itemize @value{MINUS}
-@item
-Ritrovare il valore di elementi del vettore, aggiungerne di nuovi,
-cancellare e modificare elementi esistenti.
-
-@item
-Ottenere il numero di elementi presenti in un vettore
-
-@item
-Creare un nuovo vettore
-
-@item
-Cancellare un intero vettore
-
-@item
-Appiattire un vettore per poter facilmente eseguire un ciclo, in stile C,
-su tutti i suoi indici ed elementi
-@end itemize
-
-@item
-Accedere a ridirezioni e manipolarle.
-
-@end itemize
-
-Alcune osservazioni riguardo all'uso dell'API:
-
-@itemize @value{BULLET}
-@item
-I seguenti tipi di variabili, macro e/o funzioni sono resi disponibili
-nel file @file{gawkapi.h}. Perch@'e siano utilizzabili, i rispettivi file di
-intestazione standard indicati devono essere stati specificati @emph{prima}
-di includere @file{gawkapi.h}:
-
-@c FIXME: Make this as a float at some point.
-@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}}
-@headitem Elemento C @tab File d'intestazione
-@item @code{EOF} @tab @code{<stdio.h>}
-@item valori di @code{errno} @tab @code{<errno.h>}
-@item @code{FILE} @tab @code{<stdio.h>}
-@item @code{NULL} @tab @code{<stddef.h>}
-@item @code{memcpy()} @tab @code{<string.h>}
-@item @code{memset()} @tab @code{<string.h>}
-@item @code{size_t} @tab @code{<sys/types.h>}
-@item @code{struct stat} @tab @code{<sys/stat.h>}
-@end multitable
-
-Per ragioni di portabilit@`a, specialmente per sistemi
-che non sono interamente aderenti agli standard, occorre assicurarsi di
-includere i file corretti nel modo corretto. Questa richiesta mira
-a mantenere il file @file{gawkapi.h} ordinato, invece che farlo diventare
-un'accozzaglia di problemi di portabilit@`a, quale si pu@`o vedere in alcune
-parti del codice sorgente di @command{gawk}.
-
-@item
-Il file @file{gawkapi.h} pu@`o essere incluso pi@`u volte, senza conseguenze
-negative. Tuttavia sarebbe meglio evitare di farlo, per uno
-stile di programmazione migliore.
-
-@item
-Sebbene l'API usi solo funzionalit@`a ISO C 90, c'@`e un'eccezione; le funzione
-``costruttrici'' usano la parola chiave @code{inline}. Se il compilatore in
-uso non supporta questa parola chiave, si dovrebbe specificare sulla
-riga di comando il parametro @samp{-Dinline=''} oppure usare gli strumenti
-Autotools GNU e includere un file
-@file{config.h} nel codice sorgente delle estensioni.
-
-@item
-Tutti i puntatori messi a disposizione da @command{gawk} puntano ad aree
-di memoria gestite da @command{gawk} e dovrebbero essere trattati
-dall'estensione come in sola lettura. Le aree di memoria che contengono @emph{tutte} le stringhe passate a
-@command{gawk} dall'estensione @emph{devono} provenire da una chiamata a
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()},
-e sono gestite da @command{gawk} da quel punto in avanti.
-
-@item
-L'API definisce parecchie semplici @code{struct} che mappano dei valori
-come sono visti da @command{awk}. Un valore pu@`o essere un numero @code{double}
-(a virgola mobile, in doppia precisione), una stringa o un
-vettore (come @`e il caso per i vettori multidimensionali o nella creazione di
-un nuovo vettore).
-
-I valori di tipo stringa sono costituiti da un puntatore e da una lunghezza,
-poich@'e nella stringa possono essere presenti dei caratteri @sc{nul}
-(zeri binari, che normalmente marcano la fine di una stringa).
-
-@quotation NOTA
-Di proposito, @command{gawk} immagazzina le stringhe usando la codifica
-multibyte correntemente in uso (come definita dalle variabili d'ambiente
-@env{LC_@var{xxx}}) e non usando dei caratteri larghi (ovvero due byte per
-ogni carattere). Ci@`o riflette il modo con cui @command{gawk} memorizza le
-stringhe internamente, e anche il modo in cui i caratteri sono
-verosimilmente letti dai file in input e scritti nei file in output.
-@end quotation
-
-@quotation NOTA
-I valori di una stringa passati a un'estensione da @command{gawk} hanno
-sempre un carattere @sc{nul} alla fine (come delimitatore). Quindi @`e
-possibile usare senza inconvenienti tali valori di stringa per chiamare
-funzioni di libreria standard e routine di sistema. Tuttavia, poich@'e
-@command{gawk} consente che all'interno di una stringa di dati possano
-essere presenti caratteri @sc{nul}, si dovrebbe controllare che la
-lunghezza di ogni stringa passata un'estensione coincida con il valore
-restituito dalla funzione @code{strlen()} per la stringa stessa.
-@end quotation
-
-@item
-Per ottenere un valore (p.es. quello di un parametro o quello di una
-variabile globale, oppure di un elemento di un vettore), l'estensione chiede
-un tipo specifico di variabile (numero, stringa,
-scalare, @dfn{value cookie} [si veda pi@`u avanti], vettore o ``undefined'').
-Quando la richiesta @`e
-``undefined,'' il valore restituito sar@`a quello originale della variabile in
-questione.
-
-In ogni caso, se la richiesta e il tipo effettivo della variabile non
-corrispondono, la funzione di accesso restituisce ``false'' e fornisce il
-tipo proprio della variabile, in modo che l'estensione possa, p.es.,
-stampare un messaggio di errore
-(del tipo ``ricevuto uno scalare, invece del vettore previsto'').
-
-@c This is documented in the header file and needs some expanding upon.
-@c The table there should be presented here
-@end itemize
-
-Si possono chiamare le funzioni dell'API usando i puntatori a funzione
-direttamente, ma l'interfaccia non @`e molto elegante. Per permettere al
-codice sorgente delle estensioni di assomigliare di pi@`u a un codice normale,
-il file di intestazione @file{gawkapi.h} definisce parecchie
-macro da usare nel codice sorgente dell'estensione.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} presenta le macro come se si trattasse di funzioni.
-
-@node Tipi di dati generali
-@subsection I tipi di dati di impiego generale
-
-@cindex Robbins, Arnold
-@cindex Ramey, Chet
-@quotation
-@i{Ho un vero rapporto di amore/odio con le @dfn{unioni}.}
-@author Arnold Robbins
-@end quotation
-
-@quotation
-@i{Questo @`e ci@`o che contraddistingue le @dfn{unioni}: il compilatore @`e
-in grado di accomodare le cose in modo da far coesistere amore e odio.}
-@author Chet Ramey
-@end quotation
-
-L'estensione API definisce un certo numero di semplici tipi di dato e
-strutture di uso generale. Ulteriori strutture di dati, pi@`u specializzate,
-saranno introdotte
-@ifnotinfo
-nelle successive
-@end ifnotinfo
-@ifinfo
-nei successivi
-@end ifinfo
-@value{SECTIONS}, insieme alle funzioni che ne fanno uso.
-
-I tipi di dati e le strutture di uso generale sono le seguenti:
-
-@table @code
-@item typedef void *awk_ext_id_t;
-Un valore di questo tipo @`e trasmesso da @command{gawk} a un'estensione nel
-momento in cui viene caricata. Tale valore dev'essere restituito
-a @command{gawk} come primo parametro di ogni funzione API.
-
-@item #define awk_const @dots{}
-Questa macro genera delle @samp{costanti} nel momento in cui si compila
-un'estensione, e non genera nulla quando si compila il comando @command{gawk}
-vero e proprio. Ci@`o rende alcuni
-campi nelle strutture dei dati dell'API non alterabili dal codice sorgente
-dell'estensione, ma consente al comando @command{gawk} di usarle secondo
-necessit@`a.
-
-@item typedef enum awk_bool @{
-@itemx @ @ @ @ awk_false = 0,
-@itemx @ @ @ @ awk_true
-@itemx @} awk_bool_t;
-Un semplice tipo di variabile booleana.
-
-@item typedef struct awk_string @{
-@itemx @ @ @ @ char *str;@ @ @ @ @ /* dati veri e propri */
-@itemx @ @ @ @ size_t len;@ @ @ @ /* lunghezza degli stessi, in caratteri */
-@itemx @} awk_string_t;
-Questo rappresenta una stringa modificabile. @command{gawk} @`e responsabile
-per la gestione della memoria utilizzata, se ha fornito il valore della
-stringa. Altrimenti, assume il possesso della memoria in questione.
-@emph{Questa memoria dev'essere resa disponibile chiamando una delle funzioni
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}!}
-
-Come gi@`a detto, la rappresentazione delle stringhe in memoria usa la codifica
-multibyte corrente.
-
-@item typedef enum @{
-@itemx @ @ @ @ AWK_UNDEFINED,
-@itemx @ @ @ @ AWK_NUMBER,
-@itemx @ @ @ @ AWK_STRING,
-@itemx @ @ @ @ AWK_REGEX,
-@itemx @ @ @ @ AWK_STRNUM,
-@itemx @ @ @ @ AWK_ARRAY,
-@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* accesso opaco a una variabile */
-@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* per aggiornare un valore
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ gi@`a creato */
-@itemx @} awk_valtype_t;
-L'elenco @code{enum} indica di che tipo @`e un certo valore.
-@`E usato nella seguente struttura @code{struct}.
-
-@item typedef struct awk_value @{
-@itemx @ @ @ @ awk_valtype_t val_type;
-@itemx @ @ @ @ union @{
-@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s;
-@itemx @ @ @ @ @ @ @ @ double@ @ @ @ @ @ @ @ @ @ @ @ @ d;
-@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a;
-@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl;
-@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc;
-@itemx @ @ @ @ @} u;
-@itemx @} awk_value_t;
-Un ``valore di @command{awk}''.
-Il campo @code{val_type} indica che tipo di valore @code{union} contiene,
-e ogni campo @`e del tipo appropriato.
-
-@item #define str_value@ @ @ @ @ @ u.s
-@itemx #define strnum_value@ @ @ str_value
-@itemx #define regex_value@ @ @ @ str_value
-@itemx #define num_value@ @ @ @ @ @ u.d
-@itemx #define array_cookie@ @ @ u.a
-@itemx #define scalar_cookie@ @ u.scl
-@itemx #define value_cookie@ @ @ u.vc
-L'uso di queste macro rende pi@`u facile da seguire l'accesso ai campi di
-@code{awk_value_t}.
-
-@item typedef void *awk_scalar_t;
-La variabili scalari possono essere rappresentate da un tipo opaco. Questi
-valori sono ottenuti da @command{gawk} e in seguito gli vengono restituiti.
-Questo argomento @`e discusso in maniera generale nel testo che segue questa
-lista, e pi@`u in dettaglio
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Tabella simboli tramite cookie}.
-
-@item typedef void *awk_value_cookie_t;
-Un ``@dfn{value cookie}'' @`e un tipo di variabile opaca, e
-rappresenta un valore nascosto.
-Anche questo argomento @`e discusso in maniera generale nel testo che segue
-questa lista, e pi@`u in dettaglio
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Valori nascosti}.
-
-@end table
-
-I valori di tipo scalare in @command{awk} sono numeri, stringhe, @dfn{strnum}
-o @dfn{regexp} fortemente tipizzate.
-La struttura @code{awk_value_t} rappresenta valori.
-Il campo @code{val_type} indica cosa contiene @code{union}.
-
-Rappresentare numeri @`e facile: l'API usa una variabile C di tipo
-@code{double}. Le stringhe richiedono
-uno sforzo maggiore. Poich@'e
-@command{gawk} consente che le stringhe contengano dei byte @sc{nul}
-(a zeri binari) nel valore di una stringa, una stringa dev'essere
-rappresentata da una coppia di campi che contengono il puntatore al dato vero
-e proprio e la lunghezza della stringa.
-@`E questo @`e il tipo @code{awk_string_t}.
-
-Un valore di tipo @dfn{strnum} (stringa numerica) @`e rappresentato come una
-stringa e consiste di dati in input forniti dall'utente che appaiono essere
-numerici.
-Quando una funzione di estensione crea un valore di tipo @dfn{strnum}, il
-risultato @`e una stringa che viene marcata come immessa dall'utente. La
-successiva analisi da parte di @command{gawk} servir@`a poi a determinare se
-la stringa appare essere un numero, e va quindi trattata come @dfn{strnum},
-invece che come una normale stringa di caratteri.
-
-Ci@`o @`e utile nei casi un cui una funzione di estensione desideri fare qualcosa
-di paragonabile alla funzione @code{split}, la quale imposta l'attributo
-di @dfn{strnum} agli elementi di vettore che crea.
-Per esempio, un'estensione che implementi la divisione di record CSV
-(Comma Separated Values, i cui elementi sono delimitati da virgole)
-potrebbe voler usare questa funzionalit@`a. Un'altra situazione in cui ci@`o
-@`e utile @`e quello di una funzione che richieda campi-dati ad una banca di
-dati. La funzione @code{PQgetvalue()} della banca dati PostgreSQ, per
-esempio, restituisce una stringa che pu@`o essere numerica o di tipo carattere,
-a seconda del contesto.
-
-I valori di @dfn{regexp} fortemente tipizzate
-(@pxref{Costanti @dfn{regexp} forti} non sono molto utili nelle funzioni di
-estensione. Le funzioni di estensione possono stabilire di averli ricevuti,
-e crearne, attribuendo valori di tipo scalare. In alternativa, @`e possibile
-esaminare il testo della @dfn{regexp} utilizzando campi @code{regex_value.str}
-e @code{regex_value.len}.
-
-Identificativi (cio@`e, nomi di variabili globali) possono essere
-associati sia a valori scalari che a vettori. Inoltre, @command{gawk}
-consente veri vettori di vettori, in cui ogni singolo elemento di un vettore
-pu@`o a sua volta essere un vettore. La spiegazione dei vettori @`e rinviata
-@iftex
-alla
-@end iftex
-@ifnottex
-a
-@end ifnottex
-@ref{Manipolazione di vettori}.
-
-La varie macro sopra elencate facilitano l'uso degli elementi delle
-@code{union} come se
-fossero campi in una @code{struct}; @`e questa una pratica comunemente adottata
-nella scrittura di programmi in C. Questo tipo di codice @`e pi@`u semplice da
-scrivere e da leggere, ma resta una responsabilit@`a @emph{del programmatore}
-assicurarsi che il campo @code{val_type} rifletta correttamente il tipo
-del valore contenuto nella struttura @code{awk_value_t}.
-
-Dal punti di vista concettuale, i primi tre campi dell'@code{union} (numero,
-stringa, e vettore) sono sufficienti per lavorare con i valori @command{awk}.
-Tuttavia, poich@'e l'API fornisce routine per ottenere e modificare
-il valore di una variabile scalare globale usando solo il nome della
-variabile, si ha qui una perdita di efficienza: @command{gawk} deve cercare
-la variabile ogni volta che questa @`e utilizzata e modificata. Questo
-@`e un probelma reale, non solo un problema teorico.
-
-Per questo motivo, se si sa che una certa estensione passer@`a molto tempo
-a leggere e/o modificare il valore di una o pi@`u variabili scalari, si pu@`o
-ottenere uno @dfn{scalar cookie}@footnote{Si veda
-@uref{http://catb.org/jargon/html/C/cookie.html, la voce ``cookie''
-nello Jargon file}
-per una definizione di @dfn{cookie}, e
-@uref{http://catb.org/jargon/html/M/magic-cookie.html, la voce ``magic cookie''
-sempre nello Jargon file} per un bell'esempio.
-@ifclear FOR_PRINT
-Si veda anche la voce ``Cookie'' nel @ref{Glossario}.
-@end ifclear
-[@uref{http://jhanc.altervista.org/jargon/Intro.html, @`E disponibile in rete
-anche una traduzione italiana dello Jargon file}]
-}
-per quella variabile, e poi usare
-il @dfn{cookie} per ottenere il valore della variabile o per modificarne il
-valore.
-Il tipo @code{awk_scalar_t} contiene uno @dfn{scalar cookie}, e la macro
-@code{scalar_cookie} fornisce accesso al valore di quel tipo
-nella struttura @code{awk_value_t}.
-Dato uno @dfn{scalar cookie}, @command{gawk} pu@`o trovare o modificare
-direttamente il valore, come richiesto, senza bisogno di andarlo
-a cercare ogni volta.
-
-Il tipo @code{awk_value_cookie_t} e la macro @code{value_cookie} sono simili.
-Se si pensa di dover usare
-lo stesso @emph{valore} numerico o la stessa @emph{stringa} per una o pi@`u
-variabili, si pu@`o creare il valore una volta per tutte, mettendo da parte un
-@dfn{@dfn{value cookie}} per quel valore, e in seguito specificare quel
-@dfn{value cookie} quando si desidera impostare il valore di una variabile.
-Ci@`o consente di risparmiare spazio in memoria all'interno del processo
-di @command{gawk} e riduce il tempo richiesto per creare il valore.
-
-@node Funzioni di allocazione memoria
-@subsection Funzioni per allocare memoria e macro di servizio
-@cindex allocare memoria per estensioni
-@cindex memoria, allocare per estensioni
-@cindex estensioni, allocare memoria per
-
-L'API fornisce alcune funzioni per effettuare @dfn{allocazioni di memoria}
-che possono essere passate a @command{gawk}, e anche un certo numero di
-macro che possono tornare utili.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} le presenta come prototipi di funzione, nel modo
-con cui il codice dell'estensione potrebbe usarle:
-
-@table @code
-@item void *gawk_malloc(size_t size);
-Chiama la versione corretta di @code{malloc()} per allocare memoria,
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void *gawk_calloc(size_t nmemb, size_t size);
-Chiama la versione corretta di @code{calloc()} per allocare memoria che
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void *gawk_realloc(void *ptr, size_t size);
-Chiama la versione corretta di @code{realloc()} per allocare memoria
-che pu@`o in seguito essere messa a disposizione di @command{gawk}.
-
-@item void gawk_free(void *ptr);
-Chiama la versione corretta di @code{free()} per liberare memoria che
-era stata allocata con
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-@end table
-
-L'API deve fornire queste funzioni perch@'e @`e possibile
-che un'estensione sia stata compilata e costruita usando una versione
-diversa della libreria C rispetto a quella usata per il programma eseguibile
-@command{gawk}.@footnote{Questo succede pi@`u spesso nei sistemi MS-Windows,
-ma pu@`o capitare anche in sistemi di tipo Unix.}
-Se @command{gawk} usasse la propria versione di @code{free()} per liberare
-della memoria acquisita tramite una differente versione di @code{malloc()},
-il risultato sarebbe molto probabilmente differente da quello atteso.
-
-Due macro di utilit@`a possono essere usate per allocare memoria
-tramite @code{gawk_malloc()} e
-@code{gawk_realloc()}. Se l'allocazione non riesce, @command{gawk}
-termina l'esecuzione con un messaggio di errore fatale.
-Queste macro dovrebbero essere usate come se fossero dei richiami a
-procedure che non restituiscono un codice di ritorno:
-
-@table @code
-@item #define emalloc(pointer, type, size, message) @dots{}
-Gli argomenti per questa macro sono i seguenti:
-
-@c nested table
-@table @code
-@item pointer
-La variabile di tipo puntatore che punter@`a alla memoria allocata.
-
-@item type
-Il tipo della variabile puntatore. Questo @`e usato per definire il tipo
-quando si chiama @code{gawk_malloc()}.
-
-@item size
-Il numero totale di byte da allocare.
-
-@item message
-Un messaggio da anteporre all'eventuale messaggio di errore fatale.
-Questo @`e solitamente il nome della funzione che sta usando la macro.
-@end table
-
-@noindent
-Per esempio, si potrebbe allocare il valore di una stringa cos@`{@dotless{i}}:
-
-@example
-awk_value_t risultato;
-char *message;
-const char greet[] = "non v'allarmate!";
-
-emalloc(message, char *, sizeof(greet), "myfunc");
-strcpy(message, greet);
-make_malloced_string(message, strlen(message), & risultato);
-@end example
-
-@item #define erealloc(pointer, type, size, message) @dots{}
-Questo @`e simile a @code{emalloc()}, ma chiama @code{gawk_realloc()}
-invece che @code{gawk_malloc()}.
-Gli argomenti sono gli stessi della macro @code{emalloc()}.
-@end table
-
-@node Funzioni di costruzione
-@subsection Funzioni per creare valori
-
-L'API fornisce varie funzioni di @dfn{costruzione} per creare
-valori di tipo stringa e di tipo numerico, e anche varie macro di utilit@`a.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SUBSECTION} le presenta tutte come prototipi di funzione, nel
-modo in cui il codice sorgente di
-un'estensione le userebbe:
-
-@table @code
-@item static inline awk_value_t *
-@itemx make_const_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione mette il valore di una stringa nella variabile
-@code{awk_value_t} puntata da @code{risultato}. La funzione presuppone che
-@code{stringa} sia una costante stringa C
-(o altri dati che formano una stringa), e automaticamente crea una
-@emph{copia} dei dati che sar@`a immagazzinata in @code{risultato}.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_malloced_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione mette il valore di una stringa nella variabile
-@code{awk_value_t} puntata da @code{risultato}. Si presuppone che
-@code{stringa} sia un valore @samp{char *}
-che punta a dati ottenuti in precedenza per mezzo di
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-L'idea @`e che questi dati siano comunicati direttamente a @command{gawk},
-che se ne assume la responsabilit@`a.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_null_string(awk_value_t *risultato);
-Questa funzione specializzata crea una stringa nulla (il valore ``undefined'')
-nella variabile @code{awk_value_t} puntata da @code{risultato}.
-Viene restituito il puntatore @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_number(double num, awk_value_t *risultato);
-Questa funzione crea semplicemente un valore numerico nella variabile
-@code{awk_value_t}, puntata da @code{risultato}.
-
-@item static inline awk_value_t *
-@itemx make_const_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione @`e identica a @code{make_const_string()}, ma la stringa @`e
-marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
-se il contenuto della stringa appare essere numerico.
-
-@item static inline awk_value_t *
-@itemx make_malloced_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione @`e identica a @code{make_malloced_string()}, ma la stringa @`e
-marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
-se il contenuto della stringa appare essere numerico.
-
-@item static inline awk_value_t *
-@itemx make_const_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata, allocando una
-copia della stringa.
-@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
-
-@item static inline awk_value_t *
-@itemx make_malloced_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
-Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata.
-@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
-Si aspetta che @code{stringa} sia un valore di tipo @samp{char *} che punta a
-dati ottenuti in precedenza tramite una chiamata a
-@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-
-@end table
-
-@node Funzioni di registrazione
-@subsection Funzioni di registrazione
-@cindex registrazione di estensione
-@cindex estensione, registrazione di
-
-Questa @value{SECTION} descrive le funzioni dell'API per
-registrare parti di un'estensione con @command{gawk}.
-
-@menu
-* Funzioni di estensione:: Registrare funzioni di estensione.
-* Funzioni di exit callback:: Registrare una exit di callback.
-* Stringa di versione Estensioni:: Registrare una stringa di versione.
-* Analizzatori di input:: Registrare un analizzatore di input.
-* Processori di output:: Registrare un processore di output.
-* Processori bidirezionali:: Registrare un processore bidirezionale.
-@end menu
-
-@node Funzioni di estensione
-@subsubsection Registrare funzioni di estensione
-
-Le funzioni di estensione sono descritte dal seguente tracciato record:
-
-@example
-typedef struct awk_ext_func @{
-@ @ @ @ const char *name;
-@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
-@ @ @ @ const size_t max_expected_args;
-@ @ @ @ const size_t min_required_args;
-@ @ @ @ awk_bool_t suppress_lint;
-@ @ @ @ void *data; /* puntatore di tipo opaco
-@ @ @ @ a ogni informazione ulteriore */
-@} awk_ext_func_t;
-@end example
-
-I campi sono:
-
-@table @code
-@item const char *name;
-Il nome della nuova funzione.
-Il codice sorgente a livello di @command{awk} richiama la funzione usando
-questo nome.
-Il nome @`e una normale stringa di caratteri del linguaggio C.
-
-I nomi di funzione devono rispettare le stesse regole che valgono per gli
-identificativi @command{awk}.
-Cio@`e, devono iniziare o con una lettera dell'alfabeto inglese o con un
-trattino basso, che possono essere seguiti da un numero qualsiasi di
-lettere, cifre o trattini bassi.
-L'uso di maiuscolo/minuscolo @`e significativo.
-
-@item awk_value_t *(*const function)(int num_actual_args,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
-Questo @`e un puntatore alla funzione C che fornisce la funzionalit@`a per cui
-@`e stata scritta l'estensione.
-La funzione deve riempire l'area di memoria puntata da @code{*risultato} con
-un numero, con una stringa, oppure con una @dfn{regexp}.
-@command{gawk} diventa il proprietario di tutte le stringhe di memoria.
-Come gi@`a detto sopra, la stringa di memoria @emph{deve} essere stata ottenuta
-usando @code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
-
-L'argomento @code{num_actual_args} dice alla funzione scritta in C quanti
-parametri sono stati effettivamente passati dal codice chiamante all'interno
-di @command{awk}.
-
-La funzione deve restituire il valore di @code{risultato}.
-Questo @`e per utilit@`a del codice chiamante all'interno di
-@command{gawk}.
-
-@item size_t max_expected_args;
-Questo @`e il massimo numero di argomenti che la funzione si aspetta di
-ricevere.
-Se chiamata con un numero di argomenti maggiore di questo, e se @`e stato
-richiesto il controllo @dfn{lint}, @command{gawk} stampa un messaggio di
-avvertimento. Per ulteriori informazioni, si veda la descrizione di
-@code{suppress_lint}, pi@`u avanti in questa lista.
-
-@item const size_t min_required_args;
-Questo @`e il minimo numero di argomenti che la funzione si aspetta di
-ricevere.
-Se @`e chiamata con un numero inferiore di argomenti, @command{gawk}
-stampa un messaggio di errore fatale ed esce.
-
-@item awk_bool_t suppress_lint;
-Questo @dfn{flag} dice a @command{gawk} di non stampare un messaggio
-@dfn{lint} se @`e stato richiesto un controllo @dfn{lint} e se sono stati
-forniti pi@`u argomenti di quelli attesi. Una funzione di estensione pu@`o
-stabilire se @command{gawk} ha gi@`a stampato almeno uno di tali messaggi
-controllando se @samp{num_actual_args > finfo->max_expected_args}.
-In tal caso, se la funzione non desidera la stampa di ulteriori messaggi,
-dovrebbe impostare @code{finfo->suppress_lint} a @code{awk_true}.
-
-@item void *data;
-Questo @`e un puntatore di tipo opaco a tutti quei dati che una funzione
-di estensione desidera avere disponibili al momento della chiamata.
-Passando alla funzione di estensione la struttura @code{awk_ext_func_t}
-e avendo al suo interno questo puntatore disponibile, rende possibile
-scrivere un'unica funzione C o C++ che implementa pi@`u di una funzione
-di estensione a livello @command{awk}.
-@end table
-
-Una volta preparato un record che descrive l'estensione, la funzione di
-estensione va registrata con @command{gawk} usando questa funzione dell'API:
-
-@table @code
-@item awk_bool_t add_ext_func(const char *namespace, awk_ext_func_t *func);
-Questa funzione restituisce il valore @dfn{true} se ha successo,
-oppure @dfn{false} in caso contrario.
-Il parametro @code{namespace} non @`e usato per ora; dovrebbe puntare a una
-stringa vuota (@code{""}). Il puntatore @code{func} @`e l'indirizzo di una
-@code{struct} che rappresenta la funzione stessa, come descritto sopra.
-
-@command{gawk} non modifica ci@`o che @`e puntato da @code{func}, ma la
-funzione di estensione stessa riceve questo puntatore e pu@`o modificarlo
-e farlo puntare altrove, quindi il puntatore non @`e stato dichiarato
-di tipo costante (@code{const}).
-@end table
-
-La combinazione di @code{min_required_args}, @code{max_expected_args},
-e @code{suppress_lint} pu@`o ingenerare confusione. Ecco delle linee-guida
-sul da farsi.
-
-@table @asis
-@item Un numero qualsiasi di argomenti @`e valido
-Impostare @code{min_required_args} and @code{max_expected_args} a zero e
-impostare @code{suppress_lint} ad @code{awk_true}.
-
-@item Un numero minimo di argomenti @`e richiesto, ma non c'@`e un limite al numero massimo
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} a zero e
-impostare @code{suppress_lint} ad @code{awk_true}.
-
-@item Un numero minino di argomenti @`e richiesto, ma c'@`e un limite al numero massimo
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} al massimo atteso.
-Impostare @code{suppress_lint} ad @code{awk_false}.
-
-@item Un numero minino di argomenti @`e richiesto, ma c'@`e un numero massimo non superabile
-Impostare @code{min_required_args} al minimo richiesto.
-Impostare @code{max_expected_args} al massimo atteso.
-Impostare @code{suppress_lint} ad @code{awk_false}.
-Nella funzione di estensione, controllare che @code{num_actual_args} non
-ecceda @code{f->max_expected_args}. Se il massimo @`e superato, stampare
-un messaggio di errore fatale.
-@end table
-
-@node Funzioni di exit callback
-@subsubsection Registrare una funzione @dfn{exit callback}
-
-Una funzione @dfn{exit callback} @`e una funzione che @command{gawk} invoca
-prima di completare l'esecuzione del programma.
-Siffatte funzioni sono utili se ci sono dei compiti generali di ``pulizia''
-che dovrebbero essere effettuati nell'estensione (come chiudere connessioni a
-un @dfn{database} o rilasciare altre risorse).
-Si pu@`o registrare una tale
-funzione con @command{gawk} per mezzo della seguente funzione:
-
-@table @code
-@item void awk_atexit(void (*funcp)(void *data, int exit_status),
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0);
-I parametri sono:
-
-@c nested table
-@table @code
-@item funcp
-Un puntatore alla funzione da chiamare prima che @command{gawk} completi
-l'esecuzione. Il parametro @code{data}
-sar@`a il valore originale di @code{arg0}.
-Il parametro @code{exit_status} @`e il valore del codice di ritorno che
-@command{gawk} intende passare alla chiamata di sistema @code{exit()}
-(che termina l'esecuzione del programma).
-
-@item arg0
-Un puntatore a un'area dati privata che @command{gawk} mantiene perch@'e
-sia poi passata alla funzione puntata da @code{funcp}.
-@end table
-@end table
-
-Le funzioni @dfn{exit callback} sono chiamate in ordine inverso rispetto
-a quello con cui @`e stata fatta la registrazione con @command{gawk}
-(LIFO: Last In, First Out).
-
-@node Stringa di versione Estensioni
-@subsubsection Registrare una stringa di versione per un'estensione
-
-Si pu@`o registrare una stringa di versione che indica il nome e la versione
-di una data estensione a @command{gawk}, come segue:
-
-@table @code
-@item void register_ext_version(const char *version);
-Registra la stringa puntata da @code{version} con @command{gawk}.
-Si noti che @command{gawk} @emph{non} copia la stringa @code{version}, e
-quindi questa stringa non dovrebbe essere modificata.
-@end table
-
-@command{gawk} stampa tutte le stringhe con le versioni di estensione
-registrate, quando viene invocato specificando l'opzione @option{--version}.
-
-@node Analizzatori di input
-@subsubsection Analizzatori di input personalizzati
-@cindex personalizzato, analizzatore di input
-@cindex analizzatore di input personalizzato
-@cindex input, analizzatore di, 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
-@iftex
-(@pxrefil{Leggere file}).
-@end iftex
-@ifnottex
-(@pxref{Leggere file}).
-@end ifnottex
-Viene inoltre impostato il valore di @code{RT}
-(@pxref{Variabili predefinite}).
-
-Se lo si desidera, @`e possibile fornire un analizzatore di input
-personalizzato. Il compito di un analizzatore di input @`e di restituire un
-record al codice di @command{gawk}, che poi lo elaborer@`a, accompagnato,
-se necessario, da indicatori del valore e della lunghezza dei dati da usare
-per @code{RT}.
-
-Per fornire un analizzatore personalizzato di input, occorre innanzitutto
-rendere disponibili due funzioni (dove @var{XXX} @`e un nome che fa da prefisso
-all'estensione intera):
-
-@table @code
-@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf);
-Questa funzione esamina l'informazione disponibile in @code{iobuf}
-(che vedremo tra poco). Basandosi su tale informazione,
-decide se l'analizzatore di input personalizzato andr@`a usato per questo file.
-Se questo @`e il caso, dovrebbe restituire @dfn{true}. Altrimenti, restituir@`a
-@dfn{false}. Nessuno stato (valori di variabili, etc.) dovrebbe venire
-modificato all'interno di @command{gawk}.
-
-@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf);
-Quando @command{gawk} decide di passare il controllo del file a questo
-analizzatore di input, richiamer@`a questa funzione.
-Questa funzione a sua volta deve assegnare un valore ad alcuni campi
-nella struttura @code{awk_input_buf_t} e assicurarsi che
-alcune condizioni siano verificate. Dovrebbe poi restituire @dfn{true}.
-Se si verifica un errore di qualche tipo, i campi in questione non dovrebbero
-venire riempiti, e la funzione dovrebbe restituire @dfn{false}; in questo caso
-@command{gawk} non utilizzer@`a pi@`u l'analizzatore personalizzato di input.
-I dettagli sono descritti pi@`u avanti.
-@end table
-
-L'estensione dovrebbe raccogliere queste funzioni all'interno di una
-struttura @code{awk_input_parser_t}, simile a questa:
-
-@example
-typedef struct awk_input_parser @{
- const char *name; /* nome dell'analizzatore */
- awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
- awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
- awk_const struct awk_input_parser *awk_const next; /* per uso
- di gawk */
-@} awk_input_parser_t;
-@end example
-
-I campi sono:
-
-@table @code
-@item const char *name;
-Il nome dell'analizzatore di input. Questa @`e una normale stringa di caratteri
-del linguaggio C.
-
-@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
-Un puntatore alla funzione @code{@var{XXX}_can_take_file()}.
-
-@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
-Un puntatore alla funzione @code{@var{XXX}_take_control_of()}.
-
-@item awk_const struct input_parser *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarla.
-@end table
-
-I passi da seguire sono i seguenti:
-
-@enumerate
-@item
-Creare una variabile @code{static awk_input_parser_t} e inizializzarla
-adeguatamente.
-
-@item
-Quando l'estensione @`e caricata, registrare l'analizzatore personalizzato di
-input con @command{gawk} usando la funzione API @code{register_input_parser()}
-(descritta pi@`u sotto).
-@end enumerate
-
-La definizione di una struttura @code{awk_input_buf_t} @`e simile a questa:
-
-@example
-typedef struct awk_input @{
- const char *name; /* nome file */
- int fd; /* descrittore di file */
-#define INVALID_HANDLE (-1)
- void *opaque; /* area dati privata
- per l'analizzatore di input */
- int (*get_record)(char **out, struct awk_input *iobuf,
- int *errcode, char **rt_start, size_t *rt_len);
- ssize_t (*read_func)();
- void (*close_func)(struct awk_input *iobuf);
- struct stat sbuf; /* buffer per stat */
-@} awk_input_buf_t;
-@end example
-
-I campi si possono dividere in due categorie: quelli che sono usati (almeno
-inizialmente) da @code{@var{XXX}_can_take_file()}, e quelli che sono usati da
-@code{@var{XXX}_take_control_of()}. Il primo gruppo di campi, e il loro uso,
-@`e cos@`{@dotless{i}} definito:
-
-@table @code
-@item const char *name;
-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.
-
-@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()}.
-@end table
-
-La funzione @code{@var{XXX}_can_take_file()} dovrebbe esaminare i campi di
-cui sopra e decidere se l'analizzatore di input vada usato per il file.
-La decisione pu@`o dipendere da uno stato di @command{gawk} (il valore
-di una variabile definita in precedenza dall'estensione e impostata dal
-codice @command{awk}), dal nome del
-file, dal fatto che il descrittore di file sia valido o no,
-dalle informazioni contenute in @code{struct stat} o da una qualsiasi
-combinazione di questi fattori.
-
-Una volta che @code{@var{XXX}_can_take_file()} restituisce @dfn{true}, e
-@command{gawk} ha deciso di usare l'analizzatore personalizzato, viene
-chiamata la funzione @code{@var{XXX}_take_control_of()}. Tale funzione
-si occupa di riempire il campo @code{get_record} oppure il campo
-@code{read_func} nella struttura @code{awk_input_buf_t}. La funzione si
-assicura inoltre che @code{fd} @emph{not} sia impostato al valore
-@code{INVALID_HANDLE}. L'elenco seguente descrive i campi che
-possono essere riempiti da @code{@var{XXX}_take_control_of()}:
-
-@table @code
-@item void *opaque;
-Questo campo @`e usato per contenere qualiasi informazione di stato sia
-necessaria per l'analizzatore di input
-riguardo a questo file. Il campo @`e ``opaco'' per @command{gawk}.
-L'analizzatore di input non @`e obbligato a usare questo puntatore.
-
-@item int@ (*get_record)(char@ **out,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len);
-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)();
-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
-@`e pure descritto nel testo che segue quest'elenco.
-
-@item void (*close_func)(struct awk_input *iobuf);
-Questo puntatore a funzione dovrebbe puntare a una funzione che fa
-la ``pulizia finale''. Dovrebbe liberare ogni risorsa allocata da
-@code{@var{XXX}_take_control_of()}. Pu@`o anche chiudere il file. Se lo fa,
-dovrebbe impostare il campo @code{fd} a @code{INVALID_HANDLE}.
-
-Se @code{fd} @`e ancora diverso da @code{INVALID_HANDLE} dopo la chiamata a
-questa funzione, @command{gawk} invoca la normale chiamata di sistema
-@code{close()}.
-
-Avere una funzione di ``pulizia'' @`e facoltativo. Se l'analizzatore di input
-non ne ha bisogno, basta non impostare questo campo. In questo caso,
-@command{gawk} invoca la normale chiamata di sistema @code{close()} per il
-descrittore di file, che, quindi, dovrebbe essere valido.
-@end table
-
-La funzione @code{@var{XXX}_get_record()} svolge il lavoro di creazione dei
-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.
-
-@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.
-
-@item int *errcode
-Se si verifica un errore, @code{*errcode} dovrebbe essere impostato a un
-valore appropriato tra quelli contenuti in @code{<errno.h>}.
-
-@item char **rt_start
-@itemx size_t *rt_len
-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.
-@end table
-
-Il codice di ritorno @`e la lunghezza del buffer puntato da
-@code{*out} oppure @code{EOF}, se @`e stata raggiunta la fine del file o se
-si @`e verificato un errore.
-
-Poich@'e @code{errcode} @`e sicuramente un puntatore valido, non c'@`e
-bisogno di controllare che il valore sia @code{NULL}. @command{gawk}
-imposta @code{*errcode} a zero, quindi non c'@`e bisogno di impostarlo, a meno
-che non si verifichi un errore.
-
-In presenza di un errore, la funzione dovrebbe restituire @code{EOF} e
-impostare @code{*errcode} a un valore maggiore di zero. In questo caso, se
-@code{*errcode} non @`e uguale a zero, @command{gawk} automaticamente aggiorna
-la variabile @code{ERRNO} usando il valore contenuto in @code{*errcode}.
-(In generale, impostare @samp{*errcode = errno} dovrebbe essere la
-cosa giusta da fare.)
-
-Invece di fornire una funzione che restituisce un record in input,
-@`e possibile fornirne una che semplicemente legge dei byte, e lascia
-che sia @command{gawk} ad analizzare i dati per farne dei record. In questo
-caso, i dati dovrebbero essere restituiti nella codifica multibyte propria
-della localizzazione corrente.
-Una siffatta funzione dovrebbe imitare il comportamento della chiamata di
-sistema @code{read()}, e riempire il puntatore @code{read_func} con
-il proprio indirizzo nella struttura @code{awk_input_buf_t}.
-
-Per default, @command{gawk} imposta il puntatore @code{read_func} in modo che
-punti alla chiamata di sistema @code{read()}. In questo modo l'estensione
-non deve preoccuparsi di impostare esplicitamente questo campo.
-
-@quotation NOTA
-Occorre decidere per l'uno o per l'altro metodo: o una funzione che
-restituisce un record o una che restituisce dei dati grezzi. Nel dettaglio,
-se si fornisce una funzione che prepara un record, @command{gawk} la
-invocher@`a, e non chiamer@`a mai la funzione che fa una lettura grezza.
-@end quotation
-
-@command{gawk} viene distribuito con un'estensione di esempio che legge
-delle directory, restituendo un record per ogni elemento contenuto nella
-directory (@pxref{Esempio di estensione Readdir}. Questo codice sorgente pu@`o
-essere usato come modello per scrivere un analizzatore di input
-personalizzato.
-
-Quando si scrive un analizzatore di input, si dovrebbe progettare (e
-documentare) il modo con cui si suppone che interagisca con il codice
-@command{awk}. Si pu@`o scegliere di utilizzarlo per tutte le letture, e
-intervenire solo quando @`e necessario, (come fa l'estensione di
-esempio @code{readdir}). Oppure lo si pu@`o utilizzare a seconda del
-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
-
-@node Processori di output
-@subsubsection Registrare un processore di output
-@cindex personalizzato, processore di output
-@cindex processore di output personalizzato
-@cindex output, processore di, personalizzato
-
-@cindex processore di output
-@cindex output, processore di
-Un @dfn{processore di output} @`e l'immagine riflessa di un
-analizzatore di input.
-Consente a un'estensione di prendere il controllo dell'output
-indirizzato verso un file
-che sia stato aperto con gli operatori di ridirezione di I/O
-@samp{>} o @samp{>>} (@pxref{Ridirezione}).
-
-Il processore di output @`e molto simile, come struttura,
-all'analizzatore di input:
-
-@example
-typedef struct awk_output_wrapper @{
- const char *name; /* nome del processore */
- awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
- awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
- awk_const struct awk_output_wrapper *awk_const next; /* per gawk */
-@} awk_output_wrapper_t;
-@end example
-
-I campi sono i seguenti:
-
-@table @code
-@item const char *name;
-Questo @`e il nome del processore di output.
-
-@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
-Questo @`e il puntatore a una funzione che esamina l'informazione contenuta
-nella struttura @code{awk_output_buf_t} puntata da @code{outbuf}.
-Dovrebbe restituire @dfn{true} se il processore di output vuole elaborare
-il file, e @dfn{false} in caso contrario.
-Nessuno stato (valori di variabili, etc.) dovrebbe essere modificato
-all'interno di @command{gawk}.
-
-@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
-La funzione puntata da questo campo viene chiamata quando @command{gawk}
-decide di consentire al processore di output di prendere il controllo del file.
-Dovrebbe riempire in maniera appropriata dei campi nella struttura
-@code{awk_output_buf_t}, come descritto sotto, e restituire @dfn{true} se
-ha successo, @dfn{false} in caso contrario.
-
-@item awk_const struct output_wrapper *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarlo.
-@end table
-
-La struttura @code{awk_output_buf_t} @`e simile a questa:
-
-@example
-typedef struct awk_output_buf @{
- const char *name; /* nome del file in output */
- const char *mode; /* argomento @dfn{mode} per fopen */
- FILE *fp; /* puntatore stdio file */
- awk_bool_t redirected; /* @dfn{true} se un processore @`e attivo */
- void *opaque; /* per uso del processore di output */
- size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
- FILE *fp, void *opaque);
- int (*gawk_fflush)(FILE *fp, void *opaque);
- int (*gawk_ferror)(FILE *fp, void *opaque);
- int (*gawk_fclose)(FILE *fp, void *opaque);
-@} awk_output_buf_t;
-@end example
-
-Anche qui, l'estensione definir@`a le funzioni @code{@var{XXX}_can_take_file()}
-e @code{@var{XXX}_take_control_of()} che esaminano e aggiornano
-campi dati in @code{awk_output_buf_t}.
-I campi dati sono i seguenti:
-
-@table @code
-@item const char *name;
-Il nome del file in output.
-
-@item const char *mode;
-La stringa @dfn{mode} (come sarebbe usata nel secondo argomento della
-chiamata di sistema @code{fopen()})
-con cui il file era stato aperto.
-
-@item FILE *fp;
-Il puntatore @code{FILE} da @code{<stdio.h>}. @command{gawk} apre il file
-prima di controllare se esiste un processore di output.
-
-@item awk_bool_t redirected;
-Questo campo dev'essere impostato a @dfn{true} dalla funzione
-@code{@var{XXX}_take_control_of()}.
-
-@item void *opaque;
-Questo puntatore @`e opaco per @command{gawk}. L'estensione dovrebbe usarlo
-per contenere un puntatore a qualsiasi dato privato associato al file.
-
-@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque);
-@itemx int (*gawk_fflush)(FILE *fp, void *opaque);
-@itemx int (*gawk_ferror)(FILE *fp, void *opaque);
-@itemx int (*gawk_fclose)(FILE *fp, void *opaque);
-Questi puntatori dovrebbero essere impostati per puntare a funzioni
-la cui azione sia equivalente a quella delle funzioni di @code{<stdio.h>},
-se questo @`e cio che si desidera.
-@command{gawk} usa questi puntatori a funzione per @emph{tutti} gli output.
-@command{gawk} inizializza i puntatori per puntare a funzioni interne
-``di passaggio'' che si limitano a chiamare le funzioni normali di
-@code{<stdio.h>}, e quindi un'estensione deve ridefinire solo le funzioni
-appropriate per fare il lavoro richiesto.
-@end table
-
-La funzione @code{@var{XXX}_can_take_file()} dovrebbe decidere in base ai
-campi @code{name} e @code{mode}, e a ogni altro ulteriore indicatore di stato
-(p.es., valori di variabili @command{awk}) adatto allo scopo.
-
-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.
-
-Il processore di output va registrato usando la seguente funzione:
-
-@table @code
-@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper);
-Registra il processore di output puntato da @code{output_wrapper} con
-@command{gawk}.
-@end table
-
-@node Processori bidirezionali
-@subsubsection Registrare un processore bidirezionale
-@cindex personalizzato, processore bidirezionale
-@cindex processore bidirezionale personalizzato
-@cindex bidirezionale, processore personalizzato
-
-Un @dfn{processore bidirezionale} combina un analizzatore di input e
-un processore di output per un I/O
-bidirezionale usando l'operatore @samp{|&} (@pxref{Ridirezione}).
-Le strutture @code{awk_input_parser_t} e @code{awk_output_buf_t}
-sono usate nella maniera gi@`a descritta precedentemente.
-
-Un processore bidirezionale @`e rappresentato dalla struttura seguente:
-
-@example
-typedef struct awk_two_way_processor @{
- const char *name; /* nome del processore bidirezionale */
- awk_bool_t (*can_take_two_way)(const char *name);
- awk_bool_t (*take_control_of)(const char *name,
- awk_input_buf_t *inbuf,
- awk_output_buf_t *outbuf);
- awk_const struct awk_two_way_processor *awk_const next; /* per gawk */
-@} awk_two_way_processor_t;
-@end example
-
-I campi sono i seguenti:
-
-@table @code
-@item const char *name;
-Il nome del processore bidirezionale.
-
-@item awk_bool_t (*can_take_two_way)(const char *name);
-La funzione puntata da questo campo dovrebbe restituire @dfn{true} se
-vuole gestire l'I/O bidirezionale per questo @value{FN}.
-La funzione non dovrebbe modificare alcuno stato (valori di variabili, etc.)
-all'interno di @command{gawk}.
-
-@item awk_bool_t (*take_control_of)(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf);
-La funzione puntata da questo campo dovrebbe riempire le strutture
-@code{awk_input_buf_t} e @code{awk_output_buf_t} puntate da @code{inbuf} e
-@code{outbuf}, rispettivamente. Queste strutture sono gi@`a state descritte
-in precedenza.
-
-@item awk_const struct two_way_processor *awk_const next;
-Questa struttura @`e per uso di @command{gawk};
-per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
-possa modificarla.
-@end table
-
-Come per l'analizzatore di input e il processore di output, vanno fornite le
-funzione ``s@`{@dotless{i}}, ci penso io'' e ``per questo, fai tu'',
-@code{@var{XXX}_can_take_two_way()} e @code{@var{XXX}_take_control_of()}.
-
-Il processore bidirezionale va registrato usando la seguente funzione:
-
-@table @code
-@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
-Registra il processore bidirezionale puntato da @code{two_way_processor} con
-@command{gawk}.
-@end table
-
-@node Stampare messaggi
-@subsection Stampare messaggi dalle estensioni
-@cindex stampare messaggi dalle estensioni
-@cindex messaggi, stampare dalle estensioni
-@cindex estensioni, stampare messaggi dalle
-
-@`E possibile stampare diversi tipi di messaggi di avvertimento da
-un'estensione, come qui spiegato. Si noti che, per queste funzioni,
-si deve fornire l'ID di estensione ricevuto da @command{gawk}
-al momento in cui l'estensione @`e stata caricata:@footnote{Poich@'e l'API usa solo
-funzionalit@`a previste dal
-compilatore ISO C 90, non @`e possibile usare le macro di tipo variadico
-(che accettano un numero variabile di argomenti) disponibili nel compilatore
-ISO C 99, che nasconderebbero quel parametro. Un vero peccato!}
-
-@table @code
-@item void fatal(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio e poi @command{gawk} termina immediatamente l'esecuzione.
-
-@item void nonfatal(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di errore non-fatale.
-
-@item void warning(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di avvertimento.
-
-@item void lintwarn(awk_ext_id_t id, const char *format, ...);
-Stampa un messaggio di avvertimento ``lint''. Normalmente questo equivale a
-stampare un messaggio di avvertimento, ma se @command{gawk} era stato
-invocato specificando l'opzione @samp{--lint=fatal},
-gli avvertimenti di @dfn{lint} diventano messaggi di errore fatali.
-@end table
-
-Tutte queste funzioni sono per il resto simili alla famiglia di funzioni
-@code{printf()} del linguaggio C, dove il parametro @code{format} @`e una
-stringa contenente dei caratteri normali e delle istruzioni di formattazione,
-mischiati tra loro.
-
-@node Aggiornare @code{ERRNO}
-@subsection Funzioni per aggiornare @code{ERRNO}
-
-Le seguenti funzioni consentono l'aggiornamento della variabile
-@code{ERRNO}:
-
-@table @code
-@item void update_ERRNO_int(int errno_val);
-Imposta @code{ERRNO} alla stringa equivalente del codice di errore
-in @code{errno_val}. Il valore dovrebbe essere uno dei codici di errore
-definiti in @code{<errno.h>}, e @command{gawk} lo trasforma in una stringa
-(qualora possibile, tradotta) usando la funzione C @code{strerror()}.
-
-@item void update_ERRNO_string(const char *string);
-Imposta @code{ERRNO} direttamente usando il valore della stringa specificata.
-@command{gawk} fa una copia del valore di @code{stringa}.
-
-@item void unset_ERRNO(void);
-Annulla il valore di @code{ERRNO}.
-@end table
-
-@node Richiedere valori
-@subsection Richiedere valori
-
-Tutte le funzioni che restituiscono valori da @command{gawk}
-funzionano allo stesso modo. Si fornisce un campo @code{awk_valtype_t}
-per indicare il tipo di valore che ci si aspetta. Se il valore disponibile
-corrisponde a quello richiesto, la funzione restituisce @dfn{true} e riempie
-il campo del risultato @code{awk_value_t}.
-Altrimenti, la funzione restituisce @dfn{false}, e il campo @code{val_type}
-indica il tipo di valore disponibile.
-A quel punto si pu@`o, a seconda di quel che richiede la situazione,
-stampare un messaggio di errore oppure ripetere la
-richiesta specificando il tipo di valore che risulta disponibile. Questo
-comportamento @`e riassunto nella
-@ref{table-value-types-returned}.
-
-@float Tabella,table-value-types-returned
-@caption{Tipi di valori restituiti dall'API}
-@docbook
-<informaltable>
-<tgroup cols="8">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <colspec colname="c3"/>
- <colspec colname="c4"/>
- <colspec colname="c5"/>
- <colspec colname="c6"/>
- <colspec colname="c7"/>
- <colspec colname="c8"/>
- <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/>
- <thead>
- <row><entry></entry><entry spanname="hspan"><para>Tipo di valore reale</para></entry></row>
- <row>
- <entry></entry>
- <entry></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>Indefinito</para></entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Stringa</emphasis></para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Strnum</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Numero</emphasis></para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry><para><emphasis role="bold">Tipo</emphasis></para></entry>
- <entry><para><emphasis role="bold">Regexp</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry><para><emphasis role="bold">Richiesto</emphasis></para></entry>
- <entry><para><emphasis role="bold">Vettore</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Scalare</emphasis></para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>Scalare</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">Indefinito</emphasis></para></entry>
- <entry><para>Stringa</para></entry>
- <entry><para>Strnum</para></entry>
- <entry><para>Numero</para></entry>
- <entry><para>Regexp</para></entry>
- <entry><para>Vettore</para></entry>
- <entry><para>Indefinito</para></entry>
- </row>
- <row>
- <entry></entry>
- <entry><para><emphasis role="bold">@dfn{Value cookie}</emphasis></para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- <entry><para>false</para></entry>
- </row>
- </tbody>
-</tgroup>
-</informaltable>
-@end docbook
-
-@ifnotplaintext
-@ifnotdocbook
-@multitable @columnfractions .50 .50
-@headitem @tab Tipo di valore reale
-@end multitable
-@c 10/2014: Thanks to Karl Berry for this bit to reduce the space:
-@tex
-\vglue-1.1\baselineskip
-@end tex
-@c @multitable @columnfractions .166 .166 .198 .15 .15 .166
-@ifclear SMALLPRINT
-@multitable {Richiesto} {Indefinito} {Numero} {Numero} {Scalar} {Regexp} {Vettore} {Indefinito}
-@headitem @tab @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
-@item @tab @b{Stringa} @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab false @tab false
-@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false
-@item @tab @b{Numero} @tab Numero @tab Numero @tab Numero @tab false @tab false @tab false
-@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
-@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vettore @tab false
-@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false
-@item @tab @b{Indefinito} @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
-@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
-@end multitable
-@end ifclear
-
-@ifset SMALLPRINT
-@smallformat
-@multitable {Richiesto} {Value cookie} {Num.} {Num.} {Scal.} {Regexp} {Vett.} {Indef.}
-@headitem @tab @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
-@item @tab @b{Stringa} @tab String @tab String @tab String @tab String @tab false @tab false
-@item @tab @b{Strnum} @tab false @tab Strn. @tab Strn. @tab false @tab false @tab false
-@item @tab @b{Numero} @tab Num. @tab Num. @tab Num. @tab false @tab false @tab false
-@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
-@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vett. @tab false
-@item @tab @b{Scalar} @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab false @tab false
-@item @tab @b{Indefinito} @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
-@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
-@end multitable
-@end smallformat
-@end ifset
-@end ifnotdocbook
-@end ifnotplaintext
-@ifplaintext
-@verbatim
- +-------------------------------------------------------+
- | Tipo di valore reale: |
- +--------+--------+--------+--------+-------+-----------+
- | Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
-+-----------+-----------+--------+--------+--------+--------+-------+-----------+
-| | Stringa | Stringa| Stringa| Stringa| Stringa| false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Strnum | false | Strnum | Strnum | false | false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Numero | Numero | Numero | Numero | false | false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Regexp | false | false | false | Regexp | false | false |
-| Tipo +-----------+--------+--------+--------+--------+-------+-----------+
-|Richiesto: | Vettore | false | false | false | false |Vettore| false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Scalare | Scalare| Scalare| Scalare| Scalare| false | false |
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Indefinito| Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
-| +-----------+--------+--------+--------+--------+-------+-----------+
-| | Value- | false | false | false | false | false | false |
-| | Cookie | | | | | | |
-+-----------+-----------+--------+--------+--------+--------+-------+-----------+
-@end verbatim
-@end ifplaintext
-@end float
-
-@node Accedere ai parametri
-@subsection Accedere ai parametri e aggiornarli
-
-Due funzioni consentono di accedere agli argomenti (parametri)
-passati all'estensione. Esse sono:
-
-@table @code
-@item awk_bool_t get_argument(size_t count,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
-con l'argomento numero @code{count}. Restituisce @dfn{true} se il tipo
-dell'argomento corrisponde
-a quello specificato in @code{wanted}, e @dfn{false} in caso contrario.
-In quest'ultimo caso,
-@code{risultato@w{->}val_type} indica il tipo effettivo dell'argomento
-(@pxref{table-value-types-returned}). La numerazione degli argomenti parte
-da zero: il primo
-argomento @`e il numero zero, il secondo @`e il numero uno, e cos@`{@dotless{i}} via.
-@code{wanted} indica il tipo di valore atteso.
-
-@item awk_bool_t set_argument(size_t count, awk_array_t array);
-Converte un parametro di tipo indefinito in un vettore; ci@`o permette la
-chiamata per riferimento per i vettori. Restituisce @dfn{false} se @code{count} @`e troppo elevato,
-o se il tipo di argomento @`e diverso da @dfn{undefined}.
-@xref{Manipolazione di vettori}
-per ulteriori informazioni riguardo alla creazione di vettori.
-@end table
-
-@node Accedere alla tabella simboli
-@subsection Accedere alla Tabella dei simboli
-@cindex accedere alle variabili globali dalle estensioni
-@cindex variabili globali, accesso dalle estensioni
-@cindex estensioni, accesso alle variabili globali
-
-Due insiemi di routine permettono di accedere alle variabili globali,
-e un insieme consente di creare e rilasciare dei valori nascosti.
-
-@menu
-* Tabella simboli per nome:: Accedere alle variabili per nome.
-* Tabella simboli tramite cookie:: Accedere alle variabili per ``cookie''.
-* Valori nascosti:: Creare e usare valori nascosti.
-@end menu
-
-@node Tabella simboli per nome
-@subsubsection Accedere alle variabili per nome e aggiornarle
-
-Le routine che seguono permettono di raggiungere e aggiornare
-le variabili globali a livello di @command{awk} per nome. Nel gergo dei
-compilatori, gli identificativi di vario tipo sono noti come @dfn{simboli},
-da cui il prefisso ``sym'' nei nomi delle routine. La struttura di dati che
-contiene informazioni sui simboli @`e chiamata @dfn{Tabella dei simboli}
-(@dfn{Symbol table}).
-Le funzioni sono le seguenti:
-
-@table @code
-@item awk_bool_t sym_lookup(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
-con il valore della variabile il cui nome @`e nella stringa @code{name},
-che @`e una normale stringa di caratteri C.
-@code{wanted} indica il tipo di valore atteso.
-La funzione restituisce @dfn{true} se il tipo effettivo della variabile @`e quello
-specificato in @code{wanted}, e @dfn{false} in caso contrario.
-In quest'ultimo caso, @code{risultato>val_type} indica il tipo effettivo
-della variabile
-(@pxref{table-value-types-returned}).
-
-@item awk_bool_t sym_update(const char *name, awk_value_t *valore);
-Aggiorna la variabile il cui nome @`e contenuto nella stringa @code{name},
-che @`e una normale stringa di caratteri C.
-La variabile @`e aggiunta alla Tabella dei simboli di @command{gawk},
-se non @`e gi@`a presente. Restituisce @dfn{true} se tutto @`e andato bene, e
-@dfn{false} in caso contrario.
-
-La modifica del tipo (da scalare a vettoriale o viceversa) di una variabile
-gi@`a esistente @emph{non} @`e consentito, e questa routine non pu@`o neppure
-essere usata per aggiornare un vettore.
-Questa routine non pu@`o essere usata per modificare nessuna delle variabili
-predefinite (come @code{ARGC} o @code{NF}).
-@end table
-
-Un'estensione pu@`o andare a cercare il valore delle variabili speciali di
-@command{gawk}.
-Tuttavia, con l'eccezione del vettore @code{PROCINFO}, un'estensione
-non pu@`o cambiare alcuna di queste variabili.
-
-@node Tabella simboli tramite cookie
-@subsubsection Accedere alle variabili per ``cookie'' e aggiornarle
-
-Uno @dfn{scalar cookie} @`e un puntatore nascosto (@dfn{opaque handle}) che
-fornisce accesso a una
-variabile globale o a un vettore. Si tratta di un'ottimizzazione, per evitare
-di ricercare variabili nella Tabella dei simboli di @command{gawk} ogni volta
-che un accesso @`e necessario. Questo
-argomento @`e gi@`a stato trattato in precedenza, nella
-@ref{Tipi di dati generali}.
-
-Le funzioni seguenti servono per gestire gli @dfn{scalar cookie}:
-
-@table @code
-@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Ottiene il valore corrente di uno @dfn{scalar cookie}.
-Una volta ottenuto lo @dfn{scalar cookie} usando @code{sym_lookup()}, si
-pu@`o usare questa funzione per accedere al valore della variabile in modo
-pi@`u efficiente.
-Restituisce @dfn{false} se il valore non @`e disponibile.
-
-@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *valore);
-Aggiorna il valore associato con uno @dfn{scalar cookie}.
-Restituisce @dfn{false} se il nuovo valore non @`e del tipo
-@code{AWK_STRING}, @code{AWK_STRNUM}, @code{AWK_REGEX} o @code{AWK_NUMBER}.
-Anche in questo caso, le variabili predefinite non possono essere aggiornate.
-@end table
-
-Non @`e immediatamente evidente come si lavora con gli @dfn{scalar cookie} o
-quale sia la loro vera @i{ragion d'essere}. In teoria, le routine
-@code{sym_lookup()} e @code{sym_update()} sono tutto ci@`o che occorre per
-lavorare con le variabili. Per esempio, ci potrebbe essere un codice che
-ricerca il valore di una variabile, valuta una condizione, e potrebbe
-poi cambiare il valore della variabile a seconda dei risultati della
-valutazione in modo simile a questo:
-
-@example
-/* do_magic --- fai qualcosa di veramente grande */
-
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore;
-
- if ( sym_lookup("MAGIC_VAR", AWK_NUMBER, & valore)
- && qualche_condizione(valore.num_valore)) @{
- valore.num_valore += 42;
- sym_update("MAGIC_VAR", & valore);
- @}
-
- return make_number(0.0, risultato);
-@}
-@end example
-
-@noindent
-Questo codice sembra (ed @`e) semplice e immediato. Qual @`e il problema?
-
-Beh, si consideri cosa succede se un qualche codice a livello di @command{awk}
-associato con l'estensione richiama la funzione @code{magic()}
-(implementata in linguaggio C da @code{do_magic()}), una volta per ogni
-record, mentre si stanno elaborando
-file contenenti migliaia o milioni di record.
-La variabile @code{MAGIC_VAR} viene ricercata nella Tabella dei simboli una o due
-volte per ogni richiamo della funzione!
-
-La ricerca all'interno della Tabella dei simboli @`e in realt@`a una pura perdita
-di tempo; @`e molto pi@`u efficiente
-ottenere un @dfn{value cookie} che rappresenta la variabile, e usarlo per
-ottenere il valore della variabile e aggiornarlo a seconda della
-necessit@`a.@footnote{La differenza @`e misurabile e indubbiamente reale.
-Fidatevi.}
-
-Quindi, la maniera per usare i valori-cookie @`e la seguente. Per prima
-cosa, la variabile di estensione va messa nella Tabella dei simboli di
-@command{gawk} usando @code{sym_update()}, come al solito. Poi si deve ottenere
-uno @dfn{scalar cookie} per la
-variabile usando @code{sym_lookup()}:
-
-@example
-static awk_scalar_t magic_var_cookie; /* cookie per MAGIC_VAR */
-
-static void
-inizializza_estensione()
-@{
- awk_value_t valore;
-
- /* immettere il valore iniziale */
- sym_update("MAGIC_VAR", make_number(42.0, & valore));
-
- /* ottenere il @dfn{value cookie} */
- sym_lookup("MAGIC_VAR", AWK_SCALAR, & valore);
-
- /* salvarlo per dopo */
- magic_var_cookie = valore.scalar_cookie;
- @dots{}
-@}
-@end example
-
-Dopo aver fatto questo, si usino le routine descritte in questa @value{SECTION}
-per ottenere e modificare
-il valore usando il @dfn{value cookie}. Quindi, @code{do_magic()} diviene ora
-qualcosa del tipo:
-
-@example
-/* do_magic --- fai qualcosa di veramente grande */
-
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore;
-
- if ( sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & valore)
- && qualche_condizione(valore.num_valore)) @{
- valore.num_valore += 42;
- sym_update_scalar(magic_var_cookie, & valore);
- @}
- @dots{}
-
- return make_number(0.0, risultato);
-@}
-@end example
-
-@quotation NOTA
-Il codice appena visto omette il controllo di eventuali errori, per
-amor di semplicit@`a. Il codice dell'estensione dovrebbe essere pi@`u complesso
-e controllare attentamente i valori
-restituiti dalle funzioni dell'API.
-@end quotation
-
-@node Valori nascosti
-@subsubsection Creare e usare valori nascosti
-
-Le routine in questa @value{SECTION} permettono di creare e rilasciare
-valori nascosti. Come gli @dfn{scalar cookie}, in teoria i valori nascosti
-non sono necessari. Si possono creare numeri e stringhe usando
-le funzioni descritte
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di costruzione}. Si possono poi assegnare
-quei valori a delle variabili usando @code{sym_update()}
-o @code{sym_update_scalar()}, come si preferisce.
-
-Tuttavia, si pu@`o comprendere l'utilit@`a di avere dei valori nascosti
-se si pone mente al fatto che la memoria di @emph{ogni} valore di stringa
-@emph{deve} essere ottenuta tramite @code{gawk_malloc()},
-@code{gawk_calloc()} o @code{gawk_realloc()}.
-Se ci sono 20 variabili, e tutte hanno per valore la stessa stringa,
-si devono creare 20 copie identiche della stringa.@footnote{I valori
-numerici creano molti meno problemi, in quanto richiedono solo una variabile
-C @code{double} (8 byte) per contenerli.}
-
-Chiaramente @`e pi@`u efficiente, se possibile, creare il valore una sola volta,
-e fare in modo che @command{gawk} utilizzi quell'unico valore per molte
-variabili. Questo @`e ci@`o che la routine in
-@ifnotinfo
-questa
-@end ifnotinfo
-@ifinfo
-questo
-@end ifinfo
-@value{SECTION} permette
-di fare. Le funzioni sono le seguenti:
-
-@table @code
-@item awk_bool_t create_value(awk_value_t *valore, awk_value_cookie_t *risultato);
-Crea una stringa o un valore numerico nascosti, da @code{valore}, in
-vista di un successivo assegnamento di valore. Sono consentiti solo valori di
-tipo @code{AWK_NUMBER}, @code{AWK_REGEX} ed @code{AWK_STRING}.
-Ogni altro tipo @`e rifiutato.
-Il tipo @code{AWK_UNDEFINED} potrebbe essere consentito, ma in questo caso
-l'efficienza del programma ne soffrirebbe.
-
-@item awk_bool_t release_value(awk_value_cookie_t vc);
-Libera la memoria associata con un @dfn{value cookie} ottenuto mediante
-@code{create_value()}.
-@end table
-
-Si usano i @dfn{value cookie} in modo dimile a quello con cui si usano gli
-@dfn{scalar cookie}.
-Nella routine di inizializzazione dell'estensione, si crea il
-@dfn{value cookie}:
-
-@example
-static awk_value_cookie_t answer_cookie; /* static @dfn{value cookie} */
-
-static void
-inizializza_estensione()
-@{
- awk_value_t value;
- char *long_string;
- size_t long_string_len;
-
- /* codice precedente */
- @dots{}
- /* @dots{} riempire long_string e long_string_len @dots{} */
- make_malloced_string(long_string, long_string_len, & value);
- create_value(& value, & answer_cookie); /* creare cookie */
- @dots{}
-@}
-@end example
-
-Una volta che il valore @`e creato, si pu@`o usare come valore per un numero
-qualsiasi di variabili:
-
-@example
-static awk_value_t *
-do_magic(int nargs, awk_value_t *risultato)
-@{
- awk_value_t new_value;
-
- @dots{} /* come in precedenza */
-
- value.val_type = AWK_VALUE_COOKIE;
- value.value_cookie = answer_cookie;
- sym_update("VAR1", & value);
- sym_update("VAR2", & value);
- @dots{}
- sym_update("VAR100", & value);
- @dots{}
-@}
-@end example
-
-@noindent
-Usare @dfn{value cookie} in questo modo permette di risparmiare parecchia
-memoria, poich@'e tutte le variabili da @code{VAR1} a @code{VAR100} condividono
-lo stesso valore.
-
-Ci si potrebbe chiedere, ``Questa condivisione crea problemi?
-Cosa succede se il codice @command{awk} assegna un nuovo valore a @code{VAR1};
-sono modificate anche tutte le altre variabili?''
-
-Buona domanda! La risposta @`e che no, non @`e un problema.
-Internamente, @command{gawk} usa
-@dfn{un contatore dei riferimenti alle stringhe}. Questo significa
-che molte variabili possono condividere lo stesso valore di tipo stringa,
-e @command{gawk} mantiene traccia del loro uso. Quando il valore di
-una variabile viene modificato, @command{gawk} semplicemente diminuisce di
-uno il contatore dei riferimenti del vecchio valore, e aggiorna la variabile
-perch@'e usi il nuovo valore.
-
-Infine, come parte della pulizia al termine del programma
-(@pxref{Funzioni di exit callback})
-si deve liberare ogni valore nascosto che era stato creato, usando
-la funzione @code{release_value()}.
-
-@node Manipolazione di vettori
-@subsection Manipolazione di vettori
-@cindex vettori, manipolazione nelle estensioni
-@cindex estensioni, manipolazione di vettori
-
-La struttura di dati primaria@footnote{D'accordo, l'unica struttura di dati.}
-in @command{awk} @`e il vettore associativo
-@iftex
-(@pxrefil{Vettori}).
-@end iftex
-@ifnottex
-(@pxref{Vettori}).
-@end ifnottex
-Le estensioni devono essere in grado di manipolare vettori @command{awk}.
-L'API fornisce varie strutture di dati per lavorare con vettori,
-funzioni per lavorare con singoli elementi di un vettore, e funzioni per
-lavorare con interi vettori. @`E prevista anche la possibilit@`a di
-``appiattire'' un vettore in modo da rendere facile a un programma scritto in
-C la ``visita'' di tutti gli elementi del vettore.
-Le strutture dati per i vettori sono facilmente integrabili con le
-strutture dati per variabili scalari, per facilitare sia l'elaborazione, sia
-la creazione di @dfn{veri} vettori di vettori (@pxref{Tipi di dati generali}).
-
-@menu
-* Tipi di dati per i vettori:: Tipi dati per lavorare coi vettori.
-* Funzioni per i vettori:: Funzioni per lavorare coi vettori.
-* Appiattimento di vettori:: Come appiattire i vettori.
-* Creazione di vettori:: Come creare e popolare vettori.
-@end menu
-
-@node Tipi di dati per i vettori
-@subsubsection Tipi di dati per i vettori
-
-I tipi di dato associati con i vettori sono i seguenti:
-
-@table @code
-@item typedef void *awk_array_t;
-Se si richiede il valore di una variabile contenuta in un vettore, si ottiene
-un valore del tipo @code{awk_array_t}. Questo valore @`e
-@dfn{opaco}@footnote{@`E anche un
-``cookie,'' ma gli sviluppatori di @command{gawk} hanno preferito non abusare
-di questo termine.} per l'estensione; identifica in maniera univoca il
-vettore ma pu@`o solo essere usato come parametro di una funzione dell'API,
-o essere ricevuto da una funzione dell'API. Questo @`e molto simile al modo
-in cui i valori @samp{FILE *} sono usati con le routine di libreria di
-@code{<stdio.h>}.
-
-@item typedef struct awk_element @{
-@itemx @ @ @ @ /* puntatore di servizio
-@itemx @ @ @ @ a lista collegata, non usato da gawk */
-@itemx @ @ @ @ struct awk_element *next;
-@itemx @ @ @ @ enum @{
-@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* impostato da gawk */
-@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* impostato dall'estensione */
-@itemx @ @ @ @ @} flags;
-@itemx @ @ @ @ awk_value_t index;
-@itemx @ @ @ @ awk_value_t value;
-@itemx @} awk_element_t;
-@code{awk_element_t} @`e un elemento di vettore ``appiattito''.
-@command{awk} produce un vettore di questo tipo all'interno della struttura
-@code{awk_flat_array_t} (si veda poco pi@`u avanti).
-Singoli elementi di vettore possono essere marcati per essere cancellati.
-Nuovi elementi del vettore devono essere aggiunti individualmente, uno per
-volta, usando una funzione API apposita. I campi sono i seguenti:
-
-@c nested table
-@table @code
-@item struct awk_element *next;
-Questo puntatore @`e presente come ausilio a chi scrive un'estensione.
-Permette a un'estensione di creare una lista collegata (@dfn{linked list}) di
-nuovi elementi che possono essere aggiunti a un vettore con un
-singolo ciclo che percorre tutta la lista.
-
-@item enum @{ @dots{} @} flags;
-Un insieme di valori di flag che passano informazione tra l'estensione
-e @command{gawk}. Per ora c'@`e solo un flag disponibile:
-@code{AWK_ELEMENT_DELETE}.
-Se lo si imposta, @command{gawk} elimina l'elemento in questione dal vettore
-originale, dopo che il vettore ``appiattito'' @`e stato rilasciato.
-
-@item index
-@itemx value
-L'indice e il valore di un elemento, rispettivamente.
-@emph{Tutta} la memoria puntata da @code{index} e @code{valore} appartiene
-a @command{gawk}.
-@end table
-
-@item typedef struct awk_flat_array @{
-@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* per uso di gawk */
-@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* per uso di gawk */
-@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* quanti elementi nel vettore */
-@itemx @ @ @ @ awk_element_t elements[1];@ @ /* saranno ``appiattiti'' */
-@itemx @} awk_flat_array_t;
-Questo @`e un vettore appiattito. Quando un'estensione ottiene da
-@command{gawk} questa struttura, il vettore @code{elements} ha una dimensione
-reale di @code{count} elementi.
-I puntatori @code{opaque1} e @code{opaque2} sono per uso di @command{gawk};
-come tali, sono marcati come @code{awk_const} in modo che l'estensione non
-possa modificarli.
-@end table
-
-@node Funzioni per i vettori
-@subsubsection Funzioni per lavorare coi vettori
-
-Le funzioni seguenti permettono di gestire singoli elementi di un vettore:
-
-@table @code
-@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count);
-Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*count}
-il numero di elementi in esso contenuti. Ogni sottovettore @`e conteggiato come
-se fosse un solo elemento.
-Restituisce @dfn{false} se si verifica un errore.
-
-@item awk_bool_t get_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
-Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*risultato}
-il valore dell'elemento il cui indice @`e @code{index}.
-@code{wanted} specifica il tipo di valore che si vuole ritrovare.
-Restituisce @dfn{false} se @code{wanted} non coincide con il tipo di dato o
-se @code{index} non @`e nel vettore (@pxref{table-value-types-returned}).
-
-Il valore per @code{index} pu@`o essere numerico, nel qual caso @command{gawk}
-lo converte in una stringa. Usare valori non interi @`e possibile, ma
-richiede di comprendere il modo con cui tali valori sono convertiti in stringhe
-(@pxref{Conversione}); per questo motivo, @`e meglio usare numeri interi.
-
-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{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}, e
-@command{gawk} rilascer@`a (al momento opportuno) la relativa memoria.
-
-@item awk_bool_t set_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value);
-Nel vettore rappresentato da @code{a_cookie}, crea o modifica
-l'elemento il cui indice @`e contenuto in @code{index}.
-I vettori @code{ARGV} ed @code{ENVIRON} non possono essere modificati,
-mentre il vettore @code{PROCINFO} @`e modificabile.
-
-@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element);
-Come @code{set_array_element()}, ma prende l'indice @code{index} e
-il valore @code{value} da @code{element}. Questa @`e una macro di utilit@`a.
-
-@item awk_bool_t del_array_element(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index);
-Elimina dal vettore, rappresentato da @code{a_cookie}, l'elemento con
-l'indice specificato.
-Restituisce @dfn{true} se l'elemento @`e stato rimosso o @dfn{false} se
-l'elemento non era presente nel vettore.
-@end table
-
-Le seguenti funzioni operano sull'intero vettore:
-
-@table @code
-@item awk_array_t create_array(void);
-Crea un nuovo vettore a cui si possono aggiungere elementi.
-@xref{Creazione di vettori} per una trattazione su come
-creare un nuovo vettore e aggiungervi elementi.
-
-@item awk_bool_t clear_array(awk_array_t a_cookie);
-Svuota il vettore rappresentato da @code{a_cookie}.
-Restituisce @dfn{false} in presenza di qualche tipo di problema, @dfn{true}
-in caso contrario. Il vettore non viene eliminato ma, dopo aver chiamato
-questa funzione, resta privo di elementi. Questo @`e equivalente a usare
-l'istruzione @code{delete} (@pxref{Cancellazione}).
-
-@item awk_bool_t flatten_array_typed(awk_array_t a_cookie, awk_flat_array_t **data, awk_valtype_t index_type, awk_valtype_t value_type);
-Per il vettore rappresentato da @code{a_cookie}, crea una struttura
-@code{awk_flat_array_t} e la riempie con indici e valori del tipo richiesto.
-Imposta il puntatore il cui indirizzo @`e passato in @code{data} per puntare a
-questa struttura.
-Restituisce @dfn{true} se tutto va bene o @dfn{false} in caso contrario.
-@ifset FOR_PRINT
-Si veda la prossima @value{SECTION}
-@end ifset
-@ifclear FOR_PRINT
-@xref{Appiattimento di vettori},
-@end ifclear
-per una trattazione su come appiattire un vettore per poterci lavorare.
-
-@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data);
-Per il vettore rappresentato da @code{a_cookie}, crea una struttura
-@code{awk_flat_array_t} e la riempie con indici di tipo @code{AWK_STRING} e
-valori @code{AWK_UNDEFINED}.
-Questa funzione @`e resa obsoleta da @code{flatten_array_typed()}.
-@`E fornita come macro, e mantenuta per convenienza e per compatibilit@`a a
-livello di codice sorgente con la precedente versione dell'API.
-
-@item awk_bool_t release_flattened_array(awk_array_t a_cookie,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data);
-Quando si @`e finito di lavorare con un vettore appiattito, si liberi la
-memoria usando questa funzione. Occorre fornire sia il cookie del vettore
-originale, sia l'indirizzo della struttura da liberare,
-@code{awk_flat_array_t}.
-La funzione restituisce @dfn{true} se tutto va bene, @dfn{false} in caso contrario.
-@end table
-
-@node Appiattimento di vettori
-@subsubsection Lavorare con tutti gli elementi di un vettore
-
-@dfn{Appiattire} un vettore vuol dire creare una struttura che
-rappresenta l'intero vettore in modo da facilitare la visita
-dell'intero vettore da parte del codice in C . Parte del codice in
-@file{extension/testext.c} fa questo, ed @`e anche un bell'esempio
-di come utilizzare l'API.
-
-Questa parte del codice sorgente sar@`a descritta un po' per volta.
-Ecco, per iniziare, lo script @command{gawk} che richiama l'estensione di test:
-
-@example
-@@load "testext"
-BEGIN @{
- n = split("blacky rusty sophie raincloud lucky", pets)
- printf("pets ha %d elementi\n", length(pets))
- ret = dump_array_and_delete("pets", "3")
- printf("dump_array_and_delete(pets) ha restituito %d\n", ret)
- if ("3" in pets)
- printf("dump_array_and_delete() NON ha rimosso l'indice \"3\"!\n")
- else
- printf("dump_array_and_delete() ha rimosso l'indice \"3\"!\n")
- print ""
-@}
-@end example
-
-@noindent
-Questo codice crea un vettore usando la funzione @code{split()}
-(@pxref{Funzioni per stringhe})
-e poi chiama @code{dump_array_and_delete()}. Questa funzione ricerca
-il vettore il cui nome @`e passato come primo argomento, ed
-elimina l'elemento il cui indice @`e passato come secondo argomento.
-Il codice @command{awk} stampa poi il valore restituito e controlla che
-l'elemento sia stato effettivamente cancellato. Ecco il codice C che
-costituisce la funzione
-@code{dump_array_and_delete()}. @`E stato leggermente modificato per facilitare
-l'esposizione.
-
-La prima parte dichiara variabili, imposta il valore di ritorno di default
-in @code{risultato}, e controlla che la funzione
-sia stata chiamata con il numero corretto di argomenti:
-
-@example
-static awk_value_t *
-dump_array_and_delete(int nargs, awk_value_t *risultato)
-@{
- awk_value_t valore, valore2, valore3;
- awk_flat_array_t *flat_array;
- size_t count;
- char *name;
- int i;
-
- assert(risultato != NULL);
- make_number(0.0, risultato);
-
- if (nargs != 2) @{
- printf("dump_array_and_delete: nargs errato "
- "(%d dovrebbe essere 2)\n", nargs);
- goto out;
- @}
-@end example
-
-La funzione poi prosegue un passo per volta, come segue. Il primo passo @`e
-ricuperare il nome del vettore, passato come primo argomento, seguito dal
-vettore stesso. Se una di queste operazioni non riesce, viene stampato un
-messaggio di errore e si ritorna al chiamante:
-
-@example
- /* trasforma in un vettore piatto il vettore
- passato come argomento e lo stampa */
- if (get_argument(0, AWK_STRING, & value)) @{
- name = valore.str_value.str;
- if (sym_lookup(name, AWK_array, & value2))
- printf("dump_array_and_delete: sym_lookup di %s effettuato\n",
- name);
- else @{
- printf("dump_array_and_delete: sym_lookup di %s non riuscito\n",
- name);
- goto out;
- @}
- @} else @{
- printf("dump_array_and_delete: get_argument(0) non riuscito\n");
- goto out;
- @}
-@end example
-
-Per controllo, e per assicurarsi che il codice C veda
-lo stesso numero di elementi del codice @command{awk},
-il secondo passo @`e quello di ottenere il numero di elementi nel vettore
-e stamparlo:
-
-@example
- if (! get_element_count(valore2.array_cookie, & count)) @{
- printf("dump_array_and_delete: get_element_count non riuscito\n");
- goto out;
- @}
-
- printf("dump_array_and_delete: il vettore in input ha %lu elementi\n",
- (unsigned long) count);
-@end example
-
-Il terzo passo @`e quello di appiattire il vettore, e quindi
-controllare che il numero di elementi nella struttura @code{awk_flat_array_t}
-sia uguale a quello appena trovato:
-
-@example
- if (! flatten_array_typed(valore2.array_cookie, & flat_array,
- AWK_STRING, AWK_UNDEFINED)) @{
- printf("dump_array_and_delete: non sono riuscito ad appiattire \
-il vettore\n");
- goto out;
- @}
-
- if (flat_array->count != count) @{
- printf("dump_array_and_delete: flat_array->count (%lu)"
- " != count (%lu)\n",
- (unsigned long) flat_array->count,
- (unsigned long) count);
- goto out;
- @}
-@end example
-
-Il quarto passo @`e ritrovare l'indice dell'elemento
-da eliminare, che era stato passato come secondo argomento.
-Va tenuto presente che i contatori di argomenti passati a @code{get_argument()}
-partono da zero, e che quindi il secondo argomento @`e quello numero uno:
-
-@example
- if (! get_argument(1, AWK_STRING, & value3)) @{
- printf("dump_array_and_delete: get_argument(1) non riuscito\n");
- goto out;
- @}
-@end example
-
-Il quinto passo @`e quello in cui si fa il ``vero lavoro''. La funzione esegue
-un ciclo su ogni elemento nel vettore, stampando i valori degli indici e
-degli elementi. Inoltre, dopo aver trovato, tramite l'indice, l'elemento
-che si vorrebbe eliminare, la funzione imposta il @dfn{bit}
-@code{AWK_ELEMENT_DELETE} nel campo @code{flags}
-dell'elemento. Quando il vettore @`e stato interamente percorso, @command{gawk}
-visita il vettore appiattito, ed elimina ogni elemento in cui il relativo
-@dfn{bit} della flag sia impostato:
-
-@example
- for (i = 0; i < flat_array->count; i++) @{
- printf("\t%s[\"%.*s\"] = %s\n",
- name,
- (int) flat_array->elements[i].index.str_value.len,
- flat_array->elements[i].index.str_value.str,
- valrep2str(& flat_array->elements[i].valore));
-
- if (strcmp(valore3.str_value.str,
- flat_array->elements[i].index.str_value.str) == 0) @{
- flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
- printf("dump_array_and_delete: ho marcato l'elemento \"%s\" "
- "per eliminazione\n",
- flat_array->elements[i].index.str_value.str);
- @}
- @}
-@end example
-
-Il sesto passo @`e liberare il vettore appiattito. Questo segnala a
-@command{gawk} che l'estensione non sta pi@`u usando il vettore,
-e che dovrebbe eliminare gli elementi marcati per l'eliminazione.
-@command{gawk} libera anche ogni area di memoria che era stata allocata,
-e quindi non si dovrebbe pi@`u usare il puntatore (@code{flat_array} in
-questo codice) dopo aver chiamato @code{release_flattened_array()}:
-
-@example
- if (! release_flattened_array(valore2.array_cookie, flat_array)) @{
- printf("dump_array_and_delete: non riesco a liberare \
-il vettore appiattito\n");
- goto out;
- @}
-@end example
-
-Infine, poich@'e tutto @`e andato bene, la funzione imposta il codice di ritorno
-a "successo", e lo restituisce quando esce:
-
-@example
- make_number(1.0, risultato);
-out:
- return risultato;
-@}
-@end example
-
-Ecco l'output ottenuto eseguendo questa parte del test:
-
-@example
-pets ha 5 elementi
-dump_array_and_delete: sym_lookup di pets effettuato
-dump_array_and_delete: il vettore in input ha 5 elementi
- pets["1"] = "blacky"
- pets["2"] = "rusty"
- pets["3"] = "sophie"
-dump_array_and_delete: ho marcato l'elemento "3" per eliminazione
- pets["4"] = "raincloud"
- pets["5"] = "lucky"
-dump_array_and_delete(pets) ha restituito 1
-dump_array_and_delete() ha rimosso l'indice "3"!
-@end example
-
-@node Creazione di vettori
-@subsubsection Come creare e popolare vettori
-
-Oltre a lavorare con vettori creati da codice @command{awk}, si possono
-creare vettori a cui aggiungere elementi secondo le esigenze, che poi
-il codice @command{awk} pu@`o utilizzare e manipolare.
-
-Ci sono due punti importanti da tener presente quando di creano vettori dal
-codice di un'estensione:
-
-@itemize @value{BULLET}
-@item
-Il vettore appena creato deve essere subito messo nella Tabella dei simboli di
-@command{gawk}. Solo dopo aver fatto questo @`e possibile aggiungere elementi
-al vettore.
-
-@ignore
-Strictly speaking, this is required only
-for arrays that will have subarrays as elements; however it is
-a good idea to always do this. This restriction may be relaxed
-in a subsequent revision of the API.
-@end ignore
-
-Analogamente, se si installa un nuovo vettore come sottovettore di
-un vettore gi@`a esistente,
-occorre prima aggiungere il nuovo vettore al suo "genitore" per poter poi
-aggiungere degli elementi allo stesso.
-
-Quindi, il modo giusto per costruire un vettore @`e di lavorare ``dall'alto
-verso il basso''. Creare il vettore, e subito aggiungerlo alla Tabella dei
-simboli di @command{gawk} usando @code{sym_update()}, o installarlo come
-elemento in un vettore gi@`a esistente usando @code{set_array_element()}.
-Un esempio di codice @`e fornito pi@`u sotto.
-
-@item
-Per come funziona internamente @command{gawk}, dopo aver usato
-@code{sym_update()} per definire un vettore
-in @command{gawk}, si deve innanzitutto ricuperare il @dfn{cookie}
-del vettore dal valore passato a @command{sym_update()}, in questo modo:
-
-@example
-awk_value_t val;
-awk_array_t new_array;
-
-new_array = create_array();
-val.val_type = AWK_ARRAY;
-val.array_cookie = new_array;
-
-/* aggiunge il vettore alla Tabella dei simboli */
-sym_update("array", & val);
-
-new_array = val.array_cookie; /* QUESTO @`E OBBLIGATORIO */
-@end example
-
-Se si sta installando un vettore come sottovettore, occorre anche
-ricuperare il @dfn{cookie} del vettore dopo aver chiamato @code{set_element()}.
-@end itemize
-
-Il seguente codice C @`e una semplice estensione di test per creare un vettore
-con due elementi normali e con un sottovettore. Le direttive iniziali
-@code{#include} e le solite dichiarazione di variabili sono state omesse per
-amor di brevit@`a
-(@pxref{Codice predefinito di un'estensione API}).
-Il primo passo @`e creare un nuovo vettore e poi aggiungerlo alla
-Tabella dei simboli:
-
-@example
-@ignore
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "gawkapi.h"
-
-static const gawk_api_t *api; /* per far funzionare le macro di utilit@`a */
-static awk_ext_id_t *ext_id;
-static const char *ext_version = "testarray extension: version 1.0";
-
-int plugin_is_GPL_compatible;
-
-@end ignore
-/* create_new_array --- creare un vettore denominato */
-
-static void
-create_new_array()
-@{
- awk_array_t a_cookie;
- awk_array_t sottovettore;
- awk_value_t index, valore;
-
- a_cookie = create_array();
- valore.val_type = AWK_array;
- valore.array_cookie = a_cookie;
-
- if (! sym_update("new_array", & value))
- printf("create_new_array: sym_update(\"nuovo_vettore\") \
-non riuscito!\n");
- a_cookie = valore.array_cookie;
-@end example
-
-@noindent
-Si noti come @code{a_cookie} @`e reimpostato dal campo @code{array_cookie}
-nella struttura @code{valore}.
-
-Il secondo passo aggiunge due elementi normali a @code{nuovo_vettore}:
-
-@example
- (void) make_const_string("salve", 5, & index);
- (void) make_const_string("mondo", 5, & value);
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-
- (void) make_const_string("risposta", 8, & index);
- (void) make_number(42.0, & value);
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-@end example
-
-Il terzo passo @`e creare il sottovettore e aggiungerlo al vettore:
-
-@example
- (void) make_const_string("sottovettore", 12, & index);
- sottovettore = create_array();
- valore.val_type = AWK_array;
- valore.array_cookie = subarray;
- if (! set_array_element(a_cookie, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
- sottovettore = valore.array_cookie;
-@end example
-
-Il passo finale @`e di aggiungere al sottovettore un suo proprio elemento:
-
-@example
- (void) make_const_string("pippo", 5, & index);
- (void) make_const_string("pluto", 5, & value);
- if (! set_array_element(sottovettore, & index, & value)) @{
- printf("fill_in_array: set_array_element non riuscito\n");
- return;
- @}
-@}
-@ignore
-static awk_ext_func_t func_table[] = @{
- @{ NULL, NULL, 0 @}
-@};
-
-/* init_testarray --- funzione ulteriore di inizializzazione */
-
-static awk_bool_t init_testarray(void)
-@{
- create_new_array();
-
- return awk_true;
-@}
-
-static awk_bool_t (*init_func)(void) = init_testarray;
-
-dl_load_func(func_table, testarray, "")
-@end ignore
-@end example
-
-Ecco uno script di esempio che carica l'estensione
-e quindi stampa il valore di tutti gli elementi del vettore,
-invocando nuovamente se stessa nel caso che un particolare
-elemento sia a sua volta un vettore:
-
-@example
-@@load "subarray"
-
-function dumparray(name, vettore, i)
-@{
- for (i in vettore)
- if (isarray(vettore[i]))
- dumparray(name "[\"" i "\"]", vettore[i])
- else
- printf("%s[\"%s\"] = %s\n", name, i, vettore[i])
-@}
-
-BEGIN @{
- dumparray("new_array", new_array);
-@}
-@end example
-
-Ecco il risultato dell'esecuzione dello script:
-
-@example
-$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk}
-@print{} new_array["sottovettore"]["pippo"] = pluto
-@print{} new_array["salve"] = mondo
-@print{} new_array["risposta"] = 42
-@end example
-
-@noindent
-(@xref{Trovare le estensioni} per ulteriori dettagli sulla
-variabile d'ambiente @env{AWKLIBPATH}.)
-
-@node Ridirezione API
-@subsection Accedere alle ridirezioni e modificarle
-
-La seguente funzione consente alle estensioni di accedere e di manipolare
-delle ridirezioni.
-
-@table @code
-@item awk_bool_t get_file(const char *name,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t name_len,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *tipofile,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int fd,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_input_buf_t **ibufp,
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_output_buf_t **obufp);
-Ricerca il file @code{name} nella tabella interna di ridirezione di
-@command{gawk}.
-Se @code{name} @`e @code{NULL} o @code{name_len} @`e zero, restituisce
-i dati del file in input correntemente aperto il cui nome @`e memorizzato in
-@code{FILENAME}.
-(Questa chiamata non usa l'argomento @code{filetype}, che, quindi, pu@`o essere
-lasciato indefinito).
-Se il file non @`e gi@`a aperto, tenta di aprirlo.
-L'argomento @code{filetype} deve terminare con uno zero binario, e dovrebbe
-dovrebbe avere uno di questi valori:
-
-@table @code
-@item ">"
-Un file aperto in output.
-
-@item ">>"
-Un file aperto in output, record aggiunti a fine file,
-dopo quelli gi@`a esistenti [@dfn{append}].
-
-@item "<"
-Un file aperto in input.
-
-@item "|>"
-Una @dfn{pipe} aperta in output.
-
-@item "|<"
-Una @dfn{pipe} aperta in input.
-
-@item "|&"
-Un coprocesso bidirezionale.
-@end table
-
-In caso di errore, restituisce il valore @code{@dfn{awk_false}}.
-Altrimenti, restituisce
-@code{@dfn{awk_true}}, insieme a ulteriori informazioni sulla ridirezione
-nei puntatori @code{ibufp} e @code{obufp}.
-Per ridirezioni di input il valore @code{*ibufp} non dovrebbe essere
-@code{NULL}, mentre @code{*obufp} dovrebbe essere @code{NULL}.
-Per ridirezioni di output,
-il valore di @code{*obufp} non dovrebbe essere @code{NULL}, e @code{*ibufp}
-dovrebbe essere @code{NULL}. Per coprocessi bidirezionali, nessuno dei due
-valori dovrebbe essere @code{NULL}.
-
-Normalmente, l'estensione @`e interessata a @code{(*ibufp)->fd}
-e/o @code{fileno((*obufp)->fp)}. Se il file non @`e gi@`a
-aperto, e l'argomento @code{fd} non @`e negativo, @command{gawk}
-user@`a quel descrittore di file invece di aprire il file nella
-maniera solita. Se l'@code{fd} non @`e negativo, ma il file esiste gi@`a,
-@command{gawk} ignora l'@code{fd} e restituisce il file esistente. @`E
-responsabilit@`a del chiamante notare che n@'e l'@code{fd} nella struttura
-restituita @code{awk_input_buf_t}, n@'e l'@code{fd} nella struttura restituita
-@code{awk_output_buf_t} contiene il valore richiesto.
-
-Si noti che fornire un descrittore di file @emph{non} @`e al momento supportato
-per le @dfn{pipe}. Tuttavia, l'utilizzo di un descrittore di file
-dovrebbe essere possibile per @dfn{socket} in input, output,
-aggiunta-a-fine-file (append), e bidirezionale (coprocessi).
-Se @code{filetype} @`e bidirezionale, @command{gawk} presuppone che sia un
-@dfn{socket}! Si noti che nel caso
-bidirezionale i descrittori di file in input e output possono essere
-differenti.
-Per essere sicuri che tutto sia andato bene, si deve controllare che uno dei due
-corrisponda alla richiesta.
-@end table
-
-Si prevede che questa funzione API verr@`a usata per parallelizzare l'I/O
-e rendere disponibile una libreria per i @dfn{socket}.
-
-@node Variabili dell'estensione API
-@subsection Variabili fornite dall'API
-
-L'API fornisce due insiemi di variabili. Il primo insieme contiene
-informazioni sulla versione dell'API (sia la versione dell'estensione
-compilata, che quella di @command{gawk}). Il secondo
-insieme contiene informazioni su come @command{gawk} @`e stato invocato.
-
-@menu
-* Versione dell'estensione:: Informazioni sulla versione API.
-* Variabili informative di estens. API:: Variabili che forniscono informationi
- sull'invocazione di @command{gawk}.
-@end menu
-
-@node Versione dell'estensione
-@subsubsection Costanti e variabili della versione dell'API
-@cindex API, versione
-@cindex versione dell'estensione API @command{gawk}
-@cindex estensione @command{gawk}, versione API
-
-L'API fornisce sia un numero di versione ``principale'' che uno ``secondario''.
-Le versioni dell'API sono disponibili al momento della compilazione, come
-definizioni per il preprocessore C, a supporto della compilazione
-condizionale, e come elencazione di costanti per facilitare il debug:
-
-@float Tabella,gawk-api-version
-@caption{Costanti delle versioni API gawk}
-@multitable {@b{API Version}} {@code{gawk_api_major_version}} {@code{GAWK_API_MAJOR_VERSION}}
-@headitem versione API @tab Definiz. Preprocessore C @tab Costante di elenco
-@item Major @tab @code{gawk_api_major_version} @tab @code{GAWK_API_MAJOR_VERSION}
-@item Minor @tab @code{gawk_api_minor_version} @tab @code{GAWK_API_MINOR_VERSION}
-@end multitable
-@end float
-
-La versione secondaria aumenta quando nuove funzioni sono aggiunte all'API.
-Tali nuove funzioni sono sempre aggiunte alla fine della @code{struct} dell'API.
-
-La versione principale aumenta (e la versione secondaria torna a zero) se
-qualche tipo di dati cambia dimensione o si modifica l'ordine dei campi, o se
-qualcuna delle funzioni esistenti cambia il livello di versione.
-
-Pu@`o capitare che un'estensione sia stata compilata con una versione
-dell'API ma caricata da una versione di @command{gawk} che ne usa una
-differente. Per questo motivo, la versione principale e quella secondaria
-dell'API della versione in uso di @command{gawk} sono incluse nella
-@code{struct} dell'API come costanti intere in sola lettura:
-
-@table @code
-@item api->major_version
-La versione principale di @command{gawk} in esecuzione.
-
-@item api->minor_version
-La versione secondaria di @command{gawk} in esecuzione.
-@end table
-
-Dipende dall'estensione decidere se ci sono incompatibilit@`a con l'API.
-Tipicamente, basta un controllo di questo tipo:
-
-@example
-if (api->major_version != GAWK_API_MAJOR_VERSION
- || api->minor_version < GAWK_API_MINOR_VERSION) @{
- fprintf(stderr, "estensione_pippo: discordanza di versione \
-con gawk!\n");
- fprintf(stderr, "\tLa mia versione (%d, %d), versione gawk \
-(%d, %d)\n",
- GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
- api->major_version, api->minor_version);
- exit(1);
-@}
-@end example
-
-Questo codice @`e incluso nella macro generica @code{dl_load_func()}
-presente in @file{gawkapi.h} (trattata
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Codice predefinito di un'estensione API}).
-
-@node Variabili informative di estens. API
-@subsubsection Variabili informative
-@cindex API, variabili informative dell'estensione
-@cindex variabili informative dell'API
-@cindex estensione API, variabili informative
-
-L'API fornisce accesso a parecchie variabili che descrivono
-se le opzioni della riga di comando corrispondenti sono state specificate
-quando @command{gawk} @`e stato chiamato. Le variabili sono:
-
-@table @code
-@item do_debug
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--debug}.
-
-@item do_lint
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--lint}.
-
-@item do_mpfr
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--bignum}.
-
-@item do_profile
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--profile}.
-
-@item do_sandbox
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--sandbox}.
-
-@item do_traditional
-Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--traditional}.
-@end table
-
-Il valore di @code{do_lint} pu@`o cambiare se il codice @command{awk}
-modifica la variabile predefinita @code{LINT} (@pxref{Variabili predefinite}).
-Gli altri valori non dovrebbero cambiare durante l'esecuzione.
-
-@node Codice predefinito di un'estensione API
-@subsection Codice predefinito di interfaccia API
-
-Come gi@`a detto (@pxref{Panoramica sul meccanismo delle estensioni}),
-le definizioni di funzioni qui presentate sono in realt@`a delle macro.
-Per usare queste macro, l'estensione deve fornire una piccola quantit@`a di
-codice predefinito (variabili e
-funzioni) nella parte iniziale del file sorgente, usando dei nomi
-standard, come descritto qui sotto. Il codice predefinito in questione @`e
-anche descritto nel file di intestazione @file{gawkapi.h}:
-
-@example
-/* Codice predefinito: */
-int plugin_is_GPL_compatible;
-
-static gawk_api_t *const api;
-static awk_ext_id_t ext_id;
-static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
-
-static awk_ext_func_t func_table[] = @{
- @{ "name", do_name, 1, 0, awk_false, NULL @},
- /* @dots{} */
-@};
-
-/* O: */
-
-static awk_bool_t (*init_func)(void) = NULL;
-
-/* OPPURE: */
-
-static awk_bool_t
-init_mia_estensione(void)
-@{
- @dots{}
-@}
-
-static awk_bool_t (*init_func)(void) = init_mia_estensione;
-
-dl_load_func(func_table, qualche_nome, "name_space_in_quotes")
-@end example
-
-Queste variabili e funzioni sono:
-
-@table @code
-@item int plugin_is_GPL_compatible;
-Qui si dichiara che l'estensione @`e compatibile con
-@ifclear FOR_PRINT
-la licenza GNU GPL (@pxref{Copia}).
-
-@end ifclear
-@ifset FOR_PRINT
-la licenza GNU GPL.
-@end ifset
-Se l'estensione non ha questa variabile, non verr@`a caricata da @command{gawk}
-(@pxref{Licenza delle estensioni}).
-
-@item static gawk_api_t *const api;
-Questa variabile globale @code{static} dovrebbe essere impostata per
-puntare al puntatore
-@code{gawk_api_t} che @command{gawk} passa alla funzione (dell'estensione)
-@code{dl_load()}. Questa variabile @`e usata da tutte le macro.
-
-@item static awk_ext_id_t ext_id;
-Questa variabile globale @code{static} dovrebbe essere impostata al valore
-@code{awk_ext_id_t} che @command{gawk} passa alla funzione @code{dl_load()}.
-Questa variabile @`e usata da tutte le macro.
-
-@item static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
-Questa variabile globale @code{static} dovrebbe essere impostata
-a @code{NULL} oppure puntare a una stringa che contiene il nome e la
-versione dell'estensione.
-
-@item static awk_ext_func_t func_table[] = @{ @dots{} @};
-Questo @`e un vettore di una o pi@`u strutture @code{awk_ext_func_t},
-come descritto in precedenza (@pxref{Funzioni di estensione}).
-Pu@`o essere usato in seguito per pi@`u chiamate a
-@code{add_ext_func()}.
-
-@c Use @var{OR} for docbook
-@item static awk_bool_t (*init_func)(void) = NULL;
-@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @var{OR}
-@itemx static awk_bool_t init_mia_estensione(void) @{ @dots{} @}
-@itemx static awk_bool_t (*init_func)(void) = init_mia_estensione;
-Se qualche lavoro di inizializzazione @`e necessario, si dovrebbe definire una
-funzione all'uopo (crea variabili, apre file, etc.)
-e poi definire il puntatore @code{init_func} che punti alla funzione
-stessa.
-La funzione dovrebbe restituire @code{awk_@dfn{false}} se non va a buon fine
-o @code{awktrue} se tutto va bene.
-
-Se un'inizializzazione non @`e necessaria, si definisca il puntatore e
-lo si inizializzi a @code{NULL}.
-
-@item dl_load_func(func_table, qualche_nome, "nome_spazio_tra_doppi_apici")
-Questa macro genera una funzione @code{dl_load()} che far@`a
-tutte le inizializzazioni necessarie.
-@end table
-
-Lo scopo di tutte le variabili e dei vettori @`e di far s@`{@dotless{i}} che la
-funzione @code{dl_load()} (richiamata dalla macro @code{dl_load_func()})
-faccia tutto il lavoro standard necessario, qui descritto:
-
-@enumerate 1
-@item
-Controlla le versioni dell'API. Se la versione principale dell'estensione
-non corrisponde a quella di @command{gawk} o se la versione secondaria
-dell'estensione @`e maggiore di quella di @command{gawk}, stampa un messaggio
-di errore fatale ed esce.
-
-@item
-Carica le funzioni definite in @code{func_table}.
-Se qualche caricamento non riesce, stampa un messaggio di
-avvertimento ma continua l'esecuzione.
-
-@item
-Se il puntatore @code{init_func} non @`e @code{NULL}, chiama la
-funzione da esso puntata. Se questa restituisce @code{awk_false}, stampa un
-messaggio di avvertimento.
-
-@item
-Se @code{ext_version} non @`e @code{NULL}, registra la
-stringa di versione con @command{gawk}.
-@end enumerate
-
-@node Modifiche dalla versione API 1
-@subsection Modifiche dalla versione 1 dell'API
-
-La versione API corrente @emph{non} @`e compatibile a livello binario con la
-versione 1 dell'API.
-Le funzioni di estensione vanno ricompilate per poterle usare con la versione
-corrente di @command{gawk}.
-
-Fortunatamente, fatti salvi alcuni possibili avvertimenti a livello di
-compilazione, l'API rimane compatibile a livello di codice sorgente con la
-precedente versione API. Le differenze pi@`u rilevanti sono gli ulteriori
-campi nella struttura @code{awk_ext_func_t}, e l'aggiunta del terzo argomento
-nella funzione di implementazione in linguaggio C.
-
-@node Trovare le estensioni
-@section Come @command{gawk} trova le estensioni compilate
-@cindex estensioni, percorso di ricerca per
-@cindex estensioni, come trovarle
-@cindex trovare le estensioni
-@cindex percorso di ricerca per estensioni
-
-Le estensioni compilate vanno installate in una directory dove
-@command{gawk} possa trovarle. Se @command{gawk} @`e configurato e
-installato nella maniera di default, la directory dove trovare le
-estensioni @`e @file{/usr/local/lib/gawk}. Si pu@`o anche specificare un
-percorso di ricerca contenente una lista di directory da esaminare per la
-ricerca di estensioni compilate.
-@xref{AWKLIBPATH (Variabile)} per ulteriori dettagli.
-
-@node Esempio di estensione
-@section Esempio: alcune funzioni per i file
-@cindex estensione, esempio
-@cindex esempio di estensione
-
-@quotation
-@i{In qualunque posto vai, l@`a tu sei.}
-@author Buckaroo Banzai
-@end quotation
-
-@c It's enough to show chdir and stat, no need for fts
-
-Due utili funzioni che non sono in @command{awk} sono @code{chdir()} (per
-permettere a un programma @command{awk} di cambiare directory di lavoro) e
-@code{stat()}
-(per far s@`{@dotless{i}} che un programma @command{awk} possa raccogliere informazioni
-su un dato file).
-Per illustrare l'azione dell'API, questa @value{SECTION} fornisce
-queste funzioni a @command{gawk} in un'estensione.
-
-@menu
-* Descrizione interna file:: Quello che le nuove funzioni faranno
-* Operazioni interne file:: Codice per gestire file all'interno
-* Usare operazioni interne file:: Come usare un'estensione esterna
-@end menu
-
-@node Descrizione interna file
-@subsection Usare @code{chdir()} e @code{stat()}
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} mostra come usare le nuove funzioni a
-livello di @command{awk} una volta che siano state integrate nell'interprete
-del programma @command{gawk} in esecuzione. Usare @code{chdir()} @`e molto
-semplice. Richiede un solo argomento, la nuova directory su cui
-posizionarsi:
-
-@example
-@@load "filefuncs"
-@dots{}
-newdir = "/home/arnold/funstuff"
-ret = chdir(newdir)
-if (ret < 0) @{
- printf("non riesco a passare a %s: %s\n", newdir, ERRNO) > "/dev/stderr"
- exit 1
-@}
-@dots{}
-@end example
-
-Il valore restituito @`e negativo se la chiamata a @code{chdir()} non @`e riuscita,
-ed @code{ERRNO} (@pxref{Variabili predefinite}) @`e impostato a una stringa
-che descrive l'errore.
-
-Usare @code{stat()} @`e un po' pi@`u complicato. La funzione scritta in C
-@code{stat()} riempie una struttura che ha una certa quantit@`a di informazioni.
-La maniera corretta per immagazzinarle in @command{awk} @`e quella di riempire
-un vettore associativo con le informazioni appropriate:
-
-@c broke printf for page breaking
-@example
-file = "/home/arnold/.profile"
-ret = stat(file, fdata)
-if (ret < 0) @{
- printf("non @`e stato possibile eseguire @command{stat} per %s: %s\n",
- file, ERRNO) > "/dev/stderr"
- exit 1
-@}
-printf("dimensione di %s @`e %d byte\n", file, fdata["size"])
-@end example
-
-La funzione @code{stat()} svuota sempre il vettore che contiene i dati,
-anche nel caso che la chiamata a @code{stat()} non riesca. I seguenti
-elementi vengono restituiti dalla funzione:
-
-@table @code
-@item "name"
-Il nome del file oggetto della chiamata a @code{stat()}.
-
-@item "dev"
-@itemx "ino"
-I numeri di @dfn{device} e di @dfn{inode}, rispettivamente.
-
-@item "mode"
-Il modo del file, in formato numerico. Questo include sia il tipo di file che
-i suoi permessi di accesso.
-
-@item "nlink"
-Il numero di collegamenti fisici del file (stesso file con diversi nomi).
-
-@item "uid"
-@itemx "gid"
-Gli identificativi di utente e di gruppo del possessore del file.
-
-@item "size"
-La dimensione in byte del file.
-
-@item "blocks"
-Il numero di blocchi su disco realmente occupati dal file. Questo pu@`o non
-essere
-proporzionale alla dimensione del file se il file ha delle lacune
-[ossia se solo alcune parti del file esistono veramente, il resto
-non @`e ancora stato riempito].
-
-@item "atime"
-@itemx "mtime"
-@itemx "ctime"
-La data e ora dell'ultimo accesso, modifica, e aggiornamento dell'@dfn{inode},
-rispettivamente. Questi sono delle marcature temporali numeriche
-(misurate in secondi dal
-01 gennaio 1970), che possono essere formattate dalla funzione
-@code{strftime()}
-(@pxref{Funzioni di tempo}).
-
-@item "pmode"
-La modalit@`a stampabile (``printable mode'') del file.
-Questo @`e una stringa che rappresenta
-il tipo del file e i permessi di accesso, come sono visualizzati da
-@samp{ls -l}---per esempio, @code{"drwxr-xr-x"}.
-
-@item "type"
-Una stringa stampabile che descrive il tipo di file. Il valore @`e uno dei
-seguenti:
-
-@table @code
-@item "blockdev"
-@itemx "chardev"
-Il file @`e un dispositico a blocchi o a caratteri (``file speciale'').
-
-@ignore
-@item "door"
-The file is a Solaris ``door'' (special file used for
-interprocess communications).
-@end ignore
-
-@item "directory"
-Il file @`e una directory.
-
-@item "fifo"
-Il file @`e una @dfn{pipe} denominata (nota anche come FIFO [First In First
-Out]).
-
-@item "file"
-Il file @`e un file normale.
-
-@item "@dfn{socket}"
-Il file @`e un @dfn{socket} @code{AF_UNIX} (``Unix domain'') nel
-filesystem.
-
-@item "symlink"
-Il file @`e un collegamento simbolico.
-@end table
-
-@c 5/2013: Thanks to Corinna Vinschen for this information.
-@item "devbsize"
-La dimensione di un blocco per l'elemento indicizzato da @code{"blocks"}.
-Questa informazione @`e derivata dalla costante @code{DEV_BSIZE}
-definita in @code{<sys/param.h>} nella maggior parte dei sistemi,
-o dalla costante @code{S_BLKSIZE} in @code{<sys/stat.h>} nei sistemi BSD.
-Per alcuni altri sistemi il valore si basa su una conoscenza @dfn{a priori}
-delle caratteristiche di un particolare sistema.
-Se non si riesce a determinare il valore, viene
-restituito quello di default, che @`e 512.
-@end table
-
-Possono essere presenti diversi altri elementi, a seconda del
-sistema operativo e del tipo di file.
-Si pu@`o controllarne la presenza dal programma @command{awk} per mezzo
-dell'operatore @code{in}
-(@pxref{Visitare elementi}):
-
-@table @code
-@item "blksize"
-La dimensione preferita di un blocco per effettuare operazioni di I/O sul file.
-Questo campo non @`e presente nella struttura C @code{stat} di tutti i sistemi
-che rispettano lo standard POSIX.
-
-@item "linkval"
-Se il file @`e un collegamento simbolico, questo elemento @`e il nome del
-file puntato dal collegamento simbolico (cio@`e, il valore del collegamento).
-
-@item "rdev"
-@itemx "major"
-@itemx "minor"
-Se il file @`e un dispositivo a blocchi o a caratteri, questi valori
-rappresentano il numero del dispositivo e, rispettivamente, le componenti
-principale e secondaria di quel numero.
-@end table
-
-@node Operazioni interne file
-@subsection Codice C per eseguire @code{chdir()} e @code{stat()}
-
-Questo @`e il codice C per queste estensioni.@footnote{La versione qui
-presentata @`e
-lievemente modificata per amor di semplicit@`a. Si veda @file{extension/filefuncs.c}
-nella distribuzione @command{gawk} per la versione completa.}
-
-Il file include alcuni file di intestazione standard, e poi il file di
-intestazione @file{gawkapi.h}, che fornisce le definizioni dell'API.
-A queste seguono le dichiarazioni di variabili, necessarie
-per usare le macro dell'API e il codice predefinito
-(@pxref{Codice predefinito di un'estensione API}):
-
-@example
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "gawkapi.h"
-
-#include "gettext.h"
-#define _(msgid) gettext(msgid)
-#define N_(msgid) msgid
-
-#include "gawkfts.h"
-#include "stack.h"
-
-static const gawk_api_t *api; /* per consentire il funzionamento
- delle macro di utilit@`a */
-static awk_ext_id_t *ext_id;
-static awk_bool_t init_filefuncs(void);
-static awk_bool_t (*init_func)(void) = init_filefuncs;
-static const char *ext_version = "filefuncs extension: version 1.0";
-
-int plugin_is_GPL_compatible;
-@end example
-
-@cindex programmazione, convenzioni di, estensioni @command{gawk}
-@cindex estensioni @command{gawk}, convenzioni di programmazione
-Per convenzione, per una funzione @command{awk} di nome @code{pippo()},
-la funzione C che la implementa @`e chiamata @code{do_pippo()}. La funzione
-dovrebbe avere due argomenti. Il primo @`e un numero @code{int}, chiamato
-@code{nargs}, che rappresenta il numero di argomenti passato alla funzione.
-Il secondo @`e un puntatore a una struttura @code{awk_value_t}, normalmente
-chiamata @code{risultato}:
-
-@example
-/* do_chdir --- fornisce funzione chdir()
- caricata dinamicamente per gawk */
-
-static awk_value_t *
-do_chdir(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
-@{
- awk_value_t newdir;
- int ret = -1;
-
- assert(risultato != NULL);
-@end example
-
-La variabile @code{newdir}
-rappresenta la nuova directory nella quale cambiare, che @`e ottenuta
-tramite la funzione @code{get_argument()}. Si noti che il primo argomento @`e
-quello numero zero.
-
-Se l'argomento @`e stato trovato con successo, la funzione invoca la chiamata di
-sistema @code{chdir()}. In caso contrario, se la @code{chdir()} non riesce,
-viene aggiornata la variabile @code{ERRNO}:
-
-@example
- if (get_argument(0, AWK_STRING, & newdir)) @{
- ret = chdir(newdir.str_value.str);
- if (ret < 0)
- update_ERRNO_int(errno);
- @}
-@end example
-
-Infine, la funzione restituisce il codice di ritorno da @code{chdir} a
-livello di @command{awk}:
-
-@example
- return make_number(ret, risultato);
-@}
-@end example
-
-L'estensione @code{stat()} @`e pi@`u impegnativa. Dapprima abbiamo
-una funzione che trasforma la stringa di autorizzazione numerica
-(@dfn{mode}) in una rappresentazione stampabile
-(p.es., il codice ottale @code{0644} diviene @samp{-rw-r--r--}). Questa
-parte @`e qui omessa per brevit@`a.
-
-@example
-/* format_mode --- trasforma il campo @dfn{mode} di @dfn{stat}
- in qualcosa di leggibile */
-
-static char *
-format_mode(unsigned long fmode)
-@{
- @dots{}
-@}
-@end example
-
-Viene poi una funzione per leggere dei collegamenti simbolici, anche questa
-omessa per brevit@`a:
-
-@example
-/* read_symlink --- legge un collegamento simbolico in un buffer
- allocato.
- @dots{} */
-
-static char *
-read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
-@{
- @dots{}
-@}
-@end example
-
-Due funzioni ausiliarie semplificano l'immissione di valori nel
-vettore che conterr@`a il risultato della chiamata a @code{stat()}:
-
-@example
-/* array_set --- imposta un elemento di un vettore */
-
-static void
-array_set(awk_array_t vettore, const char *sub, awk_value_t *valore)
-@{
- awk_value_t index;
-
- set_array_element(vettore,
- make_const_string(sub, strlen(sub), & index),
- valore);
-
-@}
-
-/* array_set_numeric --- imposta un elemento di un vettore con un
- numero */
-
-static void
-array_set_numeric(awk_array_t vettore, const char *sub, double num)
-@{
- awk_value_t tmp;
-
- array_set(vettore, sub, make_number(num, & tmp));
-@}
-@end example
-
-La seguente funzione fa il grosso del lavoro per riempire il vettore dei
-risultati @code{awk_array_t} con valori ottenuti
-da una @code{struct stat} valida. Questo lavoro @`e fatto in una funzione
-separata per supportare sia la funzione
-@code{stat()} per @command{gawk}, che l'estensione @code{fts()},
-che @`e inclusa nello stesso file, ma non
- @`e mostrata qui
-(@pxref{Esempio di estensione funzioni file}).
-
-La prima parte della funzione @`e la dichiarazione delle variabili,
-compresa una tabella per tradurre i tipi di file in stringhe:
-
-@example
-/* fill_stat_array --- fa il lavoro di riempire un
- vettore con informazioni da stat */
-
-static int
-fill_stat_array(const char *name, awk_array_t vettore, struct stat *sbuf)
-@{
- char *pmode; /* @dfn{mode} stampabile */
- const char *type = "unknown";
- awk_value_t tmp;
- static struct ftype_map @{
- unsigned int mask;
- const char *type;
- @} ftype_map[] = @{
- @{ S_IFREG, "file" @},
- @{ S_IFBLK, "blockdev" @},
- @{ S_IFCHR, "chardev" @},
- @{ S_IFDIR, "directory" @},
-#ifdef S_IFSOCK
- @{ S_IFSOCK, "socket" @},
-#endif
-#ifdef S_IFIFO
- @{ S_IFIFO, "fifo" @},
-#endif
-#ifdef S_IFLNK
- @{ S_IFLNK, "symlink" @},
-#endif
-#ifdef S_IFDOOR /* Stranezza Solaris */
- @{ S_IFDOOR, "door" @},
-#endif /* S_IFDOOR */
- @};
- int j, k;
-@end example
-
-Il vettore di destinazione @`e svuotato di elementi, e poi il codice riempie
-i vari elementi prendendoli dai valori presenti in @code{struct stat}:
-@example
- /* svuota il vettore */
- clear_array(vettore);
-
- /* riempie il vettore */
- array_set(vettore, "name", make_const_string(name, strlen(name),
- & tmp));
- array_set_numeric(vettore, "dev", sbuf->st_dev);
- array_set_numeric(vettore, "ino", sbuf->st_ino);
- array_set_numeric(vettore, "mode", sbuf->st_mode);
- array_set_numeric(vettore, "nlink", sbuf->st_nlink);
- array_set_numeric(vettore, "uid", sbuf->st_uid);
- array_set_numeric(vettore, "gid", sbuf->st_gid);
- array_set_numeric(vettore, "size", sbuf->st_size);
- array_set_numeric(vettore, "blocks", sbuf->st_blocks);
- array_set_numeric(vettore, "atime", sbuf->st_atime);
- array_set_numeric(vettore, "mtime", sbuf->st_mtime);
- array_set_numeric(vettore, "ctime", sbuf->st_ctime);
-
- /* per dispositivi a blocchi o carattere, aggiunge rdev,
- e il numero principale e secondario */
- if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{
- array_set_numeric(vettore, "rdev", sbuf->st_rdev);
- array_set_numeric(vettore, "major", major(sbuf->st_rdev));
- array_set_numeric(vettore, "minor", minor(sbuf->st_rdev));
- @}
-@end example
-
-@noindent
-L'ultima parte della funzione fa alcune aggiunte selettive
-al vettore di destinazione, a seconda che siano disponibili o no
-certi campi e/o il tipo del file. Viene poi restituito zero, per indicare che
-tutto @`e andato bene:
-
-@example
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
- array_set_numeric(vettore, "blksize", sbuf->st_blksize);
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
-
- pmode = format_mode(sbuf->st_mode);
- array_set(vettore, "pmode", make_const_string(pmode, strlen(pmode),
- & tmp));
-
- /* per collegamenti simbolici, si aggiunge un campo linkval */
- if (S_ISLNK(sbuf->st_mode)) @{
- char *buf;
- ssize_t linksize;
-
- if ((buf = read_symlink(name, sbuf->st_size,
- & linksize)) != NULL)
- array_set(vettore, "linkval",
- make_malloced_string(buf, linksize, & tmp));
- else
- warning(ext_id, _("stat: non riesco a leggere il \
-collegamento simbolico `%s'"),
- name);
- @}
-
- /* aggiunge il tipo di campo */
- type = "unknown"; /* non dovrebbe succedere */
- for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{
- if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{
- type = ftype_map[j].type;
- break;
- @}
- @}
-
- array_set(vettore, "type", make_const_string(type, strlen(type), & tmp));
-
- return 0;
-@}
-@end example
-
-Del terzo argomento passato a @code{stat()} non si era ancora parlato.
-Questo argomento @`e facoltativo. Se presente, dice a @code{do_stat()} di
-usare la chiamata di sistema @code{stat()} invece della chiamata di sistema
-@code{lstat()}. Questo avviene attraverso un puntatore a funzione:
-@code{statfunc}.
-@code{statfunc} @`e inizializzato per puntare a @code{lstat()} (invece che a
-@code{stat()}) per ottenere le informazioni relative al file, nel caso che
-il file in questione sia un
-collegamento simbolico. Tuttavia, se il terzo argomento @`e specificato,
-@code{statfunc} viene modificato in modo da puntare a @code{stat()}.
-
-Ecco la funzione @code{do_stat()}, che inizia con la dichiarazione delle
-variabili e un controllo degli argomenti passati dal chiamante:
-
-@example
-/* do_stat --- fornisce una funzione stat() per gawk */
-
-static awk_value_t *
-do_stat(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
-@{
- awk_value_t file_param, array_param;
- char *name;
- awk_array_t vettore;
- int ret;
- struct stat sbuf;
- /* per default si usa lstat() */
- int (*statfunc)(const char *path, struct stat *sbuf) = lstat;
-
- assert(risultato != NULL);
-@end example
-
-A questo punto inizia l'elaborazione vera e propria. Per prima cosa, la
-funzione esamina gli argomenti.
-Poi, ottiene le informazioni relative al file. Se la funzione chiamata
-(@code{lstat()} o @code{stat()}) restituisce un errore, il codice imposta
-@code{ERRNO} e torna al chiamante:
-
-@example
- /* file @`e il primo argomento,
- il vettore per contenere i risultati @`e il secondo */
- if ( ! get_argument(0, AWK_STRING, & file_param)
- || ! get_argument(1, AWK_ARRAY, & array_param)) @{
- warning(ext_id, _("stat: parametri errati"));
- return make_number(-1, risultato);
- @}
-
- if (nargs == 3) @{
- statfunc = stat;
- @}
-
- name = file_param.str_value.str;
- vettore = array_param.array_cookie;
-
- /* svuota sempre il vettore all'inizio */
- clear_array(vettore);
-
- /* chiama stat per il file;
- in caso di errore,
- imposta ERRNO e ritorna */
- ret = statfunc(name, & sbuf);
- if (ret < 0) @{
- update_ERRNO_int(errno);
- return make_number(ret, risultato);
- @}
-@end example
-
-Il lavoro noioso @`e svolto da @code{fill_stat_array()}, visto in
-precedenza. Alla fine, la funzione restituisce il codice di ritorno
-impostato da @code{fill_stat_array()}:
-
-@example
- ret = fill_stat_array(name, vettore, & sbuf);
-
- return make_number(ret, risultato);
-@}
-@end example
-
-Infine, @`e necessario fornire la ``colla'' che aggrega
-le nuove funzioni a @command{gawk}.
-
-L'estensione @code{filefuncs} comprende anche una funzione
-@code{fts()}, qui omessa
-(@pxref{Esempio di estensione funzioni file}).
-@`E anche prevista una funzione di
-inizializzazione:
-
-@example
-/* init_filefuncs --- routine di initializazione */
-
-static awk_bool_t
-init_filefuncs(void)
-@{
- @dots{}
-@}
-@end example
-
-Siamo quasi alla fine. Serve un vettore di strutture @code{awk_ext_func_t}
-per caricare ogni funzione in @command{gawk}:
-
-@example
-static awk_ext_func_t func_table[] = @{
- @{ "chdir", do_chdir, 1, 1, awk_false, NULL @},
- @{ "stat", do_stat, 3, 2, awk_false, NULL @},
- @dots{}
-@};
-@end example
-
-Ogni estensione deve avere una routine di nome @code{dl_load()} per caricare
-tutto ci@`o che occorre caricare. La cosa pi@`u semplice @`e di usare la macro
-@code{dl_load_func()} in @code{gawkapi.h}:
-
-@example
-/* definizione della funzione dl_load()
- usando la macro standard */
-
-dl_load_func(func_table, filefuncs, "")
-@end example
-
-Abbiamo finito!
-
-@node Usare operazioni interne file
-@subsection Integrare le estensioni
-
-@cindex @command{gawk}, aggiungere funzionalit@`a a
-@cindex funzionalit@`a, aggiungere a @command{gawk}
-@cindex aggiungere funzionalit@`a a @command{gawk}
-Dopo aver scritto il codice, dev'essere possibile aggiungerlo in fase
-di esecuzione all'interprete @command{gawk}. Per prima cosa, il codice
-va compilato. Supponendo che le funzioni siano in
-un file di nome @file{filefuncs.c}, e che @var{idir} sia la posizione
-del file di intestazione @file{gawkapi.h},
-i seguenti passi@footnote{In pratica, si potrebbe decidere di usare
-i comandi GNU Autotools (Automake, Autoconf, Libtool, e @command{gettext})
-per configurare e costruire le librerie necessarie. L'esposizione di come
-ci@`o pu@`o essere fatto esula dal tema di questo @value{DOCUMENT}.
-@xref{gawkextlib} per i puntatori a siti Internet che permettono di accedere
-a questi strumenti.} creano una libreria condivisa GNU/Linux:
-
-@example
-$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c}
-$ @kbd{gcc -o filefuncs.so -shared filefuncs.o}
-@end example
-
-Una volta creata la libreria, questa viene caricata usando la parola
-chiave @code{@@load}:
-
-@example
-# file testff.awk
-@@load "filefuncs"
-
-BEGIN @{
- "pwd" | getline curdir # salva la directory corrente
- close("pwd")
-
- chdir("/tmp")
- system("pwd") # verifica l'avvenuto cambio di directory
- chdir(curdir) # torna indietro
-
- print "Info per testff.awk"
- ret = stat("testff.awk", data)
- print "ret =", ret
- for (i in data)
- printf "data[\"%s\"] = %s\n", i, data[i]
- print "testff.awk modified:",
- strftime("%m %d %Y %H:%M:%S", data["mtime"])
-
- print "\nInfo per JUNK"
- ret = stat("JUNK", data)
- print "ret =", ret
- for (i in data)
- printf "data[\"%s\"] = %s\n", i, data[i]
- print "JUNK modified:", strftime("%m %d %Y %H:%M:%S", data["mtime"])
-@}
-@end example
-
-La variabile d'ambiente @env{AWKLIBPATH} dice a
-@command{gawk} dove @`e possibile trovare le estensioni (@pxref{Trovare le estensioni}).
-La variabile viene impostata alla directory corrente, e quindi viene eseguito
-il programma:
-
-@example
-$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
-@print{} /tmp
-@print{} Info per testff.awk
-@print{} ret = 0
-@print{} data["blksize"] = 4096
-@print{} data["devbsize"] = 512
-@print{} data["mtime"] = 1412004710
-@print{} data["mode"] = 33204
-@print{} data["type"] = file
-@print{} data["dev"] = 2053
-@print{} data["gid"] = 1000
-@print{} data["ino"] = 10358899
-@print{} data["ctime"] = 1412004710
-@print{} data["blocks"] = 8
-@print{} data["nlink"] = 1
-@print{} data["name"] = testff.awk
-@print{} data["atime"] = 1412004716
-@print{} data["pmode"] = -rw-rw-r--
-@print{} data["size"] = 666
-@print{} data["uid"] = 1000
-@print{} testff.awk modified: 09 29 2014 18:31:50
-@print{}
-@print{} Info per JUNK
-@print{} ret = -1
-@print{} JUNK modified: 01 01 1970 02:00:00
-@end example
-
-@node Esempi di estensione
-@section Le estensioni di esempio incluse nella distribuzione @command{gawk}
-@cindex estensioni distribuite con @command{gawk}
-
-Questa @value{SECTION} fornisce una breve panoramica degli esempi di
-estensione inclusi nella distribuzione di @command{gawk}. Alcune di esse
-sono destinate per l'uso in produzione (p.es., le estensioni
-@code{filefuncs}, @code{readdir}, e
-@code{inplace}). Altre sono state scritte principalmente per mostrare come
-si usa l'estensione API.
-
-@menu
-* Esempio di estensione funzioni file:: L'esempio che usa funzioni file.
-* Esempio di estensione Fnmatch:: Un'interfaccia a @code{fnmatch()}.
-* Esempio di estensione Fork:: Un'interfaccia a @code{fork()} e
- altre funzioni di processo.
-* Esempio di estensione Inplace:: Consentire modifica diretta dei file.
-* Esempio di estensione Ord:: Conversioni a valore e a stringa di
- caratteri.
-* Esempio di estensione Readdir:: Un'interfaccia a @code{readdir()}.
-* Esempio di estensione Revout:: Semplice post-processore per
- invertire la stringa in output.
-* Esempio di estensione Rev2way:: Processore bidirezionale per
- invertire la stringa in output.
-* Esempio di estensione Rwarray:: Serializzare il vettore in un
- file.
-* Esempio di estensione Readfile:: Leggere un intero file in una stringa.
-* Esempio di estensione Time:: Un'interfaccia a @code{gettimeofday()}
- e @code{sleep()}.
-* Esempio di estensione API Test:: Test per la API.
-@end menu
-
-@node Esempio di estensione funzioni file
-@subsection Funzioni relative ai file
-
-L'estensione @code{filefuncs} include tre funzioni diverse, come descritto sotto.
-L'uso @`e il seguente:
-
-@table @asis
-@item @code{@@load "filefuncs"}
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{chdir()}, estensione
-@cindex estensione @code{chdir()}
-@item @code{risultato = chdir("/qualche/directory")}
-La funzione @code{chdir()} invoca a sua volta la chiamata di sistema
-@code{chdir()} per cambiare la directory corrente. Restituisce zero
-se tutto va bene o un valore minore di zero in caso di errore.
-In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
-
-@cindex @code{stat()}, estensione
-@cindex estensione @code{stat()}
-@item @code{risultato = stat("/qualche/percorso", statdata} [@code{, follow}]@code{)}
-La funzione @code{stat()} invoca a sua volta la chiamata di sistema
-@code{stat()}.
-Restituisce zero se tutto va bene o un valore minore di zero in caso di
-errore.
-In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
-
-Per default, viene usata la chiamata di sistema @code{lstat()}.
-Tuttavia, se alla funzione viene passato un terzo argomento, questa invoca
-invece @code{stat()}.
-
-In tutti i casi, il vettore @code{statdata} viene preventivamente svuotato.
-Quando la chiamata a @code{stat()} riesce, viene riempito il vettore
-@code{statdata} con le informazioni ottenute dal fileystem, come segue:
-
-@multitable @columnfractions .15 .50 .20
-@headitem Indice @tab Campo in @code{struct stat} @tab Tipo file
-@item @code{"name"} @tab Il @value{FN} @tab Tutti
-@item @code{"dev"} @tab @code{st_dev} @tab Tutti
-@item @code{"ino"} @tab @code{st_ino} @tab Tutti
-@item @code{"mode"} @tab @code{st_mode} @tab Tutti
-@item @code{"nlink"} @tab @code{st_nlink} @tab Tutti
-@item @code{"uid"} @tab @code{st_uid} @tab Tutti
-@item @code{"gid"} @tab @code{st_gid} @tab Tutti
-@item @code{"size"} @tab @code{st_size} @tab Tutti
-@item @code{"atime"} @tab @code{st_atime} @tab Tutti
-@item @code{"mtime"} @tab @code{st_mtime} @tab Tutti
-@item @code{"ctime"} @tab @code{st_ctime} @tab Tutti
-@item @code{"rdev"} @tab @code{st_rdev} @tab Dispositivi
-@item @code{"major"} @tab @code{st_major} @tab Dispositivi
-@item @code{"minor"} @tab @code{st_minor} @tab Dispositivi
-@item @code{"blksize"} @tab @code{st_blksize} @tab Tutti
-@item @code{"pmode"} @tab Una versione leggibile del valore dell'autorizzazione,
-come quello stampato dal comando
-@command{ls} (per esempio, @code{"-rwxr-xr-x"}) @tab Tutti
-@item @code{"linkval"} @tab Il valore del collegamento simbolico @tab
-Collegamenti simbolici
-@item @code{"type"} @tab Il tipo del file in formato stringa---pu@`o essere
-@code{"file"},
-@code{"blockdev"},
-@code{"chardev"},
-@code{"directory"},
-@code{"socket"},
-@code{"fifo"},
-@code{"symlink"},
-@code{"door"}
-o
-@code{"unknown"}
-(non tutti i sistemi supportano tutti i tipi file) @tab Tutti
-@end multitable
-
-@cindex @code{fts()}, estensione
-@cindex estensione @code{fts()}
-@item @code{flags = or(FTS_PHYSICAL, ...)}
-@itemx @code{risultato = fts(pathlist, flags, filedata)}
-Percorre gli alberi di file elencati in @code{pathlist} e riempie il vettore
-@code{filedata}, come descritto qui di seguito. @code{flags} @`e l'operazione
-@dfn{OR} @dfn{bit} a @dfn{bit} di parecchi valori predefiniti, pure descritti
-pi@`u sotto.
-Restituisce zero in assenza di errori, in caso contrario restituisce @minus{}1.
-@end table
-
-La funzione @code{fts()} invoca a sua volta la routine di libreria C
-@code{fts()} per percorrere gerarchie di file. Invece di restituire i dati
-relativi ai file uno per volta in sequenza,
-riempie un vettore multidimensionale con i dati di ogni file e directory
-che risiedono nelle gerarchie richieste.
-
-Gli argomenti sono i seguenti:
-
-@table @code
-@item pathlist
-Un vettore di @value{FNS}. Sono usati i valori dei singoli elementi;
-gli indici che puntano a tali valori vengono ignorati.
-
-@item flags
-Questo dovrebbe essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u dei
-seguenti valori dei flag costanti predefiniti.
-Almeno uno dei due flag @code{FTS_LOGICAL}
-o @code{FTS_PHYSICAL} dev'essere impostato; in caso contrario
-@code{fts()} restituisce una segnalazione di errore e imposta @code{ERRNO}.
-I flag sono:
-
-@c nested table
-@table @code
-@item FTS_LOGICAL
-Passa in rassegna i file in modo ``logico'', e quindi l'informazione restituita
-per un collegamento simbolico @`e quella relativa al file puntato, e non al
-collegamento simbolico stesso. Questo flag @`e mutuamente esclusivo con
-@code{FTS_PHYSICAL}.
-
-@item FTS_PHYSICAL
-Passa in rassegna i file in modo ``fisico'', e quindi l'informazione restituita
-per un collegamento simbolico @`e quella relativa al collegamento simbolico
-stesso. Questo flag @`e mutuamente esclusivo con @code{FTS_LOGICAL}.
-
-@item FTS_NOCHDIR
-Per migliorare le prestazioni, la routine di libreria C @code{fts()}
-cambia directory mentre percorre una gerarchia di file. Questo flag
-disabilita quell'ottimizzazione.
-
-@item FTS_COMFOLLOW
-Si accede al file puntato da un collegamento simbolico esistente in @code{pathlist},
-anche se @code{FTS_LOGICAL} non @`e stato impostato.
-
-@item FTS_SEEDOT
-Per default, la routine di libreria C @code{fts()} non restituisce
-informazioni per i file
-@file{"."} (punto) e @file{".."} (punto-punto). Quest'opzione richiede
-l'informazione anche per @file{".."}. (L'estensione ritorna sempre
-l'informazione per @file{"."}; maggiori dettagli pi@`u sotto.)
-
-@item FTS_XDEV
-Mentre si percorre un filesystem, non passare mai a un filesystem montato
-diverso da quello in cui si opera.
-@c Pu@`o succedere nel caso di collegamenti simbolici, che contengono un nome di file
-@c che si trova da tutt'altra parte
-@c lrwxrwxrwx 1 root root 6 ago 6 2015 /aca -> /d/aca
-@c /d/aca:
-@c /dev/sda6 115234344 15648380 93709280 15% /d
-@c / (e il collegamento simbolico /aca)
-@c /dev/sda1 37308224 13573368 21816644 39% /
-@end table
-
-@item filedata
-Il vettore @code{filedata} contiene i risultati.
-La funzione @code{fts()} lo svuota all'inizio. In seguito viene creato
-un elemento in @code{filedata} per ogni elemento in @code{pathlist}.
-L'indice @`e il nome della directory o del file specificato in @code{pathlist}.
-L'elemento puntato da questo indice @`e a sua volta un vettore. Ci sono due
-casi:
-
-@c nested table
-@table @emph
-@item Il percorso @`e un file
-In questo caso, il vettore contiene due o tre elementi:
-
-@c doubly nested table
-@table @code
-@item "path"
-Il percorso completo di questo file, a partire dalla directory radice (``root'')
-indicata nel vettore @code{pathlist}.
-
-@item "stat"
-Questo elemento @`e esso stesso un vettore, contenente le stesse informazioni
-fornite dalla funzione @code{stat()} vista in precedenza a proposito del suo
-argomento
-@code{statdata}. L'elemento pu@`o non essere presente se la chiamata
-di sistema @code{stat()} per il file non @`e riuscita.
-
-@item "error"
-Se qualche tipo di errore si verifica durante l'elaborazione, il vettore
-conterr@`a anche un elemento con chiave @code{"error"}, che @`e una stringa
-che descrive l'errore.
-@end table
-
-@item Il percorso @`e una directory
-In questo caso, nel vettore viene creato un elemento per ogni elemento
-contenuto nella directory. Se un elemento della directory @`e un
-file, l'azione del programma @`e la stessa descritta sopra per un file.
-Se invece la directory contiene delle sottodirectory, l'elemento creato
-nel vettore @`e (ricorsivamente) a sua volta un vettore che descrive la
-sottodirectory. Se fra i flag @`e stato
-specificato il flag @code{FTS_SEEDOT},
-ci sar@`a anche un elemento di nome
-@code{".."}. Questo elemento sar@`a un vettore contenente i dati restituiti
-da un'invocazione di @code{stat()}.
-
-Inoltre, ci sar@`a un elemento il cui indice @`e @code{"."}.
-Questo elemento @`e un vettore contenente gli stessi due o tre elementi che
-sono messi a disposizione per un file: @code{"path"}, @code{"stat"},
-ed @code{"error"}.
-@end table
-@end table
-
-La funzione @code{fts()} restituisce zero in assenza di errori.
-in caso contrario, restituisce @minus{}1.
-
-@quotation NOTA
-L'estensione @code{fts()} non imita esattamente l'interfaccia fornita dalla
-routine di libreria C @code{fts()}, ma sceglie di fornire un'interfaccia
-basata sui vettori associativi, che @`e pi@`u adeguata per l'uso da parte di un
-programma @command{awk}. Questo
-implica la mancanza di una funzione di
-confronto, poich@'e @command{gawk} gi@`a
-prevede la possibilit@`a di mettere facilmente nell'ordine desiderato gli
-elementi di un vettore.
-Anche se un'interfaccia modellata su @code{fts_read()} avrebbe potuto essere
-fornita, @`e sembrato pi@`u naturale mettere a disposizione un vettore
-multidimensionale, che rappresenta la gerarchia dei file e le informazioni
-relative a ognuno di essi.
-@end quotation
-
-Si veda il file @file{test/fts.awk} nella distribuzione di @command{gawk}
-per un esempio di uso dell'estensione @code{fts()}.
-
-@node Esempio di estensione Fnmatch
-@subsection Un'interfaccia a @code{fnmatch()}
-
-Quest'estensione fornisce un'interfaccia per utilizzare la funzione di
-libreria C @code{fnmatch()}. Si usa cos@`{@dotless{i}}:
-
-@table @code
-@item @@load "fnmatch"
-@`E questo il modo per caricare l'estensione.
-
-@cindex @code{fnmatch()}, estensione
-@cindex estensione @code{fnmatch()}
-@item risultato = fnmatch(pattern, stringa, flags)
-Il valore restituito @`e zero se tutto va bene, oppure @code{FNM_NOMATCH}
-se la funzione non ha trovato alcuna corrispondenza, o
-un valore differente, diverso da zero, se si @`e verificato un errore.
-@end table
-
-Oltre a rendere disponibile la funzione @code{fnmatch()}, l'estensione
-di @code{fnmatch} definisce una costante (@code{FNM_NOMATCH}), e un vettore
-con dei valori di flag, di nome @code{FNM}.
-
-Gli argomenti per @code{fnmatch()} sono:
-
-@table @code
-@item pattern
-L'espressione regolare con cui confrontare @value{FN}
-
-@item stringa
-La stringa @value{FN}
-
-@item flags
-Pu@`o valere zero o essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u flag
-nel vettore @code{FNM}
-@end table
-
-I flag sono i seguenti:
-
-@multitable @columnfractions .40 .60
-@headitem Elemento del vettore @tab Flag corrispondente definito da @code{fnmatch()}
-@item @code{FNM["CASEFOLD"]} @tab @code{FNM_CASEFOLD}
-@item @code{FNM["FILE_NAME"]} @tab @code{FNM_FILE_NAME}
-@item @code{FNM["LEADING_DIR"]} @tab @code{FNM_LEADING_DIR}
-@item @code{FNM["NOESCAPE"]} @tab @code{FNM_NOESCAPE}
-@item @code{FNM["PATHNAME"]} @tab @code{FNM_PATHNAME}
-@item @code{FNM["PERIOD"]} @tab @code{FNM_PERIOD}
-@end multitable
-
-Ecco un esempio:
-
-@example
-@@load "fnmatch"
-@dots{}
-flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
-if (fnmatch("*.a", "pippo.c", flags) == FNM_NOMATCH)
- print "nessuna corrispondenza"
-@end example
-
-@node Esempio di estensione Fork
-@subsection Un'interfaccia a @code{fork()}, @code{wait()}, e @code{waitpid()}
-
-L'estensione @code{fork} mette a disposizione tre funzioni, come segue:
-
-@table @code
-@item @@load "fork"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{fork()}, estensione
-@cindex estensione @code{fork()}
-@item pid = fork()
-Questa funzione crea un nuovo processo. Il valore restituito @`e zero nel
-processo ``figlio'' e il numero che identifica il nuovo processo
-(@dfn{pid}) nel processo ``padre'', o @minus{}1
-in caso di errore. In quest'ultimo caso, @code{ERRNO} indica il problema.
-Nel processo figlio, gli elementi @code{PROCINFO["pid"]} e
-@code{PROCINFO["ppid"]} vengono aggiornati per riflettere i valori corretti.
-
-@cindex @code{waitpid()}, estensione
-@cindex estensione @code{waitpid()}
-@item ret = waitpid(pid)
-Questa funzione ha un unico argomento numerico, l'identificativo del processo
-di cui aspettare l'esito. Il valore di ritorno @`e quello restituito dalla
-chiamata di sistema @code{waitpid()}.
-
-@cindex @code{wait()}, estensione
-@cindex estensione @code{wait()}
-@item ret = wait()
-Questa funzione attende che il primo processo ``figlio'' termini.
-Il valore restituito @`e quello della chiamata di sistema @code{wait()}.
-@end table
-
-Non c'@`e una funzione corrispondente alla chiamata di sistema @code{exec()}.
-
-Ecco un esempio:
-
-@example
-@@load "fork"
-@dots{}
-if ((pid = fork()) == 0)
- print "salve dal processo figlio"
-else
- print "salve dal processo padre"
-@end example
-
-@node Esempio di estensione Inplace
-@subsection Consentire la modifica in loco dei file
-
-@cindex @code{inplace}, estensione
-@cindex estensione @code{inplace}
-L'estensione @code{inplace} svolge un lavoro simile a quello
-dell'opzione @option{-i} nel programma di utilit@`a GNU @command{sed},
-che svolge delle funzioni di modifica ``al volo'' su ogni file in input.
-Viene usato il file @file{inplace.awk}, caricato dinamicamente, per richiamare
-l'estensione in maniera corretta:
-
-@example
-@c file eg/lib/inplace.awk
-@group
-# inplace --- carica e richiama l'estensione inplace.
-
-@@load "inplace"
-
-# @`E buona cosa impostare INPLACE_SUFFIX in modo da fare
-# una copia di backup.
-# Per esempio, si potrebbe impostare INPLACE_SUFFIX a .bak
-# sulla riga di comando, o in una regola BEGIN.
-
-# Per default, ogni file specificato sulla riga di comando
-# verr@`a modificato sovrascrivendo il file originale.
-# Ma @`e possibile evitarlo specificando l'argomento inplace=0
-# davanti al nome del file che non si desidera elaborare in questo modo.
-# Si pu@`o poi abilitare di nuovo l'aggiornamento diretto del file
-# sulla riga di comando, specificando inplace=1 prima del file
-# che si vuole modificare direttamente.
-
-# N.B. La funzione inplace_end() @`e invocata nelle regole
-# BEGINFILE ed END, in modo che ogni eventuale azione
-# in una regola ENDFILE sar@`a ridiretta come previsto.
-
-BEGIN @{
- inplace = 1 # abilitato per default
-@}
-
-BEGINFILE @{
- if (_inplace_filename != "")
- inplace_end(_inplace_filename, INPLACE_SUFFIX)
- if (inplace)
- inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
- else
- _inplace_filename = ""
-@}
-
-END @{
- if (_inplace_filename != "")
- inplace_end(_inplace_filename, INPLACE_SUFFIX)
-@}
-@end group
-@c endfile
-@end example
-
-Per ogni file elaborato, l'estensione ridirige lo
-standard output verso un file temporaneo definito in modo da avere lo stesso
-proprietario e le stesse autorizzazioni del file originale. Dopo che il file
-@`e stato elaborato, l'estensione riporta lo standard output alla sua
-destinazione originale.
-Se @code{INPLACE_SUFFIX} non @`e una stringa vuota, il file originale @`e
-collegato a un @value{FN} di backup, creato aggiungendo il
-suffisso al nome originale.
-Infine, il file temporaneo @`e rinominato in modo da essere lo stesso del
-@value{FN} originario.
-
-Si noti che l'uso di questa funzionalit@`a pu@`o essere controllato
-specificando @samp{inplace=0} sulla riga di comando, prima del nome del file
-che non dovrebbe essere elaborato come appena descritto. Si pu@`o richiedere
-ancora l'aggiornamento diretto di un file, specificando l'argomento
-@samp{inplace=1} davanti al nome del file da elaborare in maniera diretta.
-
-La variabile @code{_inplace_filename} serve per tener traccia del nome del
-file corrente, in modo da non eseguire la funzione @code{inplace_end()} prima
-di aver elaborato il primo file.
-
-Se si verifica un errore, l'estensione emette un messaggio di errore fatale
-per terminare l'elaborazione immediatamente, senza danneggiare il
-file originale.
-
-Ecco alcuni semplici esempi:
-
-@example
-$ @kbd{gawk -i inplace '@{ gsub(/pippo/, "pluto") @}; @{ print @}' file1 file2 file3}
-@end example
-
-Per mantenere una copia di backup del file originale, si provi a fare cos@`{@dotless{i}}:
-
-@example
-$ @kbd{gawk -i inplace -v INPLACE_SUFFIX=.bak '@{ gsub(/pippo/, "pluto") @}}
-> @kbd{@{ print @}' file1 file2 file3}
-@end example
-
-Si noti che, anche se l'estensione tenta di mantenere il proprietario e i
-permessi di accesso del file originario, non viene tentata la copia degli
-ulteriori permessi di accesso
-(@dfn{ACL - Access Control Lists}) del file originale.
-
-Se il programma termina prima del previsto, come potrebbe succedere se riceve
-dal sistema un segnale non gestito, pu@`o lasciare come residuo un file
-temporaneo.
-
-@node Esempio di estensione Ord
-@subsection Caratteri e valori numerici: @code{ord()} e @code{chr()}
-
-L'estensione @code{ordchr} aggiunge due funzioni, di nome
-@code{ord()} e @code{chr()}, come segue:
-
-@table @code
-@item @@load "ordchr"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{ord()}, estensione
-@cindex estensione @code{Ord}
-@item numero = ord(stringa)
-Restituisce il valore numerico del primo carattere in @code{stringa}.
-
-@cindex @code{Chr}, estensione
-@cindex estensione @code{Chr}
-@item char = chr(number)
-Restituisce una stringa il cui primo carattere @`e quello rappresentato
-da @code{number}.
-@end table
-
-Queste funzioni sono ispirate alle funzioni del linguaggio Pascal
-dallo stesso nome. Ecco un esempio:
-
-@example
-@@load "ordchr"
-@dots{}
-printf("Il valore numerico di 'A' @`e %d\n", ord("A"))
-printf("Il valore come stringa di 65 @`e %s\n", chr(65))
-@end example
-
-@node Esempio di estensione Readdir
-@subsection Leggere directory
-
-L'estensione @code{readdir} aggiunge un analizzatore di input
-per esaminare directory.
-L'uso @`e il seguente:
-
-@cindex @code{readdir}, estensione
-@cindex estensione @code{readdir}
-@example
-@@load "readdir"
-@end example
-
-Quando quest'estensione @`e in uso, invece che saltare le
-directory presenti sulla riga di comando, (o accedute tramite @code{getline}),
-queste sono lette, e ogni elemento della directory @`e restituito come
-un record.
-
-Il record consiste di tre campi. I primi due sono il numero di @dfn{inode} e
-il @value{FN}, separati fra loro da una barra.
-Nei sistemi in cui l'elemento di directory contiene il tipo del file,
-il record ha un terzo campo (pure separato da una barra), composto da una
-sola lettera, che indica il tipo del file. Le lettere e i tipi di file a cui
-corrispondono sono mostrate in @ref{table-readdir-file-types}.
-
-@float Tabella,table-readdir-file-types
-@caption{Tipi file restituiti dall'estensione @code{readdir}}
-@multitable @columnfractions .1 .9
-@headitem Lettera @tab Tipo di file
-@item @code{b} @tab Dispositivo a blocchi
-@item @code{c} @tab Dispositivo a caratteri
-@item @code{d} @tab Directory
-@item @code{f} @tab File normale
-@item @code{l} @tab Collegamento simbolico
-@item @code{p} @tab @dfn{pipe} con nome (FIFO)
-@item @code{s} @tab @dfn{socket}
-@item @code{u} @tab Tutto il resto (sconosciuto)
-@end multitable
-@end float
-
-Nei sistemi che non contengono l'informazione sul tipo del file, il terzo
-campo @`e sempre @samp{u}.
-
-@quotation NOTA
-Nei sistemi GNU/Linux, ci sono fileystem che non supportano il campo
-@code{d_type} (si veda la pagina di manuale @i{readdir}(3)), e in questo caso
-il tipo di file @`e sempre @samp{u}. Si pu@`o usare l'estensione
-@code{filefuncs} per chiamare @code{stat()} e ottenere l'informazione
-corretta sul tipo di file.
-@end quotation
-
-Ecco un esempio:
-
-@example
-@@load "readdir"
-@dots{}
-BEGIN @{ FS = "/" @}
-@{ print "@value{FN} @`e", $2 @}
-@end example
-
-@node Esempio di estensione Revout
-@subsection Invertire la stringa in output
-
-L'estensione @code{revoutput} aggiunge un semplice processore
-di output che inverte i caratteri di ogni riga in output. Serve a dimostrare
-come @`e possibile scrivere un processore di output, anche se pu@`o essere
-a prima vista vagamente divertente.
-Ecco un esempio:
-
-@cindex @code{revoutput}, estensione
-@cindex estensione @code{revoutput}
-@example
-@@load "revoutput"
-
-BEGIN @{
- REVOUT = 1
- print "non v'allarmate" > "/dev/stdout"
-@}
-@end example
-
-L'output di questo programma @`e @samp{etamralla'v non}.
-
-@node Esempio di estensione Rev2way
-@subsection Esempio di I/O bidirezionale
-
-L'estensione @code{revtwoway} aggiunge un semplice processore
-bidirezionale che inverte i caratteri di ogni riga che riceve, per farla
-poi rileggere dal programma @command{awk}. Il motivo per cui @`e stata scritta
-@`e quello di mostrare come si scrive un processore bidirezionale, anche se pu@`o
-sembrare un programma vagamente divertente.
-Il seguente esempio mostra come usarlo:
-
-@cindex @code{revtwoway}, estensione
-@cindex estensione @code{revtwoway}
-@example
-@@load "revtwoway"
-
-BEGIN @{
- cmd = "/specchio/magico"
- print "non v'allarmate" |& cmd
- cmd |& getline risultato
- print risultato
- close(cmd)
-@}
-@end example
-
-L'output di questo programma
-@ifnotinfo
-anche in questo caso @`e:
-@end ifnotinfo
-@ifinfo
-@`e:
-@end ifinfo
-@samp{etamralla'v non}.
-
-@node Esempio di estensione Rwarray
-@subsection Scaricare e ricaricare un vettore
-
-L'estensione @code{rwarray} aggiunge due funzioni,
-di nome @code{writea()} e @code{reada()}, come segue:
-
-@table @code
-@item @@load "rwarray"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{writea()}, estensione
-@cindex estensione @code{writea()}
-@item ret = writea(file, vettore)
-Questa funzione ha come argomento una stringa, che @`e il nome del file
-sul quale scaricare il vettore, e il vettore stesso @`e il secondo argomento.
-@code{writea()} @`e in grado di gestire vettori di vettori. Restituisce il
-valore uno se completa il lavoro o zero se non va a buon fine.
-
-@cindex @code{reada()}, estensione
-@cindex estensione @code{reada()}
-@item ret = reada(file, vettore)
-@code{reada()} @`e la funzione inversa di @code{writea()};
-legge il file il cui nome @`e fornito come primo argomento, riempiendo il
-vettore il cui nome @`e il secondo argomento. Il vettore viene preventivamente
-svuotato.
-Anche in questo caso, il valore restituito @`e uno se tutto va bene o zero se
-la funzione non va a buon fine.
-@end table
-
-Il vettore creato da @code{reada()} @`e identico a quello scritto da
-@code{writea()} nel senso che i contenuti sono gli stessi. Tuttavia,
-per come @`e strutturata la funzione, l'ordine di attraversamento del vettore
-ricreato @`e quasi certamente differente da quello del vettore originale.
-Poich@'e l'ordine di attraversamento di un vettore @`e, per default, indefinito
-in @command{awk}, questo non @`e (tecnicamente) un problema. Se serve che
-l'attraversamento del vettore avvenga in un ordine preciso, si possono usare
-le funzionalit@`a di ordinamento di un vettore disponibili in @command{gawk}
-(@pxref{Ordinamento di vettori}).
-
-Il file contiene dati in formato binario. Tutti i valori interi sono scritti
-in @dfn{network byte order}@footnote{Cio@`e, nella maniera con cui sarebbero
-normalmente scritti in un testo, con le cifre pi@`u significative del
-numero contenute nella parte sinistra, e quelle meno significative
-nella parte destra della rappresentazione binaria del numero.}.
-Tuttavia, i valori in virgola mobile a doppia precisione sono scritti come
-dati binari nativi. Quindi, vettori che contengono solo dati in formato
-stringa possono essere scaricati da un sistema con un certo ordine di byte
-e ripristinati su un sistema con un ordine di byte differente, anche se
-un test al riguardo non @`e mai stato fatto.
-
-Ecco un esempio:
-
-@example
-@@load "rwarray"
-@dots{}
-ret = writea("scaricato.bin", vettore)
-@dots{}
-ret = reada("scaricato.bin", vettore)
-@end example
-
-@node Esempio di estensione Readfile
-@subsection Leggere un intero file in una stringa
-
-L'estensione @code{readfile} aggiunge una sola funzione
-di nome @code{readfile()}, e un analizzatore di input:
-
-@table @code
-@item @@load "readfile"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{readfile()}, estensione
-@cindex estensione @code{readfile()}
-@item risultato = readfile("/qualche/persorso")
-L'argomento @`e il nome del file da leggere. Il valore restituito @`e una
-stringa contenente l'intero contenuto del file richiesto. In caso di errore,
-la funzione restituisce la stringa vuota e imposta @code{ERRNO}.
-
-@item BEGIN @{ PROCINFO["readfile"] = 1 @}
-Inoltre, l'estensione aggiunge un analizzatore di input che @`e attivato se
-l'elemento @code{PROCINFO["readfile"]} esiste.
-Quando l'analizzatore @`e attivato, ogni file in input @`e restituito interamente
-come @code{$0}.
-La variabile @code{RT} @`e impostata alla stringa nulla.
-@end table
-
-Ecco un esempio:
-
-@example
-@@load "readfile"
-@dots{}
-contents = readfile("/percorso/del/file");
-if (contents == "" && ERRNO != "") @{
- print("problema in lettura file", ERRNO) > "/dev/stderr"
- ...
-@}
-@end example
-
-@node Esempio di estensione Time
-@subsection Funzioni dell'estensione time
-
-L'estensione @code{time} aggiunge due funzioni, di nome
-@code{gettimeofday()} e @code{sleep()}, come segue:
-
-@table @code
-@item @@load "time"
-Questo @`e il modo per caricare l'estensione.
-
-@cindex @code{gettimeofday()}, estensione
-@cindex estensione @code{gettimeofday()}
-@item ora_corrente = gettimeofday()
-Restituisce il numero di secondi trascorsi dalle ore 00:00 del giorno
-01/01/1970 UTC come valore a virgola mobile.
-Se questa informazione non @`e disponibile nella piattaforma in uso,
-restituisce @minus{}1 e imposta @code{ERRNO}. Il valore fornito dovrebbe
-avere la precisione di una frazione di
-secondo, ma la precisione effettiva pu@`o variare a seconda della
-piattaforma.
-Se la chiamata di sistema standard C @code{gettimeofday()} @`e disponibile
-nella piattaforma in uso, questo @`e il valore restituito. In caso contrario,
-se si sta lavorando con MS-Windows, la chiamata di sistema @`e fatta a
-@code{GetSystemTimeAsFileTime()}.
-
-@cindex @code{sleep()}, estensione
-@cindex estensione @code{sleep()}
-@item risultato = sleep(@var{secondi})
-Il programma @command{gawk} resta inattivo (dorme) per i @var{secondi}
-specificati. Se @var{secondi} ha un valore negativo,
-o la chiamata di sistema non riesce, restituisce @minus{}1 e imposta @code{ERRNO}.
-In caso contrario, restituisce zero dopo aver lasciato trascorrere
-la quantit@`a di tempo indicata.
-Si noti che @var{secondi} pu@`o essere un numero a virgola mobile (non solo un
-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.
-@end table
-
-@node Esempio di estensione API Test
-@subsection Test per la API
-@cindex @code{testext}, estensione
-@cindex estensione @code{testext}
-
-L'estensione @code{testext} controlla la funzionalit@`a di
-parti dell'API delle estensioni che non sono utilizzate negli altri esempi.
-Il file @file{extension/testext.c}
-contiene sia il codice C per l'estensione che il codice @command{awk}
-(tra i commenti del codice C) per eseguire i test. L'ambiente di test
-estrae il codice sorgente @command{awk} ed esegue i test. Si veda il file
-sorgente per maggiori informazioni.
-
-@node gawkextlib
-@section Il progetto @code{gawkextlib}
-@cindex @code{gawkextlib}, estensioni
-@cindex estensioni, @code{gawkextlib}
-@cindex estensioni, dove trovarle
-
-@cindex @code{gawkextlib}, progetto
-@cindex progetto @code{gawkextlib}
-Il progetto @uref{http://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}}
-fornisce varie estensioni per @command{gawk}, compresa una per
-l'elaborazione dei file XML. Questa @`e un'evoluzione del progetto noto come
-@command{xgawk} (XML @command{gawk}).
-
-Al momento della stesura di questo testo, ci sono otto estensioni:
-
-@itemize @value{BULLET}
-@item
-Estensione @code{errno}
-
-@item
-Estensione GD graphics library
-
-@item
-Estensione libreria MPFR
-(fornisce l'accesso a varie funzioni MPFR non previste dal supporto nativo
-di MPFR disponibile in @command{gawk})
-
-@item
-Estensione PDF
-
-@item
-Estensione PostgreSQL
-
-@item
-Estensione Redis
-
-@item
-Estensione Select
-
-@item
-Estensione analizzatore XML, usando la libreria di analisi XML
-@uref{http://expat.sourceforge.net, Expat}
-@end itemize
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-Si pu@`o scaricare il codice del progetto @code{gawkextlib}
-usando il codice sorgente mantenuto tramite
-@uref{http://git-scm.com, Git}.
-Il comando per farlo @`e il seguente:
-
-@example
-git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
-@end example
-
-@cindex Expat, libreria per analizzare XML
-@cindex XML, Expat, libreria per analizzare
-Per poter compilare e usare l'estensione XML, @`e necessario installare
-la libreria di analisi XML @uref{http://expat.sourceforge.net, Expat}.
-
-Inoltre, @`e necessario installare gli strumenti GNU Autotools
-(@uref{http://www.gnu.org/software/autoconf, Autoconf},
-@uref{http://www.gnu.org/software/automake, Automake},
-@uref{http://www.gnu.org/software/libtool, Libtool}
-e
-@uref{http://www.gnu.org/software/gettext, GNU @command{gettext}}).
-
-La semplice procedura per compilare e testare @code{gawkextlib} @`e la seguente.
-Dapprima, occorre compilare e installare @command{gawk}:
-
-@example
-cd .../percorso/del/sorgente/gawk
-./configure --prefix=/tmp/newgawk @ii{Installa in /tmp/newgawk per ora}
-make && make check @ii{Compila e controlla che tutto sia a posto}
-make install @ii{Installa gawk}
-@end example
-
-Poi, dal sito @url{http://sourceforge.net/projects/gawkextlib/files} si deve
-scaricare @code{gawkextlib} e le estensioni che si vogliono installare.
-Il file @file{README} del sito spiega come compilare il codice. Se si @`e
-installato @command{gawk} in una posizione non-standard, occorre
-specificare @code{./configure --with-gawk=@var{/percorso/del/programma/gawk}}
-per far s@`{@dotless{i}} che venga trovato.
-Pu@`o essere necessario usare il programma di utilit@`a @command{sudo}
-per installare sia @command{gawk} che @code{gawkextlib}, a seconda di come
-funziona il sistema su cui si lavora.
-
-Chi scrive un'estensione e desidera condividerla con altri utenti
-@command{gawk}, pu@`o prendere in considerazione l'idea di farlo attraverso
-il progetto @code{gawkextlib}.
-Si veda il sito web del progetto per maggiori informazioni.
-
-@node Sommario delle estensioni
-@section Sommario
-
-@itemize @value{BULLET}
-@item
-Si possono scrivere estensioni (dette anche @dfn{plug-in})
-per @command{gawk}
-nel linguaggio C o C++ usando l'interfaccia di programmazione applicativa
-(API) definita dagli sviluppatori di
-@command{gawk}.
-
-@item
-Le estensioni devono avere una licenza compatibile con la
-GNU General Public License (GPL), e devono dichiararlo definendo un'apposita
-variabile di nome
-@code{plugin_is_GPL_compatibile}.
-
-@item
-La comunicazione tra @command{gawk} e un'estensione @`e bidirezionale.
-@command{gawk} passa all'estensione una struttura (@code{struct}) che contiene
-vari campi di dati e puntatori a funzione. L'estensione pu@`o poi chiamare
-funzioni all'interno di @command{gawk} tramite dei puntatori a funzioni
-per svolgere alcuni compiti.
-
-@item
-Uno di questi compiti @`e di ``registrare'' il nome e l'implementazione di
-nuove funzioni a livello di @command{awk} con @command{gawk}.
-L'implementazione ha la forma di un puntatore del linguaggio C,
-cui @`e associato un dato livello di versione.
-Per convenzione, le funzioni di implementazione hanno nome
-@code{do_@var{XXXX}()} per una funzione a livello di @command{awk} di nome
-@code{@var{XXXX}()}.
-
-@item
-L'API @`e definita in un file di intestazione di nome @file{gawkapi.h}.
-Occorre includere alcuni file di intestazione standard @emph{prima} di
-includere tale intestazione nel codice sorgente.
-
-@item
-Vengono forniti dei puntatori a funzioni dell'API per i seguenti tipi di
-operazioni:
-
-@itemize @value{BULLET}
-@item
-Allocare, riallocare, e liberare memoria
-
-@item
-Registrare funzioni (si possono registrare
-funzioni di estensione,
-funzioni ausiliarie di pulizia (@dfn{callbacks}),
-una stringa di versione,
-degli analizzatori di input,
-dei processori di output,
-e dei processori bidirezionali)
-
-@item
-Stampare messaggi fatali, non fatali, di avvertimento, e avvertimenti ``lint''
-
-@item
-Aggiornare @code{ERRNO} o annullarlo
-
-@item
-Accedere a parametri, come pure convertire un parametro di tipo non definito
-in un vettore
-
-@item
-Accedere alla tabella dei simboli (ricuperare il valore di una
-variabile globale, crearne una nuova o modificarne una esistente)
-
-@item
-Creare e rilasciare valori nascosti; questo consente di usare in modo
-efficiente lo stesso valore per pi@`u variabili e pu@`o migliorare di molto le
-prestazioni del programma
-
-@item
-Manipolare vettori
-(ricuperare, aggiungere, cancellare e modificare elementi;
-ottenere il numero di elementi in un vettore;
-creare un nuovo vettore;
-svuotare un vettore;
-e
-appiattire un vettore per poterlo percorrere facilmente con un ciclo in
-stile C, visitando tutti i suoi indici ed elementi)
-@end itemize
-
-@item
-L'API definisce diversi tipi di dati standard per rappresentare
-valori di variabili, elementi di vettore e vettori presenti in @command{awk}.
-
-@item
-L'API fornisce funzioni di servizio per definire dei valori.
-Sono anche disponibili funzioni di gestione della memoria, per assicurare
-la compatibilit@`a fra memoria allocata da @command{gawk} e memoria allocata da
-un'estensione.
-
-@item
-@emph{Tutta} la memoria passata da @command{gawk} a un'estensione dev'essere
-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
-dall'API. @command{gawk} @`e responsabile per la gestione di quella memoria e
-la libera quando @`e il momento per farlo.
-
-@item
-L'API fornisce informazioni sulla versione di @command{gawk} in
-esecuzione, in modo che un'estensione possa verificare la propria compatibilit@`a
-con la versione di @command{gawk} da cui @`e stata caricata.
-
-@item
-@`E pi@`u facile iniziare a programmare una nuova estensione usando il
-codice predefinito descritto in questo @value{CHAPTER}. Alcune macro nel
-file di intestazione @file{gawkapi.h} rendono la cosa pi@`u agevole.
-
-@item
-La distribuzione di @command{gawk} comprende un numero di piccoli ma utili
-esempi di estensione. Il progetto @code{gawkextlib} include diverse altre
-estensioni, di maggiori dimensioni.
-Per chi desideri scrivere un'estensione e metterla a disposizione della
-comunit@`a degli utenti di @command{gawk}, il progetto @code{gawkextlib}
-@`e il posto adatto per farlo.
-
-@end itemize
-
-@c EXCLUDE START
-@node Esercizi sulle estensioni
-@section Esercizi
-
-@enumerate
-@item
-Aggiungere funzioni per rendere disponibili chiamate di sistema come
-@code{chown()}, @code{chmod()} e @code{umask()} nelle estensioni che
-operano con i file viste
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Operazioni interne file}.
-
-@c Idea from comp.lang.awk, February 2015
-@item
-Scrivere un analizzatore di input che stampi un prompt se l'input proviene
-da un dispositivo che sia un ``terminale''. Si pu@`o usare la funzione
-@code{isatty()} per sapere se il file in input @`e un terminale.
-(Suggerimento: questa funzione
-normalmente usa parecchie risorse quando @`e richiamata; si tenti di chiamarla
-una volta sola.)
-Il contenuto del prompt dovrebbe provenire da una variabile che sia possibile
-impostare a livello di codice @command{awk}.
-Si pu@`o inviare il prompt allo standard error. Tuttavia,
-per ottenere risultati migliori, @`e meglio aprire un nuovo descrittore di file
-(o puntatore a un file)
-sul file @file{/dev/tty} e stampare il prompt su quel file, nel caso
-in cui lo standard error sia stato ridiretto.
-
-Perch@'e lo standard error @`e una scelta migliore dello
-standard output per scrivere il prompt?
-Quale meccanismo di lettura andrebbe sostituito, quello che legge un record
-o quello che legge dei semplici byte?
-
-@item
-(Difficile.)
-Come si potrebbero gestire degli insiemi di nomi (@dfn{namespaces})
-in @command{gawk}, in modo
-che i nomi di funzione presenti in estensioni differenti non siano in conflitto
-tra loro?
-Chi riesce a trovare uno schema di buona qualit@`a @`e pregato di contattare il
-manutentore di @command{gawk}, per metterlo al corrente.
-
-@item
-Si scriva uno script di shell che funga da interfaccia per
-l'estensione ``inplace'', vista
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Esempio di estensione Inplace},
-in modo che il comportamento sia simile a quello del comando @samp{sed -i}.
-
-@end enumerate
-@c EXCLUDE END
-
-@ifnotinfo
-@part @value{PART4}Appendici
-@end ifnotinfo
-
-@ifdocbook
-
-@ifclear FOR_PRINT
-La Parte IV contiene le appendici (come pure le due licenze che proteggono
-il codice sorgente di @command{gawk} e questo @value{DOCUMENT},
-rispettivamente) e inoltre il Glossario:
-@end ifclear
-
-@ifset FOR_PRINT
-La Parte IV contiene tre appendici, l'ultima delle quali @`e la licenza
-che protegge il codice sorgente di @command{gawk}:
-@end ifset
-
-@itemize @value{BULLET}
-@item
-@ref{Storia del linguaggio}
-
-@item
-@ref{Installazione}
-
-@ifclear FOR_PRINT
-@item
-@ref{Note}
-
-@item
-@ref{Concetti fondamentali}
-
-@item
-@ref{Glossario}
-@end ifclear
-
-@item
-@ref{Copia}
-
-@ifclear FOR_PRINT
-@item
-@ref{Licenza per Documentazione Libera GNU (FDL)}
-@end ifclear
-@end itemize
-@end ifdocbook
-
-@node Storia del linguaggio
-@appendix L'evoluzione del linguaggio @command{awk}
-
-Questo @value{DOCUMENT} descrive l'implementazione GNU di @command{awk}
-conforme alle specifiche POSIX. Molti degli utenti di lunga data di
-@command{awk} hanno imparato a programmare in @command{awk} usando
-l'implementazione originale di @command{awk} presente nella versione 7 di
-Unix. (Questa versione @`e servita da base per la versione Berkeley Unix di
-@command{awk}, attraverso la versione 4.3BSD-Reno. Successive versioni di
-Berkeley Unix e, per un certo periodo, alcuni sistemi derivati da
-4.4BSD-Lite, hanno usato varie versioni di @command{gawk} come loro
-@command{awk}.) Questo @value{CHAPTER} descrive in breve l'evoluzione
-del linguaggio @command{awk}, facendo riferimento ad altre parti del
-@value{DOCUMENT} dove si possono trovare ulteriori informazioni.
-
-@ifset FOR_PRINT
-Per amor di brevit@`a, sono state omesse in questa edizione informazioni
-sulla storia delle funzionalit@`a di @command{gawk}. Si possono trovare nella
-@uref{http://www.gnu.org/software/gawk/manual/html_node/Feature-History.html,
-documentazione online}.
-@end ifset
-
-@menu
-* V7/SVR3.1:: Le principali differenze tra V7 e System V
- Release 3.1.
-* SVR4:: Differenze minori tra System V
- Release 3.1 e 4.
-* POSIX:: Nuove funzionalit@`a per lo standard POSIX.
-* BTL:: Nuove funzionalit@`a dalla versione
- di @command{awk} di Brian Kernighan.
-* POSIX/GNU:: Le estensioni in @command{gawk} non
- previste in @command{awk} POSIX.
-* Storia delle funzionalit@`a:: La storia delle funzionalit@`a di
- @command{gawk}.
-* Estensioni comuni:: Sommario Estensioni comuni.
-* Intervalli e localizzazione:: Come le localizzazioni influiscono sugli
- intervalli delle espressioni regolari.
-* Contributori:: I maggiori contributori a @command{gawk}.
-* Sommario della storia:: Sommario della storia.
-@end menu
-
-@node V7/SVR3.1
-@appendixsec Differenze importanti tra V7 e System V Release 3.1
-@cindex @command{awk}, versioni di
-@cindex @command{awk}, versioni di, differenze tra V7 e SVR3.1
-
-Il liguaggio @command{awk} si @`e evoluto considerevolmente tra Unix versione
-7 (1978) e la nuova implementazione disponibile a partire da Unix System V
-Release 3.1 (1987). Questa @value{SECTION} riassume le differenze e indica
-dove @`e possibile trovare ulteriori dettagli:
-
-@itemize @value{BULLET}
-@item
-La necessit@`a di inserire @samp{;} per separare pi@`u regole su una riga
-(@pxref{Istruzioni/Righe})
-
-@item
-Funzioni definite dall'utente e istruzione @code{return}
-(@pxref{Funzioni definite dall'utente})
-
-@item
-L'istruzione @code{delete} (@pxref{Cancellazione})
-
-@item
-L'istruzione @code{do}-@code{while}
-(@pxref{Istruzione do})
-
-@item
-Le funzioni predefinite @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()} e
-@code{srand()} (@pxref{Funzioni numeriche})
-
-@item
-Le funzioni predefinite @code{gsub()}, @code{sub()} e @code{match()}
-(@pxref{Funzioni per stringhe})
-
-@item
-Le funzioni predefinite @code{close()} e @code{system()}
-(@pxref{Funzioni di I/O})
-
-@item
-Le variabili predefinite @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH},
-@code{RSTART} e @code{SUBSEP} (@pxref{Variabili predefinite})
-
-@item
-Possibilit@`a di modificare @code{$0} (@pxref{Cambiare i campi})
-
-@item
-L'espressione condizionale che fa uso dell'operatore ternario @samp{?:}
-(@pxref{Espressioni condizionali})
-
-@item
-L'espressione @samp{@var{indice} in @var{vettore}} esterna alle istruzioni
-@code{for} (@pxref{Visitare elementi})
-
-@item
-L'operatore esponenziale @samp{^}
-(@pxref{Operatori aritmetici}) e il relativo operatore di assegnamento
-@samp{^=} (@pxref{Operatori di assegnamento})
-
-@item
-Precedenze tra operatori compatibili con quelle del linguaggio C, che
-rendono non funzionanti alcuni vecchi programmi @command{awk} (@pxref{Precedenza})
-
-@item
-La possibilit@`a di usare @dfn{regexp} come valori di @code{FS}
-(@pxref{Separatori di campo}) e come
-terzo argomento per la funzione @code{split()}
-(@pxref{Funzioni per stringhe}), invece di usare solo il primo carattere
-di @code{FS}
-
-@item
-@dfn{Regexp} dinamiche come operandi degli operatori @samp{~} e @samp{!~}
-(@pxref{Espressioni regolari calcolate})
-
-@item
-Le sequenze di protezione @samp{\b}, @samp{\f} e @samp{\r}
-(@pxref{Sequenze di protezione})
-
-@item
-La ridirezione dell'input per la funzione @code{getline}
-(@pxref{Getline})
-
-@item
-La possibilit@`a di avere pi@`u regole @code{BEGIN} ed @code{END}
-(@pxref{BEGIN/END})
-
-@item
-Vettori multidimensionali
-(@pxref{Vettori multidimensionali})
-@end itemize
-
-@node SVR4
-@appendixsec Differenze tra le versioni System V Release 3.1 e SVR4
-
-@cindex @command{awk}, versioni di, differenze tra SVR3.1 e SVR4
-La versione per Unix System V Release 4 (1989) di @command{awk} ha aggiunto
-queste funzionalit@`a (alcune delle quali introdotte da @command{gawk}):
-
-@itemize @value{BULLET}
-@item
-Il vettore @code{ENVIRON} (@pxref{Variabili predefinite})
-@c gawk and MKS awk
-
-@item
-La possibilit@`a di specificare pi@`u opzioni @option{-f} sulla riga di comando
-(@pxref{Opzioni})
-@c MKS awk
-@c Mortice Kern Systems, ditta produttrice di una versione commerciale di awk
-
-@item
-L'opzione @option{-v} per assegnare variabili prima di iniziare
-l'esecuzione del programma
-(@pxref{Opzioni})
-@c GNU, Bell Laboratories & MKS together
-
-@item
-La notazione @option{--} per indicare la fine delle opzioni sulla riga di
-comando
-
-@item
-Le sequenze di protezione @samp{\a}, @samp{\v} e @samp{\x}
-(@pxref{Sequenze di protezione})
-@c GNU, for ANSI C compat
-
-@item
-Un valore di ritorno definito per la funzione predefinita @code{srand()}
-(@pxref{Funzioni numeriche})
-
-@item
-Le funzioni predefinite per stringhe @code{toupper()} e @code{tolower()}
-per la conversione maiuscolo/minuscolo
-(@pxref{Funzioni per stringhe})
-
-@item
-Una specificazione pi@`u accurata per la lettera @samp{%c} di controllo del
-formato nella funzione @code{printf}
-(@pxref{Lettere di controllo})
-
-@item
-La capacit@`a di decidere dinamicamente la larghezza di un campo e la
-precisione da usare (@code{"%*.*d"}) nella lista degli argomenti passati a
-@code{printf} e @code{sprintf()}
-(@pxref{Lettere di controllo})
-
-@item
-L'uso di costanti @dfn{regexp}, p.es. @code{/pippo/}, come espressioni,
-che equivalgono a usare l'operatore di ricerca di una
-corrispondenza, p.es. @samp{$0 ~ /pippo/}
-(@pxref{Usare le costanti @dfn{regexp}})
-
-@item
-Gestione di sequenze di protezione nell'assegnamento di variabili
-effettuato tramite la riga di comando
-(@pxref{Opzioni di assegnamento})
-@end itemize
-
-@node POSIX
-@appendixsec Differenze tra versione SVR4 e POSIX di @command{awk}
-@cindex @command{awk}, versioni di, differenze tra SVR4 e POSIX @command{awk}
-@cindex POSIX @command{awk}, differenze tra versioni @command{awk}
-
-Lo standard POSIX Command Language and Utilities per @command{awk} (1992)
-ha introdotto le seguenti modifiche al linguaggio:
-
-@itemize @value{BULLET}
-@item
-L'uso dell'opzione @option{-W} per opzioni specifiche a una data
-implementazione
-(@pxref{Opzioni})
-
-@item
-L'uso di @code{CONVFMT} per controllare la conversione di numeri
-in stringhe (@pxref{Conversione})
-
-@item
-Il concetto di stringa numerica e regole di confronto pi@`u precise da seguire
-al riguardo (@pxref{Tipi di variabile e confronti})
-
-@item
-L'uso di variabili predefinite come nomi di parametri delle funzioni @`e vietato
-(@pxref{Sintassi delle definizioni})
-
-@item
-Una documentazione pi@`u completa di molte tra le funzionalit@`a del linguaggio
-precedentemente non documentate
-@end itemize
-
-Nel 2012, un certo numero di estensioni che erano gi@`a comunemente
-disponibili da parecchi anni sono state finalmente aggiunte allo standard
-POSIX. Ecco l'elenco:
-
-@itemize @value{BULLET}
-@item
-La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
-in output
-(@pxref{Funzioni di I/O})
-
-@item
-L'istruzione @code{nextfile}
-(@pxref{Istruzione nextfile})
-
-@item
-La possibilit@`a di eliminare completamente un vettore con l'istruzione
-@samp{delete @var{vettore}}
-(@pxref{Cancellazione})
-
-@end itemize
-
-@xref{Estensioni comuni} per una lista delle estensioni comuni
-non previste nello standard POSIX.
-
-Lo standard POSIX 2008 @`e reperibile online a:
-@url{http://www.opengroup.org/onlinepubs/9699919799/}.
-
-
-@node BTL
-@appendixsec Estensioni nell'@command{awk} di Brian Kernighan
-
-@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
-@cindex estensioni, Brian Kernighan @command{awk}
-@cindex Brian Kernighan, @command{awk} di, estensioni
-@cindex Kernighan, Brian
-Brian Kernighan
-ha reso disponibile la sua versione nel suo sito.
-(@pxref{Altre versioni}).
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive estensioni comuni disponibili per la
-prima volta nella sua versione di @command{awk}:
-
-@itemize @value{BULLET}
-@item
-Gli operatori @samp{**} e @samp{**=}
-(@pxref{Operatori aritmetici}
-e
-@ref{Operatori di assegnamento})
-
-@item
-L'uso di @code{func} come abbreviazione di @code{function}
-(@pxref{Sintassi delle definizioni})
-
-@item
-La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
-in output
-(@pxref{Funzioni di I/O})
-
-@ignore
-@item
-The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol
-table. This feature was never documented for his @command{awk}, largely because
-it is somewhat shakily implemented. For instance, you cannot access arrays
-or array elements through it
-@end ignore
-@end itemize
-
-@xref{Estensioni comuni} per una lista completa delle estensioni
-disponibile nel suo @command{awk}.
-
-@node POSIX/GNU
-@appendixsec Estensioni di @command{gawk} non in POSIX @command{awk}
-
-@cindex modalit@`a compatibile di (@command{gawk}), estensioni nella
-@cindex estensioni nella modalit@`a compatibile di (@command{gawk})
-@cindex estensioni, in @command{gawk}, non in POSIX @command{awk}
-@cindex POSIX, estensioni @command{gawk} non incluse in
-L'implementazione GNU di @command{gawk} aggiunge molte funzionalit@`a.
-Queste possono essere disabilitate completamente sia con l'opzione
-@option{--traditional} che con l'opzione
-@option{--posix}
-(@pxref{Opzioni}).
-
-Alcune funzionalit@`a sono state introdotte e successivamente tolte
-con il passare del tempo.
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION}
-sintetizza le ulteriori funzionalit@`a rispetto a POSIX @command{awk} che sono
-presenti nella versione corrente di @command{gawk}.
-
-@itemize @value{BULLET}
-
-@item
-Ulteriori variabili predefinite:
-
-@itemize @value{MINUS}
-@item
-Le variabili
-@code{ARGIND},
-@code{BINMODE},
-@code{ERRNO},
-@code{FIELDWIDTHS},
-@code{FPAT},
-@code{IGNORECASE},
-@code{LINT},
-@code{PROCINFO},
-@code{RT}
-e
-@code{TEXTDOMAIN}
-(@pxref{Variabili predefinite})
-@end itemize
-
-@item
-File speciali verso cui ridirigere l'I/O:
-
-@itemize @value{MINUS}
-@item
-I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
-@value{FNS} speciali @file{/dev/fd/@var{N}}
-(@pxref{File speciali})
-
-@item
-I file speciali @file{/inet}, @file{/inet4} e @file{/inet6} per
-interagire con la rete TCP/IP usando @samp{|&} per specificare quale
-versione usare del protocollo IP
-(@pxref{Reti TCP/IP})
-@end itemize
-
-@item
-Differenze e/o aggiunte al linguaggio:
-
-@itemize @value{MINUS}
-@item
-La sequenza di protezione @samp{\x}
-(@pxref{Sequenze di protezione})
-
-@item
-Supporto completo per @dfn{regexp} sia POSIX che GNU
-@iftex
-(@pxrefil{Espressioni regolari})
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari})
-@end ifnottex
-
-@item
-La possibilit@`a che @code{FS} e il terzo
-argomento di @code{split()} siano la stringa nulla
-(@pxref{Campi di un solo carattere})
-
-@item
-La possibilit@`a che @code{RS} sia una @dfn{regexp}
-(@pxref{Record})
-
-@item
-La possibilit@`a di usare costanti ottali ed esadecimali nei programmi
-scritti in @command{awk}
-(@pxref{Numeri non-decimali})
-
-@item
-L'operatore @samp{|&} per poter effettuare I/O bidirezionale verso un
-coprocesso
-(@pxref{I/O bidirezionale})
-
-@item
-Chiamate indirette di funzione
-(@pxref{Chiamate indirette})
-
-@item
-La possibilit@`a di ignorare directory specificate sulla riga di comando,
-emettendo un messaggio di avvertimento
-(@pxref{Directory su riga di comando})
-
-@item
-Errori in output usando @code{print} e @code{printf} non provocano
-necessariamente la fine del programma
-(@pxref{Continuazione dopo errori})
-@end itemize
-
-@item
-Nuove parole chiave:
-
-@itemize @value{MINUS}
-@item
-I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE})
-
-@item
-L'istruzione @code{switch}
-(@pxref{Istruzione switch})
-@end itemize
-
-@item
-Differenze in funzioni standard di @command{awk}:
-
-@itemize @value{MINUS}
-@item
-Il secondo argomento opzionale di @code{close()} che consente di chiudere
-un solo lato dell'I/O di una @dfn{pipe} bidirezionale aperta verso un
-coprocesso (@pxref{I/O bidirezionale})
-
-@item
-Aderenza allo standard POSIX per le funzioni @code{gsub()} e @code{sub()}
-se @`e stata specificata l'opzione @option{--posix}
-
-@item
-La funzione @code{length()} accetta come argomento il nome di un vettore
-e restituisce il numero di elementi nel vettore
-(@pxref{Funzioni per stringhe})
-
-@item
-Il terzo argomento opzionale della funzione @code{match()}
-per contenere eventuali sottoespressioni individuate all'interno di una
-@dfn{regexp}
-(@pxref{Funzioni per stringhe})
-
-@item
-Specificatori posizionali nei formati di @code{printf} per facilitare
-le traduzioni di messaggi
-(@pxref{Ordinamento di printf})
-
-@item
-L'aggiunta di un quarto argomento opzionale alla funzione @code{split()},
-per designare un vettore che contenga il testo dei separatori di campo
-(@pxref{Funzioni per stringhe})
-@end itemize
-
-@item
-Ulteriori funzioni presenti solo in @command{gawk}:
-
-@itemize @value{MINUS}
-@item
-Le funzioni @code{gensub()}, @code{patsplit()} e @code{strtonum()}
-per una gestione di testi pi@`u potente
-(@pxref{Funzioni per stringhe})
-
-@item
-Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
-(@pxref{Ordinamento di vettori})
-
-@item
-Le funzioni @code{mktime()}, @code{systime()} e @code{strftime()}
-per lavorare con date e ore
-(@pxref{Funzioni di tempo})
-
-@item
-Le funzioni
-@code{and()},
-@code{compl()},
-@code{lshift()},
-@code{or()},
-@code{rshift()}
-e
-@code{xor()}
-per la manipolazione a livello di bit
-(@pxref{Funzioni a livello di bit})
-@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments
-
-@item
-La funzione @code{isarray()} per controllare se una variabile @`e un vettore
-oppure no
-(@pxref{Funzioni per i tipi})
-
-@item
-Le funzioni @code{bindtextdomain()}, @code{dcgettext()}
-e @code{dcngettext()} per l'internazionalizzazione
-(@pxref{I18N per programmatore})
-
-@item
-La funzione @code{intdiv()} per effettuare divisioni a numeri interi e
-ottenere il resto della divisione
-(@pxref{Funzioni numeriche})
-@end itemize
-
-@item
-Modifiche e/o aggiunte alle opzioni della riga di comando:
-
-@itemize @value{MINUS}
-@item
-La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
-per l'opzione @option{-f} della riga di comando
-(@pxref{Opzioni})
-
-@item
-La variabile d'ambiente @env{AWKLIBPATH} per specificare un percorso di ricerca
-per l'opzione @option{-l} della riga di comando
-(@pxref{Opzioni})
-
-@item
-Le opzioni brevi
-@option{-b},
-@option{-c},
-@option{-C},
-@option{-d},
-@option{-D},
-@option{-e},
-@option{-E},
-@option{-g},
-@option{-h},
-@option{-i},
-@option{-l},
-@option{-L},
-@option{-M},
-@option{-n},
-@option{-N},
-@option{-o},
-@option{-O},
-@option{-p},
-@option{-P},
-@option{-r},
-@option{-s},
-@option{-S},
-@option{-t}
-e
-@option{-V}
-. Inoltre, la
-possibilit@`a di usare opzioni in formato lungo (stile GNU) che iniziano
-con @option{--}
-e le opzioni lunghe
-@option{--assign},
-@option{--bignum},
-@option{--characters-as-bytes},
-@option{--copyright},
-@option{--debug},
-@option{--dump-variables},
-@option{--exec},
-@option{--field-separator},
-@option{--file},
-@option{--gen-pot},
-@option{--help},
-@option{--include},
-@option{--lint},
-@option{--lint-old},
-@option{--load},
-@option{--non-decimal-data},
-@option{--optimize},
-@option{--no-optimize},
-@option{--posix},
-@option{--pretty-print},
-@option{--profile},
-@option{--re-interval},
-@option{--sandbox},
-@option{--source},
-@option{--traditional},
-@option{--use-lc-numeric},
-and
-@option{--version}
-(@pxref{Opzioni}).
-@end itemize
-
-@c new ports
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-sorgente e dalla documentazione di @command{gawk} @value{PVERSION} 4.0:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-Amiga
-
-@item
-Atari
-
-@item
-BeOS
-
-@item
-Cray
-
-@item
-MIPS RiscOS
-
-@item
-MS-DOS con il compilatore Microsoft
-
-@item
-MS-Windows con il compilatore Microsoft
-
-@item
-NeXT
-
-@item
-SunOS 3.x, Sun 386 (Road Runner)
-
-@item
-Tandem (non-POSIX)
-
-@item
-Compilatore pre-standard VAX C per VAX/VMS
-
-@item
-GCC per VAX e Alpha non @`e stato verificato da parecchio tempo.
-
-@end itemize
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-di @command{gawk} @value{PVERSION} 4.1:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-Ultrix
-@end itemize
-
-@item
-Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
-sorgente e dalla documentazione di
-@command{gawk} @value{PVERSION} 4.2:
-
-@c nested table
-@itemize @value{MINUS}
-@item
-MirBSD
-
-@item
-GNU/Linux su Alpha
-@end itemize
-
-@end itemize
-
-@c XXX ADD MORE STUFF HERE
-
-
-@c This does not need to be in the formal book.
-@ifclear FOR_PRINT
-@node Storia delle funzionalit@`a
-@appendixsec Storia delle funzionalit@`a di @command{gawk}
-
-@ignore
-See the thread:
-https://groups.google.com/forum/#!topic/comp.lang.awk/SAUiRuff30c
-This motivated me to add this section.
-@end ignore
-
-@ignore
-I've tried to follow this general order, esp.@: for the 3.0 and 3.1 sections:
- variables
- special files
- language changes (e.g., hex constants)
- differences in standard awk functions
- new gawk functions
- new keywords
- new command-line options
- behavioral changes
- new ports
-Within each category, be alphabetical.
-@end ignore
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive le funzionalit@`a in @command{gawk}
-in aggiunta a quelle di POSIX @command{awk},
-nell'ordine in cui sono state rese disponibili in @command{gawk}.
-
-La versione 2.10 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
-per l'opzione @option{-f} della riga di comando
-(@pxref{Opzioni})
-
-@item
-La variabile @code{IGNORECASE} e i suoi effetti
-(@pxref{Maiuscolo-Minuscolo}).
-
-@item
-I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
-@value{FNS} speciali @file{/dev/fd/@var{N}}
-(@pxref{File speciali})
-@end itemize
-
-La versione 2.13 di @command{gawk} ha ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-La variabile @code{FIELDWIDTHS} e i suoi effetti
-(@pxref{Dimensione costante}).
-
-@item
-Le funzioni predefinite @code{systime()} e @code{strftime()} per ottenere
-e stampare data e ora
-(@pxref{Funzioni di tempo}).
-
-@item
-Ulteriori opzioni dalla riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{-W lint} per fornire controlli su possibili errori e per
-la portabilit@`a, sia a livello di codice sorgente che in fase di esecuzione.
-
-@item
-L'opzione @option{-W compat} per inibire le estensioni GNU.
-
-@item
-L'opzione @option{-W posix} per richiedere una stretta aderenza allo
-standard POSIX.
-@end itemize
-@end itemize
-
-La versione 2.14 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-L'istruzione @code{next file} per passare immediatamente al successivo
-@value{DF} (@pxref{Istruzione nextfile}).
-@end itemize
-
-La versione 2.15 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Nuove variabili (@pxref{Variabili predefinite}):
-
-@itemize @value{MINUS}
-@item
-@code{ARGIND}, che permette di controllare la posizione di @code{FILENAME}
-nel vettore @code{ARGV}.
-
-@item
-@code{ERRNO}, che contiene il messaggio di errore del sistema quando
-@code{getline} restituisce @minus{}1 o @code{close()} non termina con successo.
-@end itemize
-
-@item
-I @value{FNS} speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
-e @file{/dev/user}. Questo supporto @`e stato rimosso in seguito.
-
-@item
-La possibilit@`a di cancellare un intero vettore in una sola istruzione
-con @samp{delete @var{vettore}}
-(@pxref{Cancellazione}).
-
-@item
-Modifiche nelle opzioni della riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-La possibilit@`a di usare opzioni in formato lungo (in stile GNU) che iniziano
-con @option{--}.
-
-@item
-L'opzione @option{--source} per combinare codice sorgente immesso nella riga
-di comando e codice sorgente proveniente da file di libreria.
-@end itemize
-@end itemize
-
-La versione 3.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Variabili nuove o modificate:
-
-@itemize @value{MINUS}
-@item
-@code{IGNORECASE} modificato, diventa applicabile al confronto tra stringhe,
-come pure alle operazioni su @dfn{regexp}
-(@pxref{Maiuscolo-Minuscolo}).
-
-@item
-@code{RT}, che contiene il testo in input che @`e stato individuato da @code{RS}
-(@pxref{Record}).
-@end itemize
-
-@item
-Supporto completo sia per le @dfn{regexp} POSIX sia per quelle GNU
-@iftex
-(@pxrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@pxref{Espressioni regolari}).
-@end ifnottex
-
-@item
-La funzione @code{gensub()} per migliorare la manipolazione di testi
-(@pxref{Funzioni per stringhe}).
-
-@item
-La funzione @code{strftime()} prevede un formato di data e ora di default,
-in modo da poter essere chiamata senza alcun argomento.
-(@pxref{Funzioni di tempo}).
-
-@item
-La possibilit@`a che @code{FS} e il terzo argomento della funzione
-@code{split()} siano delle stringhe nulle
-(@pxref{Campi di un solo carattere}).
-
-@item
-La possibilit@`a che @code{RS} sia una @dfn{regexp}
-(@pxref{Record}).
-
-@item
-L'istruzione @code{next file} @`e diventata @code{nextfile}
-(@pxref{Istruzione nextfile}).
-
-@item
-La funzione @code{fflush()} di
-BWK @command{awk}
-(BWK allora lavorava ai Bell Laboratories;
-@pxref{Funzioni di I/O}).
-
-@item
-Nuove opzioni della riga di comando:
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{--lint-old} per
-ottenere messaggi relativi a costrutti non disponibili
-nell'implementazione di @command{awk} per Unix Version 7
-(@pxref{V7/SVR3.1}).
-
-@item
-L'opzione @option{-m} da BWK @command{awk}. (Brian lavorava
-ancora ai Bell Laboratories all'epoca.) Quest'opzione @`e stata in seguito
-rimossa, sia dal suo @command{awk} che da @command{gawk}.
-
-@item
-L'opzione @option{--re-interval} per consentire di specificare
-espressioni di intervallo nelle @dfn{regexp}
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-L'opzione @option{--traditional} aggiunta come maniera pi@`u intuitiva
-per richiedere l'opzione
-@option{--compat} (@pxref{Opzioni}).
-@end itemize
-
-@item
-L'uso di GNU Autoconf per controllare il processo di configurazione
-(@pxref{Installazione veloce}).
-
-@item
-Supporto per Amiga.
-Questo supporto @`e stato rimosso in seguito.
-
-@end itemize
-
-La versione 3.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-@item
-Nuove variabili
-(@pxref{Variabili predefinite}):
-
-@itemize @value{MINUS}
-@item
-@code{BINMODE}, per sistemi non aderenti allo standard POSIX,
-che consente I/O binario per file in input e/o output
-(@pxref{Uso su PC}).
-
-@item
-@code{LINT}, che controlla dinamicamente gli avvertimenti emessi da @dfn{lint}.
-
-@item
-@code{PROCINFO}, un vettore che fornisce informazioni correlate con il
-processo in esecuzione.
-
-@item
-@code{TEXTDOMAIN}, per impostare il dominio testuale in cui internazionalizzare
-un'applicazione (@pxref{Internazionalizzazione}).
-@end itemize
-
-@item
-La possibilit@`a di usare costanti ottali ed esadecimali nel codice
-sorgente di programmi @command{awk}.
-(@pxref{Numeri non-decimali}).
-
-@item
-L'operatore @samp{|&} per effettuare I/O bidirezionale verso un
-coprocesso
-(@pxref{I/O bidirezionale}).
-
-@item
-I file speciali @file{/inet} per interagire con reti TCP/IP usando @samp{|&}
-(@pxref{Reti TCP/IP}).
-
-@item
-Il secondo argomento opzionale della funzione @code{close()} per permettere di
-chiudere uno dei lati di una @dfn{pipe} bidirezionale aperta con un coprocesso
-(@pxref{I/O bidirezionale}).
-
-@item
-Il terzo argomento opzionale della funzione @code{match()} per
-avere a disposizione le diverse sottoespressioni individuate all'interno
-di una @dfn{regexp}
-(@pxref{Funzioni per stringhe}).
-
-@item
-Specificatori posizionali nelle stringhe di formato di @code{printf} per
-facilitare la traduzione di messaggi
-(@pxref{Ordinamento di printf}).
-
-@item
-Alcune nuove funzioni predefinite:
-
-@itemize @value{MINUS}
-@item
-Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
-(@pxref{Ordinamento di vettori}).
-
-@item
-Le funzioni @code{bindtextdomain()}, @code{dcgettext()} e @code{dcngettext()}
-per l'internationalizzazione
-(@pxref{I18N per programmatore}).
-
-@item
-La funzione @code{extension()} e la possibilit@`a di aggiungere
-nuove funzioni predefinite dinamicamente
-@iftex
-(@pxrefil{Estensioni dinamiche}).
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}).
-@end ifnottex
-
-@item
-La funzione @code{mktime()} per generare date e ore
-(@pxref{Funzioni di tempo}).
-
-@item
-Le funzioni @code{and()}, @code{or()}, @code{xor()}, @code{compl()},
-@code{lshift()}, @code{rshift()} e @code{strtonum()}
-(@pxref{Funzioni a livello di bit}).
-@end itemize
-
-@item
-@cindex @code{next file} statement
-Il supporto per @samp{next file} scritto come due parole @`e stato rimosso
-completamente
-(@pxref{Istruzione nextfile}).
-
-@item
-Ulteriori opzioni sulla riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{--dump-variables} per stampare una lista di tutte le
-variabili globali.
-
-@item
-L'opzione @option{--exec}, da usare in script CGI [Common Gateway Interface].
-
-@item
-L'opzione della riga di comando @option{--gen-po} e l'uso di un trattino
-basso a inizio stringa, per segnalare stringhe che dovrebbero essere tradotte
-(@pxref{Estrazione di stringhe}).
-
-@item
-L'opzione @option{--non-decimal-data} per consentire di avere dati in input
-di tipo non decimale
-(@pxref{Dati non decimali}).
-
-@item
-L'opzione @option{--profile} e @command{pgawk}, la
-versione profilatrice di @command{gawk}, per produrre profili di esecuzione
-di programmi @command{awk}
-(@pxref{Profilare}).
-
-@item
-L'opzione @option{--use-lc-numeric} per richiedere a @command{gawk}
-di usare il carattere di separazione decimale proprio della localizzazione
-nell'elaborazione dei dati in input
-(@pxref{Conversione}).
-@end itemize
-
-@item
-L'uso di GNU Automake a supporto della standardizzazione del processo
-di configurazione
-(@pxref{Installazione veloce}).
-
-@item
-L'uso di GNU @command{gettext} per i messaggi emessi da @command{gawk}
-(@pxref{Gawk internazionalizzato}).
-
-@item
-Supporto per BeOS. Rimosso in seguito.
-
-@item
-Supporto per Tandem. Rimosso in seguito.
-
-@item
-La versione per Atari ufficialmente non @`e pi@`u supportata e in seguito
-@`e stata completamente rimossa.
-
-@item
-Modifiche al codice sorgente per usare definizioni di funzione secondo lo
-stile di codifica dello standard ISO C.
-
-@item
-Aderenza alla specifica POSIX per le funzioni @code{sub()} e @code{gsub()}
-(@pxref{Dettagli ostici}).
-
-@item
-La funzione @code{length()} @`e stata estesa per accettare un vettore come
-argomento, e restituire in tal caso il numero di elementi nel vettore
-(@pxref{Funzioni per stringhe}).
-
-@item
-La funzione @code{strftime()} accetta un terzo argomento per
-dare la possibilit@`a di stampare data e ora nel formato UTC
-(@pxref{Funzioni di tempo}).
-@end itemize
-
-La versione 4.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-
-@item
-Aggiunta di variabili:
-
-@itemize @value{MINUS}
-@item
-@code{FPAT}, che permette di specificare una @dfn{regexp} che individua
-i campi, invece che individuare il separatore tra i campi
-(@pxref{Separazione in base al contenuto}).
-
-@item
-Se esiste l'elemento di vettore @code{PROCINFO["sorted_in"]}, il ciclo
-@samp{for(indice in pippo)} ordina
-gli indici, prima di iniziare il ciclo. Il valore di questo elemento
-permette di controllare l'ordinamento degli indici prima di iniziare il
-ciclo che li visita tutti
-(@pxref{Controllare visita}).
-
-@item
-@code{PROCINFO["strftime"]}, che contiene la stringa di formato
-di default per @code{strftime()}
-(@pxref{Funzioni di tempo}).
-@end itemize
-
-@item
-I file speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
-e @file{/dev/user} sono stati rimossi.
-
-@item
-Il supporto per IPv6 @`e stato aggiunto attraverso il file speciale
-@file{/inet6}.
-Il file speciale @file{/inet4} consente di operare con IPv4 e @file{/inet}
-opera con il default di sistema, che probabilmente @`e IPv4
-(@pxref{Reti TCP/IP}).
-
-@item
-L'uso delle sequenze di protezione @samp{\s} e @samp{\S} nelle espressioni
-regolari
-(@pxref{Operatori di @dfn{regexp} GNU}).
-
-@item
-Le espressioni di intervallo sono consentite per default nelle espressioni
-regolari
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-La classi di caratteri POSIX sono consentite anche se si @`e specificata
-l'opzione @option{--traditional}
-(@pxref{Operatori di espressioni regolari}).
-
-@item
-@code{break} e @code{continue} non sono pi@`u consentiti fuori da un ciclo,
-anche se si @`e specificata l'opzione @option{--traditional}
-(@pxref{Istruzione break} e anche la
-@ref{Istruzione continue}).
-
-@item
-@code{fflush()}, @code{nextfile} e @samp{delete @var{array}}
-sono consentite anche se @`e stata specificata l'opzione @option{--posix} o
-@option{--traditional}, poich@'e questi costrutti sono ora inclusi
-nello standard POSIX.
-
-@item
-Un terzo argomento facoltativo per le funzioni @code{asort()} e @code{asorti()}
-permette di specificare il tipo di ordinamento desiderato
-(@pxref{Funzioni per stringhe}).
-
-@item
-Il comportamento di @code{fflush()} @`e stato modificato per corrispondere
-a quello di BWK @command{awk}
-e per lo standard POSIX; ora sia @samp{fflush()} che @samp{fflush("")}
-forzano la scrittura di tutte le ridirezioni in output aperte
-(@pxref{Funzioni di I/O}).
-
-@item
-La funzione @code{isarray()}
-determina se un elemento @`e un vettore oppure no
-per rendere possibile la visita di vettori di vettori
-(@pxref{Funzioni per i tipi}).
-
-@item
-La funzione @code{patsplit()} che
-fornisce le stesse funzionalit@`a di @code{FPAT}, per suddividere delle stringhe
-(@pxref{Funzioni per stringhe}).
-
-@item
-Un quarto argomento opzionale per la funzione @code{split()},
-che indica un vettore destinato a contenere i valori dei separatori
-(@pxref{Funzioni per stringhe}).
-
-@item
-Vettori di vettori
-(@pxref{Vettori di vettori}).
-
-@item
-I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-@item
-Chiamate indirette di funzioni
-(@pxref{Chiamate indirette}).
-
-@item
-Le istruzioni @code{switch} / @code{case} sono disponibili per default
-(@pxref{Istruzione switch}).
-
-@item
-Modifiche nelle opzioni della riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-Le opzioni @option{-b} e @option{--characters-as-bytes},
-che impediscono che @command{gawk} tratti l'input come composto da una
-stringa di caratteri multibyte.
-
-@item
-Rimozione delle opzioni ridondanti (in notazione lunga) @option{--compat},
-@option{--copyleft} e @option{--usage}.
-
-@item
-L'opzione @option{--gen-po} @`e stata finalmente rinominata
-@option{--gen-pot} per correttezza.
-
-@item
-L'opzione @option{--sandbox} che disabilita alcune funzionalit@`a [per operare
-in un ambiente "protetto"].
-
-@item
-Tutte le opzioni in notazione lunga hanno acquisito opzioni corrispondenti
-in notazione breve, per poter essere usate negli script di shell @samp{#!}.
-@end itemize
-
-@item
-I nomi di directory che appaiono sulla riga di comando generano adesso
-un messaggio di errore, ma non interrompono l'elaborazione, a meno che non
-siano state specificate le opzioni @option{--posix} o @option{--traditional}
-(@pxref{Directory su riga di comando}).
-
-@item
-Il codice interno di @command{gawk} @`e stato riscritto, aggiungendo la
-versione per il debug @command{dgawk},
-con un possibile miglioramento nei tempi di esecuzione
-@iftex
-(@pxrefil{Debugger}).
-@end iftex
-@ifnottex
-(@pxref{Debugger}).
-@end ifnottex
-
-@item
-In aderenza agli standard di codifica GNU, le estensioni dinamiche devono
-definire un simbolo globale che indica che sono compatibili con la
-licenza GPL
-(@pxref{Licenza delle estensioni}).
-
-@item
-In modalit@`a POSIX, i confronti tra stringhe usano le funzioni di
-libreria @code{strcoll()} / @code{wcscoll()}
-(@pxref{Confronto POSIX di stringhe}).
-
-@item
-L'opzione per usare @dfn{socket} in maniera @dfn{raw} (nativa) @`e stata
-rimossa, perch@'e non era mai stata implementata
-(@pxref{Reti TCP/IP}).
-
-@item
-Intervalli nella forma @samp{[d-h]} sono elaborati come se fossero scritti
-nella localizzazione C, a prescindere da che tipo di @dfn{regexp} @`e usata,
-anche se era stata specificata l'opzione
-@option{--posix}
-(@pxref{Intervalli e localizzazione}).
-
-@item
-@`E stato rimosso il supporto per i seguenti sistemi:
-
-@itemize @value{MINUS}
-@item
-Atari
-
-@item
-Amiga
-
-@item
-BeOS
-
-@item
-Cray
-
-@item
-MIPS RiscOS
-
-@item
-MS-DOS con Compilatore Microsoft
-
-@item
-MS-Windows con Compilatore Microsoft
-
-@item
-NeXT
-
-@item
-SunOS 3.x, Sun 386 (Road Runner)
-
-@item
-Tandem (non-POSIX)
-
-@item
-Compilatore pre-standard VAX C per VAX/VMS
-@end itemize
-@end itemize
-
-La versione 4.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
-
-@itemize @value{BULLET}
-
-@item
-Tre nuovi vettori:
-@code{SYMTAB}, @code{FUNCTAB} e @code{PROCINFO["identifiers"]}
-(@pxref{Variabili auto-assegnate}).
-
-@item
-I tre comandi eseguibili @command{gawk}, @command{pgawk} e @command{dgawk},
-sono diventati uno solo, con il solo nome @command{gawk}. Di conseguenza
-le opzioni sulla riga di comando sono state modificate.
-
-@item
-Modifiche delle opzioni da riga di comando
-(@pxref{Opzioni}):
-
-@itemize @value{MINUS}
-@item
-L'opzione @option{-D} attiva il debugger.
-
-@item
-Le opzioni @option{-i} e @option{--include}
-caricano dei file di libreria @command{awk}.
-
-@item
-Le opzioni @option{-l} e @option{--load} caricano estensioni dinamiche
-compilate.
-
-@item
-Le opzioni @option{-M} e @option{--bignum} abilitano la libreria MPFR per
-il calcolo con un numero arbitrario di cifre significative.
-
-@item
-L'opzione @option{-o} serve solo a ottenere in output una stampa formattata
-elegantemente del programma da eseguire.
-
-@item
-L'opzione @option{-p} @`e usata per "profilare" l'esecuzione del programma.
-
-@item
-L'opzione @option{-R} @`e stata rimossa.
-@end itemize
-
-@item
-Supporto per il calcolo ad alta precisione con MPFR
-(@pxref{Calcolo con precisione arbitraria}).
-
-@item
-Le funzioni @code{and()}, @code{or()} e @code{xor()} sono state modificate
-per ammettere un numero qualsiasi di argomenti, con un minimo di due
-(@pxref{Funzioni a livello di bit}).
-
-
-@item
-L'interfaccia che rende possibile l'estensione dinamica @`e stata rifatta
-completamente
-@iftex
-(@pxrefil{Estensioni dinamiche}).
-@end iftex
-@ifnottex
-(@pxref{Estensioni dinamiche}).
-@end ifnottex
-
-@item
-La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di
-@code{BEGINFILE} ed @code{ENDFILE}
-(@pxref{BEGINFILE/ENDFILE}).
-
-@item
-Il comando @code{where} @`e stato aggiunto al debugger
-(@pxref{Stack di esecuzione}).
-
-@item
-Il supporto per Ultrix @`e stato rimosso.
-
-@end itemize
-
-La versione 4.2 ha introdotto le seguenti funzionalit@`a:
-
-@itemize @bullet
-@item
-Differenze apportate alle variabili di ambiente (@code{ENVIRON}) sono riflesse in quelle
-rese disponibili a @command{gawk} e in quelle di programmi che siano da esso richiamati.
-@xref{Variabili auto-assegnate}.
-
-@item
-L'opzione @option{--pretty-print} non esegue pi@`u, dopo averlo stampato,
-il programma @command{awk}.
-@xref{Opzioni}.
-
-@item
-Il programma @command{igawk} e le relative pagine di manuale non sono
-pi@`u installati come parte dell'installazione di @command{gawk}.
-@xref{Programma igawk}.
-
-@item
-La funzione @code{intdiv()}.
-@xref{Funzioni numeriche}.
-
-@item
-Il massimo numero di cifre esadecimali permesse nelle sequenze di
-protezione @samp{\x} @`e ora limitato a due.
-@xref{Sequenze di protezione}.
-
-@item
-@code{print} e @code{printf} non terminano il programma dopo alcuni
-errori di output.
-@xref{Continuazione dopo errori}.
-
-@item
-Per molti anni, lo standard POSIX richiedeva che la separazione dei campi
-di un record fosse fatta per default
-quando si incontrano spazi e TAB, e questo @`e il comportamento di
-@command{gawk} se si specifica l'opzione @option{--posix}. Dal 2013
-il comportamento originario @`e stato ripristinato, e ora
-il default per separare i campi con l'opzione @option{--posix} ammette
-anche il ritorno a capo come separatore di campi.
-
-@item
-Il supporto per MirBSD @`e stato rimosso.
-
-@item
-Il supporto per GNU/Linux sull'architettura Alpha @`e stato rimosso.
-@end itemize
-
-@c XXX ADD MORE STUFF HERE
-@end ifclear
-
-@node Estensioni comuni
-@appendixsec Sommario Estensioni Comuni
-
-@cindex estensioni, Brian Kernighan @command{awk}
-@cindex estensioni, @command{mawk}
-La tabella seguente dettaglia le estensioni comuni supportate
-da @command{gawk}, da Brian Kernighan @command{awk} e da @command{mawk},
-le tre versioni liberamente disponibili pi@`u usate di @command{awk}
-(@pxref{Altre versioni}).
-
-@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 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 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 @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 @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 @tab X @tab X @tab
-@item Funzioni gestione data/ora @tab @tab X @tab X @tab
-@end multitable
-
-@node Intervalli e localizzazione
-@appendixsec Intervalli @dfn{regexp} e localizzazione: una lunga e triste storia
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} descrive la storia confusionaria degli intervalli
-all'interno di espressioni regolari, le loro relazioni con la localizzazione,
-e l'effetto da ci@`o determinato su diverse versioni di @command{gawk}.
-
-Gli strumenti originali Unix aventi a che fare con espressioni regolari
-stabilivano che intervalli di caratteri (come @samp{[a-z]}) individuavano
-un carattere qualsiasi tra il primo carattere dell'intervallo e l'ultimo
-carattere dello stesso, entrambi inclusi. L'ordinamento era basato sul
-valore numerico di ogni carattere come era rappresentato all'interno
-del computer, nell'insieme di caratteri proprio di ogni macchina.
-Quindi, su sistemi che adottano la codifica ASCII, @samp{[a-z]} individua
-tutte le lettere minuscole, e solo
-quelle, in quanto i valori numerici che rappresentano le lettere dalla
-@samp{a} fino alla @samp{z} sono contigui. (In un sistema che adotta la
-codifica EBCDIC, l'intervallo @samp{[a-z]} comprende anche ulteriori
-caratteri non alfabetici.)
-
-Quasi tutti i testi di introduzione allo Unix spiegavano che le espressioni
-di intervallo funzionavano in questo modo, e in particolare insegnavano che
-la maniera ``corretta'' per individuare le lettere minuscole era con
-@samp{[a-z]} e che @samp{[A-Z]} era il modo ``corretto'' per individuare le
-lettere maiuscole.
-E, in effetti, era proprio cos@`{@dotless{i}}.@footnote{E la vita era semplice.}
-
-Lo standard POSIX 1992 introduceva l'idea di localizzazione
-(@pxref{Localizzazioni}).
-Poich@'e molte localizzazioni comprendono altre lettere, oltre alle 26
-lettere dell'alfabeto inglese, lo standard POSIX introduceva le classi
-di carattere (@pxref{Espressioni tra parentesi quadre}) per permettere
-l'individuazione di differenti insiemi di caratteri, in aggiunta a quelli
-tradizionali presenti nell'insieme di caratteri ASCII.
-
-Tuttavia, lo standard @emph{ha modificato} l'interpretazione delle
-espressioni di intervallo.
-Nelle localizzazioni @code{"C"} e @code{"POSIX"},
-un'espressione di intervallo come
-@samp{[a-dx-z]} @`e ancora equivalente a @samp{[abcdxyz]}, secondo l'ordine
-della codifica ASCII.
-Ma in tutte le altre localizzazioni l'ordinamento @`e basato su quel che
-si chiama @dfn{ordine di collazione}.
-
-Cosa vuol dire?
-In molte localizzazioni, le lettere @samp{A} e @samp{a} vengono entrambe
-prima di @samp{B}.
-In altre parole, queste localizzazioni ordinano i caratteri nel modo in cui
-sono ordinati in un dizionario,
-e @samp{[a-dx-z]} non @`e detto che equivalga a @samp{[abcdxyz]};
-invece, potrebbe essere equivalente a @samp{[ABCXYabcdxyz]}, per fare un
-esempio.
-
-Su questo punto @`e opportuno insistere: molta documentazione afferma che
-si dovrebbe usare @samp{[a-z]} per identificare un carattere minuscolo.
-Ma su sistemi con localizzazioni
-non-ASCII, un tale intervallo potrebbe includere tutti i caratteri maiuscoli
-tranne @samp{A} o @samp{Z}! Questo ha continuato a essere una fonte di
-equivoci perfino nel ventunesimo secolo.
-
-Per dare un'idea del tipo di problemi, l'esempio seguente usa la funzione
-@code{sub()}, che effettua una sostituzione di testo all'interno di una
-stringa (@pxref{Funzioni per stringhe}). Qui, l'idea @`e quella di rimuovere
-i caratteri maiuscoli a fine stringa:
-
-@example
-$ @kbd{echo qualcosa1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'}
-@print{} qualcosa1234a
-@end example
-
-@noindent
-Questo non @`e l'output che ci si aspettava, perch@'e, il @samp{bc} alla fine di
-@samp{qualcosa1234abc} non dovrebbe essere individuato da @samp{[A-Z]*}.
-Un tale risultato dipende dalle impostazioni di localizzazione (e quindi
-potrebbe non succedere sul sistema che si sta usando).
-
-@cindex Unicode
-Considerazioni simili valgono per altri intervalli. Per esempio, @samp{["-/]}
-@`e perfettamente valido in ASCII, ma non @`e valido in molte localizzazioni
-Unicode, p.es. in @code{en_US.UTF-8}.
-
-Il codice delle prime versioni di @command{gawk} per individuare le
-@dfn{regexp} non teneva conto della localizzazione, e quindi gli
-intervalli potevano essere interpretati in maniera tradizionale.
-
-Quando @command{gawk} ha iniziato a usare metodi di ricerca di @dfn{regexp}
-che tengono conto della localizzazione, sono iniziati i problemi;
-a maggior ragione in quanto sia GNU/Linux che i venditori di versioni
-commerciali di Unix
-avevano iniziato a implementare localizzazioni non-ASCII,
-@emph{adottandole per default}. La domanda che forse si udiva pi@`u spesso
-era del tipo: ``Perch@'e @samp{[A-Z]} individua lettere minuscole?!?''
-
-@cindex Berry, Karl
-Questa situazione @`e in essere da circa 10 anni, se non di pi@`u, e
-il manutentore di @command{gawk} si @`e stufato di continuare a spiegare che
-@command{gawk} stava semplicemente implementando quelli che sono gli
-standard, e che il problema stava nella localizzazione dell'utente. Nella
-fase di sviluppo della @value{PVERSION} 4.0, @command{gawk} @`e stato modificato
-in modo da trattare sempre gli
-intervalli "come si faceva prima di POSIX", a meno che non si specifichi
-l'opzione @option{--posix} (@pxref{Opzioni}).@footnote{Ed
-@`e cos@`{@dotless{i}} che @`e nata la Campagna per l'Interpretazione Razionale degli
-Intervalli (in inglese, RRI [@dfn{Rational Range Interpretation}]).
-Un certo
-numero di strumenti GNU hanno gi@`a implementato questa modifica, o
-lo faranno presto. Grazie a Karl Berry per aver coniato la frase
-``Rational Range Interpretation''.}
-
-Fortunatamente, un po' prima del rilascio definitivo della versione 4.0 di
-@command{gawk}, il manutentore ha appreso che lo standard 2008 aveva
-modificato la definizione di intervallo, e che, al di fuori delle
-localizzazioni @code{"C"} e @code{"POSIX"}, il significato di espressione
-di intervallo era ora
-@emph{indefinito}.@footnote{Si veda
-@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, lo standard}
-e
-@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, le motivazioni}.}
-
-Adottando questo simpatico termine tecnico, lo standard permette agli
-implementatori di implementare gli intervalli nella maniera che preferiscono.
-Il manutentore di @command{gawk} ha deciso di implementare la regola pre-POSIX
-sia per l'individuazione di default delle @dfn{regexp} sia quando si
-specificano le opzioni @option{--traditional} o @option{--posix}.
-In ogni caso @command{gawk} aderisce allo standard POSIX.
-
-@node Contributori
-@appendixsec I principali contributori a @command{gawk}
-@cindex @command{gawk}, lista di contributori a
-@quotation
-@i{Riconoscere sempre il merito, se un merito va riconosciuto.}
-@author Anonimo
-@end quotation
-
-Questa @value{SECTION} elenca le persone che hanno maggiormente contribuito
-allo sviluppo di @command{gawk} e/o alla stesura di questo @value{DOCUMENT},
-in ordine approssimativamente cronologico:
-
-@itemize @value{BULLET}
-@item
-@cindex Aho, Alfred
-@cindex Weinberger, Peter
-@cindex Kernighan, Brian
-Il Dr.@: Alfred V.@: Aho,
-il Dr.@: Peter J.@: Weinberger, e
-il Dr.@: Brian W.@: Kernighan, tutti dei Bell Laboratories,
-hanno progettato e implementato @command{awk} per Unix,
-da cui @command{gawk} trae la maggioranza delle sue funzionalit@`a.
-
-@item
-@cindex Rubin, Paul
-Paul Rubin,
-autore del progetto e dell'implementazione iniziale del 1986, ha
-scritto la prima bozza (di circa 40 pagine) di questo @value{DOCUMENT}.
-
-@item
-@cindex Fenlason, Jay
-Jay Fenlason
-ha completato l'implementazione iniziale.
-
-@item
-@cindex Close, Diane
-Diane Close
-ha rivisto la prima bozza di questo @value{DOCUMENT}, portandolo alla
-lunghezza di circa 90 pagine.
-
-@item
-@cindex Stallman, Richard
-Richard Stallman
-ha aiutato a completare l'implementazione e la bozza iniziale di questo
-@value{DOCUMENT}.
-@`E anche il fondatore della FSF e del progetto GNU.
-
-@item
-@cindex Woods, John
-John Woods
-ha scritto porzioni di codice (volti principalmente alla correzione di
-errori) nella versione iniziale di @command{gawk}.
-
-@item
-@cindex Trueman, David
-Nel 1988,
-David Trueman
-si @`e fatto carico della manutenzione principale di @command{gawk},
-rendendolo compatibile col ``nuovo'' @command{awk} e
-migliorandone parecchio la velocit@`a di esecuzione.
-
-@item
-@cindex Kwok, Conrad
-@cindex Garfinkle, Scott
-@cindex Williams, Kent
-Conrad Kwok,
-Scott Garfinkle
-e
-Kent Williams
-hanno per primi portato il programma all'ambiente MS-DOS, usando varie
-versioni del compilatore MSC.
-
-@item
-@cindex Rankin, Pat
-Pat Rankin
-ha portato il programma all'ambiente VMS, preparando anche la relativa
-documentazione.
-
-@item
-@cindex Peterson, Hal
-Hal Peterson
-@`e stato di aiuto nel portare @command{gawk} nei sistemy Cray.
-(L'ambiente Cray non @`e pi@`u supportato.)
-
-@item
-@cindex Rommel, Kai Uwe
-Kai Uwe Rommel
-ha portato per primo il programma all'ambiente OS/2, preparando anche
-la relativa documentazione.
-
-@item
-@cindex Jaegermann, Michal
-Michal Jaegermann
-ha portato il programma all'ambiente Atari, preparando anche la relativa
-documentazione.
-(L'ambiente Atari non @`e pi@`u supportato.)
-Michal continua a effettuare controlli di portabilit@`a,
-e ha molto contribuito a consentire a @command{gawk}
-di funzionare su sistemi diversi da quelli a 32 bit.
-
-@item
-@cindex Fish, Fred
-Fred Fish
-ha portato il programma all'ambiente Amiga, preparando anche la relativa
-documentazione.
-(Purtroppo Fred non @`e pi@`u tra noi, e questo ambiente non @`e pi@`u supportato.)
-
-@item
-@cindex Deifik, Scott
-Scott Deifik
-si @`e occupato della manutenzione per MS-DOS usando il compilatore DJGPP.
-
-@item
-@cindex Zaretskii, Eli
-Eli Zaretskii
-si occupa della manutenzione della versione per MS-Windows, nell'ambiente
-MinGW.
-
-@item
-@cindex Grigera, Juan
-Juan Grigera
-@`e autore di una versione di @command{gawk} per sistemi Windows32.
-(Questa versione non @`e pi@`u supportata.)
-
-@item
-@cindex Hankerson, Darrel
-Per molti anni, il
-Dr.@: Darrel Hankerson
-ha fatto da coordinatore per le varie versioni che giravano su diverse
-piattaforme PC e ha creato distribuzioni binarie per vari sistemi operativi
-che girano sui PC.
-Il suo aiuto @`e stato importante per mantenere aggiornata la documentazione
-per le diverse piattaforme PC.
-
-@item
-@cindex Zoulas, Christos
-Christos Zoulas
-ha scritto la funzione predefinita @code{extension()} per aggiungere
-dinamicamente nuove funzioni.
-(Questa funzionalit@`a @`e divenuta obsoleta a partire da @command{gawk} 4.1.)
-
-@item
-@cindex Kahrs, J@"urgen
-J@"urgen Kahrs
-ha scritto la prima versione del codice per interagire con la rete
-TCP/IP, con la relativa documentazione, e fornito le ragioni per l'aggiunta
-dell'operatore @samp{|&}.
-
-@item
-@cindex Davies, Stephen
-Stephen Davies
-ha portato per la prima volta il programma all'ambiente Tandem, preparando
-anche la relativa documentazione.
-(Tuttavia, questa versione non @`e pi@`u supportata.)
-Stephen @`e anche stato determinante nel lavoro iniziale per integrare il codice
-interno di gestione dei byte nel
-complesso del codice di @command{gawk}.
-
-@item
-@cindex Woehlke, Matthew
-Matthew Woehlke
-ha migliorato l'aderenza allo standard POSIX nei sistemi Tandem che
-implementano lo standard.
-
-@item
-@cindex Brown, Martin
-Martin Brown
-ha portato il programma all'ambiente BeOS, preparando anche la relativa
-documentazione.
-(L'ambiente BeOS non @`e pi@`u supportato.)
-
-@item
-@cindex Peters, Arno
-Arno Peters
-ha fatto il lavoro iniziale necessario per consentire alla configurazione
-di @command{gawk} di usare GNU Automake e GNU @command{gettext}.
-
-@item
-@cindex Broder, Alan J.@:
-Alan J.@: Broder
-ha scritto la prima versione della funzione @code{asort()} e anche
-il codice per gestire il terzo argomento opzionale della funzione
-@code{match()}.
-
-@item
-@cindex Buening, Andreas
-Andreas Buening
-ha aggiornato la versione di @command{gawk} per OS/2.
-
-@item
-@cindex Hasegawa, Isamu
-Isamu Hasegawa,
-dell'IBM in Giappone, ha contribuito con il supporto per i caratteri multibyte.
-
-@item
-@cindex Benzinger, Michael
-Michael Benzinger ha sviluppato il codice iniziale per l'istruzione
-@code{switch}.
-
-@item
-@cindex McPhee, Patrick
-Patrick T.J.@: McPhee ha sviluppato il codice per il caricamento
-dinamico negli ambienti Windows32.
-(Questa funzionalit@`a non @`e pi@`u supportata.)
-
-@item
-@cindex Wallin, Anders
-Anders Wallin ha aiutato a continuare il supporto della versione VMS
-di @command{gawk} per parecchi anni.
-
-@item
-@cindex Gordon, Assaf
-Assaf Gordon ha scritto il codice per implementare
-l'opzione @option{--sandbox}.
-
-@item
-@cindex Haque, John
-John Haque @`e autore dei seguenti contributi:
-
-@itemize @value{MINUS}
-@item
-Le modifiche per convertire @command{gawk}
-in un interprete di codice a livello di byte, compreso il debugger
-
-@item
-L'aggiunta di veri vettori di vettori
-
-@item
-Le modifiche ulteriori per il supporto del calcolo a precisione
-arbitraria
-
-@item
-Il testo iniziale di
-@ref{Calcolo con precisione arbitraria}
-
-@item
-Il lavoro per unificare le tre varianti del programma @command{gawk},
-in vista della versione 4.1
-
-@item
-I miglioramenti alla gestione interna dei vettori per i vettori i cui
-indici sono dei numeri interi
-
-@item
-A John, insieme a Pat Rankin, si devono i miglioramenti alla funzionalit@`a
-di ordinamento dei vettori.
-@end itemize
-
-@cindex Papadopoulos, Panos
-@item
-Panos Papadopoulos ha scritto il testo originale per
-@ref{Includere file}.
-
-@item
-@cindex Yawitz, Efraim
-Efraim Yawitz ha scritto il testo originale per il @ref{Debugger}.
-
-@item
-@cindex Schorr, Andrew
-Lo sviluppo dell'estensione API rilasciata per la prima volta con
-@command{gawk} 4.1 @`e stata principalmente guidata da
-Arnold Robbins e Andrew Schorr, con notevoli contributi dal
-resto del team di sviluppo.
-
-@cindex Malmberg, John E.
-@item
-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.
-
-@item
-@cindex Robbins, Arnold
-Arnold Robbins
-ha lavorato su @command{gawk} dal 1988, dapprima
-aiutando David Trueman e in seguito, dal 1994 circa, come
-manutentore principale.
-@end itemize
-
-@node Sommario della storia
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-Il linguaggio @command{awk} si @`e evoluto col passare degli anni. La prima
-versione risale a Unix V7, circa 1978. Nel 1987, per la versione Unix
-System V Release 3.1, sono state fatte al linguaggio delle modifiche
-importanti, inclusa la possibilit@`a di avere funzioni definite dall'utente.
-Ulteriori modifiche sono state fatte per la versione System V Release 4, nel
-1989.
-Dopo di allora, sono state apportate ulteriori modifiche minori,
-per implementare lo standard POSIX.
-
-@item
-L'@command{awk} di Brian Kernighan prevede un piccolo numero di estensioni
-implementate di comune accordo con altre versioni di @command{awk}.
-
-@item
-@command{gawk} prevede un elevato numero di estensioni rispetto
-a POSIX @command{awk}.
-Queste estensioni possono essere disabilitate specificando l'opzione
-@option{--traditional} o @option{--posix}.
-
-@item
-L'interazione tra localizzazioni POSIX e individuazione di @dfn{regexp}
-in @command{gawk} @`e stata causa di malintesi nel corso degli anni. Oggi
-@command{gawk} implementa l'Interpretazione Razionale degli Intervalli
-(@dfn{Rational Range Interpretation}), dove
-intervalli nella forma @samp{[a-z]} individuano @emph{solo} i caratteri
-numericamente compresi tra
-@samp{a} e @samp{z} nella rappresentazione nativa dei caratteri in quella
-particolare macchina. Normalmente quella in uso @`e quella ASCII,
-ma pu@`o essere EBCDIC sui sistemi IBM S/390.
-
-@item
-Molte persone hanno contribuito allo sviluppo di @command{gawk} nel corso
-degli anni. Spero che l'elenco fornito in questo @value{CHAPTER} sia
-esauriente e attribuisca il giusto riconoscimento quando questo @`e dovuto.
-
-@end itemize
-
-@node Installazione
-@appendix Installare @command{gawk}
-
-@c last two commas are part of see also
-@cindex sistemi operativi, si veda anche GNU/Linux@comma{} sistemi operativi per PC@comma{} Unix
-@cindex @command{gawk}, installare
-@cindex installare @command{gawk}
-Quest'appendice contiene istruzioni per installare @command{gawk} sulle
-varie piattaforme supportate dagli sviluppatori. Lo sviluppatore
-principale supporta GNU/Linux (e Unix), mentre le altre piattaforme sono
-sono curate da altri sviluppatori.
-@xref{Bug}
-per gli indirizzi di posta elettronica di chi effettua la manutenzione
-della versione specifica di una particolare piattaforma.
-
-@menu
-* Distribuzione di Gawk:: Contenuto della distribuzione di @command{gawk}.
-* Installazione Unix:: Installare @command{gawk} su varie versioni
- di Unix.
-* Installazione non-Unix:: Installazioni su altri Sistemi Operativi.
-* Bug:: Notificare problemi e bug.
-* Altre versioni:: Altre implementazioni di @command{awk}
- liberamente disponibili.
-* Sommario dell'installazione:: Sommario dell'installazione.
-@end menu
-
-@node Distribuzione di Gawk
-@appendixsec La distribuzione di @command{gawk}
-@cindex codice sorgente di @command{gawk}
-@cindex sorgente, codice, @command{gawk}
-
-Questa @value{SECTION} spiega come ottenere la distribuzione
-di @command{gawk}, come scompattarla, e cosa @`e contenuto nei vari file
-e nelle sottodirectory risultanti.
-
-@menu
-* Scaricare:: Come ottenere la distribuzione.
-* Scompattazione:: Come estrarre la distribuzione.
-* Contenuti della distribuzione:: Cosa c'@`e nella distribuzione.
-@end menu
-
-@node Scaricare
-@appendixsubsec Ottenere la distribuzione di @command{gawk}
-@cindex @command{gawk}, codice sorgente@comma{} ottenere il
-@cindex codice sorgente di @command{gawk}, ottenere il
-Ci sono due modi per ottenere del software GNU:
-
-@itemize @value{BULLET}
-@item
-Copiarlo da qualcuno che ce l'abbia gi@`a.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@item
-Ottenere @command{gawk}
-dal sito Internet
-@code{ftp.gnu.org}, nella directory @file{/gnu/gawk}.
-@`E possibile accedere al sito sia via @command{ftp} anonimo che via @code{http}.
-Se si dispone del programma @command{wget}, si pu@`o utilizzarlo digitando un
-comando simile a questo:
-
-@example
-wget http://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-@end example
-@end itemize
-
-L'archivio che contiene il software GNU @`e disponibile in vari cloni
-(@dfn{mirror}) in tutto il mondo.
-La lista aggiornata dei siti clone @`e disponibile nel
-@uref{http://www.gnu.org/order/ftp.html, sito web principale della FSF}.
-Si tenti di usare uno dei siti-clone; dovrebbero essere meno trafficati, ed @`e
-possibile che ce ne sia uno pi@`u vicino.
-
-Si pu@`o anche scaricare la distribuzione del sorgente di @command{gawk}
-dal deposito Git ufficiale; per maggiori informazioni, si veda
-@ref{Accedere ai sorgenti}.
-
-@node Scompattazione
-@appendixsubsec Scompattare la distribuzione
-@command{gawk} @`e distribuito sotto forma di parecchi file @code{tar}
-compressi con differenti programmi di compressione: @command{gzip},
-@command{bzip2}
-e @command{xz}. Per amor di semplicit@`a, il resto di queste istruzioni
-presuppone che si stia usando quella compressa col programma GNU Gzip
-(@command{gzip}).
-
-Una volta che si ha a disposizione la distribuzione (p.es.,
-@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}),
-va usato @code{gzip} per scompattare il file e quindi @code{tar} per estrarne i
-file. Si pu@`o usare la seguente @dfn{pipe} per produrre la distribuzione
-@command{gawk}:
-
-@example
-gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf -
-@end example
-
-In un sistema che abbia la versione GNU di @command{tar}, si
-pu@`o far effettuare la scompattazione direttamente a @command{tar}:
-
-@example
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-@end example
-
-@noindent
-L'estrazione dei file dall'archivio
-crea una directory di nome @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}
-nella directory corrente.
-
-Il @value{FN} della distribuzione @`e nella forma
-@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}.
-La @var{V} rappresenta la versione maggiore di @command{gawk},
-la @var{R} rappresenta il rilascio corrente della versione @var{V}, e
-la @var{P} rappresenta un @dfn{patch level}, che sta a indicare che
-correzioni a errori minori sono state incluse nel rilascio.
-Il @dfn{patch level} corrente @`e @value{PATCHLEVEL}, ma quando ci si procura
-una distribuzione, andr@`a ottenuta quella con il livello pi@`u alto di
-versione, rilascio e @dfn{patch}.
-(Si noti, comunque, che livelli di @dfn{patch} maggiori o uguali a 70
-denotano versioni ``beta'', ossia versioni non destinate a essere usate
-in produzione; non si dovrebbero utilizzare tali versioni, se non si @`e
-disposti a sperimentare.)
-Se non si sta usando un sistema Unix o GNU/Linux, i modi per ottenere
-e scompattare la distribuzione di @command{gawk} sono differenti.
-Si dovrebbe sentire un esperto di quel sistema.
-
-@node Contenuti della distribuzione
-@appendixsubsec Contenuti della distribuzione @command{gawk}
-@cindex @command{gawk}, distribuzione di
-@cindex distribuzione di @command{gawk}
-
-La distribuzione di @command{gawk} contiene un certo numero di file
-sorgente in C, di file di documentazione, di sottodirectory, e di file
-utilizzati durante il processo di configurazione
-(@pxref{Installazione Unix}),
-come pure parecchie sottodirectory relative a diversi sistemi operativi
-non-Unix:
-
-@table @asis
-@item Vari file @samp{.c}, @samp{.y} e @samp{.h}
-Questi file contengono il codice sorgente vero e proprio di @command{gawk}.
-@end table
-
-@table @file
-@item support/*
-Intestazioni C e file sorgente per routine che @command{gawk}
-usa, ma che non sono parte della sua funzionalit@`a
-fondamentale. Per esempio, analisi di argomenti, controlli
-di corrispondenze di espressioni regolari, e routine per
-generare numeri casuali sono tutti mantenuti qui.
-
-@item ABOUT-NLS
-Un file contenente informazioni sul comando GNU @command{gettext} e
-sulle traduzioni.
-
-@item AUTHORS
-Un file con alcune informazioni su chi ha scritto @command{gawk}.
-Esiste solo per placare i pedanti della Free Software Foundation.
-
-@item README
-@itemx README_d/README.*
-File descrittivi: vari @file{README} ("leggimi") per @command{gawk} sotto Unix e per
-tutte le varie altre combinazioni hardware e software.
-
-@item INSTALL
-Un file che fornisce una panoramica sul processo di configurazione e installazione.
-
-@item ChangeLog
-Una lista dettagliata delle modifiche apportate al codice sorgente,
-ai problemi risolti e ai miglioramenti introdotti.
-
-@item ChangeLog.0
-Una lista meno recente di modifiche al codice sorgente.
-
-@item NEWS
-Una lista di modifiche a @command{gawk} a partire dall'ultimo rilascio
-o @dfn{patch}.
-
-@item NEWS.0
-Una lista meno recente di modifiche a @command{gawk}.
-
-@item COPYING
-La @dfn{GNU General Public License}.
-
-@item POSIX.STD
-Una descrizione di comportamenti nello standard POSIX per @command{awk} che
-sono lasciati indefiniti, o ai quali @command{gawk} non pu@`o conformarsi
-pienamente, come pure una lista di specifiche che lo standard POSIX dovrebbe
-contenere, ma che non sono presenti.
-
-@cindex intelligenza artificiale, @command{gawk} e
-@cindex @command{gawk} e l'intelligenza artificiale
-@item doc/awkforai.txt
-Puntatori alla bozza originale di un breve articolo
-che spiega perch@'e @command{gawk} @`e un linguaggio adatto alla
-programmazione nel campo dell'intelligenza artificiale (AI).
-
-@item doc/bc_notes
-Una breve descrizione della struttura interna a livello di byte di
-@command{gawk} [``byte code''].
-
-@item doc/README.card
-@itemx doc/ad.block
-@itemx doc/awkcard.in
-@itemx doc/cardfonts
-@itemx doc/colors
-@itemx doc/macros
-@itemx doc/no.colors
-@itemx doc/setter.outline
-Il sorgente @command{troff} per una scheda di riferimento a cinque colori
-di @command{awk}.
-Per ottenere la versione a colori @`e richiesta una versione recente di
-@command{troff}, come la versione GNU di @command{troff} (@command{groff}).
-Si veda il file @file{README.card} per istruzioni su come comportarsi se @`e
-disponibile solo una versione pi@`u vecchia di @command{troff}.
-
-@item doc/gawk.1
-Il sorgente @command{troff} di una pagina di manuale [@dfn{man}]
-che descrive @command{gawk}.
-Questa pagina @`e distribuita a beneficio degli utenti Unix.
-
-@cindex Texinfo
-@item doc/gawktexi.in
-@itemx doc/sidebar.awk
-Il file sorgente Texinfo di questo @value{DOCUMENT}.
-Dovrebbe venire elaborato da @file{doc/sidebar.awk}
-prima di essere elaborato con @command{texi2dvi} o @command{texi2pdf}
-per produrre un documento stampato, o
-con @command{makeinfo} per produrre un file Info o HTML.
-Il @file{Makefile} si occupa di questa elaborazione e produce
-la versione stampabile tramite i comandi
-@command{texi2dvi} o @command{texi2pdf}.
-
-@item doc/gawk.texi
-Il file prodotto elaborando @file{gawktexi.in}
-tramite @file{sidebar.awk}.
-
-@item doc/gawk.info
-Il file Info generato per questo @value{DOCUMENT}.
-
-@item doc/gawkinet.texi
-Il file sorgente Texinfo per
-@ifinfo
-@inforef{Top, , Introduzione generale, gawkinet, @value{GAWKINETTITLE}}.
-@end ifinfo
-@ifnotinfo
-@cite{@value{GAWKINETTITLE}}.
-@end ifnotinfo
-Dovrebbe venire elaborato con @TeX{}
-(tramite @command{texi2dvi} o @command{texi2pdf})
-per produrre un documento stampato o
-con @command{makeinfo} per produrre un file Info o HTML.
-
-@item doc/gawkinet.info
-Il file Info generato per
-@cite{@value{GAWKINETTITLE}}.
-
-@item doc/igawk.1
-Il sorgente @command{troff} per una pagina di manuale relativa al
-programma @command{igawk} descritto
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Programma igawk}.
-(Poich@'e @command{gawk} prevede ora internamente l'uso della direttiva
-@code{@@include},
-n@'e @command{igawk} n@'e @file{igawk.1} sono effettivamente installati.)
-
-@item doc/Makefile.in
-Il file in input usato durante la procedura di configurazione per
-generare l'effettivo @file{Makefile} da usare per creare la documentazione.
-
-@item Makefile.am
-@itemx */Makefile.am
-File usati dal software GNU Automake per generare
-il file @file{Makefile.in} usato da Autoconf e dallo script
-@command{configure}.
-
-@item Makefile.in
-@itemx aclocal.m4
-@itemx bisonfix.awk
-@itemx config.guess
-@itemx configh.in
-@itemx configure.ac
-@itemx configure
-@itemx custom.h
-@itemx depcomp
-@itemx install-sh
-@itemx missing_d/*
-@itemx mkinstalldirs
-@itemx m4/*
-Questi file e sottodirectory sono usati per configurare e compilare
-@command{gawk} per vari sistemi Unix. L'uso di molti tra questi file @`e spiegato
-@iftex
-nella
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Installazione Unix}. I rimanenti hanno una funzione di supporto
-per l'infrastruttura.
-
-@item po/*
-La directory @file{po} contiene la traduzione in varie lingue
-dei messaggi emessi da @command{gawk}.
-
-@item awklib/extract.awk
-@itemx awklib/Makefile.am
-@itemx awklib/Makefile.in
-@itemx awklib/eg/*
-La directory @file{awklib} contiene una copia di @file{extract.awk}
-(@pxref{Programma extract}),
-che pu@`o essere usato per estrarre i programmi di esempio dal file sorgente
-Texinfo di questo @value{DOCUMENT}. Contiene anche un file
-@file{Makefile.in}, che
-@command{configure} usa per generare un @file{Makefile}.
-@file{Makefile.am} @`e usato da GNU Automake per creare @file{Makefile.in}.
-Le funzioni di libreria descritte
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria},
-sono incluse come file pronti per l'uso nella distribuzione @command{gawk}.
-Essi sono installati come parte della procedura di installazione.
-I rimanenti programmi contenuti in questo @value{DOCUMENT} sono disponibili
-nelle appropriate sottodirectory di @file{awklib/eg}.
-
-@item extension/*
-Il codice sorgente, le pagine di manuale, e i file di infrastruttura per
-gli esempi di estensione incluse con @command{gawk}.
-@xref{Estensioni dinamiche}, per ulteriori dettagli.
-
-@item extras/*
-Ulteriori file, non-essenziali. Al momento, questa directory contiene
-alcuni file da eseguire al momento di iniziare una sessione,
-da installare nella directory @file{/etc/profile.d}
-per essere di aiuto nella gestione delle variabili di ambiente
-@env{AWKPATH} e @env{AWKLIBPATH}.
-@xref{File da usare a inizio sessione}, per ulteriori informazioni.
-
-@item posix/*
-File necessari per compilare @command{gawk} su sistemi conformi allo
-standard POSIX.
-
-@item pc/*
-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).
-
-@item test/*
-Una serie di test per
-@command{gawk}. Si pu@`o usare @samp{make check} dalla directory principale
-di @command{gawk} per provare se la serie di test funziona con la
-versione in uso di @command{gawk}.
-Se @command{gawk} supera senza errori @samp{make check}, si pu@`o essere
-sicuri che sia stato installato e configurato correttamente su un dato
-sistema.
-@end table
-
-@node Installazione Unix
-@appendixsec Compilare e installare @command{gawk} su sistemi di tipo Unix
-
-Normalmente, si pu@`o compilare e installare @command{gawk} immettendo
-solo un paio di comandi. Comunque, se si ci si trova in un sistema
-insolito, pu@`o essere necessario
-dover configurare @command{gawk} per quel dato sistema.
-
-@menu
-* Installazione veloce:: Compilare @command{gawk} sotto Unix.
-* File da usare a inizio sessione:: Funzioni di personalizzazione della
- shell.
-* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase di
- compilazione.
-* Filosofia della configurazione:: Come si suppone che tutto funzioni.
-@end menu
-
-@node Installazione veloce
-@appendixsubsec Compilare @command{gawk} per sistemi di tipo Unix
-
-Questi normali passi di installazione dovrebbero essere sufficienti in
-tutti i moderni sistemi in commercio derivati da Unix, ossia
-GNU/Linux, sistemi basati su BSD, e l'ambiente Cygwin sotto MS-Windows.
-
-Dopo aver estratto la distribuzione di @command{gawk}, posizionarsi con
-@command{cd} nella directory
-@file{gawk-@value{VERSION}.@value{PATCHLEVEL}}. Come per la maggior parte dei
-programmi GNU, occorre configurare @command{gawk} per il sistema in uso,
-eseguendo il programma @command{configure}. Questo programma @`e
-uno script della shell Bourne, che @`e stato generato automaticamente
-usando il comando GNU Autoconf.
-@ifnotinfo
-(Il software Autoconf @`e
-descritto in dettaglio in
-@cite{Autoconf---Generating Automatic Configuration Scripts},
-che pu@`o essere trovato in rete sul sito
-@uref{http://www.gnu.org/software/autoconf/manual/index.html,
-della Free Software Foundation}.)
-@end ifnotinfo
-@ifinfo
-(Il software Autoconf @`e descritto in dettaglio a partire da
-@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.)
-@end ifinfo
-
-Per configurare @command{gawk} basta eseguire @command{configure}:
-
-@example
-sh ./configure
-@end example
-
-Questo produce i file @file{Makefile} e @file{config.h} adatti al sistema
-in uso.
-Il file @file{config.h} descrive varie situazioni relative al sistema in uso.
-@`E possibile modificare il @file{Makefile} per
-cambiare la variabile @code{CFLAGS}, che controlla
-le opzioni di riga di comando da passare al compilatore C (come i livelli
-di ottimizzazione o la richiesta di generare informazioni per il @dfn{debug}).
-
-In alternativa, si possono specificare dei valori a piacere per
-molte delle variabili di @command{make} sulla riga di comando,
-come @code{CC} e @code{CFLAGS}, quando
- si chiama il programma
-@command{configure}:
-
-@example
-CC=cc CFLAGS=-g sh ./configure
-@end example
-
-@noindent
-Si veda il file @file{INSTALL} nella distribuzione di @command{gawk} per
-tutti i dettagli.
-
-Dopo aver eseguito @command{configure} ed eventualmente modificato
-@file{Makefile},
-va dato il comando:
-
-@example
-make
-@end example
-
-@noindent
-Poco dopo, si dovrebbe avere a disposizione una versione eseguibile
-di @command{gawk}.
-Questo @`e tutto!
-Per verificare se @command{gawk} funziona correttamente,
-va dato il comando @samp{make check}. Tutti i test dovrebbero terminare con
-successo.
-Se questi passi non producono il risultato desiderato, o se qualche
-test fallisce, controllare i file nella directory @file{README_d}
-per determinare se quello che @`e capitato @`e un problema noto.
-Se il problema capitato non @`e descritto l@`{@dotless{i}},
-inviare una segnalazione di @dfn{bug} (@pxref{Bug}).
-
-Naturalmente, dopo aver compilato @command{gawk}, verosimilmente
-andr@`a installato. Per fare ci@`o, occorre eseguire il comando
-@samp{make install}, disponendo delle autorizzazioni necessarie.
-Come acquisirle varia da sistema a sistema, ma su molti sistemi si pu@`o
-usare il comando @command{sudo} per ottenerle. Il comando da immettere
-diventa in questo caso @samp{sudo make install}. @`E probabile che sia
-necessario fornire una password, ed essere stati messi nella lista degli
-utenti che possono utilizzare il comando @command{sudo}.
-
-@node File da usare a inizio sessione
-@appendixsubsec File di inizializzazione della shell
-
-La distribuzione contiene i file da usare a inizio sessione
-@file{gawk.sh} e
-@file{gawk.csh}, che contengono funzioni che possono essere di aiuto
-nel gestire le variabili di ambiente
-@env{AWKPATH} e @env{AWKLIBPATH}.
-Su un sistema Fedora GNU/Linux, questi file dovrebbero essere installati
-nella directory @file{/etc/profile.d};
-su altre piattaforme, la posizione corretta pu@`o essere differente.
-
-@table @command
-
-@cindex @command{gawkpath_default}, funzione della shell
-@cindex funzione della shell @command{gawkpath_default}
-@item gawkpath_default
-Ripristina la variabile d'ambiente @env{AWKPATH} al suo valore di default.
-
-@cindex @command{gawkpath_prepend}, funzione della shell
-@cindex funzione della shell @command{gawkpath_prepend}
-@item gawkpath_prepend
-Aggiunge l'argomento all'inizio della variabile d'ambiente @env{AWKPATH}.
-
-@cindex @command{gawkpath_append}, funzione della shell
-@cindex funzione della shell @command{gawkpath_append}
-@item gawkpath_append
-Aggiunge l'argomento alla fine della variabile d'ambiente @env{AWKPATH}.
-
-@cindex @command{gawklibpath_default}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_default}
-@item gawklibpath_default
-Reimposta la variabile d'ambiente @env{AWKLIBPATH} al suo valore di default.
-
-@cindex @command{gawklibpath_prepend}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_prepend}
-@item gawklibpath_prepend
-Aggiunge l'argomento all'inizio della variabile d'ambiente
-@env{AWKLIBPATH}.
-
-@cindex @command{gawklibpath_append}, funzione della shell
-@cindex funzione della shell @command{gawklibpath_append}
-@item gawklibpath_append
-Aggiunge l'argomento alla fine della variabile d'ambiente
-@env{AWKLIBPATH}.
-
-@end table
-
-
-@node Ulteriori opzioni di configurazione
-@appendixsubsec Ulteriori opzioni di configurazione
-@cindex @command{gawk}, configurazione, opzioni di
-@cindex configurazione di @command{gawk}, opzioni di
-
-Ci sono parecchie altre opzioni che si possono utilizzare sulla riga
-di comando di @command{configure}
-quando si compila @command{gawk} a partire dai sorgenti, tra cui:
-
-@table @code
-
-@cindex @option{--disable-extensions}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-extensions}
-@item --disable-extensions
-Richiede di non configurare e generare le estensioni di esempio nella
-directory @file{extension}. Questo @`e utile quando si genera
-@command{gawk} per essere eseguito su un'altra piattaforma.
-L'azione di default @`e di controllare dinamicamente se le estensioni
-possono essere configurate e compilate.
-
-@cindex @option{--disable-lint}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-lint}
-@item --disable-lint
-Disabilita i controlli @dfn{lint} all'interno di @command{gawk}. Le opzioni
-@option{--lint} e @option{--lint-old}
-(@pxref{Opzioni})
-sono accettate, ma non fanno nulla, e non emettono alcun messaggio di
-avvertimento.
-Analogamente, se si imposta la variabile @code{LINT}
-(@pxref{Variabili modificabili dall'utente})
-questa non ha alcun effetto sul programma @command{awk} in esecuzione.
-
-Se si specifica l'opzione del compilatore GNU Compiler Collection (GCC) che
-elimina il codice non eseguito, quest'opzione riduce di quasi
-23K byte la dimensione del programma eseguibile @command{gawk}
-su sistemi GNU/Linux x86_64. I risultati su altri sistemi e con
-altri compilatori sono probabilmente diversi.
-L'uso di questa opzione pu@`o apportare qualche piccolo miglioramento nei
-tempi di esecuzione di un programma.
-
-@quotation ATTENZIONE
-Se si usa quest'opzione alcuni dei test di funzionalit@`a non avranno successo.
-Quest'opzione potr@`a essere rimossa in futuro.
-@end quotation
-
-@cindex @option{--disable-nls}, opzione di configurazione
-@cindex opzione di configurazione @code{--disable-nls}
-@item --disable-nls
-Non attiva la traduzione automatica dei messaggi.
-Ci@`o normalmente non @`e consigliabile, ma pu@`o apportare qualche lieve
-miglioramento nei tempi di esecuzione di un programma.
-
-@cindex @option{--with-whiny-user-strftime}, opzione di configurazione
-@cindex opzione di configurazione @code{--with-whiny-user-strftime}
-@item --with-whiny-user-strftime
-Forza l'uso della versione della funzione C @code{strftime()} inclusa nella
-distribuzione di @command{gawk}, per i sistemi in cui la funzione stessa
-non sia disponibile.
-@end table
-
-Si usi il comando @samp{./configure --help} per ottenere la lista completa
-delle opzioni disponibili in @command{configure}.
-
-@node Filosofia della configurazione
-@appendixsubsec Il processo di configurazione
-
-@cindex @command{gawk}, configurazione di
-@cindex configurazione di @command{gawk}
-Questa @value{SECTION} interessa solo a chi abbia un minimo di familiarit@`a con
-il linguaggio C e con i sistemi operativi di tipo Unix.
-
-Il codice sorgente di @command{gawk}, in generale, cerca di aderire, nei limiti
-del possibile, a degli standard formali. Ci@`o significa che @command{gawk} usa
-routine di libreria che sono specificate nello standard ISO C e nello standard
-POSIX per le interfacce dei sistemi operativi. Il codice sorgente di
-@command{gawk} richiede l'uso di un compilatore ISO C (standard 1990).
-
-Molti sistemi Unix non aderiscono completamente n@'e allo standard ISO n@'e a
-quello POSIX. La sottodirectory @file{missing_d} nella distribuzione di
-@command{gawk} contiene delle versioni sostitutive per quelle funzioni che pi@`u
-frequentemente risultano essere non disponibili.
-
-Il file @file{config.h} creato da @command{configure} contiene definizioni che
-elencano funzionalit@`a del particolare sistema operativo nel quale si tenta di
-compilare @command{gawk}. Le tre cose descritte da questo file sono: quali
-file di intestazione sono disponibili, in modo da poterli includere correttamente,
-quali funzioni (presumibilmente) standard sono realmente disponibili nelle
-librerie C, e varie informazioni assortite riguardo al sistema operativo
-corrente. Per esempio, pu@`o non esserci l'elemento @code{st_blksize} nella
-struttura @code{stat}. In questo caso, @samp{HAVE_STRUCT_STAT_ST_BLKSIZE} @`e
-indefinito.
-
-@cindex @code{custom.h}, file
-@`E possible che il compilatore C del sistema in uso "tragga in inganno"
-@command{configure}. Pu@`o succedere nel caso in cui non viene restituito
-un errore se una funzione di libreria non @`e disponibile. Per superare questo
-problema, si pu@`o modificare il file @file{custom.h}. Basta usare una direttiva
-@samp{#ifdef} appropriata per il sistema corrente, e definire, tramite
-@code{#define}, tutte le costanti che @command{configure} avrebbe dovuto
-definire, ma non @`e riuscito a farlo, oppure, usando @code{#undef} annullare le
-costanti che @command{configure} ha definito, ma non avrebbe dovuto farlo. Il
-file @file{custom.h} @`e automaticamente incluso dal file @file{config.h}.
-
-@`E anche possibile che il programma @command{configure} generato da Autoconf non
-funzioni in un dato sistema per una ragione differente. Se c'@`e un problema, si
-tenga presente che il file @file{configure.ac} @`e quello preso in input da
-Autoconf. @`E possibile modificare questo file e generare una nuova versione di
-@command{configure} che funzioni sul sistema corrente (@pxref{Bug} per
-informazioni su come segnalare problemi nella configurazione di
-@command{gawk}). Lo stesso meccanismo si pu@`o usare per inviare aggiornamenti
-al file @file{configure.ac} e/o a @file{custom.h}.
-
-@node Installazione non-Unix
-@appendixsec Installazione su altri Sistemi Operativi
-
-Questa @value{SECTION} descrive come installare @command{gawk} su
-vari sistemi non-Unix.
-
-@menu
-* Installazione su PC:: Installare e compilare @command{gawk}
- su Microsoft Windows.
-* Installazione su VMS:: Installare @command{gawk} su VMS.
-@end menu
-
-@node Installazione su PC
-@appendixsubsec Installazione su MS-Windows
-
-@cindex PC, @command{gawk} su sistemi operativi
-@cindex sistemi operativi per PC, @command{gawk} su
-@cindex installare @command{gawk} su sistemi operativi per PC
-Questa @value{SECTION} tratta dell'installazione e uso di @command{gawk}
-su macchine con architettura Intel che eseguono qualsiasi versione di
-MS-Windows.
-In questa @value{SECTION}, il termine ``Windows32''
-si riferisce a una qualsiasi versione di Microsoft Windows
-95/98/ME/NT/2000/XP/Vista/7/8/10.
-
-Si veda anche il file @file{README_d/README.pc} nella distribuzione.
-
-@menu
-* Installazione binaria su PC:: Installare una distribuzione pronta
- all'uso.
-* Compilazione su PC:: Compilare @command{gawk} per Windows32.
-* Uso su PC:: Eseguire @command{gawk} su Windows32.
-* Cygwin:: Compilare ed eseguire @command{gawk}
- per Cygwin.
-* MSYS:: Usare @command{gawk} nell'ambiente MSYS.
-@end menu
-
-@node Installazione binaria su PC
-@appendixsubsubsec Installare una distribuzione predisposta per sistemi MS-Windows
-
-La sola distribuzione binaria predisposta supportata per i sistem MS-Windows
-@`e quella messa a disposizione da Eli Zaretskii
-@uref{https://sourceforge.net/projects/ezwinports/, progetto ``ezwinports''}.
-Si parta da l@`{@dotless{i}} per installare il comando @command{gawk} precompilato.
-
-@node Compilazione su PC
-@appendixsubsubsec Compilare @command{gawk} per sistemi operativi di PC
-
-@command{gawk} pu@`o essere compilato per Windows32, usando MinGW
-(per Windows32).
-Il file @file{README_d/README.pc} nella distribuzione @command{gawk}
-contiene ulteriori annotazioni, e il file @file{pc/Makefile} contiene
-informazioni importanti sulle opzioni di compilazione.
-
-@cindex compilare @command{gawk} per MS-Windows
-Per compilare @command{gawk} per Windows32, occorre copiare i file
-dalla directory @file{pc} (@emph{tranne} il file @file{ChangeLog}) alla
-directory che contiene il resto dei sorgenti di @command{gawk}, e quindi
-chiamare @command{make}, specificando il nome appropriato di obiettivo come
-argomento, per generare @command{gawk}. Il @file{Makefile} copiato dalla
-directory @file{pc} contiene una sezione di configurazione con commenti, e pu@`o
-essere necessario modificarlo perch@'e funzioni con il programma di utilit@`a
-@command{make} corrente.
-
-Il @file{Makefile} contiene un certo numero di alternative, che permettono di
-generare @command{gawk} per diverse
-versioni MS-DOS e Windows32. Se il comando @command{make} @`e richiamato senza
-specificare alcun argomento viene stampata una lista delle alternative
-disponibili. Per esempio,
-per generare un codice binario di @command{gawk} nativo per MS-Windows
-usando gli strumenti MinGW, scrivere @samp{make mingw32}.
-
-@node Uso su PC
-@appendixsubsubsec Usare @command{gawk} su sistemi operativi PC
-@cindex PC, @command{gawk} su sistemi operativi
-@cindex sistemi operativi PC, @command{gawk} su
-
-Sotto MS-Windows, gli ambienti Cygwin e MinGW consentono di usare
-sia l'operatore @samp{|&} che le operazioni su rete TCP/IP
-(@pxref{Reti TCP/IP}).
-
-@cindex percorso di ricerca
-@cindex percorso di ricerca per file sorgente
-@cindex @command{gawk}, versione MS-Windows di
-@cindex @code{;} (punto e virgola), @env{AWKPATH} variabile e
-@cindex punto e virgola (@code{;}), @env{AWKPATH} variabile e
-@cindex @env{AWKPATH}, variabile d'ambiente
-@cindex variabile d'ambiente @env{AWKPATH}
-Le versioni MS-Windows di @command{gawk} ricercano i file di
-programma come descritto in @ref{AWKPATH (Variabile)}. Comunque, gli elementi
-della variabile @env{AWKPATH} sono separati tra di loro da un punto e virgola
-(anzich@'e da due punti (@code{:})).
-Se @env{AWKPATH} @`e non impostata o ha per valore la stringa nulla, il percorso
-di ricerca di default @`e @samp{@w{.;c:/lib/awk;c:/gnu/lib/awk}}.
-
-@cindex estensioni comuni, variabile @code{BINMODE}
-@c @cindex extensions, common@comma{} @code{BINMODE} variable
-@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
-@cindex @code{BINMODE}, variabile
-@cindex variabile @code{BINMODE}
-Sotto MS-Windows,
-@command{gawk} (come molti altri programmi di trattamento testi) converte
-automaticamente la stringa di fine riga @samp{\r\n} in @samp{\n} leggendo dall'input
-e @samp{\n} in @samp{\r\n} scrivendo sull'output.
-La variabile speciale @code{BINMODE} @value{COMMONEXT} permette di controllare
-come avvengono queste conversioni, ed @`e interpretata come segue:
-
-@itemize @value{BULLET}
-@item
-Se @code{BINMODE} @`e @code{"r"} o uno,
-la modalit@`a binaria @`e impostata
-in lettura (cio@`e, nessuna conversione in lettura).
-
-@item
-Se @code{BINMODE} @`e @code{"w"} o due,
-la modalit@`a binaria @`e impostata
-in scrittura (cio@`e, nessuna conversione in scrittura).
-
-@item
-Se @code{BINMODE} @`e @code{"rw"} o @code{"wr"} o tre,
-la modalit@`a binaria @`e impostata sia in lettura che in scrittura.
-
-@item
-@code{BINMODE=@var{stringa-non-nulla}} equivale a specificare
-@samp{BINMODE=3} (cio@`e, nessuna conversione in
-lettura e scrittura). Tuttavia, @command{gawk} emette un messaggio di
-avviso se la stringa non @`e @code{"rw"} o @code{"wr"}.
-@end itemize
-
-@noindent
-La modalit@`a di trattamento dello standard input e standard output sono
-impostate una volta sola
-(dopo aver letto la riga di comando, ma prima di iniziare a elaborare
-qualsiasi programma @command{awk}).
-L'impostazione di @code{BINMODE} per standard input o
-standard output va fatta usando
-un'appropriata opzione @samp{-v BINMODE=@var{N}} sulla riga di comando.
-@code{BINMODE} @`e impostato nel momento in cui un file o @dfn{pipe} @`e aperto
-e non pu@`o essere cambiato in corso di elaborazione.
-
-Il nome @code{BINMODE} @`e stato scelto in analogia con @command{mawk}
-(@pxref{Altre versioni}).
-@command{mawk} e @command{gawk} gestiscono @code{BINMODE} in maniera simile;
-tuttavia, @command{mawk} prevede un'opzione @samp{-W BINMODE=@var{N}} e una
-variabile d'ambiente che pu@`o impostare @code{BINMODE}, @code{RS}, e @code{ORS}.
-I file @file{binmode[1-3].awk} (nella directory @file{gnu/lib/awk} in alcune
-delle distribuzioni binarie gi@`a predisposte) sono stati inclusi per rendere
-disponibile l'opzione di @command{mawk} @samp{-W BINMODE=@var{N}}. Questi
-possono essere modificati o ignorati; in particolare, quale sia l'impostazione
-di @code{RS} che d@`a meno ``sorprese'' rimane una questione aperta.
-@command{mawk} usa @samp{RS = "\r\n"} se si imposta la modalit@`a binaria in
-lettura, il che @`e appropriato per file che abbiano i caratteri di fine riga in
-stile MS-DOS.
-
-Per chiarire, gli esempi seguenti impostano la modalit@`a binaria in
-scrittura per lo standard output e altri file, e impostano @code{ORS} in modo
-da ottenere la fine riga ``normale'' in stile MS-DOS:
-
-@example
-gawk -v BINMODE=2 -v ORS="\r\n" @dots{}
-@end example
-
-@noindent
-o:
-
-@example
-gawk -v BINMODE=w -f binmode2.awk @dots{}
-@end example
-
-@noindent
-Questi comandi danno lo stesso risultato dell'opzione
-@samp{-W BINMODE=2} in @command{mawk}.
-Quanto segue modifica il separatore di record a @code{"\r\n"} e imposta
-la modalit@`a binaria in lettura, senza modificare le letture da standard input:
-
-@example
-gawk -v RS="\r\n" -e "BEGIN @{ BINMODE = 1 @}" @dots{}
-@end example
-
-@noindent
-o:
-
-@example
-gawk -f binmode1.awk @dots{}
-@end example
-
-@noindent
-Usando i caratteri di protezione appropriati, nel primo
-esempio l'impostazione di @code{RS} pu@`o essere spostata in una regola
-@code{BEGIN}.
-
-@node Cygwin
-@appendixsubsubsec Usare @command{gawk} in ambiente Cygwin
-@cindex compilare @command{gawk} per Cygwin
-@cindex Cygwin, compilare @command{gawk} per
-
-@command{gawk} pu@`o essere compilato e usato ``cos@`{@dotless{i}} com'@`e'' sotto MS-Windows se
-si opera all'interno dell'ambiente @uref{http://www.cygwin.com, Cygwin}.
-Questo ambiente consente un'eccellente simulazione di GNU/Linux, con l'uso di
-Bash, GCC, GNU Make, e altri programmi GNU. La compilazione e l'installazione
-per Cygwin @`e la stessa usata nei sistemi di tipo Unix:
-
-@example
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-cd gawk-@value{VERSION}.@value{PATCHLEVEL}
-./configure
-make && make check
-@end example
-
-In confronto a un sistema GNU/Linux sulla stessa macchina, l'esecuzione
-del passo di @samp{configure} sotto Cygwin richiede molto pi@`u tempo. Tuttavia
-si conclude regolarmente, e poi @samp{make} funziona come ci si aspetta.
-
-@node MSYS
-@appendixsubsubsec Usare @command{gawk} in ambiente MSYS
-
-Nell'ambiente MSYS sotto MS-Windows, @command{gawk} automaticamente usa la
-modalit@`a binaria per leggere e scrivere file. Non @`e quindi necessario usare la
-variabile @code{BINMODE}.
-
-Questo pu@`o causare problemi con altri componenti di tipo Unix che sono stati
-resi disponibile in MS-Windows, che si aspettano che @command{gawk} faccia
-automaticamente la conversione di @code{"\r\n"}, mentre cos@`{@dotless{i}} non @`e.
-
-@node Installazione su VMS
-@appendixsubsec Compilare e installare @command{gawk} su Vax/VMS e 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}, versione VMS di
-@cindex installare @command{gawk} su VMS
-@cindex VMS, installare @command{gawk} su
-Questa @value{SUBSECTION} descrive come compilare e installare @command{gawk}
-sotto VMS. Il termine classico ``VMS'' @`e usato qui anche 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.
-* Vecchio Gawk su VMS:: Una versione non aggiornata arriva
- con alcune versioni di VMS.
-@end menu
-
-@node Compilazione su VMS
-@appendixsubsubsec Compilare @command{gawk} su VMS
-@cindex compilare @command{gawk} per VMS
-@cindex VMS, compilare @command{gawk} per
-
-Per compilare @command{gawk} sotto VMS, 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}. A partire della directory che contiene i file sorgente, si usi:
-
-@example
-$ @kbd{@@[.vms]vmsbuild.com}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
-@end example
-
-Il comando @command{MMK} @`e un quasi-clone, a codice aperto e gratuito, di
-@command{MMS}, che gestisce in maniera migliore i volumi ODS-5 con @value{FNS}
-a caratteri maiuscoli e minuscoli. @command{MMK} @`e disponibile da
-@uref{https://github.com/endlesssoftware/mmk}.
-
-Avendo a che fare con volumi ODS-5 e con l'analisi sintattica estesa abilitata,
-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 sotto VAX/VMS 7.3 e Alpha/VMS 7.3-1 usando il
-compilatore Compaq C V6.4, e sotto Alpha/VMS 7.3, Alpha/VMS 7.3-2, e IA64/VMS
-8.3. Le compilazioni pi@`u recenti hanno usato il compilatore HP C V7.3 su Alpha
-VMS 8.3 e su VMS 8.4, sia Alpha che IA64, hanno usato il compilatore HP C
-7.3.@footnote{L'architettura IA64 @`e anche nota come ``Itanium''.}
-
-@xref{GNV su VMS} 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
-
-Le estensioni che sono state rese disponibile su VMS possono essere
-costruite dando uno dei comandi seguenti:
-
-@example
-$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms extensions}
-@end example
-
-@noindent
-o:
-
-@example
-$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms extensions}
-@end example
-
-@command{gawk} usa @code{AWKLIBPATH} come una variabile d'ambiente
-oppure come un nome logico per trovare le estensioni dinamiche.
-
-Le estensioni dinamiche devono essere compilate con le stesse opzioni del
-compilatore usate per compilare @command{gawk} riguardanti numeri in virgola
-mobile, dimensione dei puntatori e trattamento dei nomi simbolici. I computer
-con architettura Alpha e Itanium dovrebbero usare i numeri in virgola mobile
-col formato IEEE. La dimensione dei puntatori @`e 32 bit, e il trattamento dei nomi
-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
-/name=(as_is,short)
-/float=ieee/ieee_mode=denorm_results
-@end example
-
-Per VAX:
-
-@example
-/name=(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:
-
-@example
-#if (__CRTL_VER >= 70200000) && !defined (__VAX)
-#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.
-
-@node Dettagli installazione su VMS
-@appendixsubsubsec Installare @command{gawk} su VMS
-
-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.
-Per esempio:
-
-@example
-$ @kbd{GAWK :== $disk1:[gnubin]gawk}
-@end example
-
-@noindent
-Si sostituisca la posizione corrente di @command{gawk.exe} a
-@samp{$disk1:[gnubin]}. Il simbolo dovrebbe essere posto nel file
-@file{login.com} di ogni utente che desideri eseguire @command{gawk},
-in modo che sia definito ogni volta che l'utente inizia una sessione.
-Alternativamente, il simbolo pu@`o essere messo nella procedura di sistema
-@file{sylogin.com},
-in modo da permettere a tutti gli utenti di eseguire @command{gawk}.
-
-Se @command{gawk} @`e stato installato da un kit PCSI nell'albero di
-directory @file{GNV$GNU:}, il programma avr@`a come nome
-@file{GNV$GNU:[bin]gnv$gawk.exe}, e il file di aiuto sar@`a chiamato
-@file{GNV$GNU:[vms_help]gawk.hlp}.
-
-Il kit PCSI installa anche un file @file{GNV$GNU:[vms_bin]gawk_verb.cld}
-che pu@`o essere usato per aggiungere @command{gawk} e @command{awk}
-alla lista dei comandi DCL.
-
-Per farlo solo nella sessione corrente si pu@`o usare:
-
-@example
-$ @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
-aggiungere @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:
-
-@example
-$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
-@end example
-
-@noindent
-(Una libreria specifica dell'installazione potrebbe venir usata invece
-della libreria standard VMS library @samp{HELPLIB}.) Dopo aver installato
-il testo di aiuto, il comando:
-
-@example
-$ @kbd{HELP GAWK}
-@end example
-
-@noindent
-fornisce informazioni sia sull'implementazione di @command{gawk}
-sia sul linguaggio di programmazione @command{awk}.
-
-Il nome logico @samp{AWK_LIBRARY} pu@`o designare una posizione di default per i
-file di programma @command{awk}. Riguardo all'opzione @option{-f}, se il
-@value{FN} specificato non contiene un dispositivo o un percorso di directory,
-@command{gawk} cerca dapprima nella directory corrente, poi nella directory
-specificata dalla traduzione di @samp{AWK_LIBRARY} se il file non @`e stato
-trovato. Se, dopo aver cercato in entrambe queste directory, il file non @`e
-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
-
-L'elaborazione della riga di comando e le convenzioni per proteggere i
-caratteri sono significativamente differenti in VMS, 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.
-
-Ecco un paio di semplici test:
-
-@example
-$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"}
-$ @kbd{gawk -"W" version}
-! ma anche -"W version" o "-W version"
-@end example
-
-@noindent
-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,
-e l'opzione @option{--} pu@`o essere omessa.
-
-@cindex exit, codice di ritorno, in VMS
-Il valore di @code{exit} @`e un valore in stile Unix e viene trasformato in
-una condizione VMS 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
-@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
-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:
-
-@example
-unix_status = (vms_status .and. %x7f8) / 8
-@end example
-
-@noindent
-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 in virgola mobile, VAX/VMS
-@cindex VAX/VMS, 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.
-
-@c @cindex directory search
-@c @cindex path, search
-@cindex percorso di ricerca
-@cindex percorso di ricerca per file sorgente
-Il percorso di ricerca di default, nella ricerca dei file di programma per
-@command{awk} specificati dall'opzione @option{-f}, @`e
-@code{"SYS$DISK:[],AWK_LIBRARY:"}. Il nome logico @env{AWKPATH} pu@`o essere
-usato per sostituire questo di default. Il formato di @env{AWKPATH} @`e una lista
-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
-
-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
-esegua un file di comandi, prima di invocare @command{gawk}.
-(Questa restrizione potrebbe essere rimossa in una futura versione di
-@command{gawk} per VMS.)
-
-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
-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}.
-
-@example
-$ sort = "@@device:[dir]vms_gawk_sort.com"
-@end example
-
-Il file di comandi deve avere il formato dell'esempio seguente.
-
-La prima riga serve a evitare che i dati in input siano presenti anche
-nell'output. Dev'essere nel formato mostrato nell'esempio.
-
-La riga seguente crea un comando esterno che prevale sul comando esterno
-superiore, che serve a prevenire una ricorsione infinita di file di comandi.
-
-Il penultimo comando ridirige @code{sys$input} su @code{sys$command},
-per poter ottenere i dati che sono ridiretti verso il comando.
-
-L'ultima riga esegue il comando vero e proprio. Dev'essere l'ultimo
-comando, perch@'e i dati ridiretti da @command{gawk} saranno letti
-quando il file di comandi finisce di essere eseguito.
-
-@example
-$!'f$verify(0,0)'
-$ sort := sort
-$ define/user sys$input sys$command:
-$ sort sys$input: sys$output:
-@end example
-
-
-@node GNV su VMS
-@appendixsubsubsec Il progetto VMS GNV
-
-Il pacchetto VMS 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
-di offrire pacchetti PCSI separati per ogni componente.
-Si veda @w{@uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.}
-
-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.
-
-@ignore
-@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
-@c and building gawk for it has not been tested in many years, but these
-@c old instructions might still work if anyone is still using it.
-
-@node VMS POSIX
-@appendixsubsubsec Compilare e usare @command{gawk} su VMS POSIX
-
-Le istruzioni appena viste vanno ignorate, sebbene @file{vms/gawk.hlp}
-dovrebbe ancora essere reso disponibile in una libreria di aiuto.
-L'albero del codice sorgente dovrebbe essere scompattato in un sottosistema
-contenitore di file, e non nel normale @dfn{filesystem} VMS.
-Occorre accertarsi che i due script, @file{configure} e
-@file{vms/posix-cc.sh}, siano eseguibile; si usi @samp{chmod +x} per farlo,
-se necessario. Poi vanno eseguiti i seguenti due comandi:
-
-@example
-psx> @kbd{CC=vms/posix-cc.sh configure}
-psx> @kbd{make CC=c89 gawk}
-@end example
-
-@noindent
-Il primo comando costruisce i file @file{config.h} e @file{Makefile},
-a partire da dei modelli, usando uno script per fare s@`{@dotless{i}} che il
-compilatore C soddisfi le aspettative di @command{configure}. Il secondo
-comando compila e collega @command{gawk} chiamando direttamente il
-compilatore C; gli eventuali messaggi di @command{make} che dicono di non
-riuscire a ridefinire @code{CC} vanno ignorati. @command{configure}
-impiega molto tempo a completarsi, ma in compenso continua a fornire
-messaggi che permettono di seguirne l'avanzamento.
-
-Questo @`e stato testato con VAX/VMS V6.2, VMS POSIX V2.0, e DEC C V5.2.
-
-Una volta installato, @command{gawk} funziona come ogni altro programma
-di utilit@`a della shell. A differenza della normale versione VMS di
-@command{gawk}, neesuna manipolazione speciale della riga di comando @`e
-necessaria nell'ambiente VMS POSIX.
-@end ignore
-
-@node Vecchio Gawk su VMS
-@appendixsubsubsec Vecchia versione di @command{gawk} su sistemi VMS
-
-
-@c Thanks to "gerard labadie" <gerard.labadie@gmail.com>
-
-Alcune versioni di VMS includono una vecchia versione di @command{gawk}.
-Per utilizzarla, occorre definire un simbolo, come segue:
-
-@example
-$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe}
-@end example
-
-La versione appare essere la @value{PVERSION} 2.15.6, che @`e molto vecchia.
-Si raccomanda di compilare e usare la versione corrente.
-
-@node Bug
-@appendixsec Segnalazione di problemi e bug
-@cindex archeologi
-@quotation
-@i{Non c'@`e niente di pi@`u pericoloso di un archeologo annoiato.}
-@author Douglas Adams, @cite{Guida galattica per autostoppisti}
-@end quotation
-@c the radio show, not the book. :-)
-
-@cindex debug, @command{gawk}, segnalare bug
-@cindex risoluzione problemi @command{gawk}, segnalare bug
-Se si incontrano problemi con @command{gawk} o se si ritiene di aver trovato un
-bug, si raccomanda di segnalarlo agli sviluppatori;
-non c'@`e un impegno preciso a intervenire, ma c'@`e una buona possibilit@`a che ci
-si sforzi di risolverlo.
-
-@menu
-* Indirizzo Bug:: Dove inviare le segnalazioni.
-* Usenet:: Dove non inviare le segnalazioni.
-* Manutentori:: Manutentori di version non-*nix.
-@end menu
-
-@node Indirizzo Bug
-@appendixsubsec Segnalare Bug
-
-Prima di segnalare un bug, occorre assicurarsi che sia davvero un bug. La
-documentazione va riletta attentamente, per controllare se dice che @`e possibile
-fare quel che si sta tentando di fare. Se non @`e chiaro se sia possibile
-fare quella particolare cosa o no, occorre segnalarlo; in questo caso si tratta
-di un bug nella documentazione!
-
-Prima di segnalare un bug o di tentare di risolverlo personalmente, si tenti
-di isolarlo preparando un programma @command{awk} il pi@`u piccolo possibile, con
-un @value{DF} in input che possa riprodurre il problema. Dopo averlo fatto, si
-spedisca il programma e il @value{DF}, insieme a informazioni sul tipo di
-sistema Unix in uso, il compilatore usato per compilare @command{gawk}, e i
-risultati esatti che @command{gawk} ha prodotto. Inoltre andrebbe specificato
-cosa ci si aspettava che il programma facesse; questo @`e di aiuto per decidere
-se il problema @`e un problema di documentazione.
-
-@`E importante includere il numero di versione di @command{gawk} in uso.
-Questa informazione si pu@`o ottenere con il comando @samp{gawk --version}.
-
-@cindex @code{bug-gawk@@gnu.org} indirizzo per la segnalazione dei bug
-@cindex email, indirizzo per segnalare bug, @code{bug-gawk@@gnu.org}
-@cindex indirizzo email per segnalare bug, @code{bug-gawk@@gnu.org}
-@cindex bug, segnalare, indirizzo email, @code{bug-gawk@@gnu.org}
-@cindex segnalare bug, indirizzo email, @code{bug-gawk@@gnu.org}
-Una volta pronta la descrizione precisa del problema, si spedisca un messaggio
-di posta elettronica a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-I manutentori di @command{gawk} sono i destinatari, e riceveranno la
-segnalazione di errore. Sebbene sia possibile spedire messaggi direttamente ai
-manutentori, @`e preferibile usare l'indirizzo sopra fornito perch@'e quella
-mailing list rimane in archivio presso il Progetto GNU. @emph{Tutti i messaggi
-devono essere in inglese. @`E questo il solo linguaggio che tutti i manutentori
-conoscono.} Inoltre, occorre accertarsi di spedire tutti i messaggi in formato
-@emph{testo}, e non (o non soltanto) in formato HTML.
-
-@quotation NOTA
-Molte distribuzioni di GNU/Linux e i vari sistemi operativi basati su
-BSD hanno un loro proprio canale per segnalare i bug. Se si segnala un
-bug usando il canale della distribuzione, una copia del messaggio andrebbe
-inviata anche a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-Questo per due ragioni. La prima @`e che, sebbene alcune distribuzioni inoltrino
-i messaggi sui problemi ``verso l'alto'' alla mailing list GNU, molte non lo
-fanno, e quindi c'@`e una buona probabilit@`a che i manutentori di @command{gawk}
-non vedano affatto il messaggio relativo al bug! La seconda ragione @`e che la
-posta diretta alla mailing list GNU @`e archiviata, e il poter disporre di ogni
-cosa all'interno del progetto GNU consente di avere a disposizione tutte le
-informazioni rilevanti senza dover dipendere da altre organizzazioni.
-@end quotation
-
-Suggerimenti non correlati a bug sono pure sempre benvenuti. Se si hanno
-domande riguardo a qualcosa di non chiaro nella documentazione o a proposito
-di funzionalit@`a oscure, si scriva alla mailing list dei bug; si prover@`a
-a essere di aiuto nei limiti del possibile.
-
-@node Usenet
-@appendixsubsec Non segnalare bug a USENET!
-
-@quotation
-@c Date: Sun, 17 May 2015 19:50:14 -0400
-@c From: Chet Ramey <chet.ramey@case.edu>
-@c Reply-To: chet.ramey@case.edu
-@c Organization: ITS, Case Western Reserve University
-@c To: Aharon Robbins <arnold@skeeve.com>
-@c CC: chet.ramey@case.edu
-Ho iniziato a ignorare Usenet un paio di anni fa, e non me ne sono mai
-pentito. @`E come quando si parla di sport alla radio---ci si sente
-pi@`u intelligenti per aver lasciato perdere.
-@author Chet Ramey
-@end quotation
-
-@cindex @code{comp.lang.awk} gruppo di discussione
-@cindex newsgroup @code{comp.lang.awk}
-@cindex gruppo di discussione @code{comp.lang.awk}
-Siete pregati di @emph{non} provare a notificare bug di @command{gawk}
-scrivendo al gruppo di discussione Usenet/Internet @code{comp.lang.awk}.
-Sebbene alcuni degli sviluppatori di @command{gawk} leggano talora i
-messaggi di questo gruppo di discussione, il manutentore principale di
-@command{gawk} non lo fa pi@`u. Quindi @`e praticamente certo che un
-messaggio inviato l@`a @emph{non} sia da lui letto.
-La procedura qui descritta @`e la sola maniera ufficialmente riconosciuta
-per notificare problemi. Davvero!
-
-@ignore
-And another one:
-
-Date: Thu, 11 Jun 2015 09:00:56 -0400
-From: Chet Ramey <chet.ramey@case.edu>
-
-My memory was imperfect. Back in June 2009, I wrote:
-
-"That's the nice thing about open source, right? You can take your ball
-and run to another section of the playground. Then, if you like mixing
-metaphors, you can throw rocks from there."
-@end ignore
-
-@node Manutentori
-@appendixsubsec Notificare problemi per versioni non-Unix
-
-Se si riscontrano bug in una delle versioni non-Unix di @command{gawk}, una
-copia del messaggio inviato alla mailing list dei bug andrebbe spedita alla
-persona che si occupa di quella versione. I manutentori sono elencati nella
-lista seguente, come pure nel file @file{README} nella distribuzione
-@command{gawk}. Le informazioni nel file @file{README} dovrebbero essere
-considerate come le pi@`u aggiornate, se risultano in conflitto con questo
-@value{DOCUMENT}.
-
-Le persone che si occupano delle varie versioni di @command{gawk} sono:
-
-@c put the index entries outside the table, for docbook
-@cindex Buening, Andreas
-@cindex Deifik, Scott
-@cindex Malmberg, John E.
-@cindex Pitts, Dave
-@cindex G., Daniel Richard
-@cindex Robbins, Arnold
-@cindex Zaretskii, Eli
-@ifset SMALLPRINT
-@multitable {MS-Windows} {123456789012345678901234567890123456789001234567890}
-@end ifset
-@ifclear SMALLPRINT
-@multitable {MS-Windows con MinGW} {123456789012345678901234567890123456789001234567890}
-@end ifclear
-@item Unix e sistemi POSIX @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}
-
-@c @item MS-DOS con DJGPP @tab Scott Deifik, @EMAIL{scottd.mail@@sbcglobal.net,scottd dot mail at sbcglobal dot net}
-
-@item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}
-
-@c Leave this in the document on purpose.
-@c OS/2 is not mentioned anywhere else though.
-@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}
-
-@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net}
-
-@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG}
-@item @tab Dave Pitts (Maintainer Emeritus), @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}
-@end multitable
-
-Se il problema riscontrato @`e riproducibile anche sotto Unix,
-si dovrebbe spedire una copia del messaggio anche alla mailing list
-@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
-
-La versione generata usando gli strumenti DJGPP non @`e pi@`u supportata;
-il codice relativo rester@`a nella distribuzione ancora per qualche tempo,
-nel caso che qualche volontario desideri prenderla in carico.
-Se questo non dovesse succedere, la parte di codice relativa questa
-versione sar@`a rimossa dalla distribuzione.
-
-@node Altre versioni
-@appendixsec Altre implementazioni di @command{awk} liberamente disponibili
-@cindex @command{awk}, implementazioni di
-@cindex implementazioni di @command{awk}
-@ignore
-From: emory!amc.com!brennan (Michael Brennan)
-Subject: C++ comments in awk programs
-To: arnold@gnu.ai.mit.edu (Arnold Robbins)
-Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT)
-
-@end ignore
-@cindex Brennan, Michael
-@ifnotdocbook
-@quotation
-@i{@`E piuttosto divertente mettere commenti simili nel vostro codice awk:}@*
-@ @ @ @ @ @ @code{// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo}
-@author Michael Brennan
-@end quotation
-@end ifnotdocbook
-
-@docbook
-<blockquote><attribution>Michael Brennan</attribution>
-<literallayout><emphasis>
-@`E piuttosto divertente mettere commenti simili nel vostro codice awk.
-</emphasis>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<literal>
-// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo
-</literal></literallayout>
-</blockquote>
-@end docbook
-
-Ci sono alcune altre implementazioni di @command{awk} disponibili
-gratuitamente.
-Questa @value{SECTION} descrive in breve dove @`e possibile trovarle:
-
-@table @asis
-@cindex Kernighan, Brian
-@cindex sorgente, codice, Brian Kernighan @command{awk}
-@cindex codice sorgente, Brian Kernighan @command{awk}
-@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
-@cindex Brian Kernighan, @command{awk} di, codice sorgente
-@item Unix @command{awk}
-Brian Kernighan, uno degli sviluppatori originali di Unix @command{awk},
-ha reso disponibile liberamente la sua implementazione di @command{awk}.
-Si pu@`o scaricare questa versione dalla
-@uref{http://www.cs.princeton.edu/~bwk, sua pagina principale}.
-@`E disponibile in parecchi formati compressi:
-
-@table @asis
-@item Archivio Shell
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.shar}
-
-@item File @command{tar} compresso
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.tar.gz}
-
-@item File Zip
-@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.zip}
-@end table
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-@`E anche disponbile in GitHub:
-
-@example
-git clone git://github.com/onetrueawk/awk bwkawk
-@end example
-
-@noindent
-Questo comando crea una copia del deposito @uref{http://git-scm.com, Git}
-in una directory chiamata @file{bwkawk}. Se si omette questo argomento della
-riga di comando @command{git}, la copia del deposito @`e creata nella
-directory di nome @file{awk}.
-
-Questa versione richiede un compilatore ISO C (standard 1990); il compilatore
-C contenuto in GCC (la collezione di compilatori GNU) @`e pi@`u che sufficiente.
-
-@xref{Estensioni comuni}
-per una lista di estensioni in questo @command{awk} che non sono in
-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}.
-
-@cindex Brennan, Michael
-@cindex @command{mawk}, programma di utilit@`a
-@cindex programma di utilit@`a @command{mawk}
-@cindex codice sorgente, @command{mawk}
-@item @command{mawk}
-Michael Brennan ha scritto un'implementazione indipendente di @command{awk},
-di nome @command{mawk}. @`E disponibile sotto la licenza
-@ifclear FOR_PRINT
-GPL (@pxref{Copia}),
-@end ifclear
-@ifset FOR_PRINT
-GPL,
-@end ifset
-proprio come @command{gawk}.
-
-Il sito di distribuzione originale di @command{mawk} non contiene pi@`u
-il codice sorgente. Una copia @`e disponibile in
-@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}.
-
-Dal 2009 @`e Thomas Dickey a occuparsi della manutenzione di @command{mawk}.
-Le informazioni di base sono disponibili nella
-@uref{http://www.invisible-island.net/mawk, pagine web del progetto}.
-Il puntatore URL da cui scaricare @`e
-@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}.
-
-Una volta scaricato,
-per scompattare questo file pu@`o essere usato @command{gunzip}.
-L'installazione @`e simile a quella di @command{gawk}
-(@pxref{Installazione Unix}).
-
-@xref{Estensioni comuni}
-per una lista di estensioni in @command{mawk} che non sono in POSIX @command{awk}.
-
-@cindex Sumner, Andrew
-@cindex @command{awka}, compilatore per @command{awk}
-@cindex compilatore per @command{awk}, @command{awka}
-@cindex sorgente, codice, @command{awka}
-@cindex codice sorgente di @command{awka}
-@item @command{awka}
-Scritto da Andrew Sumner,
-@command{awka} traduce i programmi @command{awk} in C, li compila,
-e prepara il codice eseguibile usando una libreria di funzioni che
-implementano le funzionalit@`a di base di @command{awk}.
-Comprende anche un certo numero di estensioni.
-
-Il traduttore di @command{awk} @`e rilasciato sotto la licenza GPL, e la
-relativa libreria sotto la licenza LGPL.
-
-Per ottenere @command{awka}, si visiti
-il sito @url{http://sourceforge.net/projects/awka}.
-@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}.
-@c andrewsumner@@yahoo.net
-
-Il progetto sembra essere stato congelato; non ci sono state modifiche nel
-codice sorgente dal 2001 circa.
-
-@cindex Beebe, Nelson H.F.@:
-@cindex @command{pawk} (versione con profilatura di Brian Kernighan @command{awk})
-@cindex codice sorgente, @command{pawk}
-@cindex sorgente, codice, @command{pawk}
-@item @command{pawk}
-Nelson H.F.@: Beebe all'Universit@`a dello Utah ha modificato
-BWK @command{awk} per fornire informazioni di temporizzazione e profilatura.
-Questo @`e differente dall'usare @command{gawk} con l'opzione @option{--profile}
-(@pxref{Profilare})
-nel senso che fornisce un profilo basato sul consumo di CPU, non sul
-numero di esecuzioni di una data riga di codice.
-Sia pu@`o trovare sia in
-@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}
-che in
-@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}.
-
-@item BusyBox @command{awk}
-@cindex BusyBox Awk
-@cindex codice sorgente, BusyBox Awk
-@cindex sorgente, codice, BusyBox Awk
-BusyBox @`e un programma distribuito con licenza GPL che fornisce versioni
-ridotte di parecchie piccole applicazioni, all'interno di un singolo modulo
-eseguibile. @`E stato ideato per sistemi
-integrati.
-Include un'implementazione completa di POSIX @command{awk}. Quando lo si
-compila occorre prestare attenzione a non eseguire @samp{make install}, perch@'e
-in questo modo si andrebbero a sostituire copie di altre applicazioni nella
-directory @file{/usr/local/bin} del sistema corrente. Per ulteriori
-informazioni, si veda @uref{http://busybox.net, la pagina principale del progetto}.
-
-@cindex OpenSolaris
-@cindex Solaris, versione POSIX @command{awk}
-@cindex codice sorgente, Solaris @command{awk}
-@cindex sorgente, codice, Solaris @command{awk}
-@item POSIX @command{awk} per OpenSolaris
-Le versioni di @command{awk} in @file{/usr/xpg4/bin} e @file{/usr/xpg6/bin} su
-Solaris sono @dfn{grosso modo} conformi allo standard POSIX. Sono basate sul
-comando @command{awk} preparato per i PC dalla ditta Mortice Kern. @`E stato
-possibile compilare e far funzionare questo codice sotto GNU/Linux dopo 1--2
-ore di lavoro. Rendere questo codice pi@`u generalmente portabile (usando gli
-strumenti GNU Autoconf e/o Automake) richiederebbe ulteriore lavoro, che non @`e
-stato fin qui compiuto, almeno per quel che risulta a chi scrive.
-
-@cindex Illumos
-@cindex Illumos, @command{awk} conforme a POSIX e
-@cindex codice sorgente, Illumos @command{awk}
-@cindex sorgente, codice, Illumos @command{awk}
-Il codice sorgente era un tempo disponibile dal sito web OpenSolaris.
-Tuttavia, il progetto @`e terminato, e il sito web chiuso. Fortunatamente,
-il progetto
-@uref{http://wiki.illumos.org/display/illumos/illumos+Home, Illumos}
-mette a disposizione questa implementazione. Si possono vedere i singoli file in
-@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
-
-@cindex @command{jawk}
-@cindex Java, implementazione di @command{awk}
-@cindex implementazione Java di @command{awk}
-@cindex codice sorgente, @command{jawk}
-@cindex sorgente, codice, @command{jawk}
-@item @command{jawk}
-Questo @`e un interprete per @command{awk} scritto in Java. Dichiara di
-essere un interprete completo, anche se, poich@'e usa funzionalit@`a di Java
-per l'I/O e per la ricerca di @dfn{regexp}, il linguaggio che supporta
-@`e differente da @command{awk} POSIX.
-Ulteriori informazioni sono disponibili sulla
-@uref{http://jawk.sourceforge.net, pagina principale del progetto}.
-
-@item Libmawk
-@cindex @command{libmawk}
-@cindex codice sorgente, @command{libmawk}
-@cindex sorgente, codice, @command{libmawk}
-Questo @`e un interprete @command{awk} incorporabile, derivato da
-@command{mawk}. Per ulteriori informazioni, si veda
-@uref{http://repo.hu/projects/libmawk/}.
-
-@item @code{pawk}
-@cindex codice sorgente, @command{pawk} (versione Python)
-@cindex sorgente, codice, @command{pawk} (versione Python)
-@cindex @code{pawk}, implementazione simile ad @command{awk} per Python
-Questo @`e un modulo Python che intende introdurre funzionalit@`a di tipo
-@command{awk} in Python. Si veda @uref{https://github.com/alecthomas/pawk} per
-ulteriori informazioni. (Questo programma non @`e correlato con la versione
-modificata da Nelson Beebe di BWK @command{awk}, descritta prima.)
-
-@item @w{QSE @command{awk}}
-@cindex QSE @command{awk}
-@cindex codice sorgente, QSE @command{awk}
-@cindex sorgente, codice, QSE @command{awk}
-Questo @`e un interprete di @command{awk} incorporabile. Per ulteriori
-informazioni, si veda
-@uref{http://code.google.com/p/qse/} e @uref{http://awk.info/?tools/qse}.
-
-@item @command{QTawk}
-@cindex QuikTrim Awk
-@cindex codice sorgente, QuikTrim Awk
-@cindex sorgente, codice, QuikTrim Awk
-Questa @`e un'implementazione indipendente di @command{awk} distribuita con la
-licenza GPL. Ha un gran numero di estensioni rispetto ad @command{awk}
-standard, e pu@`o non essere sintatticamente compatibile al 100% con esso. Si
-veda @uref{http://www.quiktrim.org/QTawk.html} per ulteriori informazioni,
-compreso il manuale. Il puntatore per scaricare QuikTrim non punta all'ultima
-versione: si veda @uref{http://www.quiktrim.org/#AdditionalResources} per un
-puntatore alla versione corrente.
-
-Il progetto sembra essere fermo; non ci sono nuove versioni del codice
-a partire dal 2014 circa.
-
-@item Altre versioni
-Si veda anche [in inglese] la sezione ``Versions and implementations''
-della voce di
-@uref{http://en.wikipedia.org/wiki/Awk_language#Versions_and_implementations,
-Wikipedia} su @command{awk} per informazioni su ulteriori versioni.
-
-@end table
-
-@node Sommario dell'installazione
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-La distribuzione di @command{gawk} @`e disponibile dal sito principale
-di distribuzione del Progetto GNU
-@code{ftp.gnu.org}. La maniera canonica per scaricarlo e installarlo @`e:
-
-@example
-wget http://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
-cd gawk-@value{VERSION}.@value{PATCHLEVEL}
-./configure && make && make check
-@end example
-
-@item
-@command{gawk} pu@`o essere installato anche su sistemi non-POSIX. I sistemi
-correntemente supportati sono MS-Windows, usando
-MSYS, MinGW, e Cygwin,
-e sia Vax/VMS che OpenVMS. Le istruzioni per ognuno di questi sistemi sono
-incluse in questa @value{APPENDIX}.
-
-@item
-Le segnalazioni di errori (bug) dovrebbero essere spedite tramite email a
-@email{bug-gawk@@gnu.org}. Le segnalazioni di errore dovrebbero essere scritte
-in inglese e dovrebbero specificare la versione di @command{gawk} in uso, come
-@`e stata compilata, un breve programma e un @value{DF} che permettono di
-riprodurre il problema.
-
-@item
-Ci sono alcune altre implementazioni di @command{awk} disponibili
-gratuitamente. Molte rispettano lo standard POSIX; altre un po' meno.
-
-@end itemize
-
-
-@ifclear FOR_PRINT
-@node Note
-@appendix Note di implementazione
-@cindex @command{gawk}, problemi di implementazione
-@cindex problemi di implementazione, @command{gawk}
-
-Quest'appendice contiene informazioni che interessano soprattutto le persone
-che aggiornano e mantengono @command{gawk}. L'intero contenuto si applica
-specificatamente a @command{gawk} e non ad altre implementazioni.
-
-@menu
-* Modalit@`a di compatibilit@`a:: Come inibire alcune estensioni di
- @command{gawk}.
-* Aggiunte:: Fare aggiunte a @command{gawk}.
-* Future estensioni:: Nuove funzionalit@`a che potranno
- essere implementate in futuro.
-* Limitazioni dell'implementazione:: Alcune limitazioni
- dell'implementazione.
-* Progetto delle estensioni:: Note di progetto sull'estensione API.
-* Meccanismo delle vecchie estensioni:: Alcune compatibilit@`a per le vecchie
- estensioni.
-* Sommario delle note:: Sommario delle note di
- implementazione.
-@end menu
-
-@node Modalit@`a di compatibilit@`a
-@appendixsec Compatibilit@`a all'indietro e debug
-@cindex @command{gawk}, problemi di implementazione, compatibilit@`a all'indietro
-@cindex @command{gawk}, problemi di implementazione, debug
-@cindex risoluzione di problemi, @command{gawk}
-@cindex problemi, risoluzione di, @command{gawk}
-@cindex problemi di implementazione@comma{} @command{gawk}, debug
-
-@xref{POSIX/GNU},
-per un compendio delle estensioni GNU per il linguaggio e il programma
-@command{awk}. Tutte queste funzionalit@`a possono essere inibite invocando
-@command{gawk} con l'opzione @option{--traditional} o con l'opzione
-@option{--posix}.
-
-Se @command{gawk} @`e stato compilato per il debug con @samp{-DDEBUG}, @`e
-possibile specificare un'ulteriore opzione sulla riga di comando:
-
-@table @code
-@item -Y
-@itemx --parsedebug
-Stampa l'informazione contenuta nella pila di analisi, durante la fase di
-analisi iniziale del programma.
-@end table
-
-Quest'opzione @`e utile solo a chi sviluppa @command{gawk} e non all'utente
-occasionale. @`E probabile che non sia neppure disponibile nella versione di
-@command{gawk} che si sta usando, perch@'e rallenta l'esecuzione del programma.
-
-@node Aggiunte
-@appendixsec Fare aggiunte a @command{gawk}
-
-Se si desidera migliorare @command{gawk} in maniera significativa, c'@`e la
-massima libert@`a di farlo. @`E questo lo scopo del software libero; il codice
-sorgente @`e disponibile, ed @`e possibile modificarlo a piacere
-(@pxref{Copia}).
-
-@ifnotinfo
-Questa
-@end ifnotinfo
-@ifinfo
-Questo
-@end ifinfo
-@value{SECTION} tratta di come @`e possibile modificare @command{gawk},
-ed espone alcune considerazioni che si dovrebbero tenere presenti.
-
-@menu
-* Accedere ai sorgenti:: Accedere al deposito dei sorgenti Git.
-* Aggiungere codice:: Aggiungere codice al programma
- principale @command{gawk}.
-* Nuovi sistemi:: Portare @command{gawk} su un nuovo sistema
- operativo.
-* File derivati:: Perch@'e i file derivati sono tenuti
- nel deposito @command{git}.
-@end menu
-
-@node Accedere ai sorgenti
-@appendixsubsec Accedere al deposito dei sorgenti Git di @command{gawk}
-
-Poich@'e @command{gawk} @`e Software Libero, il codice sorgente @`e sempre
-disponibile.
-@iftex
-La
-@end iftex
-@ref{Distribuzione di Gawk} descrive come scaricare e installare
-le versioni ufficiali rilasciate di @command{gawk}.
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-Peraltro, se si intende modificare @command{gawk} e mettere a disposizione le
-modifiche, @`e preferibile lavorare sulla versione in via di sviluppo. Per far
-ci@`o @`e necessario accedere al deposito del codice sorgente di @command{gawk}.
-Il codice @`e mantenuto usando il @uref{http://git-scm.com, sistema distribuito
-di controllo delle versioni Git}. Sar@`a necessario installarlo se non @`e gi@`a
-presente nel sistema. Quando @command{git} @`e disponibile, va usato il comando:
-
-@example
-git clone git://git.savannah.gnu.org/gawk.git
-@end example
-
-@noindent
-Questo comando scarica in locale una copia esatta del deposito dei
-sorgenti di @command{gawk}. Se si sta usando un @dfn{firewall}
-che non consente l'uso del protocollo nativo di Git, @`e possibile accedere
-ugualmente al deposito usando il comando:
-
-@example
-git clone http://git.savannah.gnu.org/r/gawk.git
-@end example
-
-Una volta modificato il sorgente, @`e posibile usare @samp{git diff} per
-produrre una @dfn{patch}, e spedirla al manutentore di @command{gawk}; si veda
-@ref{Bug}, per come farlo.
-
-In passato era disponibile un'interfaccia Git--CVS
-utilizzabile da persone che non avevano a disposizione Git. Purtroppo,
-quest'interfaccia non funziona pi@`u, ma si potrebbe avere maggior fortuna usando
-un sistema di controllo versioni pi@`u moderno, come Bazaar, che @`e dotato di
-un'estensione Git per lavorare con depositi di sorgenti Git.
-
-@node Aggiungere codice
-@appendixsubsec Aggiungere nuove funzionalit@`a
-
-@cindex @command{gawk}, aggiungere funzionalit@`a a
-@cindex funzionalit@`a, aggiungere a @command{gawk}
-@cindex aggiungere funzionalit@`a a @command{gawk}
-Ognuno @`e libero di aggiungere tutte le nuove funzionalit@`a che vuole a
-@command{gawk}. Comunque, se si desidera che tali modifiche siano incorporate
-nella distribuzione di @command{gawk}, ci sono parecchi passi da fare per
-rendere possibile la loro inclusione:
-
-@enumerate 1
-@item
-Prima di inserire la nuova funzionalit@`a all'interno di @command{gawk},
-prendere in considerazione la possibilit@`a di scriverla sotto forma di
-estensione (@pxref{Estensioni dinamiche}).
-Se ci@`o non @`e possibile, continuare con i passi rimanenti descritti in questa
-lista.
-
-@item
-Essere disposti a firmare un documento liberatorio appropriato.
-Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
-di pubblico dominio, tramite la firma di un documento apposito, oppure
-attribuendo il copyright delle modifiche all'FSF.
-Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
-l'hanno fatto. Se ci sono domande da fare, mettersi in contatto con me
-(@pxref{Bug}),
-oppure @EMAIL{assign@@gnu.org,assign chiocciola gnu punto org}.
-
-@item
-Utilizzare l'ultima versione.
-@`E molto pi@`u semplice per me integrare modifiche se sono basate sull'ultima
-versione disponibile di @command{gawk} o, meglio ancora, sull'ultimo codice
-sorgente presente nel deposito Git. Se la versione di @command{gawk} @`e molto
-vecchia, potrei non essere affatto in grado di integrare le modifiche.
-(@xref{Scaricare},
-per informazioni su come ottenere l'ultima versione di @command{gawk}.)
-
-@item
-@ifnotinfo
-Seguire gli @cite{Standard di codifica GNU}.
-@end ifnotinfo
-@ifinfo
-Si veda @inforef{Top, , Version, standards, Standard di Codifica GNU}.
-@end ifinfo
-Questo documento descrive come dovrebbe essere scritto il software GNU.
-Se non lo si @`e letto, @`e bene farlo, preferibilmente @emph{prima}
-di iniziare a modificare @command{gawk}.
-(Gli @cite{Standard di codifica GNU} sono disponibili nel sito web del
-@uref{http://www.gnu.org/prep/standards/, Progetto GNU}.
-Sono disponibili anche versioni in formato Texinfo, Info, e DVI.)
-
-@cindex @command{gawk}, stile di codifica in
-@item
-Usare lo stile di codifica @command{gawk}.
-Il codice sorgente in C di @command{gawk} segue le istruzioni dello
-@cite{Standard di codifica GNU}, con qualche piccola eccezione. Il codice @`e
-formattato usando lo stile tradizionale ``K&R'', in particolare per ci@`o che
-riguarda il posizionamento delle parentesi graffe e l'uso del carattere TAB.
-In breve, le regole di codifica per @command{gawk}
-sono le seguenti:
-
-@itemize @value{BULLET}
-@item
-Usare intestazioni di funzione (prototipi) in stile ANSI/ISO quando
-si definiscono delle funzioni.
-
-@item
-Mettere il nome della funzione all'inizio della riga in cui la si sta definendo.
-
-@item
-Usare @samp{#elif} invece di nidificare istruzioni @samp{#if} all'interno
-di un'istruzione @samp{#else}.
-
-@item
-Mettere il tipo di codice di ritorno della funzione, anche se @`e @code{int},
-sulla riga immediatamente sopra quella che contiene il nome e gli argomenti
-della funzione.
-
-@item
-Mettere degli spazi attorno alle parentesi usate nelle strutture di controllo
-(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch}
-e @code{return}).
-
-@item
-Non mettere spazi davanti alle parentesi usate nelle chiamate di funzione.
-
-@item
-Mettere spazi attorno a tutti gli operatori C e dopo le virgole,
-nelle chiamate di funzione.
-
-@item
-Non usare l'operatore @dfn{virgola} per produrre degli effetti collaterali
-multipli, tranne che nelle parti di inizializzazione e incremento dei cicli
-@code{for}, e nel corpo delle macro.
-
-@item
-Usare dei caratteri TAB per l'indentazione, e non dei semplici spazi.
-
-@item
-Usare lo stile ``K&R'' per formattare le parti di programma incluse fra
-parentesi graffe.
-
-@item
-Usare confronti con @code{NULL} e @code{'\0'} per le condizioni
-contenute nelle istruzioni @code{if}, @code{while} e @code{for}, e anche
-nelle varie clausole @code{case} delle istruzioni @code{switch}, invece
-del semplice puntatore o il semplice valore del carattere.
-
-@item
-Usare i valori @code{true} e @code{false} per le variabili @code{booleane},
-la costante simbolica @code{NULL} per i valori dei puntatori,
-e la costante carattere @code{'\0'} quando @`e il caso, invece dei valori @code{1}
-e @code{0}.
-
-@item
-Fornire un commento descrittivo di una riga per ogni funzione.
-
-@item
-Non usare la funzione @code{alloca()} per allocare memoria dalla @dfn{stack}.
-Il farlo genera dei problemi di portabilit@`a che non giustificano il vantaggio
-secondario di non doversi preoccupare di liberare la memoria. Usare invece
-@code{malloc()} e @code{free()}.
-
-@item
-Non usare confronti nella forma @samp{! strcmp(a, b)} o simili.
-Come disse una volta Henry Spencer, ``@code{strcmp()} non @`e una funzione
-booleana!'' Usare invece @samp{strcmp(a, b) == 0}.
-
-@item
-Per aggiungere nuovi valori a @dfn{flag} binari, usare costanti esadecimali
-esplicite (@code{0x001}, @code{0x002}, @code{0x004}, etc.) invece che
-spostare di un bit a sinistra in incrementi successivi
-(@samp{(1<<0)}, @samp{(1<<1)}, etc.).
-@end itemize
-
-@quotation NOTA
-Qualora fossi costretto a riformattare completamente il codice per
-farlo aderire allo stile di codifica usato in @command{gawk}, potrei anche
-decidere di ignorare del tutto le modifiche proposte.
-@end quotation
-
-@cindex Texinfo
-@item
-Aggiornare la documentazione.
-Insieme col nuovo codice, fornire nuove sezioni e/o capitoli per questo
-@value{DOCUMENT}. Per quanto possibile, usare il formato Texinfo, invece
-di fornire soltanto del testo ASCII non formattato (sebbene un semplice testo
-sia gi@`a meglio che nessuna documentazione). Le convenzioni da seguire in
-@cite{@value{TITLE}} sono elencate dopo la parole chiave @samp{@@bye} alla fine
-del file sorgente Texinfo. Se possibile, aggiornare anche la pagina di manuale
-in formato @command{man}.
-
-Si dovr@`a anche firmare un documento liberatorio relativo alle
-modifiche apportate alla documentazione.
-
-@cindex @command{git}, programma di utilit@`a
-@cindex programma di utilit@`a @command{git}
-@item
-Inviare le modifiche come file di differenze nel formato contestuale unificato.
-Usare @samp{diff -u -r -N} per confrontare i sorgenti originali dell'albero
-di sorgenti @command{gawk} con la versione proposta.
-Si raccomanda di usare la versione GNU di @command{diff} o, ancora meglio,
-@samp{git diff} o @samp{git format-patch}.
-Per inviare le modifiche proposte spedire l'output prodotto da @command{diff}.
-(@xref{Bug}, per l'indirizzo di posta elettronica.)
-
-L'uso di questo formato rende semplice per me l'applicazione delle modifiche
-alla versione principale del sorgente di @command{gawk} (usando il programma di
-utilit@`a @code{patch}). Se invece tocca a me applicare le modifiche a mano,
-con un editor di testo, potrei decidere di non farlo, specialmente
-se le modifiche sono molte.
-
-@item
-Includere una descrizione da aggiungere al file @file{ChangeLog} riguardo alla
-modifica da voi proposta. Questo serve a minimizzare l'attivit@`a a me
-richiesta, rendendo pi@`u facile per me l'accettazione delle modifiche, che
-diventa pi@`u semplice se si include anche questa parte nel file di differenze
-(nel formato @dfn{diff}).
-@end enumerate
-
-Sebbene questa possa sembrare una richiesta molto esigente, si tenga presente
-che, anche se il nuovo codice non @`e opera mia, tocca poi a me manutenerlo e
-correggere eventuali errori. Se non @`e possibile per me farlo senza perderci
-troppo tempo, potrei anche lasciar perdere la modifica.
-
-@node Nuovi sistemi
-@appendixsubsec Portare @command{gawk} su un nuovo Sistema Operativo
-@cindex portabilit@`a, @command{gawk}
-@cindex sistemi operativi, portare @command{gawk} su altri
-
-@cindex portare @command{gawk}
-Se si vuol portare @command{gawk} su di un nuovo sistema operativo, sono
-necessari parecchi passi:
-
-@enumerate 1
-@item
-Seguire le linee-guida contenute
-@ifinfo
-in @ref{Aggiungere codice},
-@end ifinfo
-@ifnotinfo
-nella precedente @value{SECTION}
-@end ifnotinfo
-relative allo stile di codifica, all'invio delle differenze proposte, etc.
-
-@item
-Essere disposti a firmare un documento liberatorio appropriato.
-Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
-di pubblico dominio, tramite la firma di un documento apposito, oppure
-attribuendo il copyright delle modifiche all'FSF.
-Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
-l'hanno fatto. Se ci sono domande da fare, scrivere a me
-oppure all'indirizzo @email{gnu@@gnu.org}.
-
-@item
-Nel realizzare un @dfn{port}, tener presente che il codice
-deve coesistere pacificamente con il resto di @command{gawk} e con le
-versioni per altri sistemi operativi.
-Evitare modifiche non necessarie alla parte di codice che @`e indipendente
-dal sistema operativo. Se possibile, evitare di disseminare @samp{#ifdef},
-utili solo per il proprio @dfn{port}, all'interno del codice sorgente.
-
-Se le modifiche necessarie per un particolare sistema coinvolgono una parte
-troppo rilevante del codice, @`e probabile che io non le accetti.
-In questo caso si possono, naturalmente, distribuire le modifiche per
-proprio conto, basta che si rispettino i vincoli della GPL
-(@pxref{Copia}).
-
-@item
-Un certo numero di file che fanno parte della distribuzione di @command{gawk}
-sono mantenuti da terze persone e non dagli sviluppatori di @command{gawk}.
-Quindi, non si dovrebbero cambiare, se non per ragioni molto
-valide; vale a dire, modifiche a questi file non sono impossibili, ma
-le modifiche a questi file saranno controllate con estrema attenzione.
-I file sono
-@file{dfa.c},
-@file{dfa.h},
-@file{getopt.c},
-@file{getopt.h},
-@file{getopt1.c},
-@file{getopt_int.h},
-@file{gettext.h},
-@file{regcomp.c},
-@file{regex.c},
-@file{regex.h},
-@file{regex_internal.c},
-@file{regex_internal.h}
-e
-@file{regexec.c}.
-
-@item
-Un certo numero di altri file sono prodotti dagli Autotool [comandi di
-configurazione] di GNU (Autoconf, Automake, e GNU @command{gettext}).
-Neppure questi file dovrebbero essere modificati, se non per ragioni molto
-valide. I file sono
-@file{ABOUT-NLS},
-@file{config.guess},
-@file{config.rpath},
-@file{config.sub},
-@file{depcomp},
-@file{INSTALL},
-@file{install-sh},
-@file{missing},
-@file{mkinstalldirs},
-@file{xalloc.h}
-e
-@file{ylwrap}.
-
-@item
-Essere disponibili a continuare a manutenere il @dfn{port}.
-I sistemi operativi non-Unix sono supportati da volontari che tengono
-aggiornato il codice necessario per compilare ed eseguire @command{gawk}
-nei loro sistemi. Se nessuno @`e disponibile a tener aggiornato un @dfn{port},
-questo diventa non pi@`u supportato, e pu@`o essere necessario rimuoverlo dalla
-distribuzione.
-
-@item
-Fornire un appropriato file @file{gawkmisc.???}.
-Ogni @dfn{port} ha il proprio @file{gawkmisc.???} che implementa alcune
-funzioni specifiche per quel sistema operativo. Questa @`e una soluzione pi@`u
-pulita, rispetto a una quantit@`a di @samp{#ifdef} sparsi nel codice. Il file
-@file{gawkmisc.c} nella directory principale dei sorgenti include gli
-appropriati file @file{gawkmisc.???} da ogni sottodirectory. Anche
-quest'ultimo file va aggiornato.
-
-Ogni file @file{gawkmisc.???} del @dfn{port} ha un suffisso esplicativo
-del tipo di macchina o del sistema operativo in questione---per esempio,
-@file{pc/gawkmisc.pc} e @file{vms/gawkmisc.vms}. L'uso di suffissi distinti
-invece di un semplice @file{gawkmisc.c}, rende possibile spostare file da
-una sottodirectory propria del @dfn{port} nella sottodirectory principale,
-senza cancellare incidentalmente il file @file{gawkmisc.c} vero e proprio.
-(Al momento, questo rappresenta un problema solo per i @dfn{port} ai
-sistemi operativi dei PC.)
-
-@item
-Fornire un @file{Makefile} e ogni altro file sorgente o di intestazione in C
-che sia necessario per il proprio sistema operativo. Tutto il codice dovrebbe
-stare in una sottodirectory a parte, il cui nome sia lo stesso, o
-sia indicativo, del proprio sistema operativo o del tipo di computer.
-Se possibile, tentare di strutturare il codice in modo che non sia necessario
-spostare file dalla propria sottodirectory nella directory principale del
-codice sorgente. Se ci@`o non @`e possibile, evitare nel modo pi@`u assoluto di
-usare nomi per i file che siano duplicati di nomi di file presenti nella
-directory principale del codice sorgente.
-
-@item
-Aggiornare la documentazione.
-Scrivere una sezione (o pi@`u sezioni) per questo @value{DOCUMENT}
-che descriva i passi di installazione e compilazione necessari per compilare
-e/o installare @command{gawk} per il sistema desiderato.
-@end enumerate
-
-Seguire queste indicazioni facilita molto l'integrazione delle
-modifiche in @command{gawk} e la loro felice coesistenza con il codice di
-altri sistemi operativi gi@`a presenti.
-
-Nel codice che viene fornito e tenuto aggiornato, si possono
-tranquillamente usare uno stile di codifica e una disposizione delle
-parentesi graffe di proprio gradimento.
-
-@node File derivati
-@appendixsubsec Perch@'e i file generati sono tenuti in Git
-
-@cindex Git, uso per il codice sorgente di @command{gawk}
-@c From emails written March 22, 2012, to the gawk developers list.
-
-Se si esaminano i sorgenti di @command{gawk} nel deposito Git
-si noter@`a che sono inclusi file generati automaticamente dagli strumenti
-dell'infrastruttura GNU, come @file{Makefile.in} generato da Automake e
-anche @file{configure} proveniente da Autoconf.
-
-Questo comportamento @`e differente da quello di molti progetti di
-Libero Software che non memorizzano i file derivati, per mantenere pi@`u
-sgombro il deposito Git, rendendo cos@`{@dotless{i}} pi@`u facile comprendere quali sono le
-modifiche sostanziali confrontando differenti versioni, nel tentativo di
-capire cosa @`e cambiato tra una modifica e la precedente.
-
-Tuttavia, ci sono parecchie ragioni per le quali il manutentore di
-@command{gawk} preferisce mantenere ogni cosa nel deposito Git.
-
-Innanzitutto, perch@'e in questo modo @`e facile generare completamente ogni
-data versione, senza doversi preoccupare di avere a disposizione altri
-strumenti (pi@`u vecchi, probabilmente obsoleti, e in qualche caso
-perfino impossibili da trovare).
-
-Come esempio estremo, se solo si pensa di tentare di compilare, diciamo, la
-versione Unix V7 di @command{awk}, ci si accorge che non solo @`e necessario
-scaricare e ricompilare la versione V7 del comando @command{yacc} per farlo, ma
-anche che serve la versione V7 del comando @command{lex}. E quest'ultima @`e
-praticamente impossibile farla funzionare in un sistema GNU/Linux dei giorni
-nostri.@footnote{Ci abbiamo provato. @`E stata un'esperienza dolorosa.}
-
-(Oppure, diciamo che la versione 1.2 di @command{gawk} richiede il comando
-@command{bison} come funzionava nel 1989, e non @`e presente il file
-@file{awkgram.c} [generato tramite @command{bison}] nel deposito Git. Che cosa
-ci garantisce di riuscire a trovare quella versione di @command{bison}? O che
-@emph{quella} riesca a generarlo?)
-
-Se il deposito Git comprende tutti i file derivati,
-@`e facile, dopo averli scaricati, ricostruire il programma. (Oppure @`e @emph{pi@`u
-facile}, a seconda di quanto si vuole risalire indietro nel tempo).
-
-E qui arriviamo alla seconda (e pi@`u valida) ragione per cui tutti i file
-devono essere proprio nel deposito Git. Domandiamoci a chi ci si rivolge:
-agli sviluppatori di @command{gawk}, oppure a un utilizzatore che intende
-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
-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,
-@`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
-sistemi, @`e una notevole perdita di tempo.
-
-Neppure partire dall'ultimo archivio @command{tar} compresso @`e stata una
-passeggiata: i manutentori avevano eliminato i file compressi in formato
-@file{.gz} e @file{.bz2} sostituendoli con file di tipo @file{.tar.xz}.
-Bisognava quindi per prima cosa scaricare e compilare @command{xz}}.
-A questo serve il file @file{bootstrap.sh}. Va a "toccare"
-[tramite il comando @command{touch}] vari altri file nell'ordine richiesto
-in modo che
-
-@example
-# La formula canonica per compilare il software GNU:
-./bootstrap.sh && ./configure && make
-@end example
-
-@noindent
-tutto @emph{funzioni senza problemi}.
-
-Questo @`e estremamente importante per i rami
-@code{master} e @code{gawk-@var{X}.@var{Y}-stable}.
-
-Inoltre, il manutentore di @command{gawk} potrebbe sostenere che
-ci@`o @`e importante anche per gli sviluppatori di @command{gawk}. Tentando di
-scaricare il ramo @code{xgawk}@footnote{Un ramo (non pi@`u presente) creato da
-uno degli altri sviluppatori, e che non includeva i file generati.} per
-compilarlo, non ci riusc@`{@dotless{i}}. (Mancava il file @file{ltmain.sh}, ed egli non
-aveva idea di come crearlo, e c'erano anche ulteriori problemi.)
-
-La cosa lo lasci@`o in uno stato di frustrazione @emph{estrema}. Riguardo a quel
-ramo, il manutentore @`e in una posizione non differente da quella di un utente
-generico che voglia tentare di compilare @code{gawk-4.1-stable} o @code{master}
-dal deposito Git.
-
-Quindi, il manutentore ritiene che sia non solo importante, ma cruciale, che
-per ogni dato ramo la formula canonica evocata prima
-@emph{funzioni senza problemi}.
-
-@c Added 9/2014:
-Una terza ragione per avere tutti i file @`e che senza di essi, usare @samp{git
-bisect} per tentare di trovare quale modifica ha introdotto un errore diventa
-estremamente difficile. Il manutentore ha tentato di farlo su un altro
-progetto che richiede di eseguire @dfn{script} di inizializzazione allo scopo
-di creare lo @dfn{script} @command{configure} e cos@`{@dotless{i}} via; @`e stata un'esperienza
-veramente dolorosa. Se invece il deposito Git contiene tutto il necessario,
-usare @command{git bisect} al suo interno @`e molto facile.
-
-@c So - that's my reasoning and philosophy.
-
-Quali sono, quindi, alcune delle conseguenze e/o delle cose da fare?
-
-@enumerate 1
-@item
-Non importa se ci sono file differenti nei diversi rami
-prodotti da versioni differenti degli Autotool.
-
-@enumerate A
-@item
-Spetta al manutentore integrarli tra loro, e se ne occuper@`a lui.
-
-@item
-@`E facile per lui eseguire @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1}
-per rimuovere le differenze che non sono rilevanti ai fini della revisione
-del codice sorgente.
-@end enumerate
-
-@item
-Sarebbe sicuramente d'aiuto se tutti usassero le stesse versioni degli Autotool
-GNU che lui usa, che in generale sono le ultime versioni rilasciate di
-Automake,
-Autoconf,
-@command{bison}
-e
-GNU @command{gettext}.
-
-@ignore
-If it would help if I sent out an ``I just upgraded to version x.y
-of tool Z'' kind of message to this list, I can do that. Up until
-now it hasn't been a real issue since I'm the only one who's been
-dorking with the configuration machinery.
-@end ignore
-
-@c @enumerate A
-@c @item
-Installare a partire dal sorgente @`e abbastanza facile. @`E il modo con cui il
-manutentore ha lavorato per anni (e ancora lavora).
-Egli aveva @file{/usr/local/bin} all'inizio del suo @env{PATH} e dava i
-seguenti comandi:
-
-@example
-wget http://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz
-tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz
-cd @var{package}-@var{x}.@var{y}.@var{z}
-./configure && make && make check
-make install # come utente root
-@end example
-
-@c @item
-@ignore
-These days the maintainer uses Ubuntu 12.04 which is medium current, but
-he is already doing the above for Automake, Autoconf, and @command{bison}.
-@end ignore
-
-@ignore
-(C. Rant: Recent Linux versions with GNOME 3 really suck. What
- are all those people thinking? Fedora 15 was such a bust it drove
- me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from
- a UI perspective. Bleah.)
-@end ignore
-@c @end enumerate
-
-@ignore
-@item
-If someone still feels really strongly about all this, then perhaps they
-can have two branches, one for their development with just the clean
-changes, and one that is buildable (xgawk and xgawk-buildable, maybe).
-Or, as I suggested in another mail, make commits in pairs, the first with
-the "real" changes and the second with "everything else needed for
- building".
-@end ignore
-@end enumerate
-
-La maggior parte del testo precedente fa parte di messaggi scritti
-originalmente dal manutentore agli altri sviluppatori @command{gawk}.
-Da uno degli sviluppatori @`e stata avanzata l'obiezione
-``@dots{} che chi scarica il sorgente da Git
-non @`e un utente finale''.
-
-Tuttavia, questo non @`e esatto. Ci sono ``utenti avanzati di @command{awk}''
-che possono installare @command{gawk} (usando la formula canonica vista sopra)
-ma che non conoscono il linguaggio C. Quindi, i rami pi@`u rilevanti
-dovrebbero essere sempre compilabili.
-
-@`E stato proposto poi di lanciare ogni notte uno @dfn{script} tramite il
-programma di utilit@`a @command{cron} per creare archivi in formato @command{tar}
-contenenti tutto ``il codice sorgente.'' Il problema in questo caso @`e che
-ci sono differenti alberi di sorgenti, che corrispondono ai vari rami!
-Quindi gli archivi notturni in questione non sono una risposta valida, anche
-per il fatto che il deposito Git pu@`o rimanere senza alcuna modifica
-significativa per settimane intere.
-
-Fortunatamente, il server Git pu@`o rispondere a questa esigenza. Per ogni
-dato ramo chiamato @var{nome-ramo}, basta usare:
-
-@example
-wget http://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{nome-ramo}.tar.gz
-@end example
-
-@noindent
-per ottenere una copia utilizzabile del ramo in questione.
-
-@node Future estensioni
-@appendixsec Probabili estensioni future
-@ignore
-From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995
-Return-Path: <emory!scalpel.netlabs.com!lwall>
-Message-Id: <9510311732.AA28472@scalpel.netlabs.com>
-To: arnold@skeeve.atl.ga.us (Arnold D. Robbins)
-Subject: Re: May I quote you?
-In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST."
- <m0tAHPQ-00014MC@skeeve.atl.ga.us>
-Date: Tue, 31 Oct 95 09:32:46 -0800
-From: Larry Wall <emory!scalpel.netlabs.com!lwall>
-
-: Greetings. I am working on the release of gawk 3.0. Part of it will be a
-: thoroughly updated manual. One of the sections deals with planned future
-: extensions and enhancements. I have the following at the beginning
-: of it:
-:
-: @cindex PERL
-: @cindex Wall, Larry
-: @display
-: @i{AWK is a language similar to PERL, only considerably more elegant.} @*
-: Arnold Robbins
-: @sp 1
-: @i{Hey!} @*
-: Larry Wall
-: @end display
-:
-: Before I actually release this for publication, I wanted to get your
-: permission to quote you. (Hopefully, in the spirit of much of GNU, the
-: implied humor is visible... :-)
-
-I think that would be fine.
-
-Larry
-@end ignore
-@cindex Perl
-@cindex Wall, Larry
-@cindex Robbins, Arnold
-@quotation
-@i{AWK @`e un linguaggio simile a PERL, solo che @`e notevolmente pi@`u elegante.}
-@author Arnold Robbins
-@end quotation
-
-@quotation
-@i{Hey!}
-@author Larry Wall
-@end quotation
-
-Il file @file{TODO} nel ramo @code{master} del deposito Git di @command{gawk}
-contiene un elenco di possibili futuri miglioramenti. Alcuni di questi
-riguardano il codice sorgente, e altri possibili nuove funzionalit@`a.
-Consultare quel file per esaminare la lista.
-@xref{Aggiunte},
-se si @`e interessati a intraprendere qualcuno dei progetti col@`a elencati.
-
-@node Limitazioni dell'implementazione
-@appendixsec Alcune limitazioni dell'implementazione
-
-La tabella seguente specifica i limiti di @command{gawk} in un sistema di
-tipo Unix (sebbene anche tra questi ci potrebbero essere variazioni). Altri
-sistemi operativi possono avere limiti differenti.
-
-@multitable @columnfractions .40 .60
-@headitem Caratteristica @tab Limiti
-@item Caratteri in una classe di caratteri @tab 2^(numero di bit per byte)
-@item Lunghezza di un record in input @tab @code{MAX_INT}
-@item Lunghezza di un record in output @tab Illimitata
-@item Lunghezza di una riga di codice sorgente @tab Illimitata
-@item Numero di campi in un record @tab @code{MAX_LONG}
-@item Numero di ridirezioni di file @tab Illimitata
-@item Numero di record in input in un singolo file @tab @code{MAX_LONG}
-@item Numero totale di record in input @tab @code{MAX_LONG}
-@item Numero di ridirezioni via @dfn{pipe} @tab min(numero processi per utente, numero di file aperti)
-@item Valori numerici @tab Numeri a virgola mobile in doppia precisione (se non si usa la funzionalit@`a MPFR)
-@item Dimensione di un campo @tab @code{MAX_INT}
-@item Dimensione di una stringa letterale @tab @code{MAX_INT}
-@item Dimensione di una stringa di @dfn{printf} @tab @code{MAX_INT}
-@end multitable
-
-@node Progetto delle estensioni
-@appendixsec Note di progetto dell'estensione API
-
-Questa @value{SECTION} documenta l'architettura dell'estensione API,
-inclusa una trattazione sommaria della progettazione e dei problemi che
-andavano risolti.
-
-La prima versione delle estensioni per @command{gawk} @`e stata sviluppata
-a met@`a degli anni '90, e distribuita con la versione 3.1 di @command{gawk},
-verso la fine degli anni '90.
-Il meccanismo e l'architettura sono rimasti gli stessi per quasi 15 anni,
-fino al 2012.
-
-Il vecchio meccanismo delle estensioni usava tipi di dati e funzioni dello
-stesso @command{gawk}, con un ``abile trucco'' per installare le funzioni
-di estensione.
-
-La distribuzione @command{gawk} conteneva alcuni esempi di estensioni, solo
-poche delle quali erano realmente utili. Tuttavia era chiaro fin da
-principio che il meccanismo di estensione era un'aggiunta improvvisata, e
-non era realmente ben concepito.
-
-@menu
-* Problemi con le vecchie estensioni:: Problemi col vecchio meccanismo.
-* Obiettivi delle estensioni:: Obiettivi del nuovo meccanismo.
-* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
-* Futuri sviluppi delle estensioni:: Possibilit@`a di crescita futura.
-@end menu
-
-@node Problemi con le vecchie estensioni
-@appendixsubsec Problemi con le vecchie estensioni
-
-Il vecchio meccanismo delle estensioni presentava parecchi problemi:
-
-@itemize @value{BULLET}
-@item
-Dipendeva eccessivamente dalla struttura interna di @command{gawk}. Ogni volta
-che la struttura @code{NODE}@footnote{Una struttura di dati fondamentale
-all'interno di @command{gawk}.} veniva modificata, ogni estensione doveva
-essere ricompilata. Inoltre, la scrittura di estensioni richiedeva una
-certa familiarit@`a con le funzioni interne di @command{gawk}. Esisteva
-un po' di documentazione in questo @value{DOCUMENT}, ma era ridotta al minimo.
-
-@item
-Per poter utilizzare servizi di @command{gawk} da un'estensione era necessario
-disporre di funzionalit@`a del @dfn{linker}
-normalmente disponibili in ambiente di tipo Unix, ma non implementate
-nei sistemi MS-Windows; chi voleva utilizzare estensioni in
-MS-Windows doveva aggiungerle al modulo eseguibile di @command{gawk},
-anche se MS-Windows supporta il caricamento dinamico di oggetti condivisi.
-
-@item
-L'API di tanto in tanto veniva modificata, in parallelo ai cambiamenti di
-@command{gawk}; nessuna compatibilit@`a tra le versioni @`e stata mai prevista o
-resa disponibile.
-@end itemize
-
-Nonostante questi inconvenienti, gli sviluppatori del progetto @command{xgawk}
-si basarono su @command{gawk} per sviluppare parecchie estensioni
-significative. Inoltre, migliorarono le capacit@`a, in @command{gawk}, di
-includere file e di accedere a oggetti condivisi.
-
-Una nuova API @`e rimasta un desiderio per lungo tempo, ma solo nel 2012
-il manutentore di @command{gawk} e gli sviluppatori di @command{xgawk}
-iniziarono finalmente a lavorare insieme. Ulteriori informazioni riguardanti
-il progetto @command{xgawk} sono forniti nella @ref{gawkextlib}.
-
-@node Obiettivi delle estensioni
-@appendixsubsec Obiettivi per un nuovo meccanismo
-
-Alcuni obiettivi per la nuova API sono:
-
-@itemize @value{BULLET}
-@item
-L'API dovrebbe essere indipendente dalla struttura interna di @command{gawk}.
-Le modifiche alla struttura interna di @command{gawk} dovrebbero essere
-irrilevanti per chi scrive una funzione di estensione.
-
-@item
-L'API dovrebbe consentire una compatibilit@`a @emph{binaria} [ossia a livello
-di codice eseguibile, e non solo a livello di codice sorgente] tra diverse
-versioni di @command{gawk}, se la stessa API rimane invariata.
-
-@item
-L'API dovrebbe consentire che le estensioni scritte in C o C++ abbiano
-all'incirca la stessa ``struttura'', per il codice awk,
-di quella che hanno le funzioni di @command{awk}. Questo vuol dire che le
-estensioni dovrebbero avere:
-
-@itemize @value{MINUS}
-@item
-La capacit@`a di accedere ai parametri delle funzioni.
-
-@item
-La capacit@`a di trasformare un parametro indefinito in un vettore
-(chiamata per riferimento [@dfn{by reference}]).
-
-@item
-La capacit@`a di creare, leggere e aggiornare variabili globali.
-
-@item
-Un accesso facile a tutti gli elementi di un vettore simultaneamente
-(``appiattimento del vettore'') in modo da poter visitare tutti gli elementi
-del vettore in una maniera semplice per un programma scritto in C.
-
-@item
-La capacit@`a di creare vettori (compresi i veri "vettori di vettori" di
-@command{gawk}).
-@end itemize
-@end itemize
-
-Alcuni ulteriori obiettivi rilevanti sono:
-
-@itemize @value{BULLET}
-@item
-L'API dovrebbe usare solo funzionalit@`a disponibili nella specifica ISO C 90, in
-modo da consentire estensioni scritte con una vasta gamma di compilatori C e
-C++. L'intestazione dovrebbe includere le appropriate direttive
-@samp{#ifdef __cplusplus} e @samp{extern "C"}, in modo da poter utilizzare un
-compilatore C++. (Se si usa C++, il sistema operativo in uso dev'essere in
-grado di invocare dei costruttori e dei distruttori, poich@'e @command{gawk} @`e un
-programma scritto in C. Al momento in cui queste note sono scritte, la cosa
-non @`e stata verificata).
-
-@item
-Il meccanismo API non dovrebbe aver bisogno di accedere ai simboli di
-@command{gawk}@footnote{I @dfn{simboli} sono le variabili e le funzioni
-definite all'interno di @command{gawk}. Accedere a questi simboli da parte
-di codice esterno a @command{gawk} caricato dinamicamente al momento
-dell'esecuzione @`e problematico in ambiente MS-Windows.} da parte del
-@dfn{linker} statico, usato in fase di compilazione, o di quello dinamico,
-in modo da rendere possibile la creazione di estensioni che funzionino anche
-in ambiente MS-Windows.
-@end itemize
-
-In fase di sviluppo, @`e apparso evidente che dovevano essere disponibili alle
-estensioni anche altre funzionalit@`a, che sono state
-successivamente implementate:
-
-@itemize @value{BULLET}
-@item
-Le estensioni dovrebbero essere in grado di agganciarsi al meccanismo di
-ridirezione dell'I/O di @command{gawk}. In particolare, gli sviluppatori di
-@command{xgawk} hanno programmato un cosiddetto ``gancio aperto'' (@dfn{open
-hook}) per gestire autonomamente la lettura dei record. In fase di sviluppo,
-questo meccanismo @`e stato generalizzato, per consentire alle estensioni di
-agganciarsi sia all'elaborazione dell'input, che a quella dell'output, nonch@'e
-all'I/O bidirezionale.
-
-@item
-Un'estensione dovrebbe poter rendere disponibile una funzione di ``call back''
-(richiamo) per effettuare operazioni di pulizia all'uscita di @command{gawk}.
-
-@item
-Un'estensione dovrebbe poter rendere disponibile una stringa di versione
-cos@`{@dotless{i}} che l'opzione @option{--version}
-di @command{gawk} possa informare anche sulle versioni delle estensioni.
-@end itemize
-
-Il vincolo di evitare di accedere ai simboli di @command{gawk} pu@`o parere a
-prima vista piuttosto difficile da rispettare.
-
-Un tipo di architettura, apparentemente usato da Perl e Ruby e forse da altri
-programmi, potrebbe consistere nel mettere il codice principale di
-@command{gawk} in una libreria, limitando il programma di utilit@`a
-@command{gawk} a una piccola funzione @code{main()} in C che richiamerebbe
-dinamicamente la libreria.
-
-Questo inverte i ruoli del programma principale e della sua estensione, e
-complica sia la compilazione che l'installazione, trasformando la semplice
-copia del programma eseguibile @command{gawk} da un sistema all'altro (o da una
-posizione all'altra all'interno dello stesso sistema) in un'operazione ad alto
-rischio.
-
-Pat Rankin ha suggerito la soluzione che @`e stata adottata.
-@xref{Panoramica sul meccanismo delle estensioni}, per maggiori dettagli.
-
-@node Altre scelte progettuali per le estensioni
-@appendixsubsec Altre scelte progettuali
-
-Per una scelta progettuale arbitraria, le estensioni possono accedere ai valori
-delle variabili e dei vettori predefiniti (come @code{ARGV} e @code{FS}), ma
-non possono modificarli, con la sola eccezione di @code{PROCINFO}.
-
-Il motivo di questa scelta @`e di impedire a una funzione di estensione di
-alterare il flusso di un programma @command{awk} togliendogli il controllo.
-Mentre una vera funzione di @command{awk} pu@`o fare quel che vuole, a
-discrezione del programmatore, una funzione di estensione dovrebbe fornire un
-servizio, o rendere disponibile un'API C da utilizzare all'interno di
-@command{awk}, senza interferire con le variabili @code{FS} o @code{ARGC} e
-@code{ARGV}.
-
-Inoltre, diverrebbe facile avviarsi su un sentiero scivoloso. Quante
-funzionalit@`a di @command{gawk} dovrebbero essere disponibili alle estensioni?
-Devono poter usare @code{getline}? Oppure richiamare @code{gsub()} o compilare
-espressioni regolari? Oppure richiamare funzioni interne di @command{awk}?
-(@emph{Questo} potrebbe creare molta confusione.)
-
-Per evitare questi problemi, gli sviluppatori di @command{gawk} hanno scelto di
-iniziare con le funzionalit@`a pi@`u semplici e di base, che sono comunque
-veramente utili.
-
-Sebbene @command{gawk} consenta cose interessanti come l'MPFR,
-e vettori indicizzati internamente con numeri interi,
-un'altra decisione @`e stata quella di non rendere disponibili all'API queste
-funzionalit@`a, per amor di semplicit@`a e per restare fedeli alla tradizionale
-semantica di @command{awk}. (In effetti, i vettori indicizzati internamente
-con numeri interi sono talmente trasparenti che non sono neppure documentati!)
-
-In pi@`u, tutte le funzioni nell'API controllano che i puntatori ai parametri
-passati loro in input non siano @code{NULL}. Se lo sono, viene emesso un
-messaggio di errore. (@`E bene che il codice di estensione verifichi
-che i puntatori ricevuti da @command{gawk} non siano @code{NULL}. Ci@`o non
-dovrebbe succedere, ma gli sviluppatori di @command{gawk} sono solo degli
-esseri umani, e capita anche a loro di commettere degli errori, di tanto in
-tanto.)
-
-Col tempo, l'API si svilupper@`a certamente; gli sviluppatori di @command{gawk}
-si aspettano che questo avvenga in base alle necessit@`a degli utenti. Per ora,
-l'API disponbile sembra fornire un insieme di funzionalit@`a minimo, eppure
-potente, per creare estensioni.
-
-@node Futuri sviluppi delle estensioni
-@appendixsubsec Possibilit@`a di sviluppo futuro
-
-L'API pu@`o ancora essere ampliata, in due modi:
-
-@itemize @value{BULLET}
-@item
-@command{gawk} passa un ``identificativo di estensione'' all'estensione in fase
-di caricamente dell'estensione. L'estensione a sua volta restituisce questo
-identificativo a @command{gawk} a ogni chiamata di funzione. Questo meccanismo
-consente a @command{gawk} di identificare l'estensione che lo chiama, se la
-cosa dovesse risultare necessaria.
-
-@item
-Analogamente, l'estensione passa uno ``spazio dei nomi'' a @command{gawk}
-in fase di registrazione di ogni funzione estesa. Questo @`e fatto in vista di
-un possibile futuro meccanismo per raggruppare funzioni di estensione, e per
-evitare in questo modo possibili conflitti nei nomi di funzione.
-@end itemize
-
-Naturalmente, al momento in cui queste righe sono state scritte, nessuna
-decisione @`e stata presa riguardo ai punti sopra descritti.
-
-@node Meccanismo delle vecchie estensioni
-@appendixsec Compatibilit@`a per le vecchie estensioni
-
-@iftex
-Il
-@end iftex
-@ref{Estensioni dinamiche}, descrive le API supportate e i meccanismi
-per scrivere estensioni per @command{gawk}. Quest'API @`e stata introdotta
-nella @value{PVERSION} 4.1. Peraltro, gi@`a da molti anni @command{gawk}
-metteva a disposizione un meccanismo di estensione che richiedeva una
-familiarit@`a con la struttura interna di @command{gawk} e che non era stato
-progettato altrettanto bene.
-
-Per garantire un periodo di transizione, @command{gawk} @value{PVERSION} 4.1
-continua a supportare il meccanismo di estensione originale.
-Questo rimarr@`a disponibile per la durata di una sola versione principale.
-Il supporto cesser@`a, e sar@`a rimosso dal codice sorgente, al rilascio
-della prossima versione principale.
-
-In breve, le estensioni in stile originale dovrebbero essere compilate
-includendo il file di intestazione @file{awk.h} nel codice sorgente
-dell'estensione. Inoltre, va definito l'identificativo @samp{GAWK} durante la
-preparazione (si usi @samp{-DGAWK} con compilatori in stile Unix). Se non lo
-si fa, le definizioni in @file{gawkapi.h} risulteranno in conflitto con quelle
-in @file{awk.h} e l'estensione non sar@`a compilabile.
-
-Come nelle versioni precedenti, un'estensione vecchio stile sar@`a caricata
-usando la funzione predefinita @code{extension()} (che non viene ulteriormente
-documentata). Questa funzione, a sua volta, trova e carica il file oggetto
-condiviso che contiene l'estensione e chiama la sua routine C @code{dl_load()}.
-
-Poich@'e le estensioni in stile originale e quelle nello stile nuovo usano
-differenti routine di inizializzazione(@code{dl_load()} e @code{dlload()},
-rispettivamente), esse possono tranquillamente essere installate nella stessa
-directory (il cui nome deve essere contenuto nella variabile @env{AWKLIBPATH})
-senza problemi di conflitti.
-
-Il @dfn{team} di sviluppo di @command{gawk} raccomanda caldamente di convertire
-ogni estensione del vecchio tipo ancora in uso, in modo da utilizzare la nuova
-API descritta
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Estensioni dinamiche}.
-
-@node Sommario delle note
-@appendixsec Sommario
-
-@itemize @value{BULLET}
-@item
-Le estensioni di @command{gawk} possono essere disabilitata sia con
-l'opzione @option{--traditional} che con l'opzione @option{--posix}.
-L'opzione @option{--parsedebug} @`e disponibile se @command{gawk} @`e stato
-compilato con @samp{-DDEBUG}.
-
-@item
-Il codice sorgente di @command{gawk} @`e conservato in un deposito Git
-pubblicamente accessibile. Tutti possono scaricarlo e visualizzare il
-codice sorgente.
-
-@item
-I contributi a @command{gawk} sono benvenuti. Seguire le istruzioni
-delineate in questo @value{CHAPTER} render@`a pi@`u agevole integrare
-i contributi degli utenti nel codice principale.
-Questo vale sia per il contributo di nuove funzionalit@`a che per il
-@dfn{porting} a ulteriori sistemi operativi.
-
-@item
-@command{gawk} ha alcuni limiti: generalmente quelli imposti
-dall'architettura hardware della macchina.
-
-@item
-La progettazione dell'estensione API @`e volta a risolvere alcuni problemi
-riscontrati nel precedente meccanismo di estensione, ad abilitare
-funzionalit@`a richieste dal progetto @code{xgawk}, e a fornire una
-compatibilit@`a binaria in futuro.
-
-@item
-Il precedente meccanismo di estensione @`e ancora supportato
-nella @value{PVERSION} 4.1
-di @command{gawk}, ma sar@`a @emph{rimosso} nella prossima versione principale.
-
-@end itemize
-
-
-@node Concetti fondamentali
-@appendix Concetti fondamentali di programmazione
-@cindex programmazione, concetti di
-@cindex programmazione, concetti di
-
-Quest'@value{APPENDIX} si propone di definire alcuni dei concetti
-e termini fondamentali usati nel resto di questo @value{DOCUMENT}.
-Poich@'e questo @value{DOCUMENT} @`e dedicato ad @command{awk},
-e non riguarda la programmazione al computer in generale, la trattazione
-@`e necessariamente piuttosto generica e semplificata.
-(Se serve qualcosa di pi@`u approfondito, ci sono molti
-altri testi introduttivi che si possono consultare.)
-
-@menu
-* Fondamenti ad alto livello:: Una visione dall'alto.
-* Fondamenti sui tipi di dati:: Una velocissima introduzione ai tipi di dati.
-@end menu
-
-@node Fondamenti ad alto livello
-@appendixsec Quel che fa un programma
-
-@cindex elaborazione dati
-Al livello pi@`u fondamentale, il compito di un programma @`e di elaborare
-alcuni dati in input e produrre dei risultati.
-@ifnotdocbook
-Si veda la @ref{figura-generica-flusso}.
-@end ifnotdocbook
-@ifdocbook
-Si veda la @inlineraw{docbook, <xref linkend="figura-generica-flusso"/>}.
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-generica-flusso
-@caption{Flusso generico di un programma}
-@ifclear SMALLPRINT
-@center @image{programma-generico, , , Flusso generico di un programma}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{programma-generico, 11cm, , Flusso generico di un programma}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-@cindex programmi compilati
-@cindex programmi interpretati
-Il ``programma'' nella figura pu@`o essere sia un programma
-compilato@footnote{I programmi compilati sono normalmente scritti
-in linguaggi di programmazione di livello pi@`u basso, come C, C++, o Ada,
-e quindi tradotti, o @dfn{compilati}, in una forma che
-il computer pu@`o eseguire direttamente.}
-(come @command{ls}),
-sia un programma @dfn{interpretato}. In quest'ultimo caso, un programma
-direttamente eseguibile dal computer, come @command{awk}, legge il
-programma, e quindi usa le istruzioni in esso contenute per elaborare i dati.
-
-@cindex programmazione, passi fondamentali
-Quando si scrive un programma, esso @`e composto normalmente
-dai seguenti insiemi di istruzioni di base,
-@ifnotdocbook
-come si vede nella @ref{figura-flusso-elaborazione}:
-@end ifnotdocbook
-@ifdocbook
-come si vede nella @inlineraw{docbook, <xref linkend="figura-flusso-elaborazione"/>}:
-@end ifdocbook
-
-@ifnotdocbook
-@float Figura,figura-flusso-elaborazione
-@caption{Fasi di un programma generico}
-@ifclear SMALLPRINT
-@center @image{flusso-elaborazione, , , Fasi di un programma generico}
-@end ifclear
-@ifset SMALLPRINT
-@center @image{flusso-elaborazione, 11cm , , Fasi di un programma generico}
-@end ifset
-@end float
-@end ifnotdocbook
-
-@docbook
-<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>
-</mediaobject>
-</figure>
-@end docbook
-
-@table @asis
-@item Inizializzazione
-Queste sono le cose da fare prima di iniziare la reale elaborazione dei
-dati, per esempio controllare gli argomenti con cui @`e stato invocato il
-programma, inizializzare dei dati di cui si potr@`a aver bisogno per la
-successiva elaborazione, e cos@`{@dotless{i}} via.
-Questa fase corrisponde alla regola @code{BEGIN} di @command{awk}
-(@pxref{BEGIN/END}).
-
-Nella preparazione di una torta, questa fase corrisponde a quella di
-tirar fuori tutti i contenitori in cui mischiare gli ingredienti, e la
-teglia in cui cuocerla, e nell'assicurarsi di avere a disposizione tutti gli
-ingredienti necessari.
-
-@item Elaborazione
-Questa fase @`e quella in cui si svolge il lavoro vero e proprio. Il programma
-legge i dati, raggruppati in ``pezzi logici'', e li elabora secondo necessit@`a.
-
-In quasi tutti i linguaggi di programmazione, la lettura dei dati va gestita
-manualmente, controllando dopo ogni lettura se @`e
-rimasto ancora qualcosa d'altro da leggere. Il paradigma @dfn{criterio di
-ricerca--azione} di @command{awk}
-@iftex
-(@pxrefil{Per iniziare})
-@end iftex
-@ifnottex
-(@pxref{Per iniziare})
-@end ifnottex
-gestisce automaticamente la parte di lettura dati.
-
-Nella preparazione di una torta, l'elaborazione corrisponde all'attivit@`a
-vera e propria: rompere le uova, mescolare la farina, l'acqua e gli altri
-ingredienti, e quindi mettere la torta a cuocere nel forno.
-
-@item Pulizia
-Una volta elaborati tutti i dati, ci sono attivit@`a da svolgere prima di aver
-finito. Questa fase corrisponde alla regola @code{END} di @command{awk}.
-(@pxref{BEGIN/END}).
-
-Dopo che la torta @`e stata tirata fuori dal forno, va fatta raffreddare e
-avvolta in una pellicola trasparente per evitare che qualcuno la assaggi,
-e inoltre vanno lavati i contenitori e le posate.
-@end table
-
-@cindex Algoritmi
-Un @dfn{algoritmo} @`e la descrizione dettagliata della procedura necessaria per
-svolgere un compito o per elaborare dati. Lo si pu@`o paragonare alla ricetta
-per preparare una torta. I programmi sono il modo con cui un
-algoritmo viene eseguito da un computer.
-Spesso @`e compito del programmatore sia sviluppare un algoritmo, sia
-programmarlo.
-
-@cindex record
-@cindex campi
-I ``pezzi logici'' nominati precedentemente sono chiamati @dfn{record}
-(registrazioni), in analogia con le registrazioni del personale di una ditta,
-degli studenti di una scuola, o dei pazienti di un dottore.
-Ogni record @`e composto di molte parti, per esempio nome, cognome, data di
-nascita, indirizzo, e cos@`{@dotless{i}} via. Le parti di cui @`e composto un record sono
-chiamate @dfn{campi} del record.
-
-L'atto di leggere i dati @`e noto come @dfn{input}, e quello di generare
-risultati @`e, come facilmente prevedibile, chiamato @dfn{output}. Spesso i due
-sono riuniti sotto il nome di ``input/output'' e, ancor pi@`u spesso, con
-l'abbreviazione ``I/O''. (In inglese ``input'' e ``output'' sono spesso usati
-come verbi, nel gergo informatico, al posto di leggere e scrivere.)
-
-@cindex guidato-dai-dati, linguaggio di programmazione
-@cindex linguaggio di programmazione, guidato dai dati
-@command{awk} gestisce la lettura dei dati, come anche la divisione in
-record e campi. Lo scopo del programma dell'utente @`e di dire ad @command{awk}
-cosa fare con i dati. Questo vien fatto descrivendo @dfn{modelli} da
-ricercare nei dati e @dfn{azioni} da eseguire qualora si siano trovati questi
-modelli. Questa caratteristica dei programmi @command{awk}, di essere
-@dfn{guidati-dai-dati}, di solito li rende pi@`u facili sia da scrivere che da
-leggere.
-
-@node Fondamenti sui tipi di dati
-@appendixsec Valore dei dati in un computer
-
-@cindex variabili
-In un programma si tiene traccia di informazioni e valori in contenitori
-chiamati @dfn{variabili}. Una variabile @`e solo un nome per designare un certo
-valore, come @code{nome}, @code{cognome}, @code{indirizzo}, e cos@`{@dotless{i}} via.
-@command{awk} ha molte variabili predefinite, e ha dei nomi speciali per
-designare il record in input corrente e i campi che compongono il record
-stesso. Si possono inoltre raggruppare molti valori associati tra di loro
-sotto un unico nome, utilizzando un vettore.
-
-@cindex valori numerici
-@cindex valori tipo stringa
-@cindex valori scalari
-@cindex scalari, valori
-I dati, in particolare in @command{awk}, possono avere valori numerici, come 42
-o 3.1415927, o avere come valore delle stringhe. Un valore di tipo stringa @`e
-essenzialmente qualsiasi cosa che non sia un numero, per esempio un nome. Le
-stringhe sono talora chiamate @dfn{dati di tipo carattere}, poich@'e memorizzano
-i singoli caratteri che le formano. Le singole variabili, come pure le
-variabili numeriche e di tipo stringa, sono definite come valori
-@dfn{scalari}. Raggruppamenti di valori, come i vettori, non sono scalari.
-
-@iftex
-La
-@end iftex
-@ref{Aritmetica del computer}, ha fornito un'introduzione di base ai tipi
-numerici (interi e a virgola mobile) e a come questi sono usati in un computer.
-Si consiglia di rileggere quelle informazioni, comprese le numerose avvertente
-l@`a esposte.
-
-@cindex stringhe nulle
-Mentre @`e probabile che ci si sia abituati all'idea di un numero senza un valore
-(cio@`e, allo zero), richiede un po' pi@`u di riflessione abituarsi all'idea di
-dati di tipo carattere a lunghezza zero. Nonostante ci@`o, questo tipo di dato
-esiste. @`E chiamato @dfn{stringa nulla}. La stringa nulla @`e un dato di tipo
-carattere che non ha un valore. In altre parole, @`e vuoto. Si scrive cos@`{@dotless{i}} nei
-programmi @command{awk}: @code{""}.
-
-Gli esseri umani sono abituati a usare il sistema decimale, cio@`e a base 10.
-In base 10, i numeri vanno da 0 a 9, e poi ``vengono riportati'' nella
-colonna successiva. (Chi si ricorda la scuola elementare? 42 = 4 x 10 + 2.)
-
-Ma esistono anche altre basi per i numeri. I computer normalmente usano
-la base 2 o @dfn{binaria}, la base 8 o @dfn{ottale}, e la base 16 o
-@dfn{esadecimale}. Nella numerazione binaria, ogni colonna rappresenta il
-doppio del valore della colonna alla sua destra. Ogni colonna pu@`o contenere
-solo uno 0 o un 1. Quindi, il numero binario 1010 rappresenta (1 x 8) + (0 x
-4) + (1 x 2) + (0 x 1), ossia il numero decimale 10. Le numerazioni ottale ed
-esadecimale sono trattate pi@`u ampiamente
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Numeri non-decimali}.
-
-Al livello pi@`u basso possibile, i computer memorizzano i valori come gruppi di
-cifre binarie, o @dfn{bit}. I computer moderni raggruppano i bit in gruppi di
-otto, detti @dfn{byte}. Applicazioni avanzate talora hanno necessit@`a di
-manipolare i bit direttamente, e @command{gawk} @`e dotato di apposite funzioni.
-
-I programmi sono scritti nei linguaggi di programmazione. Esistono centinaia,
-se non migliaia, di linguaggi di programmazione. Uno dei pi@`u diffusi @`e il
-linguaggio di programmazione C. Il linguaggio C ha esercitato un'influsso
-molto forte nella progettazione del linguaggio @command{awk}.
-
-@cindex Kernighan, Brian
-@cindex Ritchie, Dennis
-Ci sono state parecchie versioni di C. La prima @`e spesso designata come
-``K&R'' C, dalle iniziali di Brian Kernighan e Dennis Ritchie,
-gli autori del primo libro sul C. (Dennis Ritchie ha creato il linguaggio,
-e Brian Kernighan @`e stato uno dei creatori di @command{awk}.)
-
-A met@`a degli anni '80 @`e iniziato uno sforzo rivolto a produrre uno
-standard internazionale per il C. Questo lavoro ha raggiunto un punto di
-arrivo nel 1989 con la produzione dello standard ANSI per il C.
-Questo standard @`e diventato uno standard ISO nel 1990.
-Nel 1999, uno standard ISO C revisionato @`e stato approvato e pubblicato.
-Dove @`e opportuno, POSIX @command{awk} @`e compatible con lo standard
-ISO C del 1999.
-
-
-@node Glossario
-@unnumbered Glossario
-
-@table @asis
-@item Abbraccio mortale
-La situazione in cui due processi che comunicano tra loro sono entrambi bloccati, in
-attesa che l'altro processo faccia qualcosa.
-
-@cindex Ada, linguaggio di programmazione
-@cindex linguaggio di programmazione, Ada
-@item Ada
-Un linguaggio di programmazione originalmente definito dal Department of
-Defense U.S.A.@: per la programmazione integrata. @`E stato progettato per
-favorire dei buoni metodi da seguire nell'ingegneria del software.
-
-@item Ambiente
-Si veda ``Variabili d'ambiente''.
-
-@item @`Ancora
-I metacaratteri @dfn{regexp} @samp{^} e @samp{$}, che richiedono che la
-corrispondenza che si sta cercando si trovi all'inizio o alla fine di una
-stringa, rispettivamente.
-
-@cindex angolo buio
-@item Angolo buio
-Un'area del linguaggio le cui specifiche spesso non erano (o ancora non
-sono) chiare, col risultato di ottenere un comportamente inatteso o non
-desiderabile.
-Tali aree sono segnalate in questo @value{DOCUMENT} con
-@iftex
-il disegno di una torcia a margine
-@end iftex
-@ifnottex
-``(a.b.)'' nel testo
-@end ifnottex
-e sono riportate nell'indice analitico sotto la voce ``angolo buio''.
-
-@cindex ANSI
-@item ANSI
-L'American National Standards Institute. Questo ente produce
-parecchi standard, e tra questi gli standard per i linguaggi di
-programmazione C e C++.
-Questi standard spesso diventano anche internazionali. Si veda anche
-``ISO''.
-
-@item Argomento
-Un argomento pu@`o essere due cose differenti. Pu@`o essere un'opzione o un
-@value{FN} passato a un comando mentre lo si invoca dalla riga dei comandi,
-oppure pu@`o essere qualcosa passato a una @dfn{funzione} all'interno di un
-programma, per esempio all'interno di @command{awk}.
-
-In quest'ultimo caso, un argomento pu@`o essere passato a una funzione in
-due modi. Nel primo modo @`e passato come valore alla funzione chiamata,
-ossia una copia del valore della variabile @`e reso disponibile alla funzione
-chiamata, ma la variabile originale non pu@`o essere modificata dalla
-funzione stessa. Nel secondo modo l'argomento @`e passato per riferimento,
-ossia un puntatore alla variabile in questione @`e passato alla funzione, che
-pu@`o quindi modificarla direttamente. In @command{awk} le variabili scalari
-sono passate per valore, e i vettori sono passati per riferimento.
-Si veda ``Passaggio per valore/riferimento''.
-
-@item Arrotondamento
-Arrotondare il risultato di un'operazione aritmetica pu@`o essere difficile.
-C'@`e pi@`u di un modo di arrotondare, e in @command{gawk} @`e possibile scegliere
-quale metodo dovrebbe essere usato all'interno di un programma.
-@xref{Impostare modi di arrotondare}.
-
-@item Assegnamento
-Un'espressione @command{awk} che cambia il valore di qualche variabile o
-dato oggetto di @command{awk}. Un oggetto a cui si pu@`o assegnare un valore
-@`e detto un @dfn{lvalue}. I valori
-assegnati sono chiamati @dfn{rvalue}.
-@xref{Operatori di assegnamento}.
-
-@cindex Spencer, Henry
-@cindex @command{sed}, programma di utilit@`a
-@cindex programma di utilit@`a @command{sed}
-@cindex incredibile assembler (@command{aaa}) scritto in @command{awk}
-@item Assembler incredibilmente scritto in @command{awk}
-Henry Spencer dell'Universit@`a di Toronto ha scritto un assembler adatto a
-molti diversi hardware, usando solo @dfn{script} @command{sed} e
-@command{awk}. @`E lungo migliaia di righe, e include
-la descrizione dell'hardware di
-numerosi micro-computer a 8 bit. @`E un
-buon esempio di programma per cui sarebbe stato
-meglio utilizzare un altro linguaggio.
-Si pu@`o scaricare da @uref{http://awk.info/?awk100/aaa}.
-
-@item Asserzione
-Un'istruzione in un programma che afferma che una condizione @`e verificata in
-un dato punto di un programma.
-Utile per ragionare su come si suppone funzioni un programma.
-
-@item Azione
-Una serie di istruzioni @command{awk} associate a una regola. Se
-l'espressione di ricerca della regola individua un record in input,
-@command{awk} esegue su quel record l'azione relativa. Le azioni sono
-sempre racchiuse tra parentesi graffe.
-(@xref{Panoramica sulle azioni}).
-
-@item Bash
-La versione GNU della shell standard
-@ifnotinfo
-(il @b{B}ourne-@b{A}gain @b{SH}ell).
-@end ifnotinfo
-@ifinfo
-(il Bourne-Again SHell).
-@end ifinfo
-Si veda anche ``Bourne Shell''.
-
-@item Binario
-Notazione a base due, che usa le cifre @code{0}--@code{1}. Poich@'e
-i circuiti elettronici funzionano ``naturalmente'' in base 2
-(basta pensare a Off/On), ogni cosa all'interno di un computer @`e
-calcolata usando la base 2. Ciascuna cifra rappresenta la presenza
-(o l'assenza) di una potenza di 2 ed @`e chiamata un @dfn{bit}.
-Cos@`{@dotless{i}}, per esempio, il numero in base due @code{10101} rappresenta il
-numero in base decimale 21, ((1 x 16) + (1 x 4) + (1 x 1)).
-
-Poich@'e i numeri in base due diventano rapidamente molto lunghi
-sia da leggere che da scrivere, normalmente li si unisce a gruppi di tre
-(ossia, sono visti come numeri ottali) o a gruppi di quattro (ossia, sono
-visti come numeri esadecimali). Non c'@`e un modo diretto per inserire
-numeri a base due in un programma C. Se necessario, tali numeri vengono
-solitamente inseriti come numeri ottali o esadecimali.
-Il numero di cifre in base due contenuto nei registri usati per
-rappresentare i numeri interi all'interno dei computer @`e un'indicazione
-approssimativa della potenza di calcolo del computer stesso. La maggior
-parte dei computer oggi usa 64 bit per rappresentare i numeri interi nei
-registri di calcolo, ma registri a 32 bit, 16 bit e 8 bit sono stati
-largamente in uso in passato.
-@xref{Numeri non-decimali}.
-
-@cindex McIlroy, Doug
-@cindex biscotto della fortuna
-@item Biscotto della fortuna
-Una particolare perla di saggezza, segno, detto o ricordo
-prodotto da (o presentato a) un programma. (Con vivi ringraziamenti al Prof.
-Doug McIlroy).
-@ignore
-From: Doug McIlroy <doug@cs.dartmouth.edu>
-Date: Sat, 13 Oct 2012 19:55:25 -0400
-To: arnold@skeeve.com
-Subject: Re: origin of the term "cookie"?
-
-I believe the term "cookie", for a more or less inscrutable
-saying or crumb of information, was injected into Unix
-jargon by Bob Morris, who used the word quite frequently.
-It had no fixed meaning as it now does in browsers.
-
-The word had been around long before it was recognized in
-the 8th edition glossary (earlier editions had no glossary):
-
-cookie a peculiar goodie, token, saying or remembrance
-returned by or presented to a program. [I would say that
-"returned by" would better read "produced by", and assume
-responsibility for the inexactitude.]
-
-Doug McIlroy
-
-From: Doug McIlroy <doug@cs.dartmouth.edu>
-Date: Sun, 14 Oct 2012 10:08:43 -0400
-To: arnold@skeeve.com
-Subject: Re: origin of the term "cookie"?
-
-> Can I forward your email to Eric Raymond, for possible addition to the
-> Jargon File?
-
-Sure. I might add that I don't know how "cookie" entered Morris's
-vocabulary. Certainly "values of beta give rise to dom!" (see google)
-was an early, if not the earliest Unix cookie. The fact that it was
-found lying around on a model 37 teletype (which had Greek beta in
-its type box) suggests that maybe it was seen to be like milk and
-cookies laid out for Santa Claus. Morris was wont to make such
-connections.
-
-Doug
-@end ignore
-
-@item Bit
-Abbreviazione di ``Binary Digit'' [cifra binaria].
-Tutti i valori nella memoria di un computer sono rappresentati nella forma di
-cifre binarie: valori che sono zero o uno.
-Gruppi di bit possono essere interpretati differentemente---come numeri
-interi, numeri a virgola mobile, dati di tipo carattere, indirizzi di altri
-oggetti contenuti in memoria, o altri dati ancora.
-@command{awk} permette di lavorare con numeri a virgola mobile e stringhe.
-@command{gawk} permette di manipolare bit con le funzioni predefinite
-descritte
-@ifnottex
-in
-@end ifnottex
-@iftex
-nella
-@end iftex
-@ref{Funzioni a livello di bit}.
-
-I computer sono spesso definiti dal numero di bit che usano per rappresentare
-valori interi. Molti sistemi sono a 32-bit, ma i sistemi a 64-bit sono sempre
-pi@`u numerosi, mentre i sistemi a 16-bit [e quelli a 8-bit] sono praticamente
-scomparsi.
-
-@item Bourne Shell
-La shell standard (@file{/bin/sh}) in Unix e nei sistemi derivati da Unix,
-Originariamente scritto da Steven R.@: Bourne dei Bell Laboratories.
-Molte shell (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) sono
-generalmente compatibili con la Bourne shell, anche quando offrono ulteriori
-funzionalit@`a.
-
-@item C
-Il linguaggio di programmazione di sistema con cui @`e scritta la maggior parte
-del software GNU. Il linguaggio di programmazione @command{awk} ha una
-sintassi simile a quella del C, e
-questo @value{DOCUMENT} puntualizza, quando serve, le somiglianze esistenti
-fra @command{awk} e C.
-
-In generale, @command{gawk} tenta di essere ragionevolmente simile alla
-versione 1990 del C ISO.
-
-@item C Shell
-La C Shell (@command{csh} o la sua versione migliorata @command{tcsh}) @`e una
-shell Unix creata da Bill Joy verso la fine degli anni '70. La C shell si
-differenzia dalla altre shell per le sue funzionalit@`a interattive, e per lo
-stile complessivo, che @`e abbastanza simile a quello del linguaggio C.
-La C shell non @`e compatibile all'indietro con la Bourne Shell, e per questo
-motivo un'attenzione speciale @`e necessaria se si convertono alla C shell
-degli script scritti per altre shell Unix, in particolare per ci@`o che
-concerne la gestione delle variaili di shell.
-Si veda anche ``Bourne Shell''.
-
-@item C++
-Un linguaggio di programmazione molto diffuso, orientato agli oggetti,
-derivato dal C.
-
-@item Campo
-Quando @command{awk} legge un record in input, suddivide il record in parti
-separate da spazi vuoti (o da una @dfn{regexp} che individua il separatore,
-modificabile reimpostando la variabile predefinita @code{FS}). Tali parti
-sono dette campi. Se le parti sono di lunghezza fissa, si pu@`o usare la
-variabile predefinita @code{FIELDWIDTHS} per descriverne le lunghezze.
-Se si desidera specificare i contenuti dei campi, piuttosto che il separatore
-fra i campi, si pu@`o usare la variabile predefinita @code{FPAT} per farlo.
-(@xref{Separatori di campo},
-@iftex
-la
-@end iftex
-@ref{Dimensione costante},
-e
-@iftex
-la
-@end iftex
-@ref{Separazione in base al contenuto}).
-
-@cindex ASCII
-@cindex ISO 8859-1
-@cindex ISO Latin-1
-@cindex caratteri (codifiche macchina di caratteri)
-@cindex insiemi di caratteri (codifiche macchina di caratteri)
-@cindex Unicode
-@item Caratteri
-L'insieme di codici numerici usati da un computer per rappresentare i
-caratteri (lettere, numeri, segni d'interpunzione, etc.) di un particolare
-paese o localit@`a. L'insieme di caratteri pi@`u comunemente in uso oggi @`e
-l'ASCII (American Standard Code for Information Interchange). Molti paesi
-europei usano un'estensione dell'ASCII
-nota come ISO-8859-1 (ISO Latin-1).
-L'insieme di caratteri @uref{http://www.unicode.org, Unicode} sta guadagnando
-popolarit@`a e affermandosi come standard, e il suo uso @`e particolarmente esteso
-nei sistemi GNU/Linux.
-
-@cindex Kernighan, Brian
-@cindex Bentley, Jon
-@cindex @command{chem}, programma di utilit@`a
-@cindex programma di utilit@`a @command{chem}
-@item CHEM
-Un preprocessore per @command{pic} che legge descrizioni di molecole
-e produce l'input a @command{pic} che serve a disegnarle.
-@`E stato scritto in @command{awk}
-da Brian Kernighan e Jon Bentley, ed @`e disponibile in
-@uref{http://netlib.org/typesetting/chem}.
-
-@item Classe di caratteri
-Si veda ``Espressione tra parentesi quadre''.
-
-@cindex programmi compilati
-@item Compilatore
-Un programma che traduce codici sorgente scritti in qualche linguaggio
-in codici eseguibili su un particolare computer. Il codice oggetto risultante
-pu@`o quindi essere eseguito direttamente dal computer.
-Si veda anche ``Interprete''.
-
-@item Concatenazione
-Concatenare due stringhe significa unirle, producendo una nuova stringa.
-Per esempio, la stringa @samp{pippo} concatenata con
-la stringa @samp{pluto} produce la stringa @samp{pippopluto}.
-(@xref{Concatenazione}).
-
-@item Contatore di riferimenti
-Un meccanismo interno di @command{gawk} per minimizzare la quantit@`a di
-memoria necessaria per contenere il valore delle variabili di tipo
-stringa. Se il valore assunto da una variabile @`e usato in pi@`u di un
-posto nel programma, solo una copia del valore stesso @`e tenuta in
-memoria, e il contatore di riferimenti ad esso associato @`e aumentato di
-uno quando lo stesso valore @`e usato da un'ulteriore variabile, e diminuito
-di uno quando la variabile relativa non @`e pi@`u utilizzata. Quando il
-contatore di riferimenti va a zero, la parte di memoria utilizzata per
-contenere il valore della variuabile @`e liberato.
-
-@item Coprocesso
-Un programma subordinato con il quale @`e possibile una comunicazione
-bidirezionale dal programma principale.
-
-@item Dati oggetto
-Sono costituiti da numeri e stringhe di caratteri. I numeri sono convertiti
-in stringhe e viceversa, a seconda delle necessit@`a.
-(@xref{Conversione}).
-
-@item Debugger
-Un programma che serve agli sviluppatori per rimuovere ``bug'' (de-bug) dai
-loro programmi.
-
-@item Dominio di testo
-Un nome unico che identifica un'applicazione.
-Usato per raggruppare messaggi che sono tradotti in fase di esecuzione
-nel linguaggio locale.
-
-@item Doppia precisione
-Una rappresentazione di numeri all'interno del computer che ha una parte
-espressa sotto forma di frazione. I numeri a doppia precisione hanno pi@`u
-cifre decimali che quelli a singola precisione, ma le operazioni che la
-usano consumano pi@`u risorse di quelle
-eseguite in singola precisione. La doppia precisione @`e il formato con cui
-@command{awk} memorizza i valori numerici. Nel linguaggio C @`e il tipo di
-dati detto @code{double}.
-
-@item Editore di flusso
-Un programma che legge record da un flusso in input e li elabora uno o
-pi@`u alla volta. Questo @`e diverso da quel che farebbe un programma batch
-il quale potrebbe leggere completamente i file in input, prima di
-iniziare a fare alcunch@'e, ed @`e diverso anche da un programma interattivo, che
-richiede input dall'utente [tipicamente, una riga alla volta].
-
-@item Effetto collaterale
-Un effetto collaterale ha luogo quando un'espressione ha un effetto ulteriore,
-invece di produrre solo un valore. Espressioni di assegnamento,
-incremento e decremento, e invocazioni di funzioni hanno effetti collaterali.
-(@xref{Operatori di assegnamento}).
-
-@cindex epoch, definizione di
-@item Epoca [Inizio del tempo in Unix]
-la data usata come ``inizio del tempo'' per i campi che contengono date.
-I valori del tempo nella maggior parte dei dei sistemi sono rappresentati
-in numero di secondi trascorsi dall'Epoca, con funzioni di libreria
-che consentono di convertire tali valori nei formati normali di data e ora.
-
-L'Epoca nei sistemi Unix e POSIX parte dal primo gennaio 1970 alle ore
-00:00:00 UTC.
-Si veda anche ``GMT'' e ``UTC''.
-
-@item Esadecimale
-Notazione per l'aritmetica in base 16, che usa le cifre @code{0}--@code{9} e
-le lettere @code{A}--@code{F}, con @samp{A}
-che rappresenta 10, @samp{B} che rappresenta 11, e cos@`{@dotless{i}} via, fino a
-@samp{F} per 15.
-I numeri esadecimali sono scritti in C prefissandoli con @samp{0x},
-per indicarne la base. Quindi, @code{0x12} @`e 18 ((1 x 16) + 2).
-@xref{Numeri non-decimali}.
-
-@item Espressione booleana
-Cos@`{@dotless{i}} detta dal nome del matematico inglese George Boole.
-Si veda anche ``Espressione logica''.
-
-@item Espressione condizionale
-Un'espressione che usa l'operatore ternario @samp{?:}, come p.es.
-@samp{@var{expr1} ? @var{expr2} : @var{expr3}}. Dell'espressione
-@var{expr1} viene calcolato il valore; se risulta verificata, il valore
-dell'intera espressione diviene quello di @var{expr2}; altrimenti il valore @`e
-quello di @var{expr3}. In ogni caso, solo una delle due espressioni
-@var{expr2} e @var{expr3}
-viene calcolata. (@xref{Espressioni condizionali}).
-
-@item Espressione di confronto
-Una relazione che @`e vera o falsa, del tipo di @samp{a < b}.
-Espressioni di confronto sono usate nelle istruzioni
-@code{if}, @code{while}, @code{do}, @code{for}
-e nelle espressioni di ricerca per scegliere quale record in input elaborare.
-(@xref{Tipi di variabile e confronti}).
-
-@item Espressione di intervallo
-Una parte di un'espressione regolare che permette di specificare
-corrispondenze multiple di qualche parte della @dfn{regexp}. Le espressioni di
-intervallo non erano originariamente ammesse nei programmi @command{awk}.
-
-@item Espressione di ricerca [@dfn{pattern}]
-@itemx (detta anche "criterio di ricerca" o "modello di ricerca")
-Le espressioni di ricerca individuano per @command{awk} a quali record in
-input sono applicabili determinate
-regole.
-
-Un'espressione di ricerca [pattern] @`e un'espressione condizionale specifica
-che viene confrontata con ogni record
-in input. Se la corrispondenza esiste, si dice che il modello @dfn{individua}
-il record in input. Una tipica espressione di ricerca potrebbe confrontare
-il record in input con un'espressione regolare.
-(@xref{Panoramica sui criteri di ricerca}).
-
-@item Espressione logica
-Un'espressione che usa gli operatori logici AND, OR e NOT,
-scritti come @samp{&&}, @samp{||}, e @samp{!} in @command{awk}.
-Spesso chiamate espressioni booleane, dal nome del matematico che per primo
-ha sistematizzato questo tipo di logica matematica.
-
-@item Espressione regolare
-un'espressione regolare (abbreviabile come ``@dfn{regexp}'') @`e un modello che
-descrive un assieme di stringhe, potenzialmente illimitato. Per esempio
-l'espressione regolare
-@samp{R.*xp} corrisponde a qualsiasi stringa che inizia con la lettera
-@samp{R} e termina con le lettere @samp{xp}. In @command{awk}, le espressioni
-regolari sono usate nei modelli [pattern] e nelle espressioni condizionali.
-Le espressioni regolari possono contenere sequenze di protezione.
-@iftex
-(@xrefil{Espressioni regolari}).
-@end iftex
-@ifnottex
-(@xref{Espressioni regolari}).
-@end ifnottex
-
-@item Espressione regolare calcolata
-Si veda ``Espressioni regolari dinamiche''.
-
-@item Espressione regolare costante
-Un'espressione regolare costante @`e un'espressione regolare scritta tra barre,
-come @code{/pippo/}. A una tale espressione viene assegnato un valore quando
-si scrive un programma @command{awk} e non pu@`o essere modificata in fase di
-esecuzione del programma. (@xref{Uso di @dfn{regexp}}.)
-
-@item Espressione regolare dinamica
-Un'espressione regolare dinamica @`e un'espressione regolare scritta come
-un'espressione normale. Potrebbe essere una costante stringa, come
-@code{"pippo"}, ma potrebbe anche essere un'espressione il cui valore @`e variabile
-(@xref{Espressioni regolari calcolate}).
-
-@item Espressione tra parentesi quadre
-All'interno di una @dfn{espressione regolare}, un'espressione racchiusa
-fra parentesi quadre sta a indicare che un singolo carattere appartiene
-a una specifica classe di caratteri. Un'espressione tra parentesi quadre
-pu@`o contenere una lista di uno o pi@`u caratteri, come @samp{[abc]}, un
-intervallo di caratteri, come @samp{[A-Z]}, o un nome, delimitato da
-@samp{:}, che designa un insieme di caratteri conosciuto, come
-@samp{[:digit:]}. La forma di espressione tra parentesi quadre
-racchiusa tra @samp{:} @`e indipendente dalla rappresentazione binaria dei
-caratteri stessi, che potrebbe utilizzare le codifiche ASCII, EBCDIC, o
-Unicode, a seconda dell'architettura del computer, e della localizzazione.
-Si veda anche ``Espressioni regolari''.
-
-@item Espressione tra parentesi quadre complementata
-La negazione di una @dfn{espressione tra parentesi quadre}. Tutto ci@`o che
-@emph{non} @`e descritto da una data espressione tra parentesi quadre.
-Il simbolo @samp{^} precede l'espressione tra parentesi quadre che viene
-negata. Per esempio: @samp{[[^:digit:]}
-designa qualsiasi carattere che non sia una cifra. @samp{[^bad]}
-designa qualsiasi carattere che non sia una delle lettere @samp{b}, @samp{a},
-o @samp{d}.
-Si veda ``Espressione tra parentesi quadre''.
-
-@item Estensione
-Una funzionalit@`a aggiunta o una modifica a un linguaggio di programmazione
-o a un programma di utilit@`a, non definita dallo standard di quel linguaggio
-o di quel programma di utilit@`a.
-@command{gawk} ha molte estensioni rispetto al POSIX @command{awk} (fin
-troppe).
-
-@item FDL
-Free Documentation License. Si veda ``Licenza Documentazione Libera''.
-
-@item File speciale
-Un @value{FN} interpretato internamente da @command{gawk}, invece che
-gestito direttamente dal sistema operativo in cui viene eseguito
-@command{gawk}---per esempio, @file{/dev/stderr}.
-(@xref{File speciali}).
-
-@item Flag [Indicatore]
-Una variabile [di tipo booleano] che, se verificata, indica la presenza o
-l'assenza di qualche condizione.
-
-@item Formato
-Le stringhe di formato controllano il modo in cui le funzioni
-@code{strftime()}, @code{sprintf()} e l'istruzione @code{printf} visualizzano
-l'output che producono. Inoltre, le conversioni da numeri a stringhe sono
-controllate dalle stringhe di formato contenute nelle variabili predefinite
-@code{CONVFMT} e @code{OFMT}. (@xref{Lettere di controllo}).
-
-@cindex formattatore incredibilmente duttile (@command{awf})
-@cindex programma @command{awf} (formattatore incredibilmente duttile)
-@item Formattatore incredibilmente duttile (@command{awf})
-Henry Spencer all'Universit@`a di Toronto ha scritto un formattatore che
-accetta un ampio sottoassieme dei comandi di formattazione @samp{nroff -ms}
-e @samp{nroff -man} usando
-@command{awk} e @command{sh}.
-Si pu@`o scaricare da @uref{http://awk.info/?tools/awf}.
-
-@item Fortran
-Abbreviazione di FORmula TRANslator (traduttore di formule), @`e uno dei primi
-linguaggi di programmazione, pensato per il calcolo scientifico.
-@`E stato ideato da John Backus ed @`e disponibile a partire dal 1957. @`E ancora
-in uso ai giorni nostri.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Stallman, Richard
-@item Free Software Foundation
-Un'organizzazione senza fini di lucro dedicata alla
-produzione e distribuzione di software liberamente distribuibile.
-@`E stata fondata da Richard M.@: Stallman, l'autore dell'originale editor
-Emacs. GNU Emacs @`e la versione di Emacs maggiormente usata oggigiorno.
-
-@item FSF
-Si veda ``Free Software Foundation''.
-
-@item Funzione
-Una parte di un programma @command{awk} che si pu@`o chiamare da qualsiasi
-punto del programma, per eseguire un compito. @command{awk} ha parecchie
-funzioni predefinite.
-Gli utenti possono definire essi stessi delle funzioni in qualsiasi parte
-del programma. Le funzioni possono essere ricorsive, ossia possono
-chiamare se stesse.
-@iftex
-@xrefil{Funzioni}.
-@end iftex
-@ifnottex
-@xref{Funzioni}.
-@end ifnottex
-In @command{gawk} @`e anche possibile avere funzioni condivise tra diversi
-programmi, incluse secondo necessit@`a usando la direttiva
-@code{@@include}
-(@pxref{Includere file}).
-In @command{gawk} il nome della funzione da chiamare pu@`o essere generato
-in fase di esecuzione, ossia in maniera dinamica.
-L'estensione API di @command{gawk} fornisce funzioni di costruzione
-(@pxref{Funzioni di costruzione}).
-
-@item Funzioni predefinite
-Il linguaggio @command{awk} fornisce funzioni predefinite, che compiono
-calcoli vari, di tipo numerico, di input/output e di tipo carattere. Esempi
-sono @code{sqrt()} ([square root], la radice quadrata di un numero) e
-@code{substr()} (che estrae una sottostringa da una stringa).
-@command{gawk} fornisce funzioni per la gestione di data e ora,
-le operazioni a livello di bit, l'ordinamento di
-vettori, il controllo di tipo [di variabile] e la traduzione di stringhe
-in fase di esecuzione di progranna.
-(@xref{Funzioni predefinite}).
-
-@item @command{gawk}
-L'implementazione GNU di @command{awk}.
-
-@cindex GPL (General Public License)
-@cindex General Public License (GPL)
-@cindex GNU General Public License
-@item General Public License
-Un documento che descrive le condizioni alle quali @command{gawk} e i suoi
-file sorgenti possono essere distribuiti. (@xref{Copia}).
-
-@item GMT
-``Greenwich Mean Time''.
-Il termine tradizionalmente usato per UTC.
-@`E la datazione usata internamente dai sistemi Unix e POSIX.
-Si veda anche ``Epoca'' e ``UTC''.
-
-@cindex FSF (Free Software Foundation)
-@cindex Free Software Foundation (FSF)
-@cindex Progetto GNU
-@item GNU
-``GNU's not Unix'' (GNU non @`e Unix).
-Un progetto della Free Software Foundation, ancora in corso, che mira a creare
-un ambiente di calcolo completo, liberamente distribuibile, aderente allo
-standard POSIX.
-
-@item GNU/Linux
-Una variante del sistema GNU che usa il kernel Linux,
-invece del kernel proprio della Free Software Foundation, noto come Hurd.
-Il kernel Linux @`e un clone di Unix stabile, efficiente, completo di tutte le
-funzionalit@`a, ed @`e stato portato su varie architetture hardware.
-@`E molto diffuso su sistemi del tipo dei Personal Computer, ma funziona bene
-anche in parecchi altri computer.
-Il codice sorgente del kernel Linux @`e disponibile nei termini della GNU General
-Public License, la qual cosa @`e forse il suo aspetto pi@`u rilevante.
-
-@item GPL
-Si veda ``General Public License''.
-
-@item Graffe
-I caratteri @samp{@{} e @samp{@}}. Le parentesi graffe sono usate in
-@command{awk} per delimitare azioni, istruzioni composte, e il codice che
-costituisce le funzioni.
-
-@item Guidato dai dati
-Una descrizione dei programmi @command{awk}, nei quali si specifica quali sono
-i dati che si vogliono elaborare, e cosa fare quando si trovano tali dati.
-
-@item I/O
-Abbreviazione per ``Input/Output,'' ovvero il trasferimento di dati da e verso
-un programma in esecuzione.
-
-@item Individuazione
-L'azione che consiste nel confrontare una stringa con un'espressione regolare.
-Se la @dfn{regexp} descrive qualcosa che @`e contenuto nella stringa, si dice che
-la @dfn{individua}.
-
-@item Internazionalizzazione
-La procedura con cui si scrive o si modifica un programma
-in modo che possa inviare messaggi in lingue differenti, senza richiedere
-ulteriori modifiche al codice sorgente.
-
-@item Intero
-Un numero intero, cio@`e un numero che non ha una parte frazionaria.
-
-@cindex programmi interpretati
-@item Interprete
-Un programma che accetta come input del codice sorgente, e usa le
-istruzione contenute nello stesso per elaborare dati e fornire risultati.
-@command{awk} @`e tipicamente (ma non sempre) implementato come un interprete.
-Si veda anche ``Compilatore''.
-
-@item Intervallo (nelle righe di input)
-Una sequenza di righe consecutive nel/nei file in input. Un'espressione di
-ricerca pu@`o specificare intervalli di righe di input da far elaborare ad
-@command{awk} oppure pu@`o specificare singole righe.
-(@xref{Panoramica sui criteri di ricerca}).
-
-@cindex ISO
-@item ISO
-Acronimo di International Organization for Standardization.
-Questo ente elabora degli standard internazionali in vari settori, inclusi i
-linguaggi di programmazione, come il C e il C++.
-In ambito informatico, standard importanti come quelli per il C, C++, e POSIX
-sono allo stesso tempo standard nazionali americani e standard internazionali
-ISO.
-In questo @value{DOCUMENT} lo Standard C @`e chiamato ``ISO C''.
-Si veda @uref{http://www.iso.org/iso/home/about.htm, il sito web ISO} per
-ulteriori informazioni sul nome dell'ente e sul suo acronimo di tre lettere,
-che rimane lo stesso in tutte le lingue.
-
-@item Istruzione
-Un'espressione all'interno di un programma @command{awk} nella parte
-"azione" di una regola @dfn{criterio di ricerca--azione}, o all'interno
-di una funzione @command{awk}. Un'espressione pu@`o essere un assegnamento
-di variabile, un'operazione su un vettore, un ciclo, etc.
-
-@item Istruzione composta
-Una serie di istruzioni @command{awk}, racchiuse tra parentesi graffe.
-Le istruzioni composte possono essere nidificate [possono esserci pi@`u livelli
-di parentesi graffe].
-(@xref{Istruzioni}).
-
-@item Istruzione di controllo
-Un'istruzione di controllo @`e un'istruzione per eseguire una data operazione
-o un insieme di operazioni all'interno di un programma @command{awk},
-se una determinata condizione @`e verificata.
-Istruzioni di controllo sono: @code{if}, @code{for}, @code{while}, e @code{do}
-(@pxref{Istruzioni}).
-
-@cindex Java, linguaggio di programmazione
-@cindex linguaggio di programmazione, Java
-@item Java
-Un moderno linguaggio di programmazione originalmente sviluppato da Sun
-Microsystems (ora Oracle) che prevede la programmazione orientata agli
-oggetti. Sebbene normalmente sia implementato compilando le istruzioni
-per una macchina virtuale standard (la JVM---Java Virtual Machine) il
-linguaggio pu@`o essere compilato per essere eseguito in maniera nativa.
-
-@item Korn Shell
-La Korn Shell (@command{ksh}) @`e una shell Unix sviluppata da David Korn,
-presso i Bell Laboratories, nei primi anni '80. La Korn shell @`e
-compatibile all'indietro con la Bourne shell e comprende molte funzionalit@`a
-presenti nella C Shell.
-Si veda anche ``Bourne Shell''.
-
-@item LDL
-Si veda ``Licenza Documentazione Libera''.
-
-@cindex LGPL (Lesser General Public License)
-@cindex Lesser General Public License (LGPL)
-@cindex GNU Lesser General Public License
-@item Lesser General Public License
-Questo documento descrive i termini nei quali possono essere distribuiti
-degli archivi contenenti librerie in formato eseguibile o oggetti condivisi,
-e il relativo codice sorgente.
-
-@item LGPL
-Si veda ``Lesser General Public License''.
-
-@item Licenza Documentazione Libera
-Questo documento descrive i termini in base ai quali questo @value{DOCUMENT}
-@`e pubblicato e pu@`o essere copiato.
-(@xref{Licenza per Documentazione Libera GNU (FDL)}).
-
-@item Linguaggio @command{awk}
-Il linguaggio in cui i programmi @command{awk} sono scritti.
-
-@item Linux
-Si veda ``GNU/Linux''.
-
-@item Lista di caratteri
-Si veda ``Espressione tra parentesi quadre''.
-
-@item Localizzazioni
-La funzionalit@`a che fornisce i dati necessari perch@'e un programma
-internazionalizzato interagisca con l'utente in un particolare linguaggio.
-
-@item @dfn{Lvalue}
-[left-value, ossia valore a sinistra] Un'espressione che pu@`o stare alla
-sinistra di un operatore di assegnamento.
-Nella maggior parte dei linguaggi, gli @dfn{lvalue} possono essere variabili o
-elementi di un vettore. In @command{awk}, un designatore di campo pu@`o anche
-essere usato come un @dfn{lvalue}.
-
-@item Marcatura temporale
-Un valore nel formato ``secondi a partire dall'epoch'' usato dai sistemi Unix
-e POSIX. Usato per le funzioni @command{gawk}
-@code{mktime()}, @code{strftime()}, e @code{systime()}.
-Si veda anche ``Epoca,'' ``GMT,'' e ``UTC''.
-
-@item Metacaratteri
-Caratteri usati all'interno di una @dfn{regexp} e che non rappresentano se
-stessi.
-Servono invece per rappresentare operazioni con espressioni regolari, come
-per esempio delle ripetizioni, dei raggruppamenti, o delle alternanze.
-
-@item Nidificazione
-Una nidificazione si riscontra dove l'informazione @`e organizzata a strati,
-o dove degli oggetti contengono altri oggetti simili.
-In @command{gawk} la direttiva @code{@@include}
-pu@`o essere nidificata. La nidificazione ``naturale'' delle operazioni
-aritmetiche e logiche pu@`o essere modificato attraverso l'uso di parentesi.
-(@pxref{Precedenza}).
-
-@item No-op
-Un'operazione che non fa nulla.
-
-@item Numero
-Un dato oggetto il cui valore @`e numerico. Le implementazioni di @command{awk}
-usano numeri a virgola mobile in doppia precisione per rappresentare i numeri.
-Le primissime implementazioni di @command{awk} usavano numeri a virgola mobile
-in singola precisione.
-
-@item Numero a virgola mobile
-Spesso descritto, in termini matematici, come un numero ``razionale'' o reale,
-@`e soltanto un numero che pu@`o avere una parte frazionaria.
-Si veda anche ``Doppia precisione'' e ``Singola precisione''.
-
-@item Operatori di espressioni regolari
-Si veda ``Metacaratteri''.
-
-@item Ottale
-Notazione avente come base 8, nella quale le cifre sono @code{0}--@code{7}.
-I numeri ottali in C sono scritti premettendo uno @samp{0},
-per indicare la base. Quindi, @code{013} @`e 11 ((1 x 8) + 3).
-@xref{Numeri non-decimali}.
-
-@item Parentesi Graffe
-Si veda ``Graffe''.
-
-@item Parola chiave
-nel linguaggio @command{awk}, una parola chiave (keyword) @`e una parola
-che ha un significato speciale. Queste parole sono riservate e non possono
-essere usate come nomi di variabili.
-
-Le parole chiave di @command{gawk} sono:
-@code{BEGIN},
-@code{BEGINFILE},
-@code{END},
-@code{ENDFILE},
-@code{break},
-@code{case},
-@code{continue},
-@code{default}
-@code{delete},
-@code{do@dots{}while},
-@code{else},
-@code{exit},
-@code{for@dots{}in},
-@code{for},
-@code{function},
-@code{func},
-@code{if},
-@code{next},
-@code{nextfile},
-@code{switch},
-e
-@code{while}.
-
-@item PEBKAC
-Un acronimo inglese che descrive qual @`e probabilmente la causa pi@`u frequente
-di problemi nell'uso di un computer. (@dfn{Problem Exists Between Keyboard and
-Chair} [il problema si trova tra la tastiera e la sedia].)
-
-@item Percorso di ricerca
-In @command{gawk}, una lista di directory in cui cercare file contenenti del
-codice sorgente per @command{awk}.
-Nella shell, una lista di directory in cui ricercare un programma eseguibile.
-
-@item Plug-in
-Si veda ``Estensione''.
-
-@item POSIX
-Il nome di una serie di standard che specificano l'interfaccia di un Sistema
-Operativo Portabile (Portable Operating System). La ``IX'' specifica
-che questi standard sono stati originati dallo Unix.
-Lo standard pi@`u rilevante per gli utenti @command{awk} @`e lo
-@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}.
-Lo standard POSIX 2008 pu@`o essere trovato in rete all'indirizzo:
-@url{http://www.opengroup.org/onlinepubs/9699919799/}.
-
-@item Precedenza
-L'ordine in cui le operazioni sono eseguite quando si usano degli operatori
-se non si stabiliscono precedenze per mezzo di parentesi.
-
-@item Private
-Variabili e/o funzioni che sono riservate all'uso esclusivo di funzioni di
-libreria, e non per il programma principale @command{awk}. Un'attenzione
-particolare va prestata quando si desigano tali variabili e funzioni.
-(@xref{Nomi di variabili di libreria}).
-
-@item Programma @command{awk}
-Un programma @command{awk} consiste in una serie di @dfn{espressioni di
-ricerca} e @dfn{azioni}, che formano delle @dfn{regole}. Per ogni record in
-input a un progranna, le regole del programma sono elaborate nell'ordine in
-cui sono scritte. I programmi
-@command{awk} possono anche contenere definizioni di funzioni.
-
-@item Record
-Si veda ``Record in input'' e ``Record in output''.
-
-@item Record in input
-Una singola parte di dati letta da @command{awk}. Solitamente, un
-record in input di @command{awk} consiste in una linea di testo.
-(@xref{Record}).
-
-@item Record in output
-Un singolo pezzo di dati scritto da @command{awk}. Solitamente, un
-record in output di @command{awk} consiste di una o pi@`u righe di testo.
-@xref{Record}.
-
-@item Ricorsione
-Quando una funzione chiama se stessa, direttamente o indirettamente.
-Se questo @`e chiaro, si pu@`o passare a leggere la definizione successiva.
-Altrimenti, si veda la voce ``Ricorsione''.
-
-@item @dfn{regexp}
-Si veda ``Espressione regolare''.
-
-@item Regola
-Un segmento di un programma @command{awk} che specifica come trattare singoli
-record in input. Una regola consiste in una @dfn{espressione di ricerca} e in
-una @dfn{azione}.
-@command{awk} legge un record in input; poi, per ogni regola, se il record in
-input soddisfa l'espressione di ricerca della regola, @command{awk} esegue
-l'azione specificata dalla regola.
-Altrimenti, la regola non ha alcun effetto su quel record in input.
-
-@item Ridirezione
-Ridirezione significa ricevere input da quaclosa che non sia il flusso dello
-standard input, o dirigere output a qualcosa di diverso dal flusso dello
-standard output.
-
-Si pu@`o ridirigere input all'istruzione @code{getline} usando gli operatori
-@samp{<}, @samp{|}, e @samp{|&}.
-Si pu@`o ridirigere l'output delle istruzioni @code{print} e @code{printf} verso
-un file o un comando di sistema, usando gli operatori @samp{>}, @samp{>>},
-@samp{|}, e @samp{|&}.
-(@xref{Getline},
-e @ref{Ridirezione}).
-
-@item @dfn{Rvalue}
-[right-value, ossia valore a destra] Un valore che pu@`o apparire alla destra
-di un operatore di assegnazione.
-In @command{awk}, essenzialmente ogni espressione ha un valore.
-Ognuno di questi valori @`e un @dfn{rvalue}.
-
-@item Scalare
-Un valore singolo, sia numerico che di tipo stringa.
-Le variabili normali sono scalari; i vettori e le funzioni non lo sono.
-
-@item Scorciatoia
-La natura degli operatori logici @command{awk} @samp{&&} e @samp{||}.
-Se il valore dell'intera espressione in cui sono contenuti @`e determinabile
-valutando solo una parte iniziale dell'espressione, la parte seguente non @`e
-presa in considerazione.
-(@xref{Operatori booleani}).
-
-@item @dfn{Script} @command{awk}
-Un altro nome per designare un programma @command{awk}.
-
-@item @command{sed}
-Si veda ``Editore di flusso''.
-
-@item Seme
-Il valore iniziale, o il punto di partenza, di una sequenza di numeri casuali.
-
-@item Sequenze di protezione
-Una speciale sequenza di caratteri usata per descrivere caratteri non
-stampabili, come @samp{\n} (ritorno a capo) o @samp{\033} per il carattere
-ASCII ESC (Escape). (@xref{Sequenze di protezione}).
-
-@item Shell
-Il programma che interpreta i comandi nei sistemi Unix e in quelli che
-rispettano lo standard POSIX.
-La shell funziona sia interattivamente che come un linguaggio di
-programmazione, che elabora file sequenziali, detti @dfn{script} di shell.
-
-@item Singola precisione
-Una rappresentazione di numeri all'interno del computer che ha una parte
-espressa sotto forma di frazione. I numeri a singola precisione hanno meno
-cifre significative di quelli a doppia precisione, ma le operazioni relative
-richiedono talora meno risorse elaborative da parte del computer.
-Questo tipo di numero @`e quello usato da alcune tra le prime versioni di
-@command{awk} per memorizzare valori numerici. Nel linguaggio C, sono numeri
-di tipo @code{float}.
-
-@item Spazio
-Il carattere generato premendo la barra spaziatrice sulla tastiera.
-
-@item Spazio vuoto
-Una sequenza di spazi, TAB, o caratteri di ritorno a capo presenti in un
-record in input o in una stringa.
-
-@item Stringa
-Un dato che consiste in una sequenza di caratteri, come @samp{Io sono una
-stringa}. Le costanti stringa sono scritte tra doppi apici nel linguaggio
-@command{awk} e possono contenere sequenze di protezione
-(@xref{Sequenze di protezione}).
-
-@item Stringa nulla
-Una stringa che non contiene alcun carattere. @`E rappresentabile
-esplicitamente nei programmi @command{awk} mettendo due caratteri di
-doppio apice uno dietro all'altro (@code{""}). La si pu@`o inserire nei dati
-in input mettendo due separatori di campo uno dietro all'altro.
-
-@item Stringa vuota
-Si veda ``Stringa nulla''.
-
-@item Tab
-Il carattere generato premendo il tasto @kbd{TAB} sulla tastiera.
-Normalmente pu@`o generare sino a otto spazi in output.
-
-@cindex Linux
-@cindex GNU/Linux
-@cindex Unix
-@cindex sistemi operativi basati su BSD
-@cindex NetBSD
-@cindex FreeBSD
-@cindex OpenBSD
-@item Unix
-Un sistema operativo per computer originalmente sviluppato nei primi anni '70
-presso gli AT&T Bell Laboratories. Inizialmente si diffuse nelle universit@`a
-di tutto il mondo e in seguito si estese agli ambienti del mondo del lavoro
-come un sistema per lo sviluppo del software e come server di rete.
-Ci sono parecchie versioni di Unix a pagamento, come pure parecchi sistemi
-operativi modellati su Unix e il cui codice sorgente @`e liberamente
-disponibile. (come GNU/Linux, @uref{http://www.netbsd.org, NetBSD},
-@uref{http://www.freebsd.org, FreeBSD}, e
-@uref{http://www.openbsd.org, OpenBSD}).
-
-@item UTC
-L'abbreviazione comune per ``Universal Coordinated Time'' (tempo coordinato
-universale). Questa @`e l'ora standard di Greenwich, (UK), usata come tempo
-di riferimento per i calcoli relativi a marcature temporali.
-Si veda anche ``Epoca'' e ``GMT''.
-
-@item Variabile
-Un nome per designare un valore. In @command{awk}, le variabili possono
-essere degli scalari o dei vettori.
-
-@item Variabili d'ambiente
-Una collezione di stringhe, in formato @samp{@var{nome}=@var{valore}}, che
-ogni programma ha a disposizione. Gli utenti in generale assegnano valori
-alle variabili d'ambiente per fornire informazioni a vari programmi.
-Esempi tipici sono le variabili d'ambiente @env{HOME} e @env{PATH}.
-
-@item Variabili predefinite
-@code{ARGC},
-@code{ARGV},
-@code{CONVFMT},
-@code{ENVIRON},
-@code{FILENAME},
-@code{FNR},
-@code{FS},
-@code{NF},
-@code{NR},
-@code{OFMT},
-@code{OFS},
-@code{ORS},
-@code{RLENGTH},
-@code{RSTART},
-@code{RS},
-e
-@code{SUBSEP}
-sono le variabili con un significato speciale in @command{awk}.
-In pi@`u,
-@code{ARGIND},
-@code{BINMODE},
-@code{ERRNO},
-@code{FIELDWIDTHS},
-@code{FPAT},
-@code{IGNORECASE},
-@code{LINT},
-@code{PROCINFO},
-@code{RT},
-e
-@code{TEXTDOMAIN}
-sono le variabili con un significato speciale in @command{gawk}.
-Se i loro valori sono modificati, il contesto di esecuzione di @command{awk}
-cambia.
-(@xref{Variabili predefinite}).
-
-@item Vettore
-Un raggruppamento di molti valori con uno stesso nome.
-La maggior parte dei linguaggi fornisce solo vettori sequenziali.
-@command{awk} fornisce vettori associativi.
-
-@item Vettore associativo
-Un vettore i cui indici possono essere numeri o stringhe, e non solamente
-interi sequenziali compresi in un intervallo prestabilito.
-
-@end table
-
-@end ifclear
-
-@c The GNU General Public License.
-
-@node Copia
-@unnumbered Licenza Pubblica Generale GNU (GPL)
-@ifnotdocbook
-@center Versione 3, 29 Giugno 2007
-@end ifnotdocbook
-@docbook
-<subtitle>Versione 3, 29 Giugno 2007</subtitle>
-@end docbook
-
-@c This file is intended to be included within another document,
-@c hence no sectioning command or @node.
-
-@display
-Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
-
-This is an unofficial translation of the GNU General Public License into
-Italian. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU GPL—only
-the original English text of the GNU GPL does that. However, we hope that this
-translation will help Italian speakers understand the GNU GPL better.
-
-Questa @`e una traduzione non ufficiale in italiano della GNU General Public
-License. Questa traduzione non @`e stata pubblicata dalla Free Software
-Foundation, e non stabilisce i termini legali di distribuzione del software
-che usa la GNU GPL. Soltanto la versione originale in inglese della GNU GPL
-fa ci@`o. Ciononostante, speriamo che questa traduzione possa aiutare gli utenti
-di lingua italiana a comprendere un po' meglio la GNU GPL.
-
-A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
-di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
-@end display
-
-@c fakenode --- for prepinfo
-@heading Preambolo
-
-La GNU General Public License @`e una licenza libera e basata su copyleft per
-software e altri tipi di opere.
-
-Le licenze della maggior parte del software e di altre opere materiali sono
-pensate per togliere la libert@`a di condividere e modificare tali opere. Al
-contrario, la GNU General Public License ha l'obiettivo di garantire la
-libert@`a di condividere e modificare tutte le versioni di un programma e di
-fare in modo che esso rimanga software libero per tutti gli utenti. Noi, Free
-Software Foundation, usiamo la GNU General Public License per la maggior parte
-del nostro software; essa viene applicata anche a qualunque altro software
-rilasciato dall'autore sotto questa licenza. Chiunque pu@`o utilizzare questa
-licenza per i suoi programmi.
-
-Quando parliamo di software libero (free software), ci riferiamo al concetto
-di libert@`a, non al prezzo. Le nostre General Public License sono progettate
-per garantire che chiunque abbia la libert@`a di distribuire copie di software
-libero (anche dietro pagamento di un prezzo, se lo desidera), che chiunque
-riceva o possa ricevere il codice sorgente se lo vuole, che chiunque possa
-apportare modifiche al software o utilizzarne delle porzioni in altri software
-liberi, e che chiunque sappia che ha il diritto di fare tutte queste cose col
-software libero.
-
-Per proteggere i vostri diritti, abbiamo la necessit@`a di impedire che altri vi
-neghino questi diritti o vi obblighino a rinunciarvi. Pertanto, chiunque
-distribuisce o modifica software rilasciato con questa licenza assume dei
-precisi doveri: il dovere di rispettare la libert@`a degli altri.
-
-Per esempio, chi distribuisce copie di un programma rilasciato sotto questa
-licenza, sia gratis che dietro pagamento di un prezzo, e' obbligato a
-riconoscere a chi riceve il software esattamente gli stessi diritti che ha
-ricevuto. Deve garantire che chi riceva il software abbia o possa avere
-accesso al codice sorgente. E deve chiaramente far conoscere ai destinatari
-del software queste condizioni, cos@`{@dotless{i}} che essi conoscano quali sono i loro
-diritti.
-
-Gli sviluppatori che usano la GNU GPL proteggono i vostri diritti in due modi:
-(1) Rivendicando il copyright sul software, e (2) offrendovi questa licenza
-che vi garantisce il diritto legale di copiarlo e/o di modificarlo.
-
-Al fine di proteggere gli sviluppatori e gli autori, la GPL spiega chiaramente
-che non c'@`e nessuna garanzia per questo software libero. Nell'interesse degli
-utenti e degli autori, la GPL impone che le versioni modificate del software
-vengano esplicitamente marcate come ``modificate'', in maniera tale che
-eventuali problemi non vengano erroneamente attribuiti agli autori delle
-versioni precedenti.
-
-Alcuni dispositivi sono progettati per negare agli utenti l'installazione o
-l'esecuzione di versioni modificate del software che gira sugli stessi, anche
-se il costruttore si riserva la possibilit@`a di farlo. Ci@`o @`e fondamentalmente
-incompatibile con l'obiettivo di garantire la libert@`a degli utenti di
-modificare il software. Una ripetizione sistematica di tali abusi avviene nel
-campo dei dispositivi per usi individuali, e ci@`o rende questi abusi ancora pi@`u
-inaccettabili. Pertanto, abbiamo realizzato questa versione della GPL al fine
-di proibire queste pratiche. Se problemi simili dovessero sorgere in altri
-ambiti, saremo pronti ad estendere queste misure a questi nuovi ambiti in
-versioni future della GPL, nella maniera che si render@`a necessaria per
-difendere la libert@`a degli utenti.
-
-In conclusione, tutti i programmi sono costantemente minacciati dai brevetti
-sul software. Gli Stati non dovrebbero permettere ai brevetti sul software di
-limitare lo sviluppo e l'utilizzo di software per computer, ma nei Paesi in
-cui ci@`o avviene noi vogliamo evitare in particolare il pericolo che i brevetti
-sul software applicati ad un programma libero possano renderlo, a tutti gli
-effetti, proprietario. Per impedire ci@`o, la GPL assicura che non @`e possibile
-utilizzare i brevetti sul software per rendere un programma non libero.
-
-I termini e le condizioni esatte per la copia, la distribuzione e la modifica
-del software sono riportate di seguito.
-
-@c fakenode --- for prepinfo
-@heading TERMINI E CONDIZIONI
-
-@enumerate 0
-@item Definizioni
-
-``Questa Licenza'' si riferisce alla versione 3 della GNU General Public
-License.
-
-``Copyright'' indica anche leggi simili al copyright che riguardano altri tipi
-di opere, come le maschere per la produzione di semiconduttori.
-
-``Il Programma'' indica qualunque opera che sia soggetta a copyright e che sia
-rilasciata sotto questa Licenza. I detentori della licenza sono indicati come
-``tu'' o ``voi''. Licenziatari e destinatari possono essere individui o
-organizzazioni.
-
-``Modificare'' un'opera significa copiare o adattare tutta o parte dell'opera in
-una maniera che richieda un permesso di copyright, e non indica la semplice
-azione di fare una esatta copia dell'opera. L'opera risultante viene chiamata
-``versione modificata'' dell'opera precedente, oppure viene detta opera ``basata
-sulla'' opera precedente.
-
-Una ``opera coperta da questa licenza'' indica il Programma originale non
-modificato oppure un'opera basata sul Programma.
-
-``Propagare'' un'opera significa fare qualunque cosa con essa che, in mancanza
-di un esplicito permesso, ti renda direttamente o indirettamente perseguibile
-per violazione secondo le vigenti normative sul copyright, ad eccezione della
-semplice esecuzione del Programma su un computer o della modifica di una copia
-privata. La Propagazione include la copia, la distribuzione (con o senza
-modifiche), la messa a disposizione al pubblico e, in alcuni stati, altre
-attivit@`a simili e connesse.
-
-``Distribuire'' un'opera indica qualunque forma di propagazione che permetta a
-terze parti di effettuare o ricevere delle copie. La mera interazione con un
-utente attraverso una rete di computer, senza che ci sia alcun trasferimento
-di una copia, non @`e considerata ``Distribuzione''.
-
-Una interfaccia utente interattiva fornisce delle ``Adeguate Informazioni
-Legali'' soltanto nel caso in cui include una apposita funzionalit@`a, resa
-adeguatamente visibile, che (1) visualizzi un'adeguata informazione di
-copyright, e (2) informi l'utente che non c'@`e alcuna garanzia sull'opera
-(eccetto nel caso in cui delle garanzie sono espressamente fornite), dica che
-il licenziatario pu@`o distribuire l'opera utilizzando questa Licenza, indichi
-come @`e possibile prendere visione di una copia di questa Licenza. Se
-l'interfaccia presenta una lista di comandi o di opzioni, come per esempio un
-men@`u, una delle opzioni fornite nella lista deve rispettare questa condizione.
-
-@item Codice Sorgente
-
-Il ``codice sorgente'' di un'opera indica la forma pi@`u indicata dell'opera per
-effettuare modifiche su di essa. Il ``codice oggetto'' indica qualunque forma
-dell'opera che non sia codice sorgente.
-
-Una ``Interfaccia Standard'' @`e una interfaccia che risponde ad uno standard
-ufficiale definito da un ente di standardizzazione riconosciuto o, nel caso di
-interfacce specifiche per un particolare linguaggio di programmazione, una
-interfaccia che @`e largamente utilizzata dagli sviluppatori per sviluppare in
-tale linguaggio.
-
-Le ``Librerie di Sistema'' di un eseguibile includono qualsiasi cosa, eccetto
-l'opera nel suo insieme, che (a) sia inclusa nella normale forma di
-pacchettizzazione di un ``Componente Principale'', ma che non @`e parte di quel
-Componente Principale, e (b) che serva solo a consentire l'uso dell'opera con
-quel Componente Principale, o per implementare una Interfaccia Standard per la
-quale esista una implementazione disponibile al pubblico in forma sorgente. Un
-``Componente Principale'', in questo contesto, @`e un componente essenziale
-(kernel, gestore di finestre eccetera) dello specifico sistema operativo
-(ammesso che ce ne sia uno) sul quale l'eseguibile esegue, o un compilatore
-utilizzato per produrre il programma, o un interprete di codice oggetto
-utilizzato per eseguire il programma.
-
-Il ``Sorgente Corrispondente'' per un'opera in forma di codice oggetto @`e il
-codice sorgente necessario per generare, installare e (per un programma
-eseguibile) eseguire il codice oggetto e per modificare l'opera, inclusi gli
-script per controllare le suddette attivit@`a di generazione, installazione ed
-esecuzione. Non sono incluse le Librerie di Sistema usate dal programma, o gli
-strumenti di utilit@`a generica o i programmi liberamente accessibili che sono
-utilizzati, senza modifiche, per portare a termine le suddette attivit@`a ma che
-non fanno parte dell'opera. Per esempio, il sorgente corrispondente include i
-file con le definizioni delle interfacce associati ai file sorgente
-dell'opera, e il codice sorgente delle librerie condivise e sottoprogrammi
-collegati dinamicamente specificatamente necessari per il programma, ad
-esempio a causa di stretta comunicazione dati o di controllo di flusso tra
-questi sottoprogrammi e altre parti del programma.
-
-Il Sorgente Corrispondente non include qualunque cosa che l'utente possa
-rigenerare automaticamente da altre parti del Sorgente Corrispondente stesso.
-
-Il Sorgente Corrispondente di un'opera in forma di codice sorgente @`e l'opera
-stessa.
-
-@item Principali Diritti
-
-Tutti i diritti garantiti da questa Licenza sono garantiti per la durata del
-copyright sul Programma, e sono irrevocabili ammesso che le suddette
-condizioni siano rispettate. Questa Licenza afferma esplicitamente il tuo
-permesso illimitato di eseguire il Programma non modificato. Il risultato
-dell'esecuzione di un programma coperto da questa Licenza @`e a sua volta
-coperto da questa Licenza solo se il risultato stesso, a causa del suo
-contenuto, @`e un'opera coperta da questa Licenza. Questa Licenza riconosce il
-tuo diritto all'uso legittimo o altri diritti equivalenti, come stabilito
-dalla legislazione sul copyright.
-
-Puoi creare, eseguire e propagare programmi coperti da questa Licenza che tu
-non distribuisci, senza alcuna condizione fino a quando la tua Licenza rimane
-valida. Puoi distribuire opere coperte da questa Licenza ad altri al solo
-scopo di ottenere che essi facciano delle modifiche al programma
-esclusivamente per te, o che ti forniscano dei servizi per l'esecuzione di
-queste opere, ammesso che tu rispetti i termini di questa Licenza nel
-distribuire tutto il materiale per il quale non detieni il copyright. Coloro i
-quali creano o eseguono per conto tuo un programma coperto da questa Licenza
-lo fanno esclusivamente in tua vece, sotto la tua direzione e il tuo
-controllo, in maniera tale che sia proibito a costoro effettuare copie di
-materiale di cui detieni il copyright al di fuori della relazione che
-intrattengono nei tuoi confronti.
-
-Distribuire opere coperte da licenza in qualunque altra circostanza @`e
-consentito soltanto alle condizioni espresse in seguito. Non @`e consentito
-sottolicenziare le opere: la sezione 10 lo rende non necessario.
-
-@item Protezione dei diritti legali degli utenti dalle leggi anti-elusione
-
-Nessun programma protetto da questa Licenza pu@`o essere considerato parte di
-una misura tecnologica di restrizione che sottosta ad alcuna delle leggi che
-soddisfano l'articolo 11 del ``WIPO copyright treaty'' adottato il 20 Dicembre
-1996, o a simili leggi che proibiscono o limitano l'elusione di tali misure
-tecnologiche di restrizione.
-
-Quando distribuisci un programma coperto da questa Licenza, rifiuti tutti i
-poteri legali atti a proibire l'elusione di misure tecnologiche di restrizione
-ammesso che tale elusione sia effettuata nell'esercizio dei diritti garantiti
-da questa Licenza riguardo al programma coperto da questa Licenza, e rinunci
-all'intenzione di limitare l'operativit@`a o la modifica del programma per far
-valere, contro i diritti degli utenti del programma, diritti legali tuoi o di
-terze parti che impediscano l'elusione di misure tecnologiche di restrizione.
-
-@item Distribuzione di Copie Esatte
-
-Ti @`e permesso distribuire copie esatte del codice sorgente del Programma come
-lo hai ricevuto, con qualunque mezzo, ammesso che tu aggiunga in maniera
-appropriata su ciascuna copia una appropriata nota di copyright; che tu lasci
-intatti tutti gli avvisi che affermano che questa Licenza e tutte le clausole
-non-permissive aggiunte in accordo con la sezione 7 sono valide per il codice
-che distribuisci; che tu lasci intatti tutti gli avvisi circa l'assenza di
-garanzia; che tu fornisca a tutti i destinatari una copia di questa Licenza
-assieme al Programma.
-
-Puoi richiedere il pagamento di un prezzo o di nessun prezzo per ciascuna
-copia che distribuisci, e puoi offrire supporto o garanzia a pagamento.
-
-@item Distribuzione di Versioni modificate del sorgente
-
-Puoi distribuire un'opera basata sul Programma, o le modifiche per produrla a
-partire dal Programma, nella forma di codice sorgente secondo i termini della
-sezione 4, ammesso che tu rispetti anche tutte le seguenti condizioni:
-
-@enumerate a
-@item
-L'opera deve recare con s@`e delle informazioni adeguate che affermino che tu
-l'hai modificata, indicando la data di modifica.
-
-@item
-L'opera deve recare informazioni adeguate che affermino che essa @`e rilasciata
-sotto questa Licenza e sotto le condizioni aggiuntive secondo quanto indicato
-dalla Sezione 7. Questa condizione modifica la condizione espressa alla
-sezione 4 di ``lasciare intatti tutti gli avvisi''.
-
-@item
-Devi rilasciare l'intera opera, nel suo complesso, sotto questa Licenza a
-chiunque venga in possesso di una copia di essa. Questa Licenza sar@`a pertanto
-applicata, assieme ad eventuali clausole aggiunte in osservanza della Sezione
-7, all'opera nel suo complesso, a tutte le sue parti, indipendentemente da
-come esse siano pacchettizzate. Questa Licenza nega il permesso di licenziare
-l'opera in qualunque altro modo, ma non rende nullo un tale permesso ammesso
-che tu lo abbia ricevuto separatamente.
-
-@item
-Se l'opera ha delle interfacce utente interattive, ciascuna deve mostrare
-delle Adeguate Informazioni Legali; altrimenti, se il Programma ha delle
-interfacce interattive che non visualizzano delle Adeguate Informazioni
-Legali, il tuo programma non @`e obbligato a visualizzarle.
-@end enumerate
-
-La giustapposizione di un'opera coperta da questa Licenza assieme ad altre
-opere separate e indipendenti, che non sono per loro natura estensioni del
-Programma, e che non sono combinate con esso a formare un altro programma pi@`u
-grande, dentro o in uno stesso supporto di memorizzazione a lungo termine o di
-distribuzione, @`e semplicemente detto ``aggregato'' se la raccolta e il suo
-copyright non sono utilizzati per limitare l'accesso o i diritti legali degli
-utenti della raccolta stessa oltre ci@`o che ciascun singolo programma consente.
-L'inclusione di un programma coperto da questa Licenza in un aggregato non
-comporta l'applicazione di questa Licenza alle altre parti dell'aggregato.
-
-@item Distribuzione in formato non-sorgente
-
-Puoi distribuire un programma coperto da questa Licenza in formato di codice
-oggetto secondo i termini delle sezioni 4 e 5, ammesso che tu fornisca anche
-il Sorgente Corrispondente in formato comprensibile da un computer sotto i
-termini di questa stessa Licenza, in uno dei seguenti modi:
-
-@enumerate a
-@item
-Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
-i mezzi fisici di distribuzione), accompagnato dal Sorgente Corrispondente su
-un supporto fisico duraturo comunemente utilizzato per lo scambio di software.
-
-@item
-Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
-i mezzi fisici di distribuzione), accompagnato da un'offerta scritta, valida
-per almeno tre anni e valida per tutto il tempo durante il quale tu offri
-ricambi o supporto per quel modello di prodotto, di fornire a chiunque
-possieda il codice oggetto (1) una copia del Sorgente Corrispondente di tutto
-il software contenuto nel prodotto che @`e coperto da questa Licenza, su un
-supporto fisico duraturo comunemente utilizzato per lo scambio di software, ad
-un prezzo non superiore al costo ragionevole per effettuare fisicamente tale
-distribuzione del sorgente, oppure (2) accesso alla copia del Sorgente
-Corrispondente attraverso un server di rete senza alcun costo aggiuntivo.
-
-@item
-Distribuendo copie singole del codice oggetto assieme ad una copia
-dell'offerta scritta di fornire il Sorgente Corrispondente. Questa possibilit@`a
-@`e permessa soltanto occasionalmente e per fini non commerciali, e solo se tu
-hai ricevuto il codice oggetto assieme ad una tale offerta, in accordo alla
-sezione 6b.
-
-@item
-Distribuendo il codice oggetto mediante accesso da un luogo designato (gratis
-o dietro pagamento di un prezzo), e offrendo un accesso equivalente al
-Sorgente Corrispondente alla stessa maniera a partire dallo stesso luogo senza
-costi aggiuntivi. Non devi obbligare i destinatari a copiare il Sorgente
-Corrispondente assieme al codice oggetto. Se il luogo dal quale copiare il
-codice oggetto @`e un server di rete, il Sorgente Corrispondente pu@`o trovarsi su
-un server differente (gestito da te o da terze parti) che fornisca
-funzionalit@`a equivalenti per la copia, a patto che tu fornisca delle
-indicazioni chiare accanto al codice oggetto che indichino dove trovare il
-Sorgente Corrispondente. Indipendentemente da quale server ospiti il Sorgente
-Corrispondente, tu rimani obbligato ad assicurare che esso rimanga disponibile
-per tutto il tempo necessario a soddisfare queste condizioni.
-
-@item
-Distribuendo il codice oggetto mediante trasmissione peer-to-peer, a patto che
-tu informi gli altri peer circa il luogo in cui il codice oggetto e il
-Sorgente Corrispondente sono gratuitamente offerti al pubblico secondo i
-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
-obbligatoriamente inclusa nella distribuzione del codice oggetto del
-programma.
-
-Un ``Prodotto Utente'' @`e un (1) ``prodotto consumer'', cio@`e qualunque propriet@`a
-personale tangibile che @`e normalmente utilizzata per scopi personali,
-familiari o domestici, oppure (2) qualunque cosa progettata o venduta per
-essere utilizzata in ambiente domestico. Nella classificazione di un prodotto
-come ``prodotto consumer'', i casi dubbi andranno risolti in favore dell'ambito
-di applicazione. Per un dato prodotto ricevuto da un dato utente, ``normalmente
-utilizzato'' si riferisce ad un uso tipico o comune di quella classe di
-prodotti, indipendentemente dallo stato dell'utente specifico o dal modo in
-cui l'utente specifico utilizza, o si aspetta o ci si aspetta che utilizzi, il
-prodotto. Un prodotto @`e un ``prodotto consumer'' indipendentemente dal fatto che
-abbia usi commerciali, industriali o diversi da quelli ``consumer'', a meno che
-questi usi non rappresentino il solo modo utile di utilizzare il prodotto in
-questione.
-
-Le ``Informazioni di Installazione'' per un Prodotto Utente sono i metodi, le
-procedure, le chiavi di autorizzazioni o altre informazioni necessarie per
-installare ed eseguire versioni modificate di un programma coperto da questa
-Licenza all'interno di un Prodotto Utente, a partire da versioni modificate
-dei suoi Sorgenti Corrispondenti. Tali informazioni devono essere sufficienti
-ad assicurare che il funzionamento del codice oggetto modificato non sia in
-nessun caso proibito o ostacolato per il solo fatto che sono state apportate
-delle modifiche.
-
-Se distribuisci un codice oggetto secondo le condizioni di questa sezione in,
-o assieme, o specificatamente per l'uso in o con un Prodotto Utente, e la
-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
-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)
-
-La condizione che richiede di fornire delle Informazioni di Installazione non
-implica che venga fornito supporto, garanzia o aggiornamenti per un programma
-che @`e stato modificato o installato dal destinatario, o per il Prodotto Utente
-in cui esso @`e stato modificato o installato. L'accesso ad una rete pu@`o essere
-negato se le modifiche apportate impattano materialmente sull'operativit@`a
-della rete o se violano le regole e i protocolli di comunicazione attraverso
-la rete.
-
-Il Sorgente Corrispondente distribuito, e le Informazioni di Installazione
-fornite, in accordo con questa sezione, devono essere in un formato che sia
-pubblicamente documentato (e con una implementazione pubblicamente disponibile
-in formato di codice sorgente), e non devono richiedere speciali password o
-chiavi per essere spacchettate, lette o copiate.
-
-@item Condizioni Aggiuntive
-
-Le ``Condizioni Aggiuntive'' sono condizioni che completano le condizioni di
-questa Licenza permettendo delle eccezioni a una o pi@`u delle condizioni sopra
-elencate. Le condizioni aggiuntive che sono applicabili all'intero Programma
-devono essere considerate come se fossero incluse in questa Licenza, a patto
-che esse siano valide secondo le normative vigenti. Se alcune condizioni
-aggiuntive fanno riferimento soltanto ad alcune parti del Programma, quelle
-parti possono essere utilizzate separatamente sotto le stesse condizioni, ma
-l'intero Programma rimane sottoposto a questa Licenza senza riferimento ad
-alcuna condizione aggiuntiva.
-
-Quando distribuisci una copia di un programma coperto da questa Licenza, puoi,
-a tua discrezione, eliminare qualunque condizione aggiuntiva dalla copia, o da
-parte di essa. (Le Condizioni Aggiuntive possono essere scritte in maniera
-tale da richiedere la loro rimozione in certi casi di modifica del Programma).
-Puoi aggiungere Condizioni Aggiuntive su materiale, aggiunto da te ad un'opera
-coperta da questa Licenza, per il quale hai o puoi garantire un'adeguata
-licenza di copyright.
-
-Indipendentemente da qualunque altra condizione di questa Licenza, e per il
-materiale che aggiungi ad un'opera coperta da questa Licenza, puoi (se
-autorizzato dai legittimi detentori del copyright per il suddetto materiale)
-aggiungere alle condizioni di questa Licenza delle condizioni che:
-
-@enumerate a
-@item
-Negano la garanzia o limitano la responsabilit@`a del Programma in maniera
-differente da quanto riportato nelle sezioni 15 e 16 di questa Licenza; oppure
-
-@item
-Richiedono il mantenimento di specifiche e circostanziate informative legali o
-di note di attribuzione ad autori nel materiale o assieme alle Adeguate
-Informazioni Legali mostrate dal Programma che lo contiene; oppure
-
-@item
-Proibiscono di fornire informazioni errate o ingannevoli sull'origine e la
-provenienza del materiale in oggetto, o richiedono che versioni modificate di
-tale materiale siano appositamente marcate in maniera differente rispetto alla
-versione originale; oppure
-
-@item
-Limitano l'utilizzo per scopi pubblicitari del nome dei detentori del
-copyright o degli autori del materiale; oppure
-
-@item
-Rifiutano di garantire diritti secondo le leggi sulla propriet@`a intellettuale
-circa l'uso di nomi, marchi di fabbrica o similari; oppure
-
-@item
-Richiedono l'indennizzo dei detentori del copyright o degli autori del
-materiale in oggetto da parte di chi distribuisce il materiale (o versioni
-modificate dello stesso) con impegni contrattuali circa la responsabilit@`a nei
-confronti del destinatario, per qualunque responsabilit@`a che questi impegni
-contrattuali dovessero imporre direttamente ai suddetti detentori del
-copyright e autori.
-@end enumerate
-
-Tutte le altre condizioni addizionali non-permissive sono considerate
-``ulteriori restrizioni'', secondo il significato specificato alla sezione 10.
-Se il Programma o parti di esso contengono, all'atto della ricezione dello
-stesso, informative che specificano che esso @`e soggetto a questa Licenza
-assieme ad una condizione che @`e una ``ulteriore restrizione'', puoi rimuovere
-quest'ultima condizione. Se un documento di licenza contiene ulteriori
-restrizioni ma permette di rilicenziare o distribuire il Programma con questa
-Licenza, puoi aggiungere al Programma del materiale coperto dalle condizioni
-di quel documento di licenza, a patto che le ulteriori restrizioni non
-compaiano nelle versioni rilicenziate o ridistribuite.
-
-Se aggiungi ad un Programma coperto da questa Licenza delle condizioni
-aggiuntive in accordo con questa sezione, devi aggiungere anche, nei file
-sorgenti corrispondenti, un avviso che riassuma le condizioni aggiuntive
-applicate a quei file, ovvero un avviso che specifichi dove @`e possibile
-trovare copia delle condizioni aggiunte.
-
-Tutte le Condizioni aggiuntive, permissive o non-permissive, devono essere
-espresse nella forma di una licenza scritta e separata, o espresse
-esplicitamente come eccezioni; in entrambi i casi valgono le condizioni
-succitate.
-
-@item Cessazione di Licenza
-
-Non puoi propagare o modificare un programma coperto da questa Licenza in
-maniera diversa da quanto espressamente consentito da questa Licenza.
-Qualunque tentativo di propagare o modificare altrimenti il Programma @`e nullo,
-e provoca l'immediata cessazione dei diritti garantiti da questa Licenza
-(compresi tutte le eventuali licenze di brevetto garantite ai sensi del terzo
-paragrafo della sezione 11).
-
-In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la tua
-licenza da parte di un dato detentore del copyright viene ripristinata (a) in
-via cautelativa, a meno che e fino a quando il detentore del copyright non
-cessa esplicitamente e definitivamente la tua licenza, e (b) in via permanente
-se il detentore del copyright non ti notifica in alcun modo la violazione
-entro 60 giorni dalla cessazione della licenza.
-
-Inoltre, la tua licenza da parte di un dato detentore del copyright viene
-ripristinata in maniera permanente se il detentore del copyright ti notifica
-la violazione in maniera adeguata, se questa @`e la prima volta che ricevi una
-notifica di violazione di questa Licenza (per qualunque Programma) dallo
-stesso detentore di copyright, e se rimedi alla violazione entro 30 giorni
-dalla data di ricezione della notifica di violazione.
-
-La cessazione dei tuoi diritti come specificato in questa sezione non provoca
-la cessazione delle licenze di terze parti che abbiano ricevuto copie o
-diritti da te secondo questa Licenza. Se i tuoi diritti cessano e non sono
-ristabiliti in via permanente, non hai diritto di ricevere nuove licenze per
-lo stesso materiale, secondo quanto stabilito nella sezione 10.
-
-@item L'ottenimento di copie non richiede l'accettazione della Licenza
-
-Non sei obbligato ad accettare i termini di questa Licenza al solo fine di
-ottenere o eseguire una copia del Programma. Similmente, propagazioni
-collaterali di un Programma coperto da questa Licenza che occorrono come
-semplice conseguenza dell'utilizzo di trasmissioni peer-to-peer per la
-ricezione di una copia non richiedono l'accettazione della Licenza. In ogni
-caso, solo e soltanto questa Licenza ti garantiscono il permesso di propagare
-e modificare qualunque programma coperto da questa Licenza. Queste azioni
-violano le leggi sul copyright nel caso in cui tu non accetti questa Licenza.
-Pertanto, modificando o propagando un programma coperto da questa Licenza,
-indichi implicitamente la tua accettazione della Licenza.
-
-@item Licenza Automatica per i successivi destinatari
-
-Ogni qual volta distribuisci un programma coperto da questa Licenza, il
-destinatario riceve automaticamente una licenza, dal detentore originario del
-copyright, di eseguire, modificare e propagare il programma, nel rispetto di
-questa Licenza. Non sei ritenuto responsabile del rispetto di questa Licenza
-da parte di terze parti.
-
-Una ``transazione d'entit@`a'' @`e una transazione che trasferisce il controllo di
-una organizzazione, o sostanzialmente di tutti i suoi beni, che suddivide una
-organizzazione o che fonde pi@`u organizzazioni. Se la propagazione di un
-programma coperto da questa Licenza @`e conseguente ad una transazione di
-entit@`a, ciascuna parte che ha ruolo nella transazione e che riceve una copia
-del programma riceve allo stesso tempo qualsiasi licenza sul programma che i
-predecessori della parte possedevano o potevano rilasciare nel rispetto del
-paragrafo precedente, e in pi@`u il diritto di possesso del Sorgente
-Corrispondente del programma dal predecessore in interesse, se il predecessore
-lo possiede o se pu@`o ottenerlo senza troppe difficolt@`a.
-
-Non puoi imporre nessuna ulteriore restrizione sull'esercizio dei diritti
-garantiti o affermati da questa Licenza. Per esempio, non puoi imporre un
-prezzo di licenza, una royalty, o altri costi per l'esercizio dei diritti
-garantiti da questa Licenza, a non puoi dar corso ad una controversia (ivi
-incluse le controversie incrociate o la difesa in cause legali) affermando che
-siano stati violati dei brevetti a causa della produzione, dell'uso, della
-vendita, della messa in vendita o dell'importazione del Programma o di sue
-parti.
-
-@item Brevetti
-
-Un ``contribuente'' @`e un detentore di copyright che autorizza l'uso secondo
-questa Licenza di un Programma o di un'opera basata sul Programma. L'opera
-cos@`{@dotless{i}} licenziata viene chiamata ``versione del contribuente''.
-
-I ``diritti essenziali di brevetto'' da parte di un contribuente sono tutti i
-diritti di brevetto che appartengono o che sono controllati dal contribuente,
-che siano gi@`a acquisiti o che saranno acquisiti in futuro, che possano essere
-violati in qualche maniera, consentita da questa Licenza, generando,
-modificando o vendendo la versione del contribuente, ma non includono i
-diritti che possano essere violati soltanto come conseguenza di ulteriori
-modifiche alla versione del contribuente. In relazione a questa definizione,
-il termine ``controllo'' include il diritto di garantire sottolicenze di
-brevetto in maniera consistente con le condizioni di questa Licenza.
-
-Ciascun contribuente ti garantisce la licenza di brevetto sui diritti
-essenziali di brevetto del contribuente stesso non-esclusiva, valida in tutto
-il mondo, esente da royalty, di creare, usare, vendere, offrire in vendita,
-importare e altrimenti eseguire, modificare e propagare i contenuti della
-versione del contribuente.
-
-Nei tre paragrafi successivi, con ``licenza di brevetto'' si intende qualunque
-accordo o contratto, comunque denominato, di non rivendicazione di un brevetto
-(come per esempio un permesso esplicito di utilizzare un brevetto o un accordo
-di rinuncia alla persecuzione per violazione di brevetto). ``Garantire'' una
-tale licenza di brevetto ad una parte significa portare a termine un tale
-accordo o contratto di non rivendicazione di brevetto contro la parte.
-
-Se distribuisci un programma coperto da questa Licenza, confidando
-consapevolmente su una licenza di brevetto, e il Sorgente Corrispondente per
-il programma non @`e reso disponibile per la copia, senza alcun onere aggiuntivo
-e comunque nel rispetto delle condizioni di questa Licenza, attraverso un
-server di rete pubblicamente accessibile o tramite altri mezzi facilmente
-accessibili, allora devi (1) fare in modo che il Sorgente Corrispondente sia
-reso disponibile come sopra, oppure (2) fare in modo di rinunciare ai benefici
-della licenza di brevetto per quel particolare programma, oppure (3)
-adoperarti, in maniera consistente con le condizioni di questa Licenza, per
-estendere la licenza di brevetto a tutti i destinatari successivi. ``Confidare
-consapevolmente'' significa che tu sei attualmente cosciente che, eccettuata la
-licenza di brevetto, la distribuzione da parte tua di un programma protetto da
-questa Licenza in un paese, o l'utilizzo in un paese del programma coperto da
-questa Licenza da parte di un destinatario, pu@`o violare uno o pi@`u brevetti in
-quel paese che tu hai ragione di ritenere validi.
-
-Se, come conseguenza o in connessione con una singola transazione o con un
-dato accordo, distribuisci, o fai in modo di distribuire, un programma coperto
-da questa Licenza, e garantisci una licenza di brevetto per alcune delle parti
-che ricevono il Programma autorizzandole ad utilizzare, propagare, modificare
-o distribuire una specifica copia del Programma, allora la licenza di brevetto
-che fornisci @`e automaticamente estesa a tutti i destinatari del Programma
-coperto da questa Licenza e delle opere basate sul Programma.
-
-Una licenza di brevetto @`e ``discriminatoria'' se non include nell'ambito della
-sua copertura, proibisce l'esercizio, o @`e vincolata al non-esercizio di uno o
-pi@`u dei diritti che sono specificatamente garantiti da questa Licenza. Non
-puoi distribuire un Programma coperto da questa Licenza se sei parte di un
-accordo con una terza parte la cui attivit@`a comprende la distribuzione di
-software, secondo il quale tu sei costretto ad un pagamento alla parte terza
-in funzione della tua attivit@`a di distribuzione del Programma, e in
-conseguenza del quale la parte terza garantisce, a qualunque delle parti che
-riceveranno il Programma da te, una licenza di brevetto discriminatoria (a)
-assieme a copie del Programma coperto da questa Licenza distribuite da te (o
-ad altre copie fatte da codeste copie), oppure (b) principalmente per e in
-connessione con specifici prodotti o raccolte di prodotti che contengono il
-Programma, a meno che l'accordo non sia stato stipulato, o le licenze di
-brevetto non siano state rilasciate, prima del 28 Marzo 2007.
-
-Nessuna parte di questa Licenza pu@`o essere interpretata come atta ad escludere
-o limitare gli effetti di qualunque altra licenza o altri meccanismi di difesa
-dalla violazione che possano altrimenti essere resi disponibili dalla
-normativa vigente in materia di brevetti.
-
-@item Nessuna resa di libert@`a altrui
-
-Se ti vengono imposte delle condizioni (da un ordine giudiziario, da un
-accordo o da qualunque altra eventualit@`a) che contraddicono le condizioni di
-questa Licenza, non sei in nessun modo esonerato dal rispetto delle condizioni
-di questa Licenza. Se non puoi distribuire un Programma coperto da questa
-Licenza per sottostare simultaneamente agli obblighi derivanti da questa
-Licenza e ad altri obblighi pertinenti, allora non puoi distribuire il
-Programma per nessun motivo. Per esempio, se accetti delle condizioni che ti
-obbligano a richiedere il pagamento di una royalty per le distribuzioni
-successivamente effettuate da coloro ai quali hai distribuito il Programma,
-l'unico modo per soddisfare sia queste condizioni che questa Licenza @`e evitare
-del tutto la distribuzione del Programma.
-
-@item Utilizzo con la GNU Affero General Public License
-
-Indipendentemente da qualunque altra condizione espressa da questa Licenza,
-hai il permesso di collegare o combinare qualunque Programma coperto da questa
-Licenza con un'opera rilasciata sotto la versione 3 della licenza GNU Affero
-General Public License, ottenendo un singolo Programma derivato, e di
-distribuire il Programma risultante. Le condizioni di questa Licenza
-continuano a valere per le parti riguardanti il Programma che sono coperte da
-questa Licenza, mentre le condizioni speciali della GNU Affero General Public
-License, sezione 13, riguardanti l'interazione mediante rete, saranno
-applicate al Programma cos@`{@dotless{i}} risultante.
-
-@item Versioni rivedute di questa Licenza
-
-La Free Software Foundation pu@`o pubblicare delle versioni rivedute e/o delle
-nuove versioni della GNU General Public License di tanto in tanto. Tali
-versioni saranno simili, nello spirito, alla presente versione, ma potranno
-differire nei dettagli al fine di affrontare nuovi problemi e nuove
-situazioni.
-
-A ciascuna versione viene assegnato un numero identificativo di versione. Se
-il Programma specifica che si applica a s@`e stesso una certa versione della GNU
-General Public License, ``o qualunque altra versione successiva'', hai la
-possibilit@`a di sottostare alle condizioni di quella specifica versione o di
-qualunque altra versione successiva pubblicata dalla Free Software Foundation.
-Se il Programma non specifica un numero di versione della GNU General Public
-License, puoi scegliere qualunque versione della GNU General Public License
-pubblicata dalla Free Software Foundation.
-
-Se il Programma specifica che un sostituto o un procuratore pu@`o decidere quali
-versioni future della GNU General Public License posso essere utilizzate,
-allora tale scelta di accettazione di una data versione ti autorizza, in
-maniera permanente, ad utilizzare quella versione della Licenza per il
-Programma.
-
-Versioni successive della Licenza possono garantire diritti aggiuntivi o
-leggermente differenti. Ad ogni modo, nessun obbligo aggiuntivo viene imposto
-agli autori o ai detentori di copyright come conseguenza della tua scelta di
-adottare una versione successiva della Licenza.
-
-@item Rinuncia alla Garanzia
-
-NON C'@`E NESSUNA GARANZIA PER IL PROGRAMMA, PER QUANTO CONSENTITO DALLE
-VIGENTI NORMATIVE. ECCETTO QUANDO ALTRIMENTI STABILITO PER ISCRITTO, I
-DETENTORI DEL COPYRIGHT E/O LE ALTRE PARTI FORNISCONO IL PROGRAMMA ``COS@`I COME
-@`E'' SENZA GARANZIA DI ALCUN TIPO, N@'E ESPRESSA N@'E IMPLICITA, INCLUSE, MA NON
-LIMITATE A, LE GARANZIE DI COMMERCIABILIT@`A O DI UTILIZZABILIT@`A PER UN
-PARTICOLARE SCOPO. L'INTERO RISCHIO CONCERNENTE LA QUALIT@`A E LE PRESTAZIONI
-DEL PROGRAMMA @`E DEL LICENZIATARIO. SE IL PROGRAMMA DOVESSE RISULTARE
-DIFETTOSO, IL LICENZIATARIO SI ASSUME I COSTI DI MANUTENZIONE, RIPARAZIONE O
-CORREZIONE.
-
-@item Limitazione di Responsabilit@`a
-
-IN NESSUN CASO, A MENO CHE NON SIA RICHIESTO DALLA NORMATIVA VIGENTE O
-CONCORDATO PER ISCRITTO, I DETENTORI DEL COPYRIGHT, O QUALUNQUE ALTRA PARTE
-CHE MODIICA E/O DISTRIBUISCE IL PROGRAMMA SECONDO LE CONDIZIONI PRECEDENTI,
-POSSONO ESSERE RITENUTI RESPONSABILI NEI CONFRONTI DEL LICENZIATARIO PER
-DANNI, INCLUSO QUALUNQUE DANNEGGIAMENTO GENERICO, SPECIALE, INCIDENTALE O
-CONSEQUENZIALE DOVUTO ALL'USO O ALL'IMPOSSIBILIT@`A D'USO DEL PROGRAMMA
-(INCLUSI, MA NON LIMITATI A, LE PERDITE DI DATI, LA CORRUZIONE DI DATI, LE
-PERDITE SOSTENUTE DAL LICENZIATARIO O DA TERZE PARTI O L'IMPOSSIBILIT@`A DEL
-PROGRAMMA A FUNZIONARE ASSIEME AD ALTRI PROGRAMMI), ANCHE NEL CASO IN CUI IL
-DETENTORE O LE ALTRE PARTI SIANO STATI AVVISATI CIRCA LA POSSIBILIT@`A DI TALI
-DANNEGGIAMENTI.
-
-@item Interpretazione delle Sezioni 15 e 16
-
-Se la dichiarazione di garanzia e la limitazione di responsabilit@`a fornite
-precedentemente non hanno effetto legale in un paese a causa delle loro
-condizioni, le corti di giustizia devono applicare la norma locale che pi@`u si
-avvicini al rifiuto assoluto di qualsivoglia responsabilit@`a civile relativa al
-Programma, a meno che una garanzia o una assunzione di responsabilit@`a scritta
-non accompagni una copia del programma ottenuta dietro pagamento.
-@end enumerate
-
-@c fakenode --- for prepinfo
-@heading FINE DEI TERMINI E DELLE CONDIZIONI
-
-@c fakenode --- for prepinfo
-@heading Come applicare queste condizioni di Licenza ai vostri programmi
-
-Se sviluppi un nuovo programma, e vuoi che esso sia della massima utilit@`a, il
-modo migliore @`e renderlo software libero in modo che chiunque possa
-ridistribuirlo e modificarlo secondo i termini di questa Licenza.
-
-Per fare ci@`o, allega le seguenti note informative al programma. Il modo
-migliore @`e inserirle all'inizio di ciascun file sorgente, al fine di rimarcare
-adeguatamente la mancanza di garanzia; ciascun file dovrebbe inoltre contenere
-la dichiarazione di copyright e un riferimento al posto in cui @`e possibile
-ottenere la versione completa delle note informative.
-
-@smallexample
-@var{<una riga con nome del programma e breve descrizione di ci@`o che fa.>}
-Copyright (C) @var{<anno>} @var{<nome dell'autore>}
-
-Questo software @`e libero; lo puoi distribuire e/o modificare alle condizioni
-stabilite nella 'GNU General Public License' pubblicata dalla Free Software
-Foundation; fai riferimento alla versione 3 della Licenza, o (a tua scelta)
-a una qualsiasi versione successiva.
-
-Questo programma @`e distribuito con la speranza che sia utile, ma SENZA
-ALCUNA GARANZIA; senza neppure la garanzia implicita di COMMERCIABILIT@`A o
-IDONEIT@`A AD UN PARTICOLARE SCOPO. Si veda la 'GNU General Public License' per
-ulteriori dettagli.
-
-Dovresti aver ricevuto una copia della GNU General Public License assieme a
-questo programma; se non @`e cos@`{@dotless{i}}, si veda
-@url{http://www.gnu.org/licenses/}.
-@end smallexample
-
-Inoltre, aggiungi le informazioni necessarie a contattarti via posta ordinaria
-o via posta elettronica.
-
-Se il programma interagisce mediante terminale, fai in modo che visualizzi,
-quando viene avviato in modalit@`a interattiva, un breve messaggio come quello
-che segue:
-
-@smallexample
-@var{<programma>} Copyright (C) @var{<anno>} @var{<nome dell'autore>}
-Questo programma non ha ALCUNA GARANZIA; per dettagli usare il comando
-@samp{show w}.
-Questo @`e software libero, e ognuno @`e libero di ridistribuirlo
-sotto certe condizioni; usare il comando @samp{show c} per i dettagli.
-@end smallexample
-
-Gli ipotetici comandi @samp{show w} e @samp{show c} devono visualizzare le parti
-corrispondenti della GNU General Public License. Naturalmente i comandi del
-tuo programma potrebbero essere differenti; per una interfaccia di tipo GUI,
-dovresti usare un bottone ``About'' o ``Info''.
-
-Devi inoltre fare in modo che il tuo datore di lavoro (se lavori come
-programmatore presso terzi) o la tua scuola, eventualmente, firmino una
-``rinuncia al copyright'' sul programma, se necessario. Per maggiori
-informazioni su questo punto, e su come applicare e rispettare la GNU GPL,
-consultare la pagina @url{http://www.gnu.org/licenses/}.
-
-La GNU General Public License non consente di incorporare il programma
-all'interno di software proprietario. Se il tuo programma @`e una libreria di
-funzioni, potresti ritenere pi@`u opportuno consentire il collegamento tra
-software proprietario e la tua libreria. Se @`e questo ci@`o che vuoi, allora
-utilizza la GNU Lesser General Public License anzich@'e questa Licenza, ma prima
-leggi @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
-
-@ifclear FOR_PRINT
-@c The GNU Free Documentation License.
-@node Licenza per Documentazione Libera GNU (FDL)
-@unnumbered Licenza per Documentazione Libera GNU (FDL)
-@ifnotdocbook
-@center Versione 1.3, 3 Novembre 2008
-@end ifnotdocbook
-
-@docbook
-<subtitle>Versione 1.3, 3 Novembre 2008 </subtitle>
-@end docbook
-
-@cindex FDL (Free Documentation License)
-@cindex Free Documentation License (FDL)
-@cindex GNU Free Documentation License
-
-@c This file is intended to be included within another document,
-@c hence no sectioning command or @node.
-
-@display
-Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org}
-
-This is an unofficial translation of the GNU Free Documentation License into
-Italian. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU FDL—only
-the original English text of the GNU FDL does that. However, we hope that this
-translation will help Italian speakers understand the GNU FDL better.
-
-Questa @`e una traduzione non ufficiale della GNU Free Documentation License
-in italiano. Non @`e una pubblicazione della Free Software Foundation, e non
-ha validit@`a legale per i termini di distribuzione della documentazione che
-usa la GNU FDL; solo il testo originale inglese della GNU FDL ha tale
-validit@`a. Comunque, speriamo che questa traduzione aiuti chi parla
-italiano a comprendere meglio la GNU FDL.
-
-A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
-di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
-
-@end display
-
-@enumerate 0
-@item
-PREAMBOLO
-
-Lo scopo di questa licenza @`e di rendere @dfn{liberi} un manuale, un testo o
-altri documenti funzionali e utili, nel senso di assicurare a tutti la
-libert@`a effettiva di copiarli e ridistribuirli, con o senza modifiche, con
-o senza fini di lucro. In secondo luogo questa licenza prevede per autori
-ed editori il modo per ottenere il giusto riconoscimento del proprio
-lavoro, preservandoli dall'essere considerati responsabili per modifiche
-apportate da altri.
-
-Questa licenza garantisce il ``copyleft'': questo significa che i lavori che
-derivano dal documento originale devono essere ugualmente liberi. @`E il
-complemento alla Licenza Pubblica Generale GNU, che @`e una licenza di tipo
-``copyleft'' pensata per il software libero.
-
-Questa licenza @`e stata progettata appositamente per l'uso con manuali di
-software libero, perch@'e il software libero ha bisogno di documentazione
-libera: un programma libero dovrebbe accompagnarsi a manuali che
-forniscano le stesse libert@`a del software. Questa licenza non @`e limitata
-alla manualistica del software; pu@`o essere utilizzata per ogni testo che
-tratti un qualsiasi argomento e al di l@`a dell'avvenuta pubblicazione
-cartacea. Si raccomanda l'uso di questa licenza principalmente per opere
-che abbiano fini didattici o per manuali.
-
-@item
-APPLICABILIT@`A E DEFINIZIONI
-
-Questa licenza si applica a qualsiasi manuale o altra opera, su ogni tipo
-di supporto, che contenga la nota, posta dal detentore del copyright, che
-attesti la possibilit@`a di distribuzione secondo i termini di questa
-licenza. Tale nota permette universalmente, senza pagamento di diritti e
-senza limiti di durata di utilizzare il lavoro secondo le condizioni qui
-specificate. Con ``documento'', nel seguito ci si riferisce a qualsiasi
-manuale o opera. Ogni fruitore @`e un destinatario della licenza ed @`e ad
-esso che si fa riferimento. Si conviene che la licenza viene accettata se
-si copia, modifica o distribuisce il lavoro in una maniera tale da
-richiedere il permesso secondo le leggi sul copyright.
-
-Una ``versione modificata'' del documento @`e ogni opera contenente il
-documento stesso o parte di esso, sia riprodotto alla lettera che con
-modifiche, oppure traduzioni in un'altra lingua.
-
-Una ``sezione secondaria'' @`e un'appendice cui si fa riferimento o una
-premessa del documento e riguarda esclusivamente il rapporto dell'editore
-o dell'autore del documento con l'argomento generale del documento stesso
-(o argomenti affini) e non contiene nulla che possa essere compreso
-nell'argomento principale. (Perci@`o, se il documento @`e in parte un manuale
-di matematica, una sezione secondaria non pu@`o contenere spiegazioni di
-matematica). Il rapporto con l'argomento pu@`o essere un tema collegato
-storicamente con il soggetto principale o con soggetti affini, o essere
-costituito da argomentazioni legali, commerciali, filosofiche, etiche o
-politiche pertinenti.
-
-Le ``sezioni non modificabili'' sono alcune sezioni secondarie i cui titoli
-sono esplicitamente elencati come titoli delle sezioni non modificabili
-nella nota che indica che il documento @`e realizzato sotto questa licenza.
-Se una sezione non rientra nella precedente definizione di sezione
-secondaria, allora non @`e permesso che venga definita come non
-modificabile. Il documento pu@`o anche non contenere sezioni non
-modificabili. Se nel documento non vengono indicate sezioni non
-modificabili, allora significa che non ve ne sono.
-
-I ``testi di copertina'' sono dei brevi brani di testo che sono elencati,
-nella prima o quarta pagina di copertina, nella nota che indica che il
-documento @`e rilasciato sotto questa licenza. Il testo sulla prima di
-copertina pu@`o essere composto al massimo di 5 parole mentre quello sulla
-quarta di copertina pu@`o essere al massimo di 25 parole.
-
-Una copia ``trasparente'' indica una copia leggibile da un calcolatore,
-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
-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
-per intralciare o scoraggiare modifiche future da parte dei lettori non @`e
-trasparente. Un formato immagine non @`e trasparente se viene usato per
-rappresentare una notevole quantit@`a di testo. Una copia non ``trasparente''
-viene detta ``opaca''.
-
-Esempi di formati adatti per copie trasparenti sono l'@sc{ASCII} puro senza
-marcatori, il formato di ingresso per Texinfo, il formato di ingresso per
-La@TeX{}, @acronym{SGML} o @acronym{XML} accoppiati ad una @acronym{DTD}
-pubblica e disponibile, e i formati conformi agli standard @acronym{HTML}
-semplice, Postscript e @acronym{PDF} progettati per essere modificati
-manualmente. Esempio di formati immagine trasparenti includono il
-@acronym{PNG}, @acronym{XCF} e @acronym{JPG}. I formati opachi includono i
-formati proprietari che possono essere letti e modificati solo con word
-processor proprietari, @acronym{SGML} o @acronym{XML} per cui non @`e in
-genere disponibile la @acronym{DTD} o gli strumenti per il trattamento, e i
-formati @acronym{HTML}, Postscript e @acronym{PDF} generati automaticamente
-da qualche word processor esclusivamente come output.
-
-La ``pagina del titolo'' di un libro stampato indica la pagina del titolo
-stessa, pi@`u qualche pagina seguente per quanto necessario a contenere in
-modo leggibile, il materiale che la licenza prevede che compaia nella
-pagina del titolo. Per opere in formati in cui non sia contemplata
-esplicitamente la pagina del titolo, con ``pagina del titolo'' si intende il
-testo prossimo al titolo dell'opera, precedente l'inizio del corpo del
-testo.
-
-Il termine ``editore'' indica qualunque persona o entit@`a che distribuisce al
-pubblico copie del documento.
-
-Una sezione ``Intitolata XYZ'' significa una sottosezione con nome del
-documento il cui titolo sia precisamente XYZ o che contenga XYZ in
-parentesi dopo il testo che traduce XYZ in un'altra lingua (in questo caso
-XYZ sta per uno specifico nome di sezione menzionato sotto, come per i
-``Riconoscimenti'', ``Dediche'', ``Approvazioni'', o ``Storia''). Secondo questa
-definizione, ``preservare il titolo'' di tale sezione quando si modifica il
-documento, significa che essa rimane una sezione ``Intitolata XYZ''.
-
-Il Documento pu@`o includere dei limiti alla garanzia accanto alla nota
-affermante l'applicazione di questa licenza al documento. Questi limiti
-alla garanzia sono da considerare da includere come riferimento a questa
-licenza, ma solo per quanto riguarda le limitazioni alla garanzia: ogni
-altra implicazione che questi limiti alla garanzia possono avere @`e da
-considerarsi nulla e non ha effetto sul significato di questa licenza.
-
-@item
-COPIE LETTERALI
-
-Si pu@`o copiare e distribuire il documento con qualsiasi mezzo, con o senza
-fini di lucro, purch@'e tutte le copie contengano questa licenza, le note di
-copyright e l'avviso che questa licenza si applica al documento, e che non
-si aggiungano altre condizioni al di fuori di quelle della licenza stessa.
-Non si possono usare misure tecniche per impedire o controllare la lettura
-o la produzione di copie successive alle copie che si producono o
-distribuiscono. Si possono comunque accettare compensi per la copiatura.
-Se si distribuiscono un numero sufficiente di copie si devono seguire
-anche le condizioni della sezione 3.
-
-Alle stesse condizioni sopra menzionate si possono prestare copie e
-mostrarle pubblicamente.
-
-@item
-COPIARE IN NOTEVOLI QUANTIT@`A
-
-Se si pubblicano a mezzo stampa (o in formati che tipicamente posseggono
-copertine) pi@`u di 100 copie del documento, e la nota della licenza
-richiede uno o pi@`u testi di copertina, si devono includere nelle copie, in
-modo chiaro e leggibile, tutti i testi di copertina indicati: il testo
-della prima di copertina in prima di copertina e il testo di quarta di
-copertina in quarta di copertina. Ambedue devono identificare l'editore
-che pubblica il documento. La prima di copertina deve presentare il titolo
-completo con tutte le parole che lo compongono egualmente visibili ed
-evidenti. Si pu@`o aggiungere altro materiale alle copertine. Il copiare con
-modifiche limitate alle sole copertine, purch@'e si preservino il titolo e
-le altre condizioni viste in precedenza, @`e considerato alla stregua di
-copiare alla lettera.
-
-Se il testo richiesto per le copertine @`e troppo voluminoso per essere
-riprodotto in modo leggibile, se ne pu@`o mettere una prima parte (per
-quanto ragionevolmente pu@`o stare) in copertina, e continuare il resto
-nelle pagine immediatamente seguenti.
-
-Se si pubblicano o distribuiscono copie opache del documento in numero
-superiore a 100, si deve anche includere una copia trasparente leggibile
-da un calcolatore in ogni copia oppure menzionare in ogni copia opaca un
-indirizzo di rete di calcolatori pubblicamente accessibile che utilizzi un
-protocollo di rete standard pubblico, da cui si possa scaricare
-liberamente una copia trasparente completa del documento, senza materiale
-aggiuntivo. Se si adotta quest'ultima opzione, si deve prestare la giusta
-attenzione, nel momento in cui si inizia la distribuzione in quantit@`a
-elevata di copie opache, ad assicurarsi che la copia trasparente rimanga
-accessibile all'indirizzo stabilito fino ad almeno un anno dopo l'ultima
-distribuzione (direttamente o attraverso distributori o rivenditori) di
-quell'edizione al pubblico.
-
-@`E caldamente consigliato, bench@'e non obbligatorio, contattare l'autore del
-documento prima di distribuirne un numero considerevole di copie, per
-metterlo in grado di fornire una versione aggiornata del documento.
-
-@item
-MODIFICHE
-
-Si possono copiare e distribuire versioni modificate del documento
-rispettando le condizioni delle precedenti sezioni 2 e 3, purch@'e la
-versione modificata sia realizzata seguendo questa stessa licenza, con la
-versione modificata che svolga il ruolo del ``documento'', cos@`{@dotless{i}} da estendere
-la licenza sulla distribuzione e la modifica a chiunque ne possieda una
-copia. Inoltre nelle versioni modificate si deve:
-
-@enumerate A
-@item
-Usare nella pagina del titolo (e nelle copertine se ce ne sono) un titolo
-diverso da quello del documento, e da quelli di versioni precedenti (che
-devono essere elencati nella sezione storia del documento ove presenti).
-Si pu@`o usare lo stesso titolo di una versione precedente se l'editore di
-quella versione originale ne ha dato il permesso.
-
-@item
-Elencare nella pagina del titolo, come autori, una o pi@`u persone o gruppi
-responsabili in qualit@`a di autori delle modifiche nella versione
-modificata, insieme ad almeno cinque tra i principali autori del documento
-(tutti gli autori principali se sono meno di cinque), a meno che questi
-non abbiano acconsentito a liberarvi da quest'obbligo.
-
-@item
-Dichiarare nella pagina del titolo il nome dell'editore della versione
-modificata in qualit@`a di editore.
-
-@item
-Conservare tutte le note di copyright
-del documento originale.
-
-@item
-Aggiungere un'appropriata nota di copyright per
-le modifiche di seguito alle altre note di copyright.
-
-@item
-Includere, immediatamente dopo la nota di copyright, una nota di licenza
-che dia pubblicamente il permesso di usare la versione modificata nei
-termini di questa licenza, nella forma mostrata nell'Addendum alla fine di
-questo testo.
-
-@item
-Preservare in tale nota di licenza l'elenco completo di sezioni non
-modificabili e testi di copertina richiesti come previsto dalla licenza
-del documento.
-
-@item
-Includere una copia non modificata di questa licenza.
-
-@item
-Conservare la sezione intitolata ``Storia'', e il suo titolo, e aggiungere
-a questa un elemento che riporti almeno il titolo, l'anno, i nuovi autori,
-e gli editori della versione modificata come figurano nella pagina del
-titolo. Se non ci sono sezioni intitolate ``Storia'' nel documento,
-crearne una che riporti il titolo, gli autori, gli editori del documento
-come figurano nella pagina del titolo, quindi aggiungere un elemento che
-descriva la versione modificata come detto in precedenza.
-
-@item
-Conservare l'indirizzo in rete riportato nel documento, se c'@`e, al fine
-del pubblico accesso ad una copia trasparente, e possibilmente l'indirizzo
-in rete per le precedenti versioni su cui ci si @`e basati. Questi possono
-essere collocati nella sezione ``Storia''. Si pu@`o omettere un indirizzo di
-rete per un'opera pubblicata almeno quattro anni prima del documento
-stesso, o se l'originario editore della versione cui ci si riferisce ne d@`a
-il permesso.
-
-@item
-In ogni sezione di ``Ringraziamenti'' o ``Dediche'', si conservi il titolo
-della sezione, e all'interno della sezione tutta la sostanza e il tono di
-ognuno dei ringraziamenti ai contributori e/o le dediche ivi contenute.
-
-@item
-Si conservino inalterate le sezioni non modificabili del documento, nei
-propri testi e nei propri titoli. I numeri della sezione o equivalenti non
-sono considerati parte del titolo della sezione.
-
-@item
-Si cancelli ogni sezione intitolata ``Approvazioni''. Tale sezione non pu@`o
-essere inclusa nella versione modificata.
-
-@item
-Non si cambi il titolo di sezioni esistenti in ``Approvazioni'' o in modo
-tale che si possa creare confusione con i titoli di sezioni non
-modificabili.
-
-@item
-Si conservino tutti i limiti alla garanzia.
-@end enumerate
-
-
-
-Se la versione modificata comprende nuove sezioni di primaria
-importanza o appendici che ricadono in ``sezioni secondarie'', e non
-contengono materiale copiato dal documento, si ha facolt@`a di rendere non
-modificabili quante sezioni si voglia. Per fare ci@`o si aggiunga il loro
-titolo alla lista delle sezioni non modificabili nella nota di licenza
-della versione modificata. Questi titoli devono essere distinti dai titoli
-di ogni altra sezione.
-
-Si pu@`o aggiungere una sezione intitolata ``Approvazioni'', a patto che non
-contenga altro che le approvazioni alla versione modificata prodotte da
-vari soggetti--per esempio, affermazioni di revisione o che il testo @`e
-stato approvato da una organizzazione come la definizione normativa di uno
-standard.
-
-Si pu@`o aggiungere un brano fino a cinque parole come testo di prima di
-copertina e un brano fino a 25 parole come testo di quarta di copertina,
-alla fine dell'elenco dei testi di copertina nella versione modificata.
-Solamente un brano del testo di prima di copertina e uno del testo di
-quarta di copertina possono essere aggiunti (anche con adattamenti) da
-ciascuna persona o organizzazione. Se il documento include gi@`a un testo di
-copertina per la stessa copertina, precedentemente aggiunto o adattato da
-qualunque fruitore o dalla stessa organizzazione nel nome della quale si
-agisce, non se ne pu@`o aggiungere un altro, ma si pu@`o rimpiazzare il
-vecchio ottenendo l'esplicita autorizzazione dall'editore precedente che
-aveva aggiunto il testo di copertina.
-
-L'autore/i e l'editore/i del documento non danno, tramite questa licenza,
-il permesso di usare i loro nomi per pubblicizzare o asserire, anche
-implicitamente, la loro approvazione di ogni versione modificata.
-
-@item
-COMBINAZIONE DI DOCUMENTI
-
-Si pu@`o combinare il documento con altri pubblicati con questa licenza,
-seguendo i termini definiti nella precedente sezione 4 per le versioni
-modificate, a patto che si includa l'insieme di tutte le sezioni non
-modificabili di tutti i documenti originali, senza modifiche, e si
-elenchino tutte come sezioni non modificabili della combinazione di
-documenti nella licenza della stessa, mantenendo tutti i limiti alla
-garanzia.
-
-Nella combinazione @`e necessaria una sola copia di questa licenza, e pi@`u
-sezioni non modificabili possono essere rimpiazzate da una singola copia
-se identiche. Se ci sono pi@`u sezioni non modificabili con lo stesso nome
-ma contenuti differenti, si renda unico il titolo di ciascuna sezione
-aggiungendovi, alla fine e tra parentesi, il nome dell'autore o editore
-della sezione, se noti, o altrimenti un numero distintivo. Si facciano gli
-stessi aggiustamenti ai titoli delle sezioni nell'elenco delle sezioni non
-modificabili nella nota di copyright della combinazione.
-
-Nella combinazione si devono unire le varie sezioni intitolate ``Storia''
-nei vari documenti originali di partenza per formare una unica sezione
-intitolata ``Storia''; allo stesso modo si unisca ogni sezione intitolata
-``Ringraziamenti'', e ogni sezione intitolata ``Dediche''. Si devono eliminare
-tutte le sezioni intitolate ``Approvazioni''.
-
-@item
-RACCOLTE DI DOCUMENTI
-
-Si pu@`o produrre una raccolta che consista del documento e di altri
-documenti rilasciati sotto questa licenza, e rimpiazzare le singole copie
-di questa licenza nei vari documenti con una sola inclusa nella raccolta,
-solamente se si seguono le regole fissate da questa licenza per le copie
-alla lettera come se si applicassero a ciascun documento.
-
-Si pu@`o estrarre un singolo documento da tale raccolta e distribuirlo
-separatamente sotto questa licenza, solo se si inserisce una copia di
-questa licenza nel documento estratto e se si seguono tutte le altre
-regole fissate da questa licenza per le copie alla lettera del documento.
-
-@item
-AGGREGAZIONE A LAVORI INDIPENDENTI
-
-Un'unione del documento o sue derivazioni con altri documenti o lavori
-separati o indipendenti, all'interno di, o a formare un, archivio o un
-supporto, per la memorizzazione o la distribuzione, viene chiamato un
-``aggregato'' se il copyright risultante dall'unione non viene usato per
-limitare i diritti legali degli utilizzatori oltre a ci@`o che viene
-permesso dai singoli lavori. Quando il documento viene incluso in un
-aggregato, questa licenza non si applica ad altri lavori nell'aggregato
-che non siano essi stessi dei lavori derivati dal documento.
-
-Se le esigenze del testo di copertina della sezione 3 sono applicabili a
-queste copie del documento allora, se il documento @`e inferiore alla met@`a
-dell'intero aggregato i testi di copertina del documento possono essere
-piazzati in copertine che delimitano il documento all'interno
-dell'aggregato, o dell'equivalente elettronico delle copertine se il
-documento @`e in un formato elettronico. Altrimenti devono apparire nella
-copertina dell'intero aggregato.
-
-@item
-TRADUZIONE
-
-La traduzione @`e considerata un tipo di modifica, di conseguenza si possono
-distribuire traduzioni del documento nei termini della sezione 4.
-Rimpiazzare sezioni non modificabili con traduzioni richiede un
-particolare permesso da parte dei detentori del copyright, ma @`e possibile
-includere la traduzione di parti o di tutte le sezioni non modificabili in
-aggiunta alle versioni originali di queste sezioni. @`E possibile includere
-una traduzione di questa licenza, di tutte le avvertenze del documento e
-di tutti i limiti di garanzia, a condizione che si includa anche la
-versione originale in inglese della licenza completa, comprese le
-avvertenze e limitazioni di garanzia. In caso di discordanza tra la
-traduzione e la versione originale inglese di questa licenza o avvertenza
-o limitazione di garanzia, prevale sempre la versione originale inglese.
-
-Se una sezione del documento viene titolata ``Riconoscimenti'', ``Dediche'', o
-``Storia'', il requisito (sezione 4) di preservare il titolo (sezione 1)
-richieder@`a tipicamente il cambiamento del titolo.
-
-@item
-CESSAZIONE DELLA LICENZA
-
-Non si pu@`o sublicenziare il documento, copiarlo, modificarlo, o
-distribuirlo al di fuori dei termini espressamente previsti da questa
-licenza. Ogni altro tentativo di applicare una licenza al documento,
-copiarlo, modificarlo, o distribuirlo @`e nullo e pone fine automaticamente
-ai diritti previsti da questa licenza.
-
-In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la
-specifica licenza di un particolare detentore del copyright viene
-ripristinata (a) in via provvisoria, a meno che e fino a quando il
-detentore del copyright non faccia estinguere esplicitamente e
-definitivamente la licenza, e (b) in via permanente se il detentore del
-copyright non notifica in alcun modo la violazione entro 60 giorni dalla
-cessazione della licenza.
-
-Inoltre, la licenza di un dato detentore del copyright viene ripristinata
-in maniera permanente se quest'ultimo notifica la violazione in maniera
-adeguata, se si tratta della prima volta che si riceve una notifica di
-violazione della licenza (per qualsiasi opera) dallo stesso detentore di
-copyright, e se la violazione viene corretta entro 30 giorni dalla data di
-ricezione della notifica di violazione.
-
-La cessazione dei diritti come specificato in questa sezione non provoca
-la cessazione delle licenze di terze parti che abbiano ricevuto copie o
-diritti secondo questa licenza. Se i diritti sono cessati e non sono stati
-ristabiliti in via permanente, la ricezione di una copia dello stesso
-materiale, in tutto o in parte, non d@`a alcun diritto ad utilizzarlo.
-
-@item
-REVISIONI FUTURE DI QUESTA LICENZA
-
-La Free Software Foundation pu@`o occasionalmente pubblicare versioni nuove
-o rivedute della Licenza per Documentazione Libera GNU. Le nuove versioni
-saranno simili nello spirito alla versione attuale ma potrebbero
-differirne in qualche dettaglio per affrontare nuovi problemi e concetti.
-Si veda @uref{http://www.gnu.org/copyleft/}.
-
-Ad ogni versione della licenza viene dato un numero che la distingue. Se
-il documento specifica che si riferisce ad una versione particolare della
-licenza ``o ogni versione successiva'', si ha la possibilit@`a di seguire
-termini e condizioni sia della versione specificata che di ogni versione
-successiva pubblicata (non come bozza) dalla Free Software Foundation. Se
-il documento non specifica un numero di versione particolare di questa
-licenza, si pu@`o scegliere ogni versione pubblicata (non come bozza) dalla
-Free Software Foundation. Se il documento specifica che un delegato pu@`o
-decidere quale futura versione di questa licenza pu@`o essere utilizzata,
-allora la dichiarazione pubblica di accettazione della versione, da parte
-del delegato, autorizza in maniera permanente a scegliere tale versione
-per il documento.
-
-@item
-CAMBIO DI LICENZA
-
-Il termine ``sito per la collaborazione massiva multiautore'' (o ``sito
-MMC'')
-indica qualsiasi server web che pubblica opere sottoponibili a copyright e
-fornisce a chiunque appositi strumenti per modificare tali opere. Un wiki
-pubblico modificabile da chiunque @`e un esempio di server in questione. Una
-``collaborazione massiva multiautore'' (o ``MMC'') contenuta nel sito indica
-un qualunque insieme di opere sottoponibili a copyright pubblicate sul
-sito MMC.
-
-Il termine ``CC-BY-SA'' indica la licenza Creative Commons Attribution-Share
-Alike 3.0 pubblicata dalla Creative Commons Corporation, un'organizzazione
-senza fini di lucro con sede principale a San Francisco, California, come
-anche le future versioni di tale licenza pubblicate dalla stessa
-organizzazione.
-
-``Incorporare'' significa pubblicare o ripubblicare un documento in tutto o
-in parte, come parte di un altro documento.
-
-Una MMC @`e ``qualificata a cambiare questa licenza'' se ha adottato questa
-licenza e se tutte le opere precedentemente pubblicate con questa licenza
-altrove rispetto alla MMC e successivamente incorporate del tutto o in
-parte nella MMC (1) non hanno testo di copertina o sezioni invarianti e
-(2) sono state incorporate prima del 1° Novembre 2008.
-
-L'operatore di un sito MMC pu@`o ripubblicare un MMC contenuto nel sito con
-una CC-BY-SA nello stesso sito in qualsiasi momento prima del 1° Agosto
-2009, da parte di una MMC qualificata a cambiare questa licenza.
-
-@end enumerate
-
-@c fakenode --- for prepinfo
-@unnumberedsec ADDENDUM: Come usare questa licenza per i vostri documenti
-
-Per applicare questa licenza ad un documento che si @`e scritto, si includa
-una copia della licenza nel documento e si inserisca la seguente nota di
-copyright appena dopo la pagina del titolo:
-
-@smallexample
-@group
- Copyright (C) @var{<anno>} @var{<il vostro nome>}
- @`E permesso copiare, distribuire e/o modificare questo documento
- seguendo i termini della ``Licenza per documentazione libera GNU'', versione 1.3
- o ogni versione successiva pubblicata dalla Free Software Foundation;
- senza sezioni non modificabili, senza testi di prima di copertina e di quarta di copertina.
- Una copia della licenza @`e inclusa nella sezione intitolata
- ``Licenza per la documentazione libera GNU''.
-@end group
-@end smallexample
-
-Se ci sono sezioni non modificabili, testi di prima di copertina e di
-quarta di copertina, scrivere nella parte ``with@dots{} di copertina'' il testo seguente:
-
-@smallexample
-@group
- con le seguenti sezioni non modificabili @var{lista dei loro titoli},
- con i seguenti testi di prima di copertina @var{elenco},
- e con i seguenti testi di quarta di copertina @var{elenco},
-@end group
-@end smallexample
-
-Se esistono delle sezioni non modificabili ma non i testi di copertina, o
-qualche altra combinazione dei tre elementi sopra riportati, fondere
-assieme le due alternative in modo da conformarsi alla situazione descritta.
-
-Se il vostro documento contiene esempi non banali di programma in codice
-sorgente si raccomanda di rilasciare gli esempi contemporaneamente
-applicandovi anche una licenza di software libero di vostra scelta, come
-per esempio la Licenza Pubblica Generica GNU, al fine di permetterne l'uso
-come software libero.
-
-@end ifclear
-
-@ifnotdocbook
-@node Indice analitico
-@unnumbered Indice analitico
-@end ifnotdocbook
-@printindex cp
-
-@bye
-
-Unresolved Issues:
-------------------
-1. From ADR.
-
- Robert J. Chassell points out that awk programs should have some indication
- of how to use them. It would be useful to perhaps have a "programming
- style" section of the manual that would include this and other tips.
-
-Consistency issues:
- /.../ regexps are in @code, not @samp
- ".." strings are in @code, not @samp
- no @print before @dots
- values of expressions in the text (@code{x} has the value 15),
- should be in roman, not @code
- Use TAB and not tab
- Use ESC and not ESCAPE
- Use space and not blank to describe the space bar's character
- The term "blank" is thus basically reserved for "blank lines" etc.
- To make dark corners work, the @value{DARKCORNER} has to be outside
- closing `.' of a sentence and after (pxref{...}).
- " " should have an @w{} around it
- Use "non-" only with language names or acronyms, or the words bug and option and null
- Use @command{ftp} when talking about anonymous ftp
- Use uppercase and lowercase, not "upper-case" and "lower-case"
- or "upper case" and "lower case"
- Use "single precision" and "double precision", not "single-precision" or "double-precision"
- Use alphanumeric, not alpha-numeric
- Use POSIX-compliant, not POSIX compliant
- Use --foo, not -Wfoo when describing long options
- Use "Bell Laboratories", but not "Bell Labs".
- Use "behavior" instead of "behaviour".
- Use "coprocess" instead of "co-process".
- Use "zeros" instead of "zeroes".
- Use "nonzero" not "non-zero".
- Use "runtime" not "run time" or "run-time".
- Use "command-line" as an adjective and "command line" as a noun.
- Use "online" not "on-line".
- Use "whitespace" not "white space".
- Use "Input/Output", not "input/output". Also "I/O", not "i/o".
- Use "lefthand"/"righthand", not "left-hand"/"right-hand".
- Use "workaround", not "work-around".
- Use "startup"/"cleanup", not "start-up"/"clean-up"
- Use "filesystem", not "file system"
- Use @code{do}, and not @code{do}-@code{while}, except where
- actually discussing the do-while.
- Use "versus" in text and "vs." in index entries
- Use @code{"C"} for the C locale, not ``C'' or @samp{C}.
- The words "a", "and", "as", "between", "for", "from", "in", "of",
- "on", "that", "the", "to", "with", and "without",
- should not be capitalized in @chapter, @section etc.
- "Into" and "How" should.
- Search for @dfn; make sure important items are also indexed.
- "e.g." should always be followed by a comma.
- "i.e." should always be followed by a comma.
- The numbers zero through ten should be spelled out, except when
- talking about file descriptor numbers. > 10 and < 0, it's
- ok to use numbers.
- For most cases, do NOT put a comma before "and", "or" or "but".
- But exercise taste with this rule.
- Don't show the awk command with a program in quotes when it's
- just the program. I.e.
-
- {
- ....
- }
-
- not
- awk '{
- ...
- }'
-
- Do show it when showing command-line arguments, data files, etc, even
- if there is no output shown.
-
- Use numbered lists only to show a sequential series of steps.
-
- Use @code{xxx} for the xxx operator in indexing statements, not @samp.
- Use MS-Windows not MS Windows
- Use MS-DOS not MS DOS
- Use an empty set of parentheses after built-in and awk function names.
- Use "multiFOO" without a hyphen.
- Use "time zone" as two words, not "timezone".
-
-Date: Wed, 13 Apr 94 15:20:52 -0400
-From: rms@gnu.org (Richard Stallman)
-To: gnu-prog@gnu.org
-Subject: A reminder: no pathnames in GNU
-
-It's a GNU convention to use the term "file name" for the name of a
-file, never "pathname". We use the term "path" for search paths,
-which are lists of file names. Using it for a single file name as
-well is potentially confusing to users.
-
-So please check any documentation you maintain, if you think you might
-have used "pathname".
-
-Note that "file name" should be two words when it appears as ordinary
-text. It's ok as one word when it's a metasyntactic variable, though.
-
-------------------------
-ORA uses filename, thus the macro.
-
-Suggestions:
-------------
-
-Better sidebars can almost sort of be done with:
-
- @ifdocbook
- @macro @sidebar{title, content}
- @inlinefmt{docbook, <sidebar><title>}
- \title\
- @inlinefmt{docbook, </title>}
- \content\
- @inlinefmt{docbook, </sidebar>}
- @end macro
- @end ifdocbook
-
-
- @ifnotdocbook
- @macro @sidebar{title, content}
- @cartouche
- @center @b{\title\}
-
- \content\
- @end cartouche
- @end macro
- @end ifnotdocbook
-
-But to use it you have to say
-
- @sidebar{Title Here,
- @include file-with-content
- }
-
-which sorta sucks.
-
-TODO:
-Check that all dark corners are indexed properly.
-
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in
index 678125e7..678125e7 100755..100644
--- a/doc/it/gawktexi.in
+++ b/doc/it/gawktexi.in
diff --git a/doc/it/lflashlight-small.xpic b/doc/it/lflashlight-small.xpic
index 94ae7746..94ae7746 100755..100644
--- a/doc/it/lflashlight-small.xpic
+++ b/doc/it/lflashlight-small.xpic
diff --git a/doc/it/lflashlight.eps b/doc/it/lflashlight.eps
index fdb8cf31..fdb8cf31 100755..100644
--- a/doc/it/lflashlight.eps
+++ b/doc/it/lflashlight.eps
diff --git a/doc/it/lflashlight.pdf b/doc/it/lflashlight.pdf
index 4432fdd0..4432fdd0 100755..100644
--- a/doc/it/lflashlight.pdf
+++ b/doc/it/lflashlight.pdf
diff --git a/doc/it/margini.texi b/doc/it/margini.texi
index 67b25192..67b25192 100755..100644
--- a/doc/it/margini.texi
+++ b/doc/it/margini.texi
diff --git a/doc/it/programma-generico.eps b/doc/it/programma-generico.eps
index db87944d..db87944d 100755..100644
--- a/doc/it/programma-generico.eps
+++ b/doc/it/programma-generico.eps
diff --git a/doc/it/programma-generico.fig b/doc/it/programma-generico.fig
index e87f6e3b..e87f6e3b 100755..100644
--- a/doc/it/programma-generico.fig
+++ b/doc/it/programma-generico.fig
diff --git a/doc/it/programma-generico.pdf b/doc/it/programma-generico.pdf
index d5c751af..d5c751af 100755..100644
--- a/doc/it/programma-generico.pdf
+++ b/doc/it/programma-generico.pdf
Binary files differ
diff --git a/doc/it/programma-generico.png b/doc/it/programma-generico.png
index 1a877907..1a877907 100755..100644
--- a/doc/it/programma-generico.png
+++ b/doc/it/programma-generico.png
Binary files differ
diff --git a/doc/it/programma-generico.txt b/doc/it/programma-generico.txt
index 1f6e5124..1f6e5124 100755..100644
--- a/doc/it/programma-generico.txt
+++ b/doc/it/programma-generico.txt
diff --git a/doc/it/rflashlight-small.xpic b/doc/it/rflashlight-small.xpic
index 9e78a3f5..9e78a3f5 100755..100644
--- a/doc/it/rflashlight-small.xpic
+++ b/doc/it/rflashlight-small.xpic
diff --git a/doc/it/rflashlight.eps b/doc/it/rflashlight.eps
index 28cb7e25..28cb7e25 100755..100644
--- a/doc/it/rflashlight.eps
+++ b/doc/it/rflashlight.eps
diff --git a/doc/it/rflashlight.pdf b/doc/it/rflashlight.pdf
index 72c8561e..72c8561e 100755..100644
--- a/doc/it/rflashlight.pdf
+++ b/doc/it/rflashlight.pdf
diff --git a/doc/it/sidebar.awk b/doc/it/sidebar.awk
index d1f3efc3..d1f3efc3 100755..100644
--- a/doc/it/sidebar.awk
+++ b/doc/it/sidebar.awk
diff --git a/doc/it/texinfo.tex b/doc/it/texinfo.tex
index 2a4cdd6c..2a4cdd6c 100755..100644
--- a/doc/it/texinfo.tex
+++ b/doc/it/texinfo.tex
diff --git a/doc/it/txi-it.tex b/doc/it/txi-it.tex
index ba3bf6a5..ba3bf6a5 100755..100644
--- a/doc/it/txi-it.tex
+++ b/doc/it/txi-it.tex
diff --git a/doc/it/vettore-elementi.eps b/doc/it/vettore-elementi.eps
index 87979fb8..87979fb8 100755..100644
--- a/doc/it/vettore-elementi.eps
+++ b/doc/it/vettore-elementi.eps
diff --git a/doc/it/vettore-elementi.fig b/doc/it/vettore-elementi.fig
index 37f3449c..37f3449c 100755..100644
--- a/doc/it/vettore-elementi.fig
+++ b/doc/it/vettore-elementi.fig
diff --git a/doc/it/vettore-elementi.pdf b/doc/it/vettore-elementi.pdf
index cfec8760..cfec8760 100755..100644
--- a/doc/it/vettore-elementi.pdf
+++ b/doc/it/vettore-elementi.pdf
Binary files differ
diff --git a/doc/it/vettore-elementi.png b/doc/it/vettore-elementi.png
index 87ef434d..87ef434d 100755..100644
--- a/doc/it/vettore-elementi.png
+++ b/doc/it/vettore-elementi.png
Binary files differ
diff --git a/doc/it/vettore-elementi.txt b/doc/it/vettore-elementi.txt
index 5d7efb83..5d7efb83 100755..100644
--- a/doc/it/vettore-elementi.txt
+++ b/doc/it/vettore-elementi.txt
diff --git a/test/arrayind1.awk b/test/arrayind1.awk
index 59e8b4ea..59e8b4ea 100755..100644
--- a/test/arrayind1.awk
+++ b/test/arrayind1.awk
diff --git a/test/poundbang.awk b/test/poundbang.awk
index a6440fff..a6440fff 100755..100644
--- a/test/poundbang.awk
+++ b/test/poundbang.awk