perl包中的混乱

时间:2013-04-17 09:34:44

标签: perl package

我有两个文件,下面的文件是“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”中不可见

2 个答案:

答案 0 :(得分:1)

主要问题:

您没有导出$var,而是导出$var2。如果您导出$var,则值会更改。

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

但是还有一些小问题:您使用参数调用check_scope,但是您永远不会在子例程的主体中检索参数。相反,您可以更改全局变量$var的值。

答案 1 :(得分:1)

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

由于您的模块文件名为pack_modules.pmrequire步骤工作正常。

然后调用pack_modules->import,它完全没有任何作用,因为该文件包含一个名为pack_module的包。如果您的主程序从pack_module导入符号(带有“s”),那么导出pack_modules(没有最终的“s”)并不重要。

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

顺便提一下,如果您已使用use strict;启动了某个程序,那么通过在主程序中抱怨Global symbol "$var" requires explicit package name,它会为您提供一些有关此问题原因的其他线索。