2010-12-08 4 views
1

J'ai un seul sous-programme perl dans un fichier qui lui est propre. Il est appelé séparément par deux scripts perl différents. J'ai modifié la liste des arguments passés et apporté les modifications nécessaires dans les deux scripts d'appel, mais un seul script fait ce que j'attends. Quand j'utilise le débogueur perl sur l'autre, quand le débogueur entre dans le sous-programme du module, il me montre la façon dont le module a regardé avant de le modifier. Donc, quand je lance ce script, il passe dans la nouvelle liste d'arguments, mais le module essaie de les assigner à l'ancienne, ce qui est clairement faux.Modifications du module perl local non reconnues

Ce qui pourrait causer cela? Pourquoi un script fonctionne-t-il correctement et l'autre pas?

Pour les détails, oui j'utilise strict et avertissements. Old:

use strict; 
use warnings; 
use lib("/absolute/path/to/module"); #mymodule.pm lives here 
use packagename; 

my $string = "foo"; 
my %Hash = my_sub($foo); 

et dans le module:

package packagename; 

use strict; 
use warnings; 
use Exporter; 
use vars qw(@ISA @EXPORT @EXPORT_OK); 

@ISA = qw(Exporter); 
@EXPORT = qw(my_sub); 
@EXPORT_OK = qw(my_sub); 

sub my_sub { 
    my $string = $_[0]; 
    my %Hash; 
    ... 
    return %Hash; 
} 

J'ai ajouté une référence de tableau aux arguments. Nouveau sur le script d'appel sont:

my @array = qw(Zero One Two); 
my %Hash = my_sub(\@array, $string); 

Nouveau sur le module:

sub my_sub { 
    my (@array) = @{$_[0]}; 
    my $string = $_[1]; 
} 

Quand je lance mon script avec le débogueur et pas dans ce module, il montre ma chaîne de $ étant attribué à partir de $ _ [0] comme première ligne du sous-programme, comme si je n'avais jamais changé le module.

Encore une fois, cela se produit uniquement avec l'un de mes scripts mais l'autre fonctionne correctement. Tout est dans le même répertoire. Je cours ceci sur linux, perl 5.10. Je suis déconcerté!

Répondre

2

Je suppose que les scripts sont en train de charger différentes copies du module, et vous avez seulement modifié une copie. Essayez d'ajouter

print $INC{'packagename.pm'}."\n"; 

après la ligne use packagename dans chaque script. (N'oubliez pas de remplacer :: par / dans packagename, le cas échéant.) Cela vous indiquera si les scripts chargent vraiment le même module.

+0

Bingo! J'ai complètement oublié que j'avais copié le module ailleurs pour les tests de déploiement, et l'un de mes scripts a utilisé celui-là. Je suis relativement nouveau à Perl et je ne connaissais pas $ INC; Merci pour le bon conseil. – jasper77

Questions connexes