来自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答案 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
因为我认为明确命名您的导入是个好主意。)