【发布时间】:2020-11-15 16:02:10
【问题描述】:
尊敬的 Stackoverflow 社区,
我目前对 Matlab 中的一个重要问题感到困惑。也许有人以前遇到过类似的问题。
想象一下,之前从外部 ini 文件导入了一些用户输入,包括变量名称列表、变量值和要评估的方程,例如
names = { 'var1', 'var2' };
values = { 1.23, 4.56 };
equation = 'db( var1 / var2 )';
是否有一种干净的方法来评估这样的输入结果,将评估期间的访问范围仅限于用户变量和内置数学函数?
可以将用户变量分配到专用函数的已清除工作区,并且可以在那里执行评估,因此除了用户变量之外没有其他变量可用于评估,例如:
% evaluate user function in a workspace containing user parameters only
function out = cleanEval( equation, names, values )
% descend into a subfunction to operate on this workspace
out = cleanEvalCore( equation, names, values );
function out = cleanEvalCore( equation, names, values )
% clear all variables from the caller workspace (we have them here)
evalin( 'caller', 'clear' );
% assign user variables from names/values to the caller workspace
for ii = 1 : numel( names )
assignin( 'caller', names{ ii }, values{ ii } );
end
% evaluate user function in the caller workspace
out = evalin( 'caller', equation );
但是,只要使用 'eval' 进行评估,就有可能在用户函数中输入第三个代码,例如
names = { 'var1', 'var2' };
values = { 1.23, 4.56 };
equation = 'myGUI.closeWindow()';
或例如
equation = '!format C:\';
...如果按原样评估可能会导致有趣的后果。
将方程字符串转换为“用户变量的函数句柄”并不能解决问题,因为方程中的任何第三个命令仍将被计算。
是否有一种典型的方法来限制单个评估语句的范围,使其只能访问标准数学函数(例如 min/max/sin/cos/exp/log/db)或给定列表的函数,但没有别的?
或者有没有办法用一些内置的数学计算方程。引擎而不是 EVAL?
【问题讨论】:
-
有趣的问题。您可能必须“清理”字符串,确保它仅限于您提前定义的一组函数。
标签: matlab scope eval workspace