=head1 NOME perlvar - Variabili predefinite in Perl =head1 DESCRIZIONE =head2 Nomi Predefiniti I nomi illustrati in seguito hanno un significato particolare in Perl. La maggior parte dei nomi con caratteri di punteggiatura sono ragionevolmente memorizzabili, oppure hanno degli analoghi nelle shell. Tuttavia, se desiderate utilizzare nomi lunghi per le variabili, non avete che da dichiarare use English; all'inizio del programma. Questa direttiva fa in modo da creare un alias di tutti i nomi corti ai corrispondenti nomi lunghi, all'interno del pacchetto corrente. Alcune variabili hanno perfino dei nomi di media lunghezza, generalmente presi a prestito da B. In generale E meglio utilizzare la direttiva modificata use English '-no_match_vars'; se non avete bisogno di C<$PREMATCH>, C<$MATCH> o C<$POSTMATCH>, poichE in questo modo si evita una degradazione delle prestazioni nell'utilizzo delle espressioni regolari. Consultate L per maggiori dettagli. Le variabili che dipendono dal I selezionato in un dato momento possono essere impostate anche chiamando un metodo appropriato sull'oggetto IO::Handle, sebbene ciE risulti meno efficiente rispetto ad utilizzare le normali variabili interne. (Per gli aspetti collegati, le righe di sommario nel seguito del documento contengono la parola HANDLE). Prima di tutto dovete dichiarare use IO::Handle; dopo di che potete utilizzare metodo HANDLE ESPRESSIONE o, in maniera piE sicura, HANDLE->metodo(ESPRESSIONE) Ciascun metodo restituisce il vecchio valore dell'attributo di IO::Handle. Ciascun metodo supporta una ESPRESSIONE opzionale che, se fornita, specifica il nuovo valore per l'attributo IO::Handle in questione. Se non viene fornita, invece, la maggior parte dei metodi non altera il valore corrente -- eccetto C, che assumerE che sia stato passato un 1 al posto vostro, tanto per essere differente. PoichE caricare la classe IO::Handle E un'operazione costosa, E meglio che impariate come utilizzare le variabili interne normali. Alcune di queste variabili sono considerate "di sola lettura". CiE significa che se provate ad assegnare loro un valore, direttamente o indirettamente attraverso un riferimento, vi ritroverete con un'eccezione a C. Dovete prestare particolare attenzione quando modificate il valore di default della maggior parte delle variabili speciali descritte in questo documento. Nella maggior parte dei casi sarE meglio che localizziate queste variabili prima di cambiarle, perchE altrimenti il cambiamento potrebbe alterare il funzionamento di altri moduli che si basano sui valori di default. Ecco ad esempio il modo corretto per leggere un file tutto in una volta: open my $fh, "pippo" or die $!; local $/; # abilita la modalita' "risucchio" localizzata my $contenuto = <$fh>; close $fh; Al contrario, quanto segue E da evitare: open my $fh, "pippo" or die $!; undef $/; # abilita la modalita' "risucchio" my $contenuto = <$fh>; close $fh; poichE qualche altro modulo potrebbe voler leggere i dati da qualche file in ingresso nella modalitE "per linea" di default , cosE se abbiamo giE eseguito il codice presentato, il valore globale di C<$/> E stato cambiato per qualsiasi altro pezzo di codice eseguito all'interno del medesimo interprete Perl. Di solito, quando una variabile E localizzata, E buona norma assicurarsi che questo cambiamento abbia impatto nello C piE ristretto possibile. Per questo motivo, a meno che non vi troviate giE all'interno di un blocco C<{}> breve, dovreste crearne uno appositamente. Ad esempio: my $contenuto = ''; open my $fh, "pippo" or die $!; { local $/; $contenuto = <$fh>; } close $fh; Ecco un esempio di come il vostro codice puE rovinare tutto: for (1..5){ diversione_pericolosa(); print "$_ "; } sub diversione_pericolosa { $_ = 5; # qui si fa qualcosa con $_ } Probabilmente vi aspettate che sia stampato: 1 2 3 4 5 ma vi ritrovate con: 5 5 5 5 5 PerchE? Per il motivo che C modifica C<$_> senza prima localizzarla. La soluzione consiste nell'utilizzare C: local $_ = 5; E facile notare il problema in un esempio cosE breve, ma in codice piE complesso andate a caccia di guai se non localizzate i cambiamenti delle variabili speciali. La lista che segue E ordinata inserendo prima le variabili scalari, poi gli array, poi le hash. =over 8 =item $ARG =item $_ L'ingresso e lo spazio per la ricerca di una espressione regolare predefiniti. Le seguenti coppie di righe di codice sono equivalenti: while (<>) {...} # equivalenti solo con while! while (defined($_ = <>)) {...} /^Subject:/ $_ =~ /^Subject:/ tr/a-z/A-Z/ $_ =~ tr/a-z/A-Z/ chomp chomp($_) Quelli che seguono sono i posti dove Perl assumerE di dover lavorare su C<$_> anche se non l'avete dichiarato esplicitamente: =over 3 =item * Varie funzioni unarie, incluse C ed C, cosE come tutti i test sui file (C<-f>, C<-d>) ad eccezione di C<-t>, che per default lavora su STDIN. =item * Varie funzioni su liste come C e C. =item * Gli operatori di I C, C e C, quando utilizzati senza l'operatore C<=~>. =item * La variabile di iterazione di default in un ciclo C se non viene specificata nessun'altra variabile. =item * La variabile di iterazione implicita nelle funzioni C e C. =item * La destinazione di default dove inserire un record in ingresso quando il risultato di un'operazione C<< >> viene utilizzato come unico criterio di test in un ciclo C. Al di fuori di un test per un ciclo C questo comportamento non ha luogo. =back (Memo: sottolineato E compreso in certe operazioni.) =back =over 8 =item $a =item $b Variabili di pacchetto speciali associate all'utilizzo di C, come da L. A causa di questa loro peculiaritE, C<$a> e C<$b> non necessitano di dichiarazione preventiva (con C o C), anche quando E in atto la direttiva C. Non create variabili lessicali con C o C se volete essere in grado di utilizzarle nel blocco o nella funzione di comparazione di C. =back =over 8 =item $> Contiene il I proveniente dalla corrispondente coppia di parentesi di cattura dall'ultimo I, senza contare I verificati in blocchi piE interni dai quali si E giE usciti. (Memo: come \cifre.) Queste variabili sono tutte in sola lettura e vengono ristrette dinamicamente al BLOCCO corrente. =item $MATCH =item $& La stringa che ha verificato il I piE recente (senza contare quanto avvenuto di nascosto in un BLOCCO o in una C racchiusi dal BLOCCO corrente). (Memo: come & in alcuni editor). Questa variabile E in sola lettura e ristretta dinamicamente al BLOCCO corrente. L'utilizzo di questa variabile in un qualsiasi posto nel programma ha come conseguenza una considerevole diminuzione di prestazioni su tutte le applicazioni di espressioni regolari. Consultate la sezione C. =item $PREMATCH =item $` La stringa che precede ciE che E stato verificato dall'ultimo I effettuato con successo (senza contare quanto avvenuto di nascosto in un BLOCCO o in una C racchiusi dal BLOCCO corrente). (Memo: C<`> spesso PRECEDE una stringa di citazione). Questa variabile E in sola lettura. L'utilizzo di questa variabile in un qualsiasi posto nel programma ha come conseguenza una considerevole diminuzione di prestazioni su tutte le applicazioni di espressioni regolari. Consultate la sezione C. =item $POSTMATCH =item $' La stringa che segue ciE che E stato verificato dall'ultimo I effettuato con successo (senza contare quanto avvenuto di nascosto in un BLOCCO o in una C racchiusi dal BLOCCO corrente). (Memo: C<'> spesso SEGUE una stringa di citazione). Esempio: local $_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; # stampa abc:def:ghi Questa variabile E in sola lettura e ristretta dinamicamente al BLOCCO corrente. L'utilizzo di questa variabile in un qualsiasi posto nel programma ha come conseguenza una considerevole diminuzione di prestazioni su tutte le applicazioni di espressioni regolari. Consultate la sezione C. =item $LAST_PAREN_MATCH =item $+ Il testo corrispondente all'ultima alternativa nell'ultima ricerca di I effettuata con successo. Risulta particolarmente utile quando non sapete quale sia stata verificata fra una rosa di alternative. Ad esempio: /Versione: (.*)|Revisione: (.*)/ && ($rev = $+); (Memo: sii positivo e guarda avanti.) Questa variabile E in sola lettura e ristretta dinamicamente al BLOCCO corrente. =item $^N Il testo corrispondente al gruppo utilizzato e chiuso piE di recente (ossia, il gruppo che ha la parentesi di chiusura piE a destra) dell'ultima ricerca di I che ha avuto successo. (Memo: la (possibilmente) parentesi iNnestata che si E chiusa piE di recente). E principalmente utilizzata all'interno di blocchi C<(?{...})> per esaminare il testo che ha verificato il I piE di recente. Ad esempio, per catturare il testo in una variabile in maniera efficace (al di lE di C<$1>, C<$2>, ecc.), potete rimpiazzare C<(...)> con (?:(...)(?{ $var = $^N })) Impostando e poi utilizzando C<$var> in questo modo vi toglie dall'impaccio di preoccuparvi di quale sia l'esatto numero del gruppo di parentesi che vi interessa. Questa variabile E in sola lettura e ristretta dinamicamente al BLOCCO corrente. =item @LAST_MATCH_END =item @+ Questo array contiene gli spostamenti dei punti terminali degli ultimi I avvenuti con successo all'interno dello scope dinamico correntemente attivo. C<$+[0]> E lo spostamento nella stringa della fine del I intero stesso. CiE corrisponde allo stesso valore restituito dalla funzione C quando viene chiamata sulla variabile oggetto dell'ultimo I. L'elemento Iesimo di questo array contiene lo spostamento del I Iesimo, quindi C<$+[1]> E lo spostamento dove termina C<$1>, C<$+[2]> lo spostamento dove termina C<$2> e cosE via. Potete utilizzare C<$#+> per determinare quanti sottogruppi erano presenti nell'ultimo I che ha avuto successo. Consultate anche gli esempi dati per la variabile C<@->. =item $* Impostate questa variabile ad un valore intero non nullo per effettuare I multilinea in una stringa, a 0 (o C) per dire a Perl che puE assumere che le stringhe contengono linee singole, in modo da ottimizzare le ricerche di espressioni regolari. I su stringhe che contengono caratteri "a capo" multipli possono produrre risultati confusi quando C<$*> E 0 o C. Per default il valore di questa variabile E C. (Memo: * corrisponde a varie cose). Questa variabile influenza solo l'interpretazione di C<^> e C<$>. Un "a capo" letterale puE essere ricercato anche quando C<$* == 0>. L'utilizzo di C<$*> E deprecato nel Perl moderno, soppiantato dai modificatori C e C nel C. Assegnando un valore non numerico a C<$*> comporta un avvertimento testuale (e fa sE che C<$*> si comporti come se C<$* == 0>), mentre assegnando un valore numerico comporta l'applicazione implicita della funzione C. =item HANDLE->input_line_number(ESPRESSIONE) =item $INPUT_LINE_NUMBER =item $NR =item $. Il numero di linea corrente per l'ultimo I utilizzato. Ciascun I in Perl tiene conto del numero di linee che sono stati letti. (Dipendentemente dal valore di C<$/>, l'idea di Perl di cosa sia una linea potrebbe non corrispondere alla vostra). Quando viene letta una riga da un I (attraverso C o C<< <> >>), o quando C o C sono chiamate sul I stesso, C<$.> diviene un alias per il contatore di linea del C stesso. Potete modificare il contatore assegnando un nuovo valore a C<$.>, ma ciE non sposterE il puntatore all'interno del I. I non localizza il contatore di linea del filehandle>. Piuttosto, localizzerE la visione interna di perl di quale I C<$.> stia puntando al momento. C<$.> viene riazzerato quando il I viene chiuso, ma B quando un I aperto viene riaperto senza che ci sia stata una C. Per maggiori dettagli, consultate LO">. PoichE C<< <> >> non porta mai a chiusure esplicite, i numeri di linea si incrementano attraverso i file di C (ma controllate gli esempi in C). Potete anche utilizzare solamente C<< HANDLE->input_line_number(ESPRESSIONE> >> per accedere al contatore di linea di un dato I senza dovervi preoccupare di quale sia l'I acceduto piE di recente. (Memo: molti programmi usano "." per intendere il numero di linea corrente). =item IO::Handle->input_record_separator(ESPRESSIONE) =item $INPUT_RECORD_SEPARATOR =item $RS =item $/ Il separatore di record di ingresso, "a capo" per default. Questa variabile influenza l'idea di Perl su cosa sia una "linea". Funziona in maniera simile alla variabile C di B, incluso il trattare righe vuote come terminatrici quando la variabile E impostata alla stringa vuota. (Una riga vuota non puE contenere spazi o tabulazioni). Potete impostare il valore di questa variabile ad una stringa con piE caratteri per ottenere un terminatore con piE caratteri, o ad C per leggere fino alla fine del file. Impostarla a C<"\n\n"> ha un significato leggermente differente rispetto a C<""> nel caso che il file contenga linee vuote consecutive. Impostare C<""> significa trattare due o piE linee vuote consecutive con un terminatore unico, mentre impostare C<"\n\n"> significa ciecamente che il prossimo carattere in ingresso appartiene al prossimo paragrafo, anche se E di nuovo un "a capo". (Memo: / delimita le righe quando si scrivono le poesie) local $/; # abilita la modalitE "risucchio" local $_ = ; # ora c'e` tutto il file qui s/\n[ \t]+/ /g; Ricordate: il valore di C<$/> E una stringa, non un'espressione regolare. B doveva pur essere migliore in qualcosa. :-) Impostando C<$/> ad un riferimento ad un intero, ad uno scalare che contiene un intero, o ad uno scalare che puE essere convertito in un intero, farE in modo che si cerchi di leggere record invece che linee, laddove la massima dimensione per un record E quella del valore intero puntato dal riferimento. Per cui quanto segue: local $/ = \32768; # o \"32768", o \$variabile_contenente_32768 open my $fh, $myfile or die $!; local $_ = <$fh>; leggerE un record di non piE di 32768 byte da FILE. Se non state leggendo da un file orientato al record (oppure il vostro sistema operativo non ha file orientati al record), allora molto probabilmente vi ritroverete con un bel pezzo di dati ad ogni lettura. Se un record E piE grande della dimensione del record che avete impostato vi ritroverete il record a pezzetti. Su VMS, le letture orientate al record sono effettuate con l'equivalente di C, per cui E buona norma evitare di mischiare letture di record e letture non di record sullo stesso file. (Difficilmente sarE un problema, perchE un qualsiasi file che volete leggere in modalitE record E probabilmente inutilizzabile in modalitE linea). I sistemi non-VMS effettuano l'I/O normalmente, per cui E sicuro mischiare letture di record e non record di un file. Consultate anche L e C<$.>. =item HANDLE->autoflush(ESPRESSIONE) =item $OUTPUT_AUTOFLUSH =item $| Se impostato ad un valore non nullo, forza un I [svuotamento del buffer di scrittura, N.d.T.] immediato e dopo ciascuna scrittura o C sul canale di uscita correntemente selezionato. Per default E 0 (indipendentemente dal fatto che il canale sia effettivamente bufferizzato o meno; C<$|> vi dice solamente se avete chiesto esplicitamente a Perl di effettuare un I dopo ogni scrittura). C sarE tipicamente bufferizzato alla riga se l'uscita E verso un terminale e bufferizzato al blocco altrimenti. Impostare questa variabile E principalmente utile quando state inviando dati ad una pipe o ad un socket, come quando state facendo girare un programma Perl sotto C e volete vedere l'output appena viene generato. Questa variabile non ha alcun effetto sul buffering in ingresso. Consultate C per questo. (Memo: quando volete che le vostre tubature [I in inglese, che E lo stesso nome del carattere C<|>, N.d.T.] scarichino pesante). =item IO::Handle->output_field_separator ESPRESSIONE =item $OUTPUT_FIELD_SEPARATOR =item $OFS =item $, Il separatore dei campi di uscita per l'operatore C<< print() >>. Se definito, questo valore viene stampato fra ogni parametro passato a C. Per default E C. (Memo: ciE che viene stampato quando c'E una "," nell'istruzione di C). =item IO::Handle->output_record_separator ESPRESSIONE =item $OUTPUT_RECORD_SEPARATOR =item $ORS =item $\ Il separatore dei record di uscita per l'operatore C. Se definito, questo valore E stampato dopo l'ultimo dei parametri di C. Per default E C. (Memo: impostate C<$\> invece di aggiungere "\n" alla fine della C. Inoltre, E piE o meno come C<$/>, ma E ciE che vi viene dato "dietro" da Perl [gioco di parole intraducibile, perchE "dietro" in inglese E "back", come in "backslash" che E il carattere C<\>, N.d.T.]). =item $LIST_SEPARATOR =item $" E come C<$,> eccetto che si applica ad array e valori I interpolati all'interno di una stringa in virgolette doppie (o stringhe che vengono interpretate analogamente a virgolette doppie). Per default E uno spazio. (Memo: ovvio, penso). =item $SUBSCRIPT_SEPARATOR =item $SUBSEP =item $; Il separatore di pedice per l'emulazione di array multidimensionali. Se vi riferite ad un elemento di una hash come segue $pippo{$a,$b,$c} in realtE state intendendo $pippo{join($;, $a, $b, $c)} Ma non mettete @pippo{$a,$b,$c} # una slice -- notare il carattere "@" che significa ($pippo{$a},$pippo{$b},$pippo{$c}) Per default E "\034", lo stesso di C in B. Se le vostre chiavi contengono dati binari potrebbe non esistere un valore sicuro per C<$;>. (Memo: la virgola (il separatore sintattico dei pedici) E un mezzo punto-e-virgola. Lo so, E piuttosto stupido come memo, ma C<$,> E giE preso per qualcosa di piE importante). Prendete comunque in considerazione l'utilizzo degli array multidimensionali "reali" descritti in L. =item $# Il formato di uscita per i numeri stampati. Questa variabile E un tentativo un po' goffo di emulare la variabile C di B. Ci sono volte, perE, in cui B e Perl hanno differenti punti di vista su cosa sia da considerare "numerico". Il valore iniziale E "%.Ig", ove I E il valore della macro C dall'header file F del vostro sistema. In questo differisce da B, in cui C ha valore di default "%.6g", per cui avrete bisogno di impostare C<$#> esplicitamente per avere il valore di B. (Memo: # E il segno per i numeri). L'utilizzo di C<$#> E deprecato. =item HANDLE->format_page_number(ESPRESSIONE) =item $FORMAT_PAGE_NUMBER =item $% Il numero di pagina corrente nel canale di uscita selezionato al momento. Utilizzato con i I. (Memo: % E il numero di pagina in B). =item HANDLE->format_lines_per_page(ESPRESSIONE) =item $FORMAT_LINES_PER_PAGE =item $= La lunghezza di pagina corrente (in termini di linee stampabili) del canale di uscita selezionato al momento. Per default vale 60. Utilizzato con i I. (Memo: = ha righe orizzontali). =item HANDLE->format_lines_left(ESPRESSIONE) =item $FORMAT_LINES_LEFT =item $- Il numero di righe rimaste sulla pagina del canale di uscita selezionato al momento. Utilizzato con i I. (Memo: linee_sulla_pagina - linee_stampate). =item @LAST_MATCH_START =item @- C<$-[0]> E lo scostamento dell'inizio dell'ultimo I avvenuto con successo. C<$-[>IC<]> E lo scostamento dell'inizio della sottostringa "colpita" dal I Iesimo, o C se il I non E stato verificato. Per questo motivo dopo un I su C<$_>, C<$&> coincide con C. Similmente, $I coincide con C se C<$-[n]> E definito e C<$+> coincide con C. Si puE utilizzare C<$#-> per trovare l'ultimo sottogruppo "colpito" nell'ultimo C che ha avuto successo. Confrontatelo con C<$#+>, il numero di sottogruppi dell'espressione regolare. Confrontatelo con C<@+>. Questo array contiene gli scostamenti degli inizi dei I che hanno avuto successo piE di recente nello scope dinamico attivo al momento. C<$-[0]> E lo scostamento nella stringa dell'inizio del C intero. L'elemento Iesimo di questo array contiene lo scostamento del I Iesimo, per cui C<$-[1]> E lo scostamento dove inizia C<$1>, C<$-[2]> E lo scostamento dove inizia C<$2> e cosE via. Dopo un I su una variabile qualsiasi C<$var>: =over 5 =item C<$`> E uguale a C =item C<$&> E uguale a C =item C<$'> E uguale a C =item C<$1> E uguale a C =item C<$2> E uguale a C =item C<$3> E uguale a C =back =item HANDLE->format_name(ESPRESSIONE) =item $FORMAT_NAME =item $~ Il nome del formato di report corrente per il canale di uscita selezionato al momento. Per default E il nome del I. (Memo: fratello di C<$^>). =item HANDLE->format_top_name(ESPRESSIONE) =item $FORMAT_TOP_NAME =item $^ Il nome del formato di inizio-pagina per il canale di uscita selezionato al momento. Per default E il nome del I con C<_TOP> aggiunto alla fine. (Memo: punta all'inizio della pagina). =item IO::Handle->format_line_break_characters ESPRESSIONE =item $FORMAT_LINE_BREAK_CHARACTERS =item $: L'insieme di caratteri corrente dopo i quali una stringa puE essere interrotta per riempire i campi di continuazione (che iniziano con ^) in un I. Per default E S<" \n-">, per interrompere su spazi vuoti e "-". (Memo: una "colonna" [":" in inglese si chiama I, N.d.T.] in poesia E una parte di una linea). =item IO::Handle->format_formfeed ESPRESSIONE =item $FORMAT_FORMFEED =item $^L CiE che viene stampato come I
[carattere di avanzamento, N.d.T.] dai I. Per default E C<\f>. =item $ACCUMULATOR =item $^A Il valore corrente dell'accumulatore C per le righe di C. Un I contiene un numero C di chiamate che inseriscono il proprio risultato in C<$^A>. Dopo aver chiamato il proprio I, C stampa il contenuto di C<$^A> e lo svuota. Per questo motivo non vedrete mai il contenuto di C<$^A> a meno che non chiamiate C per conto vostro e poi andate a vederne il valore. Consultate L e L. =item $CHILD_ERROR =item $? Lo stato restituito dall'ultima operazione di chiusura di una pipe, comando I (C<``>), chiamata con successo a C o C, o dall'operatore C. Contiene la parola a 16 bit di stato restituita dalla chiamata C (o perlomeno E costruita in modo da assomigliarle). Per questo motivo, il valore di uscita del sottoprocesso in realtE E (C<<< $? >> 8 >>>), e C<$? & 127> indica quale segnale, se ce n'E stato, ha causato la terminazione del processo, mentre C<$? & 128> indica se c'E stato un I. (Memo: simile alle shell B e B) In piE, se la variabile C E supportata in C, il suo valore viene restituito via C<$?> se una qualsiasi funzione della famiglia C fallisce. Se avete installato un I di segnale per C, il valore di C<$?> sarE generalmente sbagliato al di fuori dell'handler stesso. All'interno di una subroutine C, C<$?> contiene il valore che verrE passato ad C. Potete modificare C<$?> in una subroutine C per cambiare lo stato di uscita del vostro programma. Ad esempio: END { $? = 1 if $? == 255; # die lo imposta a 255 } Sotto VMS, la direttiva C fa sE che C<$?> rifletta il valore di uscita VMS reale, invece che quello di emulazione POSIX che si avrebbe di default; consultate L per i dettagli. Consultate anche L. =item ${^ENCODING} Il I all'oggetto Encode che E utilizzato per convertire il codice sorgente in Unicode. Grazie a questa variabile il vostro script perl non ha bisogno di essere scritto in UTF-8. Per default E C. La manipolazione diretta di questa variabile E caldamente scoraggiata. Consultate anche L per maggiori dettagli. =item $OS_ERROR =item $ERRNO =item $! Se utilizzata numericamente, restituisce il valore corrente della variabile C C, o, in altre parole, se una chiamata di sistema o di libreria fallisce, imposta questa variabile. CiE significa che il valore di C<$!> ha senso solo I dopo un B: if (open(FH, $nomefile)) { # Qui $! non ha senso. ... } else { # SOLO qui $! ha senso. ... # Gia' qui $! potrebbe aver perso ogni senso. } # Poiche' qui potremmo aver avuto un successo o un fallimento, # qui $! non ha senso. Nell'esempio I indica qualunque valore: zero, non zero, C. Una chiamata di sistema o di libreria completata con successo B imposta la variabile a zero. Se utilizzata come una stringa, restituisce la corrispondente stringa di errore di sistema. Potete assegnare un valore numerico I a C<$!> per impostare I se, ad esempio, volete che C<"$!"> restituisca la stringa per l'errore I, o se volete impostare il valore di uscita per l'operatore C. (Memo: cos'E che E appena esploso? [il carattere "!" E anche detto "bang" in inglese, e "bang" E il nome onomatopeico per l'esplosione, N.d.T.]). Consultate anche L. =item %! Ciascun elemento di C<%!> ha un valore "vero" solo se C<$!> E impostato al dato valore. Ad esempio, C<$!{ENOENT}> E vera se e solo se il valore corrente di C<$!> E C; in altri termini, se l'errore occorso piE di recente E stato "No such file or directory" ["Nome di file o directory inesistente", N.d.T.] (o il suo equivalente "morale": non tutti i sistemi operativi danno questo errore con questa stringa esatta, e sicuramente non tutte le lingue). Per verificare se una particolare chiave ha senso nel vostro sistema, utilizzate C; per una lista di chiavi ammissibili utilizzate C. Consultate L per maggiori informazioni, e consultate quanto detto sopra circa la validitE di C<$!>. =item $EXTENDED_OS_ERROR =item $^E Informazione di errore specifica per il sistema operativo in uso. Al momento, il valore di questa variabile differisce da C<$!> solo sotto VMS, OS/2 e Win32 (e per MacPerl). Su tutte le altre piattaforme, C<$^E> E sempre semplicemente uguale a C<$!>. Sotto VMS, c<$^E> fornisce il valore di status VMS risultante dall'ultimo errore di sistema. Tale informazione risulta un'indicazione piE specifica sull'ultimo errore di sistema rispetto a quella data da C<$!>. CiE risulta particolarmente importante quando C<$!> E impostato a B. Sotto OS/2, C<$^E> E impostata al codice di errore dell'ultima chiamata all'API OS/2 o attraverso CRT o direttamente da perl. Sotto Win32, C<$^E> restituisce sempre l'ultima informazione di errore riportata dalla chiamata Win32 C, che descrive l'ultimo errore riportato dall'interno dell'API Win32. La maggior parte del codice specifico per Win32 riporterE i propri errori attraverso C<$^E>. Le chiamate C ANSI e quelle di tipo Unix impostano C e per questo motivo il codice Perl piE portabile riporterE gli errori attraverso C<$!>. Le avvertenze date nella descrizione di C<$!> si applicano, in generale, anche a C<$^E>. (Memo: spiegazione di errore Extra). Consultate anche L. =item $EVAL_ERROR =item $@ Il messaggio di errore di sintassi di Perl risultante dall'ultimo operatore C. Se C<$@> E la stringa vuota, l'ultima chiamata a C E stata interpretata ["parsed" nell'originale inglese, N.d.T.] ed eseguita correttamente (per quanto le operazioni invocate potrebbero esser fallite nella maniera usuale). (Memo: "a" che punto era l'errore di sintassi? [il segno "@" in inglese E chiamato "at", che corrisponde alla preposizione "a" italiana, N.d.T.]) I messaggi di avvertimento non sono raccolti da questa variabile. In ogni caso, potete impostare una routine per processare gli avvertimenti impostando C<$SIG{__WARN__}> come descritto in seguito. Consultate anche L. =item $PROCESS_ID =item $PID =item $$ L'identificativo numerico del processo Perl che sta eseguendo lo script. Questa variabile va considerata in sola lettura, sebbene risulti alterata dalle chiamate a C. (Memo: come per le shell). Nota per gli utenti Linux: in Linux, le funzioni C C e C restituiscono valori differenti da thread differenti. PerchE sia portabile, questo comportamento non E replicato per C<$$>, il cui valore rimane consistente attraverso i thread. Se volete chiamare la C sottostante, potete utilizzare il modulo CPAN C. =item $REAL_USER_ID =item $UID =item $< L'UID reale di questo processo. (Memo: E l'UID I cui provenite se state utilizzando setuid). Potete cambiare sia l'UID reale che l'UID effettivo in un colpo solo utilizzando C. PoichE le modifiche a C<< $< >> richiedono una chiamata di sistema, controllate C<$!> dopo un tentativo di cambiamento per individuare possibili errori. =item $EFFECTIVE_USER_ID =item $EUID =item $> L'UID effettivo di questo processo. Ad esempio: $< = $>; # Imposta l'UID reale uguale a quello effettivo ($<,$>) = ($>,$<); # scambia UID reale ed effettivo Potete cambiare sia l'UID effettivo che quello reale allo stesso tempo utilizzando C. I cambiamenti a C<< $> >> richiedono un controllo su C<$!> per individuare qualsiasi possibile errore conseguente da un tentativo di cambiamento. (Memo: E l'UID I il quale siete andati, se state girando setuid). C<< $< >> e C<< $> >> possono essere scambiati solo su macchine che supportano C. =item $REAL_GROUP_ID =item $GID =item $( Il GID reale di questo processo. Se vi trovate su una macchina che supporta l'appartenenza a piE gruppi contemporaneamente, restituisce una lista dei gruppi a cui appartenete, con gli elementi separati da spazi. Il primo numero E quello restituito da C, mentre i seguenti sono quelli dati da C, uno dei quali potrebbe essere uguale al primo valore. In ogni caso, il valore assegnato a C<$(> deve essere un unico numero utilizzato per impostare il GID reale. Per questo motivo il valore dato da C<$(> I deve essere mai utilizzato per una successiva assegnazione a C<$(> stesso senza che sia stato forzato ad essere un numero, ad esempio mediante una somma con zero. Potete modificare sia il valore di GID reale che quello effettivo in sol colpo utilizzando C. I cambiamenti a C<$(> richiedono un controllo di C<$!> per individuare qualsiasi possibile errore derivante dal tentativo di cambiamento. (Memo: le parentesi sono utilizzate per I. Il GID reale E quello che avete I se state girando setgid ["lasciato" in inglese E "left", che vuol dire anche "sinistra", come la parentesi utilizzata per questa variabile, N.d.T.] =item $EFFECTIVE_GROUP_ID =item $EGID =item $) Il GID effettivo di questo processo. Se vi trovate su una macchina che supporta l'appartenenza a piE gruppi contemporaneamente, restituisce una lista dei gruppi a cui appartenete, con gli elementi separati da spazi. Il primo numero E quello restituito da C, mentre i seguenti sono quelli dati da C, uno dei quali potrebbe essere uguale al primo valore. In maniera analoga, un valore assegnato a C<$)> deve essere anch'esso una lista di valori numerici separati da spazi. Il primo valore va ad impostare il valore del GID effettivo, ed i rimanenti (se presenti) sono passati a C. Per ottenere una lista vuota per C vi basterE ripetere il GID effettivo nuovo; ossia, per forzare un GID effettivo pari a 5 e svuotare la lista di C in maniera efficace, chiamate C< $) = "5 5" >. Potete cambiare il GID effettivo e quello reale in sol colpo utilizzando la funzione C (utilizzate solo un unico argomento numerico). I cambiamenti a C<$)> richiedono un controllo su C<$!> per individuare qualsiasi possibile errore dopo un tentativo di cambiamento. (Memo: le parentesi sono utilizzate per I. Il GID effettivo E quello I per voi, se state girando setgid ["giusto" in inglese E "right", che vuol dire anche "destra", come la parentesi utilizzata per questa variabile, N.d.T.]). C<< $< >>, C<< $> >>, C<$(> e C<$)> possono essere impostate solo su macchine che supportano le corrispondenti routine I. C<$(> e C<$)> possono essere scambiate solo su macchine che supportano C. =item $PROGRAM_NAME =item $0 Contiene il nome del programma in esecuzione. Su alcuni (attenzione: non tutti) sistemi operativi l'assegnazione a C<$0> modifica l'area argomenti vista dal programma C. Su alcune piattaforme potreste dover utilizzare opzioni speciali di C o un programma C differente per poter osservare il cambiamento. La modifica di C<$0> E piE utile come mezzo per indicare lo stato corrente del programma che per nascondere il programma stesso. (Memo: uguale a B e B). Osservate che ci sono limitazione specifiche per ciascuna piattaforma per la lunghezza massima di C<$0>. Nel caso piE estremo potrebbe essere limitata allo spazio occupato dal valore originario di C<$0>. In alcune piattaforme potrebbero esserci I variabili [aggiunte di caratteri riempitivi all'inizio o alla fine, N.d.T.], ad esempio spazi, dopo il nome modificato cosE come mostrato da C. In alcune piattaforme queste aggiunte potrebbero estendersi per la lunghezza originale dell'area argomenti, indipendentemente da quel che potete fare (ad esempio questo E il caso di Linux 2.2). Nota per gli utenti BSD: impostare C<$0> non rimuove completamente la stringa "perl" dall'uscita di C. Ad esempio, impostando C<$0> a C<"pippopluto"> potrebbe risultare in C<"perl: pippopluto (perl)"> (la presenza di entrambe le stringhe C<"perl: "> e C<" (perl)"> dipendono dalla variante e dalla versione esatte di BSD che state utilizzando). Questa E una caratteristica del sistema operativo, Perl non puE farci niente. In script I, Perl coordina i thread in modo che ciascuno di essi possa modificare la propria copia di C<$0> ed il cambiamento diventa visibile in C (assumendo che il sistema operativo collabori). Notate che quel che gli altri thread vedono di C<$0> non cambia, perchE ciascuno di essi ha la propria copia di questa variabile. =item $[ L'indice del primo elemento in un array, ed il primo carattere in una sottostringa. Per default vale 0, ma potreste teoricamente impostarlo ad 1 per far sE che Perl si comporti similmente a B (o Fortran) quando indicizzate un array e quando utilizzate le funzioni C e C. (Memo: [ inizia l'indicizzazione di un array). A partire dalla release 5 di Perl, l'assegnazione alla variabile C<$[> viene trattata come una direttiva di compilazione, e non puE influenzare il comportamento in un qualsiasi altro file. (Per questo motivo potete solamente assegnarle costanti disponibili al tempo di compilazione). Il suo utilizzo E caldamente scoraggiato. Osservate che, diversamente da altre direttive di compilazione (come L), l'assegnazione a C<$[> puE essere vista al di fuori dello scope lessicale all'interno dello stesso file. In ogni caso potete utilizzare C per restringere il suo nuovo valore ad un blocco lessicale. =item $] Il valore di versione e livello di patch / 1000 dell'interprete Perl. Questa variabile puE essere utilizzata per determinare se l'interprete Perl che sta eseguendo uno script E compreso in un intervallo di versioni ammissibili. (Memo: questa versione di perl si trova nell'intervallo giusto? [la parentesi quadra chiusa indica la chiusura di un intervallo, N.d.T.]). Esempio: warn "Niente checksum!\n" if $] < 3.019; Consultate anche la documentazione di C e C per un modo conveniente di fallire se l'interprete Perl E troppo antiquato. Quando effettuate i test sulla variabile, per evitare le inaccuratezze derivanti dalla rappresentazione dei reali in virgola mobile E meglio che preferiate dei controlli di diseguaglianza C<< < >> e C<< > >> rispetto ai test che contengono uguaglianze: C<< <= >>, C<< == >> e C<< >= >>. La rappresentazione in virgola mobile puE a volte portare a confronti numerici inaccurati. Controllate C<$^V> per una rappresentazione piE moderna della versione Perl, che consente di effettuare comparazioni di stringa accurate. =item $COMPILING =item $^C Il valore correntemente associato al flag associato all'opzione a linea di comando C<-c>. Principalmente utilizzata con B<-MO=...> per consentire al codice di alterare il proprio comportamento in fase di compilazione, come ad esempio per C [autocaricare, N.d.T.] in fase di compilazione piuttosto che effettuare in normali caricamenti differiti a tempo di esecuzione. Consultate L. Impostare C<$^C = 1> E simile a chiamare C. =item $DEBUGGING =item $^D Il valore corrente dei flag di debugging. (Memo: il valore dell'opzione B<-D>). PuE essere letto ed impostato. Come il suo equivalente a linea di comando, potete utilizzare valori numerici o simbolici, ad esempio C<$^D = 10> oppure C<$^D = "st">. =item $SYSTEM_FD_MAX =item $^F Il massimo descrittore di file di sistema, usualmente pari a 2. I descrittori di file di sistema sono passati ai processi eseguiti con C, mentre i descrittori di file piE alti non lo sono. In piE, durante una C, i descrittori di file di sistema sono preservati anche se C fallisce. (I descrittori di file ordinari sono chiusi prima di un tentativo di C). Lo status di close-on-exec [chiudi quando esegui, N.d.T.] verrE deciso in base al valore di C<$^F> quando il file, la pipe o il socket corrispondenti sono stati aperti, non quello trovato al momento della C. =item $^H ATTENZIONE: questa variabile E strettamente ad uso interno. La sua disponibilitE, comportamento e contenuto sono soggetti a variazioni senza preavviso. Questa variabile contiene suggerimenti per l'interprete Perl utilizzati in fase di compilazione. Alla fine della compilazione di un BLOCCO il valore di questa variabile viene ripristinato a quello di quando l'interprete ha iniziato a compilare il BLOCCO stesso. Quando perl inizia ad interpretare ["parse" nell'originale inglese, N.d.T.] un qualsiasi costrutto di blocco che dE luogo ad uno scope lessicale (ad esempio il corpo di una C, un file incluso con C, il corpo di una C, il corpo di un ciclo, o un blocco condizionale), il valore corrente di C<$^H> viene salvato, ma il suo valore E lasciato immodificato. Quando la compilazione del blocco ha avuto termine, viene ripristinato il valore salvato. Fra questi due punti, il codice che viene eseguito all'interno dei blocchi BEGIN E libero di cambiare il valore di C<$^H>. Questo comportamento E alla base dello scoping lessicale, ed E utilizzato, ad esempio, nella direttiva C. Il contenuto dovrebbe consistere di un intero: i diversi bit sono utilizzati per differenti flag di direttiva. Ecco un esempio: sub aggiungi_100 { $^H |= 0x100 } sub pippo { BEGIN { aggiungi_100() } pluto->topolino($paperino); } Considerate quel che accade durante l'esecuzione del blocco BEGIN. A questo punto il blocco BEGIN E giE stato compilato, ma il corpo di C E ancora in fase di compilazione. Il nuovo valore di C<$^H> sarE pertanto visibile solo durante la compilazione di C. La sostituzione del blocco BEGIN con questo: BEGIN { require strict; strict->import('vars') } dimostra come C E implementato. Ecco una versione condizionale della stessa direttiva lessicale: BEGIN { require strict; strict->import('vars') if $condizione } =item %^H ATTENZIONE: questa variabile E strettamente ad uso interno. La sua disponibilitE, comportamento e contenuto sono soggetti a variazioni senza preavviso. La hash C<%^H> fornisce lo stesso raggio semantico di C<$^H>. CiE la rende utile per implementare direttive lessicalmente ristrette. =item $INPLACE_EDIT =item $^I Il valore corrente dell'estensione di modifica diretta di un file. Utilizzate C per disabilitare questa caratteristica. (Memo: il valore dell'opzione C<-i>). ["inplace-edit" E la caratteristica di Perl di poter agire direttamente su un file che normalmente utilizzerebbe in sola lettura, ad esempio per operare modifiche sul file stesso, N.d.T.]. =item $^M Per default, l'errore di "memoria terminata" non puE essere impedito e risulta fatale. In ogni caso, se compilato in maniera adeguata, Perl puE utilizzare il contenuto di C<$^M> come riserva di memoria di emergenza dopo C. Supponete che il vostro Perl sia stato compilato con C<-DPERL_EMERGENCY_SBRK> e che utilizzi la C di Perl. Allora $^M = 'a' x (1 << 16); allocherebbe un buffer di 64K da utilizzare nelle emergenze. Consultate il file F nella distribuzione di Perl per informazioni su come aggiungere flag di compilazione personalizzati quando compilate perl. Per scoraggiare l'utilizzo casuale di questa caratteristica avanzata, per questa variabile non esiste un nome lungo corrispondente nel modulo L. =item $OSNAME =item $^O Il nome del sistema operativo nel quale E stata compilata questa copia dell'interprete Perl, cosE come determinato durante il processo di configurazione. Il valore E identico a C<$Config{'osname'}>. Consultate anche L e l'opzione a linea di comando B<-V> documentata in L. Nelle piattaforme Windows, C<$^O> non E molto d'aiuto: essa vale infatti sempre C, e non vi dice la differenza fra 95/98/ME/NT/2000/XP/CE/.NET. Utilizzate C o C (consultate L e L) per distinguere fra le differenti varianti. =item ${^OPEN} Variabile interna utilizzata da PerlIO. Consiste di una stringa formata da due parti, separate da un byte C<\0>. La prima parte descrive i I [strati, N.d.T.] di ingresso, la seconda quelli di uscita. =item $PERLDB =item $^P Variabile interna per il supporto al debugging. Il significato dei vari bit E soggetto a cambiamento, ma al momento indica: =over 6 =item 0x01 Debug di ingresso/uscita da subroutine. =item 0x02 Debug riga-per-riga. =item 0x04 Disabilita le ottimizzazioni. =item 0x08 Conserva piE dati per future ispezioni interattive. =item 0x10 Mantieni informazioni sulle linee nel programma sorgente dove una subroutine E definita. =item 0x20 Inizia con la modalitE singolo-passo. =item 0x40 Utilizza l'indirizzo della subroutine invece del nome quando si stampa. =item 0x80 Fai rapporto anche di C. =item 0x100 Fornisci nomi di "file" informativi per C, basati sul posto dove sono state compilate. =item 0x200 Fornisci nomi informativi alle subroutine anonime, basati sul posto dove sono state compilate. =item 0x400 Debug di ingresso/uscita delle subroutine di asserzione. =back Alcuni bit possono essere rilevanti solo in fase di compilazione, alcuni solo in fase di esecuzione. Si tratta di un meccanismo nuovo ed i dettagli potrebbero cambiare. =item $LAST_REGEXP_CODE_RESULT =item $^R Il risultato della valutazione dell'ultima asserzione C<(?{ codice })> in un'espressione regolare eseguita con successo (consultate L). Potete assegnarle un valore. =item $EXCEPTIONS_BEING_CAUGHT =item $^S Stato corrente dell'interprete. $^S State --------- ------------------- undef In fase di interpretazione di un modulo o di una eval vero (1) In fase di valutazione di una eval falso (0) Altrimenti Il primo stato puE essere riscontrato in I $SIG{__DIE__} e $SIG{__WARN__}. =item $BASETIME =item $^T Il tempo al quale E iniziata l'esecuzione del programma, espresso in secondi a partire dalla I (inizio del 1970). I valori restituiti dai test su file B<-M>, B<-A> e B<-C> sono basati su questo valore. =item ${^TAINT} Riflette se la modalitE I E attiva o meno. Il valore 1 indica che E attiva (il programma E stato lanciato con B<-T>), 0 indica che non E attiva, -1 quando sono abilitati solo gli avvertimenti di I (ossia con le opzioni B<-t> o B<-TU>). =item ${^UNICODE} Riflette lo stato di determinate impostazioni di Unicode di Perl. Consultate la documentazione L riguardo l'opzione C<-C> per maggiori informazioni sui possibili valori. Questa variabili viene impostata all'avvio di Perl ed E pertanto in sola lettura. =item ${^UTF8LOCALE} Questa variabile indica se perl ha individuato un I UTF-8 all'avviamento. Tale informazione viene usata da perl quando E in modalitE I (come quando si lancia con l'opzione a linea di comando C<-CL>); consultate L per maggiori informazioni. =item $PERL_VERSION =item $^V Revisione, versione e sottoversione dell'interprete Perl, rappresentate come stringa composta da caratteri con questi ordinali. Ad esempio, Perl v5.6.0 corrisponde a C e restituirE un valore vero per il test C<$^V eq v5.6.0>. Notare che i caratteri in questa stringa possono ricadere, potenzialmente, nell'intervallo Unicode. Questa variabile puE essere utilizzata per determinare se l'interprete Perl che sta eseguendo il nostro script ricade nell'intervallo corretto di versioni ammissibili. (Memo: usa ^V per il Controllo Versione). Esempio: warn "Niente dichiarazioni \"our\"!\n" if $^V and $^V lt v5.6.0; Per convertire C<$^V> nella sua rappresentazione in forma di stringa utilizzate la conversione C<"%vd"> di C: printf "la versione e` v%vd\n", $^V; # versione di Perl Consultate la documentazione di C e C per un modo conveniente di fallire nel caso che l'interprete Perl che sta eseguendo il vostro script sia troppo datato. Consultate anche C<$]> per una rappresentazione piE obsoleta della versione dell'interprete Perl. =item $WARNING =item $^W Il valore corrente dell'impostazione di stampa degli avvertimenti, inizialmente vera se E stato utilizzato B<-w>, falsa altrimenti ma modificabile direttamente. (Memo: correlata all'opzione B<-w>). Consultate anche L. =item ${^WARNING_BITS} L'insieme attuale di controlli di avvertimento abilitati dalla direttiva C. Consultate la documentazione per L per maggiori dettagli. =item $EXECUTABLE_NAME =item $^X Il nome utilizzato per eseguire la copia corrente di Perl, presa da C del C o (laddove supportato) da F. Dipendentemente dal sistema operativo ospite, il valore di C<$^X> puE essere il percorso relativo o assoluto del file del programma perl, o puE essere la stringa utilizzata per chiamare per ma non il percorso del file del programma. In piE, la maggior parte dei sistemi operativi consente di eseguire programmi che non sono nella variabile d'ambiente C, per cui non c'E garanzia che il valore di C<$^X> sia in C. Per il VMS, il valore puE includere un numero di versione come puE non includerlo. Di solito potete utilizzare il valore di C<$^X> per richiamare una copia indipendente dello stesso perl che sta girando al momento, ad esempio @prima_girata = `$^X -le "print int rand 100 for 1..100"`; Ricordate perE che non tutti i sistemi operativi supportano C o la cattura dell'uscita dei comandi, per cui questa istruzione complessa potrebbe non essere portabile. Non E sicuro utilizzare il valore di C<$^X> come percorso di un file, perchE alcuni sistemi operativi che hanno un suffisso obbligatorio per i file eseguibili non richiedono l'uso di questo suffisso quando si lancia un comando. Per convertire il valore di C<$^X> in un percorso utilizzate le seguenti istruzioni: # Costruisci un insieme di nomi di file (non di nomi di comandi). use Config; $questo_perl = $^X; if ($^O ne 'VMS') {$questo_perl .= $Config{_exe} unless $questo_perl =~ m/$Config{_exe}$/i;} PoichE molti sistemi operativi consentono a chiunque con permessi di lettura al programma Perl di farne una copia, modificarla e poi eseguirla, il programmatore Perl che ha attenzione per la sicurezza dovrebbe procedere con cautela per chiamare la copia installata di perl, non quella riferita da C<$^X>. Le istruzioni che seguono raggiungono questo scopo, e producono un percorso che puE essere chiamato come comando o riferito come file. use Config; $percorso_a_perl_sicuro = $Config{perlpath}; if ($^O ne 'VMS') {$percorso_a_perl_sicuro .= $Config{_exe} unless $percorso_a_perl_sicuro =~ m/$Config{_exe}$/i;} =item ARGV Il I speciale che itera sui nomi di file della linea di comando contenuti in C<@ARGV>. Usualmente scritto come I vuoto nell'operatore diamante C<< <> >>. Notate che C corrente ha il suo valore magico solamente all'interno dell'operatore C<< <> >>; altrove E solo un I come altri, corrispondente all'ultimo file aperto con C<< <> >>. In particolare, passando C<\*ARGV> come parametro ad una funzione che si aspetta di ricevere un I puE far sE che la vostra funzione non legga automaticamente il contenuto di tutti i file in C<@ARGV>. =item $ARGV contiene il nome del file attualmente letto con C<< <> >>. =item @ARGV L'array C<@ARGV> contiene gli argomenti a linea di comando diretti allo script [ossia intesi per essere passati allo script piuttosto che all'interprete Perl, N.d.T.]. C<$#ARGV> E, generalmente, il numero di argomenti meno uno, perchE C<$ARGV[0]> E il primo argomento, I il nome stesso del programma. Consultate C<$0> per il nome del comando. =item ARGVOUT Il I speciale che punta al file di uscita attualmente aperto quando si sta effettuando il processamento di modifica in linea con B<-i>. Utile quando dovete effettuare molti inserimenti e non volete continuare a modificare C<$_>. Consultate L ove si descrive l'opzione B<-i>. =item @F L'array C<@F> contiene i campi di ciascuna riga letta quando la modalitE di autodivisione E attiva. Consultate L per dettagli sull'opzione B<-a>. Questo array E specifico per pacchetto, e deve essere dichiarato o utilizzato con il nome di pacchetto completo se non vi trovate nel pacchetto C
e state lavorando sotto C. =item @INC L'array C<@INC> contiene la lista dei posti dove i costrutti C, C o C vanno a guardare quando cercano i file di libreria. Inizialmente consiste degli argomenti di tutte le opzioni B<-I> a linea di comando, seguite dalla libreria di default di Perl, probabilmente F, seguite da ".", per rappresentare la directory corrente. ("." non verrE aggiunta se sono attivi i controlli di I, sia da B<-T> che da B<-t>). Se avete bisogno di modificare questa variabile durante l'esecuzione, dovreste utilizzare la direttiva C per far sE da caricare le librerie dipendenti dalla macchina in maniera appropriata: use lib '/miopercorso/libdir/'; use QualcheMod; Potete anche inserire degli "agganci" nel sistema di inclusione dei file inserendo codice Perl direttamente in C<@INC>. Questi "agganci" possono essere riferimenti a subroutine, riferimenti ad array o oggetti su cui E stata chiamata C. Consultate L per i dettagli. =item @_ In una subroutine, l'array C<@_> contiene i parametri passati alla subroutine stessa. Consultate L. =item %INC La hash C<%INC> contiene elementi per ciascun nome di file incluso attraverso gli operatori C, C o C. La chiave E il nome del file che avete specificato (con i nomi dei moduli convertiti a percorsi di file), ed il valore E la posizione del file trovato. L'operatore C utilizza questa hash per determinare se un file particolare E stato giE incluso. Se il file E stato caricato attraverso un "aggancio" (ad esempio un riferimento a subroutine, consultate L per una descrizione di questi "agganci"), l'"aggancio" stesso E inserito per default all'interno di C<%INC> al posto di un nome di file. Osservate, comunque, che l'"aggancio" puE aver impostato l'elemento in C<%INC> di per se per fornire informazioni piE specifiche. =item %ENV =item $ENV{espressione} La hash C<%ENV> contiene il vostro ambiente corrente. Impostare un valore in C<%ENV> cambia l'ambiente per tutti i processi figli che genererete da qui in avanti con C. =item %SIG =item $SIG{expr} La hash C<%SIG> contiene gli I [funzioni di gestione, N.d.T.] per i segnali. Ad esempio: sub handler { # Il primo parametro e` il nome del segnale my($seg) = @_; print "Ricevuto SIG$seg--chiudo tutto\n"; close(LOG); exit(0); } $SIG{'INT'} = \&handler; $SIG{'QUIT'} = \&handler; ... $SIG{'INT'} = 'DEFAULT'; # ripristina l'azione di default $SIG{'QUIT'} = 'IGNORE'; # ignora SIGQUIT Utilizzare un valore di C<'IGNORE'> usualmente ha l'effetto di ignorare il segnale, eccetto che per il segnale C. Consultate L per maggiori dettagli su questo caso particolare. Ecco alcuni esempi aggiuntivi: $SIG{"PIPE"} = "Idraulico"; # assume main::Idraulico (sconsigliato) $SIG{"PIPE"} = \&Idraulico; # tutto bene, assume l'Idraulico corrente $SIG{"PIPE"} = *Idraulico; # un po' esoterico $SIG{"PIPE"} = Idraulico(); # oops, cosa restituisce Idraulico()? Assicuratevi di non utilizzare una parola nuda e cruda come nome di un gestore di segnale, a meno che non vogliate chiamarla inavvertitamente. Se il vostro sistema supporta la funzione C, allora l'I di segnale viene installato utilizzandola. Questo significa avere una gestione dei segnali piE robusta. La politica di consegna dei segnali di default E cambiata in Perl 5.8.0 da immediata (anche nota come "insicura") a differita, anche nota come "segnali sicuri". Consultate L per maggiori ragguagli. Alcuni "agganci" interni possono essere impostati anche utilizzando la hash C<%SIG>. La routine indicata da C<$SIG{__WARN__}> viene chiamata quando si sta per stampare un messaggio di avvertimento. Il messaggio viene passato come primo parametro. La presenza di "agganci" C<__WARN__> implica la soppressione dell'ordinaria stampa su C. Potete utilizzare questa tecnica per salvare i messaggi di avvertimento in una variabile, o per trasformare questi messaggi in errori fatali, come ad esempio: local $SIG{__WARN__} = sub { die $_[0] }; eval $programmino; La routine indicata da C<$SIG{__DIE__}> E chiamata quando si sta per lanciare un'eccezione fatale. Il messaggio di errore viene passato come primo parametro. Quando si esce da una routine "agganciata" C<__DIE__>, il processamento dell'eccezione prosegue come se l'"aggancio" non ci fosse stato, a meno che la routine stessa non esca con un C, un'uscita da ciclo o un C. L'I C<__DIE__> E esplicitamente disabilitato durante la chiamata, in modo che possiate chiamare C all'interno dell'I. Le cose procedono in maniera simile per C<__WARN__>. A causa di una stortura di implementazione, l'"aggancio" C<$SIG{__DIE__}> viene chiamato anche quando ci si trova in una C. Non vi basate su questo fatto per riscrivere un'eccezione pendente in C<$@>, o come bizzarro sostituto per scavalcare C. Questa strana azione a distanza potrebbe essere sanata in una versione futura, di modo che C<$SIG{__DIE__}> venga chiamata solamente quando il programma sta per uscire, com'era nelle intenzioni originali. Qualsiasi altro utilizzo E deprecato. Gli I C<__DIE__>/C<__WARN__> sono particolarmente speciali in un determinato senso: essi possono essere chiamati per riportare (probabili) errori trovati dal I [la parte dell'interprete che si occupa di effettuare l'analisi del codice, N.d.T.]. In tal caso il I potrebbe trovarsi in uno stato inconsistente, per cui qualsiasi tentativo di valutare codice Perl da un I del genere risulterebbe probabilmente in un errore di segmentazione. CiE significa che gli avvertimenti o gli errori che risultano dal I devono essere utilizzati con estrema cautela, come questo: require Carp if defined $^S; Carp::confess("Qualcosa di sbagliato") if defined &Carp::confess; die "Qualcosa di sbagliato, ma non ho potuto caricare Carp per avere un backtrace... Per vederlo, provate a far partire Perl con -MCarp"; Qui la prima riga carica C I non sia il I a chiamare l'I. La seconda riga stamperE il I [la lista delle funzioni chiamate fino a questo punto, N.d.T.] e morirE se C E disponibile. La terza riga sarE eseguita solamente se C non E disponibile. Consultate L, L, L e L per ulteriori informazioni. =back =head2 Indicatori di Errore Le variabili C<$@>, C<$!>, C<$^E> e C<$?> contengono informazioni sui differenti tipi di condizioni di errore che possono avvenire durante l'esecuzione di un programma Perl. Le variabili sono mostrate in ordine di "distanza" fra il sottosistema che ha generato l'errore ed il processo Perl. Corrispondono rispettivamente ad errori individuati dall'interprete Perl, dalla libreria C, dal sistema operativo o da un programma esterno. Per illustrare la differenza fra queste variabili, considerate la seguente espressione in Perl, che utilizza stringhe con virgolette semplici: eval q{ open my $pipe, "/cdrom/install |" or die $!; my @ris = <$pipe>; close $pipe or die "pipe guasta: $?, $!"; }; Dopo l'esecuzione di questa istruzione tutte e 4 le variabili potrebbero essere state impostate. C<$@> E impostata se la stringa passata ad C non E stata compilata correttamente (come accadrebbe ad esempio se C o C fossero importati con prototipi errati), o se il codice Perl eseguito durante la C avesse generato un C. In questi casi il valore di C<$@> E l'errore di compilazione, o l'argomento fornito a C (che interpolerE C<$!> e C<$?>). (Consultate perE anche L). Quando l'espressione C viene eseguita, C, C<< >> e C sono tradotte in chiamate alla libreria di I [fase di esecuzione, N.d.T.] e da qui in chiamate al kernel del sistema operativo. C<$!> viene impostata con il valore della variabile C della libreria C se una di queste chiamate fallisce. Sotto alcuni sistemi operativi, C<$^E> potrebbe contenere una descrizione dell'errore un po' piE estesa, come ad esempio (in questo caso) "Il cassetto del CDROM non E chiuso". I sistemi che non supportano messaggi di errore estesi lasciano C<$^E> uguale a C<$!>. Infine, C<$?> potrebbe essere impostata ad un valore diverso da 0 se il programma esterno F fallisce. Gli otto bit superiori riflettono le condizioni di errore specifiche incontrate dal programma (ossia, il valore della C del programma stesso). Gli otto bit inferiori riflettono la modalitE di fallimento, come una morte a seguito di un segnale e la presenza di informazioni di I. Consultate L per i dettagli. Diversamente da C<$!> e C<$^E>, che sono impostate solo se la condizione di errore E individuata, la variabile C<$?> E impostata per qualunque chiamata a C o C su pipe, sovrascrivendo il vecchio valore. In questo senso E piE simile a C<$@>, che per ciascuna C viene sempre impostata in caso di fallimento e ripulita in caso di successo. Per maggiori dettagli, consultate le descrizioni individuali date sopra per C<$@>, C<$!>, C<$^E> e C<$?>. =head2 Nota Tecnica sulla Sintassi dei Nomi di Variabile I nomi di variabile in Perl possono avere numerosi formati. Di solito, devono iniziare con una lettera o con un I [il carattere "_", N.d.T.] nel qual caso possono essere arbitrariamente lunghe (fino ad un limite interno di 251 caratteri) e possono contenere lettere, cifre numeriche, I, la sequenza speciale C<::> o C<'>. In questo caso, la parte prima dell'ultimo C<::> o C<'> E considerata essere un I; consultate L. I nomi delle variabili Perl possono anche essere una sequenza di cifre numeriche o un singolo carattere di punteggiatura o di controllo. Questi nomi sono riservati per usi speciali da parte di Perl; ad esempio, i nomi costituiti da sole cifre numeriche sono utilizzati per contenere i dati catturati dopo l'applicazione di un'espressione regolare. Perl supporta una sintassi speciale per i nomi costituiti da un singolo carattere di controllo: capisce C<^X> (il carattere "^" seguito dalla lettera C) per intendere il carattere control-C. Ad esempio, la notazione C<$^W> (segno di dollaro, seguito da "^", seguito da C) E la variabile scalare il cui nome E costituito dal singolo carattere control-C. Capite bene che E meglio che dover digitare un control-C letterale nel vostro programma. Infine, come novitE in Perl 5.6, i nomi delle variabili Perl possono essere stringhe alfanumeriche che iniziano con caratteri di controllo (o ancora meglio con un carattere "^"). Queste variabili devono essere scritte nella forma C<${^Pippo}>; le graffe non sono opzionali. C<${^Pippo}> rappresenta la variabile scalare il cui nome E un control-C

seguito dalla stringa "ippo". Queste variabili sono riservate per uso speciale futuro da Perl, eccetto quelle che iniziano con C<^_> (control-underscore o "^" seguito da underscore). Nessun nome di variabile con carattere di controllo che inizi con un underscore avrE mai un significato speciale in qualsivoglia futura versione di Perl; tali nomi possono pertanto essere utilizzati senza problemi nei programmi. C<$^_> stessa, comunque, E riservata. Gli identificatori Perl che iniziano con cifre numeriche, caratteri di controllo o caratteri di interpunzione sono esenti dagli effetti della dichiarazione C e sono sempre forzati ad esistere nel pacchetto C

; sono anche esenti da errori associati all'uso della direttiva C. Alcuni altri nomi sono esenti in maniera analoga: ENV STDIN INC STDOUT ARGV STDERR ARGVOUT _ SIG In particolare, le nuove variabili speciali del tipo C<${^_XYZ}> sono sempre considerate come appartenenti al pacchetto C
, indipendentemente da qualsiasi dichiarazione C si possa trovare nello scope corrente. =head1 BUG Causa uno sfortunato accidente dell'implementazione di Perl, C impone una penalitE considerevole su tutte le espressioni regolari in un programma, senza riguardo al fatto che esse occorrano o meno nello scope di C. Per questa ragione, utilizzare C nelle librerie E fortemente scoraggiato. Consultate la documentazione del modulo C su CPAN ( http://www.cpan.org/modules/by-module/Devel/ ) per maggiori informazioni. Il fatto che anche solo pensiate alla variabile C<$^S> nei vostri I di eccezione E semplicemente sbagliato. C<$SIG{__DIE__}>, come implementato al momento, attira errori dolorosi e difficili da scovare. Evitatelo ed utilizzate un blocco C o piuttosto ridefinite C. =head1 TRADUZIONE =head2 Versione La versione su cui si basa questa traduzione E ottenibile con: perl -MPOD2::IT -e print_pod perlvar Per maggiori informazioni sul progetto di traduzione in italiano si veda L . =head2 Traduttore Traduzione a cura di Flavio Poletti (re-iniziata da capo dopo una prima versione parziale a cura di Alberto Re). =head2 Revisore Revisione a cura di shishii (Marco Allegretti). =cut