将sub导入perl模块包

时间:2015-07-29 17:52:21

标签: perl

来自Python和Java背景,这让我感到困惑。我有以下文件:

Constants.pm

Utils.pl

Main.pl

Constants.pm 包含我想与 Main.pl Utils.pl 分享的全局变量。

Utils.pl 有帮助潜水员,我想与 Constants.pm Main.pl

分享
#################### Constants.pm
package Constants;
require "Utils.pl";
use Exporter;
our @ISA = 'Exporter';

my %config = parseConfigFile("File.properties");

our @EXPORT = qw($var1 $var2 $var3);
our ($var1, $var2, $var3);

$var1 = $config{var1};
$var2 = $config{var2};
$var3 = $config{var3};


#################### Utils.pl
package Utils;
use Constants;

sub parseConfigFile {};
sub someSub {};

#################### Main.pl
use Constants;
require "Utils.pl"

my $var = someSub($var1);

当我运行 Main.pl 时,我得到someSub是未定义的错误

请帮助,谢谢!

编辑:我没有尝试@ ikegami的答案,而是将Constants中的所有内容移动到Utils.pm中,并在main.pl中使用'use'导入Utils

1 个答案:

答案 0 :(得分:1)

[以下说明适用于问题的原始版本。解决方案是一样的。]

require只执行一次文件,但是您希望两个包中存在相同的subs。简单的解决方案是使用do代替require。但最终你的设计很糟糕。最终得到Utils.pl创建的变量和子的多个实例。将Utils.pl转换为适当的模块(如Constants.pm)会更好。

Constants.pm

package Constants;

use strict;
use warnings;

use Exporter qw( import );
use Utils    qw( parseConfigFile );

our @EXPORT_OK = qw( $var1 $var2 $var3 );

my %config = parseConfigFile("File.properties");
our $var1 = $config{var1};
our $var2 = $config{var2};
our $var3 = $config{var3};

1;

Utils.pm

package Utils;

use strict;
use warnings;

use Constants qw( ... );
use Exporter  qw( import );

our @EXPORT_OK = qw( parseConfigFile someSub );

sub parseConfigFile { ... }
sub someSub { ... }

1;

main.pl

#!/usr/bin/perl

use strict;
use warnings;

use Constants qw( $var1 );
use Utils     qw( someSub );

my $var = someSub($var1);

但是哎呀!常量使用Utils,Utils使用常量,它们都从另一个导入。那是个问题。您可以work around it,但parseConfigFile没有理由Utils,所以让我们完全避免这个问题。

Constants.pm

package Constants;

use strict;
use warnings;

use Exporter qw( import );

our @EXPORT_OK = qw( $var1 $var2 $var3 );

sub parseConfigFile { ... }

my %config = parseConfigFile("File.properties");
our $var1 = $config{var1};
our $var2 = $config{var2};
our $var3 = $config{var3};

1;

Utils.pm

package Utils;

use strict;
use warnings;

use Constants qw( ... );
use Exporter  qw( import );

our @EXPORT_OK = qw( someSub );

sub someSub { ... }

1;

(我使用@EXPORT_OK代替@EXPORT因为我认为明确命名您的导入是个好主意。)