【问题标题】:Importing sub into perl module package将 sub 导入 perl 模块包
【发布时间】:2015-10-20 20:40:06
【问题描述】:

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

常量.pm

Utils.pl

Main.pl

Constants.pm 有我想与 Main.plUtils.pl 共享的全局变量。

Utils.pl 有我想与 Constants.pmMain.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 is undefined 错误

请帮忙,谢谢!

编辑:我没有尝试过@ikegami 的答案,而是将常量中的所有内容移至 Utils.pm 并通过在 main.pl 中使用“use”导入 Utils

【问题讨论】:

  • require "Utils.pl" 没有意义。 Utils.pl 不是模块。
  • Re “当我运行 Main.pl 时,我得到 someSub is undefined 错误”,不,你得到一个语法错误。 (syntax error at a.pl line 4, near "my ")
  • 第二个答案告诉我我可以使用“require”stackoverflow.com/questions/1712016/…
  • require 用于带有package 的文件。 do 用于没有的文件(这是一个非常糟糕的做法)。见this
  • 好的,请参阅上面的更新。我添加了“package Utils;”到 Utils.pl 但现在我得到 parseConfigFile 在 Constants.pm 第 6 行未定义

标签: perl


【解决方案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,因为我认为明确命名您的导入是个好主意。)

【讨论】:

  • do 有什么帮助? subs 仍然会在错误的包中定义。
  • @mob,而不是被编译成主常量,使用do而不是require将它们编译成主 常数。 (哼,OP好像加了package Utils;,完全否定了我的解释。)
  • @ikegami 而不是分成常量和实用程序,我只是将变量和子程序移动到'Utils.pm'并通过在main.pl中使用'use'导入Utils
猜你喜欢
  • 1970-01-01
  • 2017-12-26
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2013-12-28
  • 2019-05-26
相关资源
最近更新 更多