使用从一个文件到另一个文件的变量

时间:2014-04-03 17:13:16

标签: perl variables global

我有一个变量$ 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中读取变量。任何输入都有帮助

2 个答案:

答案 0 :(得分:2)

  

我有一个变量$ x,目前在A.pm中有一个本地范围,我想在B.pm中的if else语句中使用$ x的输出(通常是PASSED / FAILED)

我们可以告诉你如何做到这一点,但这是一个非常糟糕,糟糕的想法。

变量具有作用域的原因是什么,甚至用our而不是my声明的全局变量仍然限定在特定的包中。

想象一下有人修改了你的一个软件包,却没有意识到有一个与变量名$x的直接连接。他们甚至可能在不知道原因的情况下制造大混乱。

我强烈建议你使用 functions (子程序)来传递你需要的值:

本地/ A.pm

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::BLocal::A代替。 Local模块命名空间在CPAN中未定义,从未使用过。您始终可以在此模块命名空间下声明自己的模块。
  • use lib允许我指定在哪里找到我的模块。
  • package命令为此模块提供了一个完全独立的命名空间。这样,A.pm中的变量不会影响B.pm
  • use Exporter允许我从一个模块导出子程序到另一个模块。 @EXPORT_OK是我要导出的子例程的名称。
  • 最后,有一个子程序为我运行我的测试。我没有在A.pm中设置变量,而是从此子例程返回值。
  • 检查你的逻辑。如果两个条件都不成立,则设置为$x未设置的逻辑。你可能不希望这样。
  • 您的模块无法返回零作为最后一个值。因此,总是将1;作为模块的最后一行。

本地/ B.pm

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代替==进行字符串比较。