2010-12-08 2 views
1

У меня есть одна подпрограмма perl в собственном файле. Он называется отдельно двумя разными perl-скриптами. Я изменил список переданных аргументов и внес необходимые изменения в оба сценария вызова, но только один скрипт делает то, что я ожидаю. Когда я использую отладчик perl на другом, когда отладчик переходит в подпрограмму в модуле, он показывает мне, как выглядел модуль до того, как я его отредактировал. Поэтому, когда я запускаю этот скрипт, он переходит в новый список аргументов, но модуль пытается назначить их старым способом, что явно неверно.Модификации локального модуля perl не распознаются

Что может быть причиной этого? Почему один скрипт работает правильно, а другой нет?

Для специфики, да, я использую строгое и предупреждающее. Старый:

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

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

и в модуле:

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; 
} 

Я добавил ссылку на массив к аргументам. Новое в сценарии вызова являются:

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

Новое в модуле:

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

Когда я бегу мой сценарий с отладчик и шаг в этом модуле, он показывает мою $ строку быть назначены из $ _ [0] как первая строка подпрограммы, как будто я никогда не менял модуль.

Опять же, это происходит только с одним из моих скриптов, но с другой работает нормально. Все находится в одном каталоге. Я запускаю это на linux, perl 5.10. Я сбит с толку!

ответ

2

Я бы предположил, что скрипты загружают разные копии модуля, и вы только модифицировали одну копию. Попробуйте добавить

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

после use packagename строка в каждом скрипте. (Не забудьте заменить :: на / в packagename, если таковые имеются.) Это скажет вам, действительно ли сценарии загружают один и тот же модуль.

+0

Bingo! Я совершенно забыл, что я скопировал модуль в другом месте для тестирования развертывания, и один из моих сценариев использовал его. Я относительно новичок в perl и не знаю о INC; спасибо за большой совет. – jasper77