5

我有一个关于 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; 

我得到错误:

全局符号“$var1”需要明确的包名

4

5 回答 5

8

您的第二个示例中没有require声明,但无论如何它都行不通。什么our是声明一个词法范围的包变量。由于您没有package声明,因此它使用默认包main。因此,您的第一个脚本设置了变量$main::var1,但这仅在该文件的范围内可用。

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

于 2009-10-11T13:52:20.220 回答
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

于 2009-10-11T16:26:25.243 回答
6

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

如果您想按照自己的方式进行操作,请摆脱our并使用use vars. 不要让 PBP 警察把你吓跑。:) 您只需要our限制包变量的范围,这与您尝试做的完全相反。

于 2009-10-11T14:02:43.350 回答
2

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

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

于 2009-10-12T03:37:27.360 回答
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;
于 2010-11-13T16:07:25.437 回答