-1

我有两个文件,下面的文件是“Packages_module.pl”,

use pack_modules; 
$var = 1;
print "var is $var\n";
&pack_module::check_scope($var);
print "var is $var\n";

第二个文件是“pack_modules.pm”,代码如下

package pack_module;
use Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/$var/;
our ($var);
sub check_scope 
{
    $var = 3;
}
1;

当我运行 pack_modules.pm 时,我得到了以下结果。

    var is 1
    ==========
    Using Module Subroutine:
    var is 1
    ==========

第一次,'$var' 显然是 1,但第二次它再次给出 1 而不是 3。谁能告诉我为什么“pack_module”的值在“Packages_module”中不可见。

4

2 回答 2

1

use pack_modules相当于BEGIN { require pack_modules; pack_modules->import; }

由于您的模块文件名为pack_modules.pm,因此该require步骤可以正常工作。

然后它调用pack_modules->importwhich 绝对什么都不做,因为该文件包含一个名为pack_module. pack_module如果您的主程序正在从pack_modules(带有“s”)导入符号,那么导出什么(没有最后的“s”)并不重要。

将模块文件中的第一行更改为package pack_modules;,将主程序中的子调用更改为pack_modules::check_scope($var);,它应该可以工作。(附带说明,不要在对用户定义函数的调用前加上&。这是 Perl 4 的保留,在 Perl 5 中不是必需的,并且具有您可能不打算调用的副作用。)

顺便说一句,如果你用 启动你的程序use strict;,它会给你一些关于这个问题的原因的额外线索,通过Global symbol "$var" requires explicit package name在你的主程序中抱怨。

于 2013-04-17T12:15:15.490 回答
1

主要问题:

您不是在导出$var,而是$var2. 如果您 export $var,该值会改变。

此外,您使用pack_moudles,但包名为pack_module.

但是,还有一些更小的问题:您正在check_scope使用参数进行调用,但您从未在子例程的主体中检索参数。相反,您更改了全局变量的值$var

于 2013-04-17T09:45:48.120 回答