2015-11-11 1 views
1

Est-il possible de définir une variable de package sans utiliser notre.Variables de package Perl sans utiliser notre

Voici un exemple de code qui expliquerait le cas mieux que les mots:

package A::B::C; 

use strict; 
use warnings; 
use Exporter(); 
our @ISA = qw/Exporter/; 
our @EXPORT =(); 
our @EXPORT_OK = qw/INFO/; 
our %EXPORT_TAGS = (
    default => [qw/INFO/] 
); 
Exporter::export_ok_tags("default"); 

BEGIN { 
    $C::verbose = 0; 
} 

sub INFO { 
    my $msg = shift; 

    if ($C::verbose) { 
     print("$msg\n"); 
    } 
} 

Réglage verbeux la variable $ à partir d'un script qui utilise le package A :: B :: C ne change pas la valeur de $ verbose dans le paquet:

use A::B::C; 

$A::B::C::verbose = 1; 

Je sais parfaitement que l'utilisation de « notre » dans le paquet résoudrait le problème, mais je suis plus intéressé de savoir ce qui se passe et pourquoi il est impossible de définir verbeux la variable $ d'un script qui utilise le paquet A :: B :: C. Ou encore mieux, que se passe-t-il pour empaqueter des variables qui sont seulement utilisées (et non formellement déclarées) dans les sous-routines de paquets; quelle portée ont-ils?

Répondre

3

Vous devez faire référence au nom de package correct: $verbose ne réside pas dans le package C mais dans A::B::C. Ainsi fonctionne comme prévu:

BEGIN { 
    $A::B::C::verbose = 0; # Changed 
} 

sub INFO { 
    my $msg = shift; 

    if ($A::B::C::verbose) { # Changed 
     print("$msg\n"); 
    } 
}