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

5 perl scope require

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

脚本1:common.pl

#!/usr/bin/perl

our $var1 = "something";
our $var2 = "somethingelse";
Run Code Online (Sandbox Code Playgroud)

脚本2:ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

require('common.pl');

print $var1; 
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Global symbol "$var1" requires explicit package name

fri*_*edo 8

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

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


Nif*_*fle 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;
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

use MyConfig;

my %config = getconfig();

print $config{ somthingelse };
Run Code Online (Sandbox Code Playgroud)

这应该打印froboz


bri*_*foy 6

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

如果你想按照你拥有的方式去做,那就去除our并声明它们use vars.不要让PBP警察吓跑你.:)你真的只需要our限制一个包变量的范围,这与你想要做的完全相反.