String eval是唯一的方法:
字符串eval不应用于:
eval还可以用于在不同系统或不同语言之间创建ad-hoc通信协议,这些协议也具有eval(前提是当然一切都是安全的.JSON可以看作是这种方法更安全但有限的子集)
String eval是用字符串创建新代码的唯一方法.这很少是必要的,但是有一些有效的用例,例如将模板转换为可运行的代码时.除此之外,它的有效用途很少.eval "require $module_name"是一个众所周知的习语,但使用例如Module :: Load比IMO更好.
几年前,我编写了一个静态网站生成器,它使用 Perl(<-- 有趣的是,我的拼写检查器建议用“Peril”替代它)作为脚本语言。它允许用户输入有关层次结构不同级别的信息 - 第一个市场是墓地,在那里你有拥有纪念碑的客户(付费客户)(显然是为死者)。
它有一个 GUI,您可以在其中输入变量,例如(这里为我的图形技能而颤抖):
+------------+----------------------------+
| ClientName | Pax Diablo |
+------------+----------------------------+
| Address | 666 Hades St, Washinton DC |
+------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
以及图片变量。
此外,对于每个市场(例如前面提到的墓地),都有一个控制脚本,该脚本基本上在多个层次结构级别上运行和处理每个记录以生成静态内容。在此之前,该程序已将所有这些变量转换为以下内容:
$Var{"ClientName"} = "Pax Diablo";
Run Code Online (Sandbox Code Playgroud)
(我认为语法是正确的,我已经有一段时间没有进行任何 Perl 开发了)。最终的结果是一个完整的网站,有很多客户、很多纪念馆、搜索页面和一个不错的小赚钱工具(我被葬礼承办人赶出了市场,他们在内部提供与“免费”服务相同的东西)他们的常规包裹)。
但整个事情基本上是用最小的 Perl 编写的,它只做了两件事:
赋值语句和特定于市场的 Perl 代码的执行都是通过 eval 完成的。
所以它并不像你想象的那么无用。这是一种将脚本引入应用程序的廉价方法。