2009-10-11 12 views
5

J'ai une question concernant Perl et la portée. J'ai un fichier commun avec beaucoup de variables différentes. J'ai besoin du fichier commun dans mon script principal, mais je ne peux pas accéder aux variables; ils semblent être en dehors de sa portée. J'ai supposé qu'une déclaration our surmonterait ce problème, mais cela ne semble pas fonctionner.Pourquoi mon script Perl ne peut-il pas voir les variables our() que j'ai définies dans un autre fichier?

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; 

je reçois l'erreur:

Global symbol "$var1" requires explicit package name

+3

Le symbole global, var1 $, nécessite un nom de package explicite. – jrockway

+1

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

+0

Le point 1 de la programmation Perl efficace (ISBN: 0201419750, Joseph Hall et Randal Schwartz) s'intitule: Know Your Namespaces. C'est une excellente référence pour cela, et un excellent livre aussi. –

Répondre

8

Il n'y a pas dans votre déclaration require deuxième exemple, mais cela ne fonctionnerait pas de toute façon. Ce que fait our est de déclarer une variable de package de portée lexicale. Comme vous n'avez aucune instruction package, il utilise le package par défaut main. Ainsi, votre premier script configure la variable $main::var1, mais celle-ci ne sera disponible que dans la portée de ce fichier.

Une meilleure façon de fournir des variables communes pour d'autres scripts consiste à utiliser Exporter. Vous pouvez définir des symboles de package à un endroit et l'exportateur prendra soin de les copier dans le script demandeur ou dans l'espace de noms de la classe si nécessaire.

6

Il semble que vous ayez besoin d'un fichier de configuration approprié. J'irais chercher un fichier de configuration non-code que vous pouvez lire lorsque vous avez besoin de configurer les choses. Il y a des modules sur le CPAN pour gérer à peu près n'importe quel format de configuration que vous pouvez imaginer.

Si vous voulez le faire comme vous l'avez, débarrassez-vous de our et déclarez-les avec use vars. Ne laissez pas la police PBP vous effrayer. :) Vous n'avez vraiment besoin que de our pour limiter la portée d'une variable de package, et c'est exactement le contraire de ce que vous essayez de faire.

+0

Eh bien en utilisant strict ne me permettra pas de ne pas utiliser une définition variable comme notre ou mon. – Lee

+0

Un problème existe que je travaille sur des versions de perl qui ne peuvent pas être modifiées .. par exemple. pas de nouveaux modules. – Lee

+0

Si vous pouvez ajouter des fichiers perl, vous pouvez utiliser tous les modules perl purs, c'est juste un peu compliqué car vous devez vous occuper des dépendances vous-même. Il suffit de télécharger la source du module que vous voulez et mettez-le où "votre" perlscript peut le lire. – Nifle

7

Je mettrais plutôt la config dans un module.

fichier: 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; 

Exemple d'utilisation:

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

use MyConfig; 

my %config = getconfig(); 

print $config{ somthingelse }; 

Cela devrait imprimer froboz

2

notre() fait quelque chose d'un peu différent que vous pensez. Son seul but est de travailler avec strict en exigeant que vous déclariez les variables de paquetage que vous allez utiliser (sauf si elles sont entièrement qualifiées ou importées). Comme strict, son effet est lexical-scope. Pour l'utiliser pour autoriser l'accès à un $main:var1 global à partir de plusieurs fichiers (qui sont des portées distinctes) comme $var1, vous devez indiquer our $var1 dans chaque fichier. Vous pouvez également modifier votre fichier requis pour qu'il devienne un module avec son propre package qui exporte les variables vers n'importe quel package qui l'utilise.

1

Essayez ceci.Je suis novice en Perl, mais voici comment je l'ai eu à travailler sur un script que j'ai fait

#!/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; 
Questions connexes