多次调用Perl eval(';使用someModule;';)。它是否也经过多次评估?

多次调用Perl eval(';使用someModule;';)。它是否也经过多次评估?,perl,module,eval,Perl,Module,Eval,我必须处理使用 eval('use someModule'); 并在运行时评估模块 不幸的是,这个eval块的函数被多次调用。 现在的问题是,Perl是否在每次调用带有此块的函数时都对模块进行求值或者Perl是否足够聪明,可以跳过第二次评估? 有没有一种方法可以确定这一点 我在模块的BEGIN块中尝试了一些全局var计数,但我不确定这是否是一个足够的测试 use someModule 相当于: BEGIN { require someModule; someModule->import

我必须处理使用

eval('use someModule');
并在运行时评估模块

不幸的是,这个eval块的函数被多次调用。 现在的问题是,Perl是否在每次调用带有此块的函数时都对模块进行求值或者Perl是否足够聪明,可以跳过第二次评估? 有没有一种方法可以确定这一点

我在模块的BEGIN块中尝试了一些全局var计数,但我不确定这是否是一个足够的测试

use someModule
相当于:

BEGIN { require someModule; someModule->import(); }
如果库文件尚未包含,则要求包含该库文件

因此,someModule将只被读取和编译一次,但是它的
import
sub(如果有)将为每个
use
调用一次

相当于:

BEGIN { require someModule; someModule->import(); }
如果库文件尚未包含,则要求包含该库文件


因此,someModule将只被读取和编译一次,但是它的
import
sub(如果有)将为每个
use

调用一次。谢谢你的快速回复。太好了。感谢QuickReqply。如果它不是一个变量模块名,那么最好编写
requiresomemodule
在运行时加载它,如果加载失败则死亡,然后
someModule->import如果您还需要运行其导入例程。如果它是一个可变的模块名,考虑到它将避免任何潜在的字符串求值代码。在某些部分,它是一个动态模块名。但是感谢Module::Runtime的提示。我会尝试一下。如果它不是一个变量模块名,那么最好编写
requiresomemodule
在运行时加载它,如果加载失败则死亡,然后
someModule->import如果您还需要运行其导入例程。如果它是一个可变的模块名,考虑到它将避免任何潜在的字符串求值代码。在某些部分,它是一个动态模块名。但是感谢Module::Runtime的提示。我试试看。