【问题标题】:Modifications to local perl module not recognized无法识别对本地 perl 模块的修改
【发布时间】:2011-05-22 11:34:06
【问题描述】:

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

【问题讨论】:

    标签: perl perl-module subroutine


    【解决方案1】:

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

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

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

    【讨论】:

    • 宾果游戏!我完全忘记了我已经将模块复制到其他地方进行部署测试,而我的一个脚本使用了那个。我对 perl 比较陌生,不知道 $INC;感谢您的精彩提示。
    猜你喜欢
    • 2021-11-01
    • 2021-05-12
    • 2020-03-14
    • 2015-07-11
    • 2022-01-22
    • 2016-07-08
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多