Newsgroup: it.comp.lang.perl
Titolo: dubbio local-my

Nonstante mi sia letto il manuale del perl, non riesco a capire bene la
distinzione tra una variabile dichiarata con my ed una con local.
Qualcuno mi posterebbe, magari, un esempietto esplicativo?
Grazie mille e scusate (ma ci lavoro solo da un mesetto [studio compreso] ).
Ciao Paolo

 Qualcuno mi posterebbe, magari, un esempietto esplicativo?
Il seguente e` il riassunto dell'indice [1]:
In Perl esistono due spazi dei nomi distinti. In uno vanno a finire
i cosidetti lexical, nell'altro i global (o variabili package).
Il ciclo di vita di un lexical comincia nel punto in cui esso viene
dichiarato, e termina alla fine del blocco in cui tale dichiarazione
e` avvenuta. La variabile lexical e` visibile soltanto nel blocco
in cui essa e` stata dichiarata. La dichiarazione si effettua usando
my(). Ad esempio:
-------------------------------------------------------------
use strict;
use warnings;
my $a = 10;    # $a e` un lexical, e vale 10
{
   my $b = 20;  # $b e` un altro lexical, vale 20
   my $a = 30;  # $a e` un lexical, distinto rispetto al $a
                # esterno. Il valore di quest'ultimo e`
                # mascherato dalla nuova dichiarazione.
   print "$a $b\n"; # Stampa "30 20\n"
}
# Il lexical $b non esiste piu`
# $a non e` piu` mascherato da quello definito nel blocco
print $a;  # Stampa 10
print $b;  # Non esiste piu` un lexical $b, Perl assume che
            # tu faccia riferimento ad un global chiamato $b,
            # contenuto nel package main. Tale valore pero` e`
            # indefinito. Inoltre il pragma strict si offende,
            # perche` stai usando un nome di variabile senza
            # aver rispettato una delle seguenti regole:
            #    i. il nome e` quello di un lexical, dichiarato con my()
            #   ii. hai usato il pragma 'vars' per spiegare che
            #       avresti usato nel programma la variabile $b
            #       (i.e: use vars qw/$b/; )
            #  iii. il nome e` "fully qualified", nel senso
            #       specificato sopra.
            # In generale non e` buona norma "spegnere" strict
            # per eliminare questi messaggi d'errore.
-------------------------------------------------------------
Le variabili global, al contrario, esistono finche` il programma
non termina, e sono visibili ovunque (purche` venga specificato un
fully qualified name, vale a dire il nome della variabile completo
di nome del package). local() opera sulle variabili globali e solo
su esse. Esso salva il valore contenuto nella variabile globale,
rimpiazzandolo con un valore temporaneo. Il vecchio valore viene
ripristinato al termine del blocco in cui e` stato usato local().
Ad esempio:
-------------------------------------------------------------
use strict;
use warnings;
use vars qw/$a/; # Spiego a strict di non scaldarsi se usero`
                  # la variabile $a senza un nome completamente
                  # qualificato
$a = 10;         # la variabile _globale_ $a vale 10
{
   local( $a ) = 20; # Ora la variabile globale $a
                     # (sempre la stessa!) vale 20
   print $a;         # Stampa 20
}
print $a;        # Stampa 10
-------------------------------------------------------------
Forse ti stai chiedendo quando usare my() e quando local().
Nell'articolo citato nella nota [1], Dominus taglia corto:
                « Always use my; never use local. »
Che forse e` la cosa meno inaccurata che si puo` esprimere in
una riga. Per una risposta meno concisa:
 
http://perl.plover.com/local.html
ciao
Stefano
+++
[1] Per un riassunto meno stringato, leggi "Coping with Scoping"
     di M.J.Dominus: 
http://perl.plover.com/FAQs/Namespaces.html
     In tempi brevi dovrebbe essere disponibile una traduzione in
     italiano: non ho ancora finito di revisionarla, ma al momento
     opportuno segnalero` qui il link.