2013-07-17 9 views

risposta

5

Sì, le dichiarazioni our possono avere funzionalità aggiuntive rispetto a quelle globali non dichiarate. Ma questi sono in gran parte irrilevanti.

our crea un alias lessicale per una variabile globale (con lo stesso nome). Cioè, in package Foo, our $bar e $Foo::bar fare riferimento alla stessa variabile. Tuttavia, il primo è disponibile solo in uno stretto ambito lessicale.

Come our ha un effetto lessicale, l'alias può anche ombra variabili lessicali con my:

our $foo = 42; # give some value 
my $foo = -1; # same name, different value 
say "my gives $foo"; 
our $foo;  # reintroduce the alias; shadow lexical 
say "our gives $foo"; 

Se rimuovi i our dichiarazioni ed esegue senza rigorosa, questo ovviamente non darà l'uscita

Proprio come my, our può richiedere una sintassi di dichiarazione un po 'extra, ad esempioattributi:

use threads::shared; 
our $foo :shared; 

è anche possibile specificare un tipo per l'utilizzo con la fields pragma:

our Foo $foo; 

Questo non può essere fatto per le variabili globali senza our.

+0

Davvero una buona risposta! – none

2

Come si può vedere dalla perldocs, our crea un alias a una variabile pacchetto con lo stesso nome della variabile our ed nel pacchetto corrente.

Se si sta scrivendo il codice che contiene più definizioni di pacchetto, è possibile utilizzare una variabile our per passare una variabile alias tra i moduli.

package Foo: 
our $bar = 42; # $bar is an alias for $Foo::bar 

package Baz; 
print $bar;  # prints '42', since $bar is $Foo::bar 

Quindi, un utilizzo che non ha nulla a che fare con le variabili globali.

+1

Tutte le variabili del pacchetto sono variabili globali. Ciò che questo uso dimostra è che c'è uno scopo di "nostro" oltre a soddisfare "rigoroso". – darch

+0

Secondo la seguente domanda (http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl) le nostre variabili sono dette variabili globali e di pacchetto. Non so chi creda. – none

+0

@none: non c'è conflitto qui. 'our' dichiara (un alias per) le variabili del pacchetto (globali). – Borodin

2

Globale, le variabili del pacchetto sono accessibili ovunque, sia che strict sia presente o meno, se si specifica il nome completo, cioè si prefissa con il nome del pacchetto. Così posso accedere a $main::variable ovunque e in qualsiasi momento.

Senza strict, se si accede a $variable non dichiarato con my, Perl presuppone che sia una variabile di pacchetto nel pacchetto corrente. our può essere utilizzato per dichiarare esplicitamente una variabile di pacchetto, ma senza strict non fa molto perché qualcosa di non dichiarato si comporta allo stesso modo.

Con strict in posizione, le variabili dichiarate con our sono accessibili utilizzando il nome locale e il nome completo, nello scope lessicale in cui è stata visualizzata la dichiarazione. Ciò significa che per accedere a una variabile globale da due subroutine è necessario dichiararla in entrambe le subroutine o dichiararla prima di entrambe in un ambito esterno.

Problemi correlati