我的实际代码与此类似。
package DEF;
use warnings;
use strict;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($STR);
our ($STR);
$STR = "bin";
1;
包DEF定义了$STR,并将其导出,以便其他人可以使用它。我可以在其他包的函数中使用$STR而不会有任何问题。
package A;
use warnings;
use strict;
use DEF;
use File::Spec::Functions;
$var=catfile($STR,"abc","def");
sub fun{
print($var,"\n");
}
sub fun1{
print($STR,"\n");
}
sub fun3{
fun();
fun1();
}
fun3();
1;
我想在包中定义一个变量,这个变量可以在包的所有函数中使用,但不能在包外使用。我不想在使用变量时使用任何前缀,也不想在每个函数中定义变量。
声明变量的方法 our
上面的代码没有像预期的那样打印出变量的值。
当我使用 my $var
输出是
abc/def
bin
但预期产出是
bin/abc/def
bin
根据定义,包变量是全局的(在任何地方都可以看到)。为什么不使用 my
变量?
package SomePkg;
use warnings;
use strict;
my $var = "abc";
sub get_var {
return $var;
}
1;
它只会在同一个词法范围内可见,所以从它的声明到文件的结尾。
关于问题的更新,你所说的得到的输出是错误的。
首先,让我们在 my var;
.
$ diff -U 0 A.pm{~,}
--- A.pm~ 2020-05-13 15:34:34.110807442 -0700
+++ A.pm 2020-05-13 15:29:17.514556346 -0700
@@ -7 +7 @@
-$var=catfile($STR,"abc","def");
+my $var=catfile($STR,"abc","def");
这就是实际产生的输出。
$ perl -Mlib=. -e'use A;'
Global symbol "@ISA" requires explicit package name (did you forget to declare "my @ISA"?) at DEF.pm line 5.
Global symbol "@EXPORT" requires explicit package name (did you forget to declare "my @EXPORT"?) at DEF.pm line 6.
Compilation failed in require at A.pm line 4.
BEGIN failed--compilation aborted at A.pm line 4.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
让我们来解决这些问题:
$ diff -U 0 DEF.pm{~,}
--- DEF.pm~ 2020-05-13 15:31:16.070648821 -0700
+++ DEF.pm 2020-05-13 15:31:19.006651138 -0700
@@ -5,2 +5,2 @@
-@ISA = qw(Exporter);
-@EXPORT = qw($STR);
+our @ISA = qw(Exporter);
+our @EXPORT = qw($STR);
现在程序可以正常工作了
$ perl -Mlib=. -e'use A;'
bin/abc/def
bin
正如你所看到的,没有任何的问题... my
.