我在自己的文件中有一个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];
}
当我使用调试器运行我的脚本并进入此模块时,它显示我的$ string从$ _ [0]分配为子例程的第一行,就好像我从未更改过模块一样。
同样,这只发生在我的一个脚本中,但另一个工作正常。一切都在同一个目录中。我在linux上运行它,perl 5.10。我很困惑!
答案 0 :(得分:2)
我猜这些脚本正在加载模块的不同副本,而您只修改了一个副本。尝试添加
print $INC{'packagename.pm'}."\n";
在每个脚本中的use packagename
行之后。 (不要忘记将::
替换为/
中的packagename
,如果有的话。)这将告诉您脚本是否真的加载了相同的模块。