our TIPO ESPR : ATTRIBUTI
our associa un nome elementare con una variabile di package nel corrente
package per usarla all'itenro dello scope corrente. Quando è in
vigore use strict 'vars', our vi permette di dichiarare variabili globali
senza qualificarle con i nomi dei package, all'interno dello scope lessicale
della dichiarazione our. Così our differisce da "use vars",
il cui scope è a livello di package
A differenza di my, che alloca sia dello spazio per una variabile sia
associa un nome elementare con quello spazio per un suo uso all'interno dello
scope corrente, our associa un nome elementare con una variabile di package
nel package corrente, per un suo uso all'interno dello scope corrente. In altre
parole, our ha le stesse regole di scope di my, ma non crea necessariamente
una variabile.
Se è indicato più di un valore, la lista deve essere
inclusa tra parentesi.
our $pippo;
our($pluto, $paperino);
Un dichiarazione our dichiara una variabile globale che sarà
visibile su tutto il suo scope lessicale, persino attraverso i limiti
di un package. Il package in cui la variabile viene inserita è
determinato al momento della dichiarazione, non al momento dell'uso.
Ciò significa che è valido il seguente comportamento:
package Pippo;
our $pluto; # dichiara $Pippo::pluto per il resto dello scope lessicale
$pluto = 20;
package Pluto;
print $pluto; # stampa 20, visto che si riferisce a $Pippo::pluto
Sono permesse multiple dichiarazioni our con lo stesso nome all'interno dello stesso
scope lessicale, se si trovano all'interno di differenti package. Se si trovano nello
stesso package, Perl genererà degli avvertimenti solo se li avete richiesti,
proprio come delle multiple dichiarazioni di my. Diversamente da una seconda
dichiarazione my, che legherà il nome ad una nuova variabile, una seconda
dichiarazione our nello stesso package, nello stesso scope, è
solamente ridondante.
use warnings;
package Pippo;
our $pluto; # dichiara $Pippo::pluto per il resto dello scope lessicale
$pluto = 20;
package Pluto;
our $pluto = 30; # dichiara $Pluto::pluto per il resto dello scope lessicale
print $pluto; # stampa 30
our $pluto; # genera un warning ma non ha altri effetti
print $pluto; # stampa ancora 30
Una dichiarazione our può anche avere una lista di
attributi associata ad essa.
Le semantiche esatte e l'interfaccia di TIPO ed ATTRIBUTI sono ancora
in evoluzione. TIPO è al momento legato all'uso della direttiva
fields, a gli attributi sono gestiti utilizzando la direttiva
attributes o, a partire da Perl 5.8.0, anche tramite il modulo
Attribute::Handlers. Consultate perlsub/"Private Variables via my()"
["Variabili private tramite my()", NdT] per i dettagli e fields,
attributes e Attribute::Handlers.
Il solo attributo per our() attualmente riconosciuto è
unique, che indica che una singola copia del globale deve essere
utilizzata da tutti gli interpreti nel caso il programma stia girando
in un ambiente multi-interprete. (Il comportamento predefinito prevede
che ogni interprete abbia la sua copia del globale). Esempi:
our @EXPORT : unique = qw(pippo);
our %EXPORT_TAGS : unique = (pluto => [qw(aa bb cc)]);
our $VERSION : unique = "1.00";
Va notato che questo attributo ha anche l'effetto di far sì che
il globale diventi in sola lettura quando il primo nuovo interprete
viene clonato (per esempio, quando viene creato il primo nuovo thread).
Gli ambienti multi interprete possono esistere tramite l'emulazione di
fork() sotto Windows, o incapsulando perl in un'applicazione
multi-threaded. L'attributo unique non fa nulla in tutti gli altri
ambienti.
Attenzione: l'attuale implementazione di questo attributo opera sui typeglob
associati con la variabile; questo significa che our $x : unique ha anche l'effetto
di our @x : unique; our %x : unique. Questo potrebbe essere soggetto a cambiamenti.