2009-10-11 7 views
5

Ho una domanda relativa a Perl e scoping. Ho un file comune con molte variabili diverse. Ho bisogno del file comune nel mio script principale, ma non riesco ad accedere alle variabili; sembrano essere al di fuori del suo scopo. Supponevo che una dichiarazione our avrebbe risolto il problema, ma non sembra funzionare.Perché il mio script Perl non può vedere le nostre() variabili che ho definito in un altro file?

Script 1: common.pl

#!/usr/bin/perl 

our $var1 = "something"; 
our $var2 = "somethingelse"; 

Script 2: ftp.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

require('common.pl'); 

print $var1; 

ottengo l'errore:

Global symbol "$var1" requires explicit package name

+3

Il simbolo globale, $ var1, richiede un nome di pacchetto esplicito. – jrockway

+1

Leggi http://perl.plover.com/FAQs/Namespaces.html –

+0

L'elemento 1 in Programmazione Perl effettiva (ISBN: 0201419750, Joseph Hall e Randal Schwartz) è intitolato: Conosci i tuoi spazi dei nomi. È un riferimento eccellente per questo e anche un grande libro. –

risposta

8

Non c'è require istruzione nel secondo esempio, ma non funzionerebbe comunque. Cosa fa our è dichiarare una variabile del pacchetto con scope lessicale. Poiché non hai nessuna istruzione package, utilizza il pacchetto predefinito main. Quindi il tuo primo script imposta la variabile $main::var1, ma questo sarà disponibile solo nell'ambito del file.

Un modo migliore per fornire variabili comuni per altri script è utilizzare Exporter. È possibile definire i simboli del pacchetto in un'unica posizione ed Exporter si prenderà cura di copiarli nello script o nello spazio dei nomi della classe quando necessario.

6

Sembra che sia necessario un file di configurazione adeguato. Vado per un file di configurazione senza codice che puoi leggere quando devi configurare le cose. Ci sono moduli su CPAN per gestire praticamente qualsiasi formato di configurazione che tu possa immaginare.

Se si desidera farlo nel modo in cui lo si possiede, eliminare our e dichiararli con use vars. Non lasciare che la polizia del PBP ti spaventi. :) Ti serve solo lo our per limitare un ambito di una variabile del pacchetto, e questo è esattamente l'opposto di quello che stai cercando di fare.

+0

L'uso rigoroso non mi consentirà di non utilizzare una definizione di variabile come nostra o mia. – Lee

+0

Un problema esiste che sto lavorando su versioni perl che non possono essere modificate .. ad es. nessun nuovo modulo. – Lee

+0

Se è possibile aggiungere file perl, è possibile utilizzare tutti i moduli perl puri, è solo un po 'complicato dal momento che è necessario prendersi cura delle dipendenze da soli. Basta scaricare la fonte del modulo che si desidera e metterlo dove il "tuo" perlscript può leggerlo. – Nifle

7

Vorrei mettere la configurazione in un modulo.

File: MyConfig.pm

package MyConfig; 
require Exporter; 
use strict; 

our @ISA    = qw(Exporter); 
our @EXPORT    = qw(getconfig); 

my %confighash = ( 
      thisone => 'one', 
      thatone => 2, 
      somthingelse => 'froboz', 
        ); 



sub getconfig { 
return %confighash; 
} 

1; 

Esempio utilizzo:

#!/usr/bin/perl 
use strict; 
use warnings; 

use MyConfig; 

my %config = getconfig(); 

print $config{ somthingelse }; 

Questo dovrebbe stampare froboz

2

nostro() fa qualcosa di un po 'diverso di quanto si pensi. Il suo unico scopo è quello di lavorare con rigidi nel richiedere di dichiarare le variabili del pacchetto che si intende utilizzare (a meno che non siano pienamente qualificate o importate). Come severo, il suo effetto è lessicalmente definito. Per utilizzarlo per consentire l'accesso a un numero globale $main:var1 da più file (che sono ambiti separati) come solo $var1, è necessario dire our $var1 in ogni file.

In alternativa, è necessario modificare il file richiesto in modo che sia un modulo con un proprio pacchetto che esporta le variabili in qualsiasi pacchetto che lo utilizza.

1

Prova questo.Sono un Perl, ma questo è come ho preso a lavorare su uno script che ho fatto

#!/usr/bin/perl 

$var1 = "something"; 
$var2 = "somethingelse"; 
Script 2: ftp.pl 

#!/usr/bin/perl 

use strict; 
use warnings; 

our $var1; 
our $var2; 

require('common.pl'); 

print $var1;