2013-05-09 17 views
12

Quindi diciamo che ho uno script main.pl e in quello script ho bisogno di dichiarare alcune variabili (qualsiasi tipo di variabile costante o normale) e quelle variabili devono essere disponibili attraverso tutti gli script e moduli che includerò dallo script main.pl automaticamente.Perl - Variabili globali disponibili in tutti gli script e moduli inclusi?

Quello che voglio dire se ho una variabile $myVar in main.pl e da main.pl richiedo script1.pl, script2.pl o script3.pm, e da chiunque di questi script ho bisogno di accedere $myVar come si farebbe accedere a qualsiasi var definite in quello script o modulo specifico .

Ho cercato in rete, ma ho trovato solo esempi in cui è possibile accedere alle variabili dagli script che includi o estrai le variabili dai moduli; ma non è quello che voglio.

Non c'è una parola chiave come in PHP dove si usa global $var1, $var2 ecc. Per usare la variabile dallo script genitore?

Qualsiasi esempio, documentazione o articolo è accettabile, in pratica qualsiasi cosa possa aiutarmi sarebbe utile.

risposta

29

È possibile dichiarare le variabili globali con la parola chiave our:

our $var = 42; 

Ogni variabile globale ha un nome completo che può essere utilizzato per accedervi da qualsiasi luogo. Il nome completo è il nome del pacchetto più il nome della variabile. Se non hai ancora dichiarato un pacchetto a quel punto, sei nel pacchetto main, che può essere abbreviato in uno :: leader. Quindi la variabile di cui sopra ha i nomi

$var  # inside package main 
$main::var # This is most obvious 
$::var  # This may be a good compromise 

Se avessimo usato un altro pacchetto, il prefisso cambierebbe, per esempio

package Foo; 
our $bar = "baz"; 
# $Foo::bar from anywhere, 
# or even $::Foo::bar or $main::Foo::bar 

Se vogliamo usare una variabile senza il prefisso, ma sotto altri pacchetti, dobbiamo esportarlo. Questo di solito è fatto sottoclasse Exporter, vedere la risposta @Davids. Tuttavia, questo può solo fornire variabili dai pacchetti che sono use d, non viceversa. Per esempio.

Foo.pm:

package Foo; 
use strict; use warnings; 
use parent 'Exporter'; # imports and subclasses Exporter 

our $var = 42; 
our $not_exported = "don't look at me"; 

our @EXPORT = qw($var); # put stuff here you want to export 
# put vars into @EXPORT_OK that will be exported on request 

1; 

script.pl:

#!/usr/bin/perl 
# this is implicitly package main 
use Foo; # imports $var 

print "var = $var\n"; # access the variable without prefix 
print "$Foo::not_exported\n"; # access non-exported var with full name 

(variabili lessicali dichiarate con my) non hanno nomi univoci a livello globale e non può accedere fuori dalla loro portata statica. Inoltre, non possono essere utilizzati con Exporter.

+0

Dopo un po 'di riflessione sono passato a questo metodo così grazie: D –

+0

$ :: farà il trucco – yanger

5

Il modo più semplice per farlo è creare il proprio modulo. Così, per esempio, se voglio l'accesso globale alle variabili $foo and $bar, quindi ho potuto creare un modulo, come segue:

# file: MyVars.pm 
package MyVars; 

$foo = 12; 
$bar = 117.8; 

1; 

allora posso accedere a queste variabili utilizzando qualsiasi script perl che utilizza il modulo di MyVars:

# file: printvars.pl 
use MyVars; 

print "foo = $MyVars::foo\nbar = $MyVars::bar\n"; 

uscita:

foo = 12 
bar = 117.8 
+0

Nota: '@ EXPORT_OK' definisce i simboli da esportare su richiesta; non ne chiedi. Usando nomi completi, non hai nemmeno bisogno di 'Exporter': il tuo esempio funzionerebbe con tutte le linee relative a Exporter eliminate. – amon

+0

@amon Capito. Grazie. – David

Problemi correlati