我在Perl模块中正确使用%EXPORT_TAGS时遇到问题。在 Solver.pl 我有:
char[4]
然后在 MatrixFunctions.pm 内,我有:
use MatrixFunctions qw(:Normal);
但是只有当@EXPORT_OK包含所有方法时它才有效。如果我有
package MatrixFunctions;
use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
$VERSION = 1.00;
@ISA = qw(Exporter);
@EXPORT = ();
@EXPORT_OK = qw(&det &identityMatrix &matrixAdd
&matrixScalarMultiply &matrixMultiplication);
%EXPORT_TAGS = ( Det => [qw(&det)],
Normal => [qw(&det &identityMatrix &matrixAdd
&matrixScalarMultiply &matrixMultiplication)]);
我有错误:
@EXPORT_OK = ();
在我的 Solver.p l文件中使用"matrixScalarMultiply" is not exported by the MatrixFunctions module
"det" is not exported by the MatrixFunctions module
"matrixAdd" is not exported by the MatrixFunctions module
"matrixMultiplication" is not exported by the MatrixFunctions module
"identityMatrix" is not exported by the MatrixFunctions module
Can't continue after import errors at Solver.pl line 6.
BEGIN failed--compilation aborted at Solver.pl line 6.
的重点是我可以将@EXPORT_OK清空。我做错了什么?
答案 0 :(得分:2)
例如,Module.pm定义:@EXPORT = qw(A1 A2 A3 A4 A5); @EXPORT_OK = qw(B1 B2 B3 B4 B5); %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]);
请注意,您无法在@EXPORT或@EXPORT_OK中使用标记。
EXPORT_TAGS中的名称也必须出现在@EXPORT或@EXPORT_OK中。
上面的粗体部分说明您必需要将%EXPORT_TAGS
中的功能放在@EXPORT_OK
或@EXPORT
我开始使用的模式是定义我希望允许在@EXPORT_OK
中导出的所有内容,然后使用@EXPORT_OK
构建一个`:all'标记:
our @ISA = qw(Exporter);
our @EXPORT_OK = qw/raspberry apple/;
our %EXPORT_TAGS = (
'all' => \@EXPORT_OK,
);
答案 1 :(得分:1)
[不是一个答案,而是一个大评论的后续行动]
如果您想自动填充@EXPORT_OK
,可以使用以下内容:
push @EXPORTER_OK, map @$_, values %EXPORT_TAGS;
出口商不关心重复的条目。如果这样做,您可以使用以下代码:
my %EXPORT_OK;
@EXPORT_OK = grep !$EXPORT_OK{$_}++,
@EXPORT_OK, map @$_, values %EXPORT_TAGS;
因此,经过一些清理后,您的代码如下:
package MatrixFunctions;
use strict;
use warnings;
use Exporter qw( import );
our $VERSION = 1.00;
our @EXPORT = ();
our @EXPORT_OK = ();
our %EXPORT_TAGS = (
Det => [qw( det )],
Normal => [qw( det identityMatrix matrixAdd matrixScalarMultiply matrixMultiplication )],
);
push @EXPORTER_OK, map @$_, values %EXPORT_TAGS;