我知道此问题的具体实例之前已经得到解答:
Perl Monks也有很好的答案:
但我想要一个强大的方法来将函数添加到Perl应用程序中:
为了说明这一点,以下是一些可以从一个好的解决方案中受益的例子:
一组用于从不同应用程序移动数据的脚本。例如,将数据从OpenCart移动到Prestashop,其中数据模型中的每个实体都具有特定的"添加"处理输入或输出;然后中间数据模型负责数据的转换。这可用于向任何方向移动数据,甚至可以在同一电子商务的不同版本之间移动数据。
需要在不同位置呈现不同类型HTML的Web应用程序。每个"模块"知道如何处理某些信息并接受参数来完成它。模块输出HTML,另一个输出文档列表,另一个输出文档,另一个输出横幅等。
以下是我使用过的一些例子。
在运行时加载函数并输出可能的编译错误:
eval `cat $file_with_function`;
if( $@ ) {
print STDERR $@, "\n";
die "Errors at file $file_with_function\n";
}
使用File::Slurp
更加健壮:
eval read_file("$file_with_function", binmode => ':utf8');
检查是否已定义某个功能:
if( !defined &myfunction ) {
die "myfunction is not defined\n";
}
可以从那里调用该函数。这对一个函数来说很好,但对很多函数来说都不行。
如果该功能放在模块中:
require $file_with_function; # needs the ".pm" extension, i.e. addon/func.pm
$name_of_module->import(); # need to know the module name, i.e. Addon::Func
$name_of_module->myfunction(...);
可以在require
内保护eval
,然后像以前一样使用$@
。
使用Module::Load:
load $name_of_module;
跟随import
并以相同的方式使用。 安全性不应该是一个问题,因为可以假设动态代码来自受信任的地方。还有更好的方法吗?哪种方式被视为良好做法?
如果有帮助,我将在Dancer框架内使用解决方案(在其他地方,但不是唯一的地方)。
编辑:鉴于评论,我添加了更多信息。我想到的所有案例都有共同之处: