POD2-IT
view release on metacpan or search on metacpan
IT/perlsub.pod view on Meta::CPAN
piE<ugrave> semplice da utilizzare. Vedete piE<ugrave> avanti.
A volte non volete passare il valore di un array ad una subroutine ma,
piuttosto, il suo nome, di modo che la subroutine possa modificare l'istanza
globale dell'array stesso invece che lavorare su una copia locale. In Perl
potete riferirvi a tutti gli oggetti che hanno un determinato nome
anteponendo un asterisco: C<*pippo>. Questo meccanismo E<egrave> noto come
un I<typeglob>, perchE<eacute> l'asterisco puE<ograve> essere pensato come se
fosse un match I<wildcard> [carattere jolly, N.d.T.] per tutti quegli strambi
caratteri di prefisso per le variabili, le subroutine e cosE<igrave> via.
Quando valutato, il typeglob produce un valore scalare che rappresenta
tutti gli oggetti che hanno il dato nome, inclusi I<filehandle_>, formati
e subroutine. Quando gli si assegna qualcosa, si fa in modo che il nome
utilizzato si riferisca a qualunque C<*> valore gli sia assegnato. Ad
esempio:
sub raddoppia_array {
local(*unqualcheary) = @_;
foreach $elem (@unqualcheary) {
$elem *= 2;
}
}
raddoppia_array(*pippo);
raddoppia_array(*pluto);
Gli scalari sono sempre passati per riferimento, ossia potete modificare
gli argomenti scalari senza utilizzare questo meccanismo semplicemente
utilizzando C<$_[0]> ecc. Potete modificare tutti gli elementi di un
array passandoli come scalari, ma dovete utilizzare il meccanismo C<*>
(o l'equivalente con i riferimenti) per utilizzare C<push>, C<pop> o
cambiare la dimensione dell'array. SarE<agrave> sicuramente piE<ugrave> rapido
passare il I<typeglob> (o un riferimento).
Anche se non volete modificare un array, questo meccanismo E<egrave> utile per
passare piE<ugrave> array in un'unica LISTA, perchE<eacute> normalmente il
meccanismo della LISTA fonderE<agrave> tutti i valori dei vari array senza
permettervi di distinguerli. Per saperne di piE<ugrave> sui I<typeglob>:
L<perldata/"Typeglob e Filehandle">.
=head2 Quando local() ha Ancora Senso
X<local> X<variabile, locale> X<variabile, local>
Nonostante esista C<my>, ci sono ancora tre situazioni dove l'operatore
C<local> rifulge in tutto il suo splendore. Ancor meglio, in queste
tre situazioni I<dovete> utilizzare C<local> invece di C<my>.
=over 4
=item 1.
Dovete assegnare un valore temporaneo ad una variabile globale, specialmente
C<$_>.
Le variabili globali, come C<@ARGV> o le variabili punteggiatura, devono
essere C<local>izzate con C<local()>. Il blocco di codice che segue legge
il file F</etc/motd> e lo divide in parti separate da righe o segni di
uguaglianza, che sono poste in C<@Campi>.
{
local @ARGV = ("/etc/motd");
local $/ = undef;
local $_ = <>;
@Campi = split /^\s*=+\s*$/;
}
In particolare, E<egrave> importante C<local>izzare C<$_> in qualsiasi routine che
assegni qualcosa a tale variabile. Facendo bene attenzione agli assegnamenti
impliciti nei condizionali di C<while>.
=item 2.
Dovete creare un I<handle> locale per file o directory, o una funzione locale.
Una funzione che abbia bisogno di un file tutto suo deve utilizzare
C<local()> su un I<typeglob> completo. Quanto segue puE<ograve> essere utilizzato
per create un nuovo elemento nella tabella dei simboli:
sub coda_io {
local (*LETTORE, *SCRITTORE); # non my!
pipe (LETTORE, SCRITTORE) or die "pipe: $!";
return (*LETTORE, *SCRITTORE);
}
($testa, $coda) = coda_io();
Consultate il modulo C<Symbol> per un modo per creare elementi
anonimi nella tabella dei simboli.
PoichE<eacute> l'assegnazione di un riferimento ad un I<typeglob> crea un alias,
questa caratteristica si puE<ograve> utilizzare per creare quella che risulta,
di fatto, una funzione locale, o quantomeno un alias locale.
{
local *cresce = \&restringe; # solo finche' esiste questo blocco
cresce(); # in realta`, chiama restringe()
muove(); # se muove() cresce(), si restringe()
}
cresce(); # usa la cresce() reale
Consultate L<perlref/"Modelli di Funzione"> per maggiori ragguagli sulla
manipolazione di funzioni per nome, come in questo caso.
=item 3.
Volete modificare temporaneamente solo un elemento di un array o di
una hash.
Potete C<local>izzare anche un solo elemento di un aggregato. Di solito
viene fatto su variabili dinamiche:
{
local $SIG{INT} = 'IGNORE';
funct(); # non interrompibile
}
# interrompibilita` ripristinata automaticamente in questo punto
Ma funziona anche su aggregati dichiarati lessicalmente. Prima della
versione 5.005 questa operazione poteva portare a comportamenti anomali
in qualche occasione.
=back
( run in 2.746 seconds using v1.01-cache-2.11-cpan-364913b4093 )