Étant donné une petite bibliothèque Perl:(Comment) puis-je recréer un paquet après avoir appelé Symbol :: delete_package dessus?
package P;
use strict;
use warnings;
print("Loading P\n");
our $k1 = 'v1';
our $k2 = 'v2';
our $k3 = 'v2';
J'ai essayé d'écrire un programme qui charge, décharge et recharge le paquet pour obtenir une meilleure compréhension de la façon dont les paquetages fonctionnent en Perl:
# main.pl
use strict;
use warnings;
use Symbol qw(delete_package);
# Load module
require "./P.pm";
my @incs = sort keys %INC;
my $numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
# Unload module & delete package
delete_package('P');
delete $INC{'./P.pm'};
@incs = sort keys %INC;
$numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
# Load module again
require "./P.pm";
@incs = sort keys %INC;
$numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
L'exécution de cette programme imprime quelque chose le long des lignes de (l'ordre dans lequel les modules sont répertoriés par keys %INC
peuvent varier):
Loading P
Includes: ./P.pm Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 4
Includes: Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 0
Loading P
Includes: ./P.pm Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 0
C'est à dire. il semble que le rechargement de la bibliothèque a fonctionné comme prévu, mais la table de symboles %P::
est toujours vide. Pourquoi n'a-t-il pas été réapprovisionné lorsque la bibliothèque a été chargée une deuxième fois? J'essaie de trouver un moyen de recharger un module sans utiliser de paquets CPAN.
Ah, c'est intéressant! Si j'ai un sous-programme 'p' auquel on donne actuellement une référence à un hachage (c'est-à-dire comme' p (\% P: :); ') et qui énumère les symboles en interne, est-il possible de traduire 'p' à une chaîne de caractères telle que l'une de vos solutions pourrait être utilisée? Ou aurais-je besoin d'ajuster les appelants de telle sorte qu'ils passent une chaîne à la place? –
Ajuste l'appelant pour transmettre une référence au bon glob. – ikegami
Merci; Je suppose que je devrais lire sur ce que glob veut dire dans ce contexte (je l'ai toujours seulement connu dans le contexte de l'appariement des noms de fichiers). –