为什么我的Perl脚本看不到我在另一个文件中定义的my()变量?

时间:2009-10-11 13:45:18

标签: perl scope require

我有一个与Perl和范围有关的问题。我有一个包含许多变量的公共文件。我在主脚本中需要公共文件,但我无法访问变量;它们似乎超出了它的范围。我假设our声明会克服这个问题,但它似乎不起作用。

脚本1:common.pl

#!/usr/bin/perl

our $var1 = "something";
our $var2 = "somethingelse";

脚本2:ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

require('common.pl');

print $var1; 

我收到错误:

Global symbol "$var1" requires explicit package name

5 个答案:

答案 0 :(得分:8)

在你的第二个例子中没有require语句,但无论如何它都不会起作用。 our所做的是声明一个词法范围的包变量。由于您没有package语句,因此它使用默认包main。因此,您的第一个脚本会设置变量$main::var1,但这只能在该文件的范围内使用。

为其他脚本提供公共变量的更好方法是使用Exporter。您可以在一个位置定义包符号,Exporter将在需要时将它们复制到请求脚本或类的命名空间。

答案 1 :(得分:7)

我会将配置放在模块中。

文件: MyConfig.pm

package MyConfig;
require Exporter;
use strict;

our @ISA                = qw(Exporter);
our @EXPORT             = qw( getconfig ); 

my %confighash = ( 
            thisone => 'one',
            thatone => 2,
            somthingelse => 'froboz',
                   );



sub getconfig {
 return  %confighash;
 }

1;

使用示例:

#!/usr/bin/perl
use strict;
use warnings;

use MyConfig;

my %config = getconfig();

print $config{ somthingelse };

这应该打印 froboz

答案 2 :(得分:6)

看起来你需要一个合适的配置文件。我会选择一个非代码配置文件,您可以在需要设置时阅读该文件。 CPAN上有模块可以处理您可以想象的任何配置格式。

如果你想按照你的方式去做,请摆脱our并用use vars声明它们。不要让PBP警察吓跑你。 :)你只需要our来限制一个包变量的范围,而这恰恰与你想要做的完全相反。

答案 3 :(得分:2)

我们的()做的事与你想的有点不同。它的唯一目的是严格要求您声明要使用的包变量(除非它们是完全限定的或导入的)。像严格一样,它的作用是词法范围的。要使用它来允许从多个文件(单独的范围)访问全局$main:var1,只需要$var1,您需要在每个文件中说our $var1

或者,您可以将所需文件更改为具有自己的包的模块,该包将变量导出到使用它的任何包中。

答案 4 :(得分:1)

试试这个。我是Perl的新手,但这就是我如何使用我制作的脚本

#!/usr/bin/perl

$var1 = "something";
$var2 = "somethingelse";
Script 2: ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

our $var1;
our $var2;

require('common.pl');

print $var1;