我有一个变量$ x,目前在A.pm中有一个本地范围,我想在B.pm中的if else语句中使用$ x的输出(通常是PASSED / FAILED)
如下所示
A.pm:
if (condition1) { $x = 'PASSED'; }
if (condition2) { $x = 'FAILED'; }
B.pm:
if ($x=='PASSED') { $y=1; } else { $y=0; }
我尝试在B.pm使用require ("A.pm");
,但它给了我一个错误global symbol requires an explicit package name
,这意味着它无法从require中读取变量。任何输入都有帮助
答案 0 :(得分:2)
我有一个变量$ x,目前在A.pm中有一个本地范围,我想在B.pm中的if else语句中使用$ x的输出(通常是PASSED / FAILED)
我们可以告诉你如何做到这一点,但这是一个非常糟糕,糟糕的想法。
变量具有作用域的原因是什么,甚至用our
而不是my
声明的全局变量仍然限定在特定的包中。
想象一下有人修改了你的一个软件包,却没有意识到有一个与变量名$x
的直接连接。他们甚至可能在不知道原因的情况下制造大混乱。
我强烈建议你使用 functions (子程序)来传递你需要的值:
package Local::A;
use strict;
use warnings;
use lib qw($ENV{HOME});
use Exporter qw(import);
our @EXPORT_OK = qw(set_condition);
sub set_condition {
if ( condition1 ) {
return "PASSED";
elsif ( condition2 ) {
return "FALSED";
else {
return "Huh?";
}
1;
这就是我的所作所为:
B
作为模块名称,因为这是一个实际的模块。因此,我使用Local::B
和Local::A
代替。 Local
模块命名空间在CPAN中未定义,从未使用过。您始终可以在此模块命名空间下声明自己的模块。use lib
允许我指定在哪里找到我的模块。 package
命令为此模块提供了一个完全独立的命名空间。这样,A.pm
中的变量不会影响B.pm
。use Exporter
允许我从一个模块导出子程序到另一个模块。 @EXPORT_OK
是我要导出的子例程的名称。A.pm
中设置变量,而是从此子例程返回值。$x
未设置的逻辑。你可能不希望这样。1;
作为模块的最后一行。package Local::B;
use lib qw($ENV{HOME});
use Local::A qw(set_condition);
my $condition = set_contition();
my $y;
if ( $condition eq 'PASSED' ) { # Note: Use `eq` and not `==` because THIS IS A STRING!
$y = 1;
else {
$y = 0;
}
1;
package
定义了一个单独的模块名称空间。use Local::A qw(set_condition);
将set_condition
子例程导出到B.pm
。现在,我可以调用此子例程,而不是一直为Local::A
添加前缀。$condition
的本地范围变量设置为我的状态。$y
的结果中设置set_condition
。不需要将变量从一个包导出到另一个包。如果所有这些都看起来像神秘的魔法,你需要阅读Perl modules。这不是轻松的夏季阅读。它可能有点难以理解,但它绝对值得斗争。或者,获取Learning Perl并阅读第11章。
答案 1 :(得分:0)
在require A;
之后,您可以通过为变量提供一个显式的包名来访问该变量,如错误消息所示。
在B.pm:
my $y = $A::x eq 'PASSED ? 1 : 0
必须使用$x
而不是our
声明变量my
。
最后,使用eq
代替==
进行字符串比较。