我有一个与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
答案 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;