1

我在自己的文件中有一个 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。我很困惑!

4

1 回答 1

2

我猜脚本正在加载模块的不同副本,而您只修改了一个副本。尝试添加

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

use packagename在每个脚本的行之后。(如果有的话,不要忘记::/in替换packagename。)这会告诉你脚本是否真的在加载同一个模块。

于 2010-12-08T20:52:07.383 回答