2009-10-11 33 views
5

我有一个关于Perl和范围的问题。我有一个有很多各种变量的公共文件。我需要在我的主脚本中使用通用文件,但我无法访问这些变量;他们似乎超出了它的范围。我认为一个our声明可以解决这个问题,但似乎并不奏效。为什么我的Perl脚本不能看到我在另一个文件中定义的变量()?

脚本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

+3

全局符号,$ VAR1,需要明确的包名。 – jrockway 2009-10-11 23:53:27

+1

阅读http://perl.plover.com/FAQs/Namespaces.html – 2009-10-12 13:09:15

+0

有效Perl编程中的项目1(ISBN:0201419750,Joseph Hall和Randal Schwartz)的标题是:了解你的命名空间。这是一本很好的参考书,也是一本很棒的书。 – 2009-10-12 17:52:21

回答

8

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

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

6

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

如果您想按照自己的方式进行操作,请删除our并用use vars声明它们。不要让PBP警察吓跑你。 :)你真的只需要our来限制一个包变量的范围,这与你正在做的事情完全相反。

+0

那么严格使用不会让我不使用像我们这样的变量定义。 – Lee 2009-10-11 14:04:55

+0

存在一个问题,我正在使用无法修改的perl版本。没有新的模块。 – Lee 2009-10-11 14:05:49

+0

如果你可以添加perl文件,你可以使用所有纯粹的perl模块,它只是有点烦琐,因为你必须自己照顾依赖关系。只需下载你想要的模块的源代码,并把它放在“你的”perlscript可以读取的地方。 – Nifle 2009-10-11 15:56:52

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

我们的()做的东西有点不同的比你想象的。它的唯一目的是严格要求您声明要使用的包变量(除非它们是完全限定的或导入的)。与严格一样,其效果在词汇范围内。要使用它来允许从多个文件(这是不同的范围)访问全局$main:var1,只需要$var1,则需要在每个文件中说明our $var1

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

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; 
相关问题