【问题标题】:how to refer to a perl module whose name would be passed at run time?如何引用名称将在运行时传递的 perl 模块?
【发布时间】:2017-01-27 14:03:09
【问题描述】:

是否可以引用名称将作为命令行参数传递的 perl 模块?

我可以通过use $ARGV[0] 获取模块,但我如何引用模块中EXPORT_OK 导入的任何内容?

【问题讨论】:

  • 另请参见-M switch in perlrun 开关以指定要从命令行加载的模块。
  • 为什么投反对票?这实际上是一个很好的问题。
  • @ChankeyPathak 我也不知道为什么,但perl 标签是 SO 上最常见的负面位置之一。

标签: perl perl-module


【解决方案1】:

UNIVERSAL::require 仅用于此目的。

描述: require() 来自变量的模块

片段:

require UNIVERSAL::require;

my $module = $ARGV[0];
$module->require or die $@;

my $require_return = $module->use(@imports) or die $@;

【讨论】:

  • 但那是在运行时,不是吗?
【解决方案2】:

通常,动态加载的模块是在运行时加载的,因此可以使用以下之一:

my $module_path = $module_name;
$module_path =~ s{::}{/}g;
$module_path .= '.pm';
require $module_path;

$module_name !~ /^\w+(?:::\w+)*\z/
   or die("Bad module name\n");

eval("use $module_name qw( ); 1")
   or die $@;

这些不导入,因为在运行时导入没有多大意义。你想从模块中导入,这意味着你真的想在编译时加载模块。以下是一个方便的技巧:

use if 1, $module_name, @imports;

您也可以使用以下任一方法:

BEGIN {
   my $module_path = $module_name;
   $module_path =~ s{::}{/}g;
   $module_path .= '.pm';
   require $module_path;
   import $module_name @imports;
}

BEGIN {
   $module_name !~ /^\w+(?:::\w+)*\z/
      or die("Bad module name\n");

   eval("use $module_name \@imports; 1")
      or die $@;
}

有些模块也可以提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2017-07-23
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多