Il modificatore our
è utilizzato solo quando il pragma rigido è attivo per consentire l'utilizzo di variabili globali o è anche utilizzato per alcune funzionalità extra diverse dalle normali variabili globali quando strict è disattivato?Ci sono differenze tra le nostre variabili definite e le normali variabili globali in Perl?
risposta
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
.
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.
Tutte le variabili del pacchetto sono variabili globali. Ciò che questo uso dimostra è che c'è uno scopo di "nostro" oltre a soddisfare "rigoroso". – darch
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
@none: non c'è conflitto qui. 'our' dichiara (un alias per) le variabili del pacchetto (globali). – Borodin
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.
- 1. Le variabili di istanza sono le nuove variabili globali?
- 2. Vim: le variabili non definite sono deselezionate
- 3. Le variabili globali e locali in R
- 4. Le variabili globali scherzano
- 5. Qual è la differenza tra le variabili di sessione e le variabili globali in php?
- 6. Rendere globali tutte le variabili
- 7. In Ruby, c'è un modo per stampare tutte le variabili globali e le costanti definite/predefinite?
- 8. Visualizza le variabili definite dall'utente in Julia
- 9. Le variabili globali rallentare codice
- 10. le variabili dinamiche in perl
- 11. Le variabili globali sono thread safe in beuta?
- 12. Le variabili globali sono sempre inizializzate a zero in C?
- 13. In quale oggetto sono memorizzate le variabili globali di Javascript?
- 14. Perché le variabili globali sono considerate cattive pratiche?
- 15. Come sono collegate le variabili globali nelle librerie condivise?
- 16. Visualizzazione di tutte le variabili definite
- 17. Elenca tutte le variabili globali in Node.js
- 18. Come utilizzare le variabili globali in ObjectDataSource.SelectMethod?
- 19. Variabili globali e MPI
- 20. Come caricare e archiviare le variabili globali in Jersey/Glassfish
- 21. Le variabili statiche di ASP.NET C# sono globali?
- 22. utilizzo typeof per le variabili non definite
- 23. Le variabili python "globali" (modulo) sono thread locali?
- 24. le variabili globali sono nulle quando si utilizza PHPUnit
- 25. Quali sono le differenze tra $ {} e # {}?
- 26. Dove sono memorizzate le variabili globali come $ _GLOBAL, $ _POST ecc.?
- 27. Variabili globali in Dart
- 28. variabili globali condivise in C
- 29. Importazioni Python tra moduli e variabili globali
- 30. JavaScript: Le variabili globali dopo Ajax richieste
Davvero una buona risposta! – none