2010-04-17 6 views
3

J'essaie de lire un symbole global d'un autre paquet. J'ai le nom du paquet sous forme de chaîne. J'utilise qualify_to_ref de Symbol ModuleLecture d'une autre table de symboles de paquets en Perl

my $ref = qualify_to_ref ('myarray', 'Mypackage') ; 
    my @array = @$ref ; 

me donne Not an ARRAY reference at ...... Je suppose que je reçois le format du déréférencement mal.

Voici un exemple de programme complet.

use strict; 
    use Symbol ; 

    package Mypackage ; 
    our @myarray = qw/a b/ ; 

    package main ; 

    my $ref = qualify_to_ref ('myarray', 'Mypackage') ; 
    my @array = @$ref ; 

Répondre

4

La fonction qualify_to_ref renvoie une référence typeglob, que vous pouvez de référence comme celui-ci:

my @array = @{*$ref}; 

La syntaxe typeglob déréférencement est documentée here.

0

Vous devez déréférencer: @ $$ ref au lieu de @ $ ref

+0

Pourquoi la haine ici? Si vous testez réellement ma réponse, vous verrez que cela fonctionne. – Snowhare

4

Vous pouvez aussi le faire sans utiliser un module externe, tel que discuté dans perldoc perlmod sous la rubrique "Tableaux" Symbole:

package Mypackage; 
use strict; 
use warnings; 
our @myarray = qw/a b/; 

package main; 

our @array; 
*array = \@Mypackage::myarray; 
print "array from Mypackage is @array\n"; 

Cependant, que ce soit une bonne idée dépend du contexte de votre programme. Généralement, il serait préférable d'utiliser une méthode accesseur pour obtenir les valeurs de Mypackage ou exporter la variable vers votre espace de noms avec Exporter.

+1

Pouvez-vous modifier cela pour répondre à la question - "le nom du paquet est dans une chaîne" – justintime

+0

reformuler le commentaire précédent - cette façon semble bien si l'autre paquet est connu à l'avance, mais je ne vois pas comment l'utiliser si le nom du paquet est spécifié lors de l'exécution. – justintime

1

A côté de la manière que FM a déjà noté, vous pouvez accéder à certaines parties d'un typeglob à travers son interface comme hachage:

my $array = *{$ref}{ARRAY}; 

Cela peut être pratique pour obtenir les pièces, telles que les IO parties , qui n'ont pas de sceau. J'ai un chapitre sur ce genre de choses en Mastering Perl.

Questions connexes