我有两个文件,下面的文件是“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”中不可见
答案 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.pm
,require
步骤工作正常。
然后调用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
,它会为您提供一些有关此问题原因的其他线索。