动态查找加载模块的@EXPORT 和@EXPORT_OK
Dynamically finding @EXPORT and @EXPORT_OK for a loaded module
我正在编写一个脚本来清理隐式导入模块的代码。我想将 use Foo;
的实例更改为 use Foo qw( bar baz );
为了实现自动化,我想知道 @Foo::EXPORT
和 @Foo::EXPORT_OK
的内容是什么。我正在尝试不使用 PPI
开始。
那么,给定变量 $module_name
,我如何访问该模块的 @EXPORT
和 @EXPORT_OK
?
感谢 Graham Knop 指出我需要的语法,并感谢 PerlMonks 的对话,其中涵盖了这一点:exports -- which module exports are used?
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Printer; # exports p()
use Module::Runtime qw( require_module );
my $module_name = 'POSIX';
require_module( $module_name );
$module_name->import;
no strict 'refs';
p @{$module_name.'::EXPORT'};
p @{$module_name.'::EXPORT_OK'};
我想你真的是在问如何使用变量中的包名称访问包变量。
使用“软”(“符号”)引用,您“尊重”了一个字符串。当 Perl 发现这不是引用时,它会使用它从字符串值中计算出的包变量。 strict
不允许这样做,所以你必须关闭它的那部分检查:
my $class = 'Foo';
eval "require $class"; # or however you want to load it
my @exports = do {
no strict 'refs';
@{$class . '::' . 'EXPORT'};
};
您基本上已经在自己的答案中完成了此操作,并附有许多方便的内容。例如,Module::Runtime
正在检查模块名称并将其转换为可以 require
的文件名。这很好,但它掩盖了你的解决方案的实质。
您提到了 PPI,但没有提到您不想使用它的原因。对于刚入党的人来说,您不一定能从静态分析中分辨出任何 Perl 变量中的内容。我处理一些模块,这些模块根据它定义的内容动态构建导出列表,以及根据其他一些条件可用的内容。即@EXPORT
和friends在单元编译结束之前都是空的。这不是你应该做的事情,但它是可能的并且静态无法检查。
我正在编写一个脚本来清理隐式导入模块的代码。我想将 use Foo;
的实例更改为 use Foo qw( bar baz );
为了实现自动化,我想知道 @Foo::EXPORT
和 @Foo::EXPORT_OK
的内容是什么。我正在尝试不使用 PPI
开始。
那么,给定变量 $module_name
,我如何访问该模块的 @EXPORT
和 @EXPORT_OK
?
感谢 Graham Knop 指出我需要的语法,并感谢 PerlMonks 的对话,其中涵盖了这一点:exports -- which module exports are used?
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Printer; # exports p()
use Module::Runtime qw( require_module );
my $module_name = 'POSIX';
require_module( $module_name );
$module_name->import;
no strict 'refs';
p @{$module_name.'::EXPORT'};
p @{$module_name.'::EXPORT_OK'};
我想你真的是在问如何使用变量中的包名称访问包变量。
使用“软”(“符号”)引用,您“尊重”了一个字符串。当 Perl 发现这不是引用时,它会使用它从字符串值中计算出的包变量。 strict
不允许这样做,所以你必须关闭它的那部分检查:
my $class = 'Foo';
eval "require $class"; # or however you want to load it
my @exports = do {
no strict 'refs';
@{$class . '::' . 'EXPORT'};
};
您基本上已经在自己的答案中完成了此操作,并附有许多方便的内容。例如,Module::Runtime
正在检查模块名称并将其转换为可以 require
的文件名。这很好,但它掩盖了你的解决方案的实质。
您提到了 PPI,但没有提到您不想使用它的原因。对于刚入党的人来说,您不一定能从静态分析中分辨出任何 Perl 变量中的内容。我处理一些模块,这些模块根据它定义的内容动态构建导出列表,以及根据其他一些条件可用的内容。即@EXPORT
和friends在单元编译结束之前都是空的。这不是你应该做的事情,但它是可能的并且静态无法检查。