我们可以使用perl包变量,不加前缀,只在该包中有作用域吗?

问题描述 投票:0回答:1

我的实际代码与此类似。

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
perl scope package basic
1个回答
5
投票

根据定义,包变量是全局的(在任何地方都可以看到)。为什么不使用 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.

© www.soinside.com 2019 - 2024. All rights reserved.