【发布时间】:2010-12-27 07:14:09
【问题描述】:
我将要在运行时调用的子例程的名称保存在一个名为 $action 的变量中。然后我用它在正确的时间调用那个子:
&{\&{$action}}();
工作正常。我唯一不喜欢的是它很丑,每次我这样做时,我都觉得很感激为下一个开发者添加评论:
# call the sub by the name of $action
有人知道这样做更漂亮的方法吗?
更新:这里的想法是避免每次我添加一个新的可调用子时都必须维护一个调度表,因为我是唯一的开发人员,我不担心其他程序员遵循或不遵循“规则”。为了我的方便,牺牲了一点安全性。相反,我的调度模块将检查 $action 以确保 1)它是定义的子例程的名称,而不是使用 eval 运行的恶意代码,以及 2)它不会运行任何以下划线开头的子程序,这将是按此命名约定标记为仅限内部的子。
对这种方法有什么想法吗?将调度表中的子例程列入白名单是我一直都会忘记的事情,我的客户宁愿我在“它有效”方面犯错,而不是“它非常安全”。 (开发应用的时间非常有限)
最终更新:我想我已经决定使用调度表了。虽然我很好奇读到这个问题的人是否曾经试图废除一个问题以及他们是如何做到的,但我必须向这里的集体智慧低头。谢谢大家,很多很好的回应。
【问题讨论】:
-
意识到当你引用某个东西来立即取消引用它时,你可以跳过中间步骤。 :)
-
@brian:通常(在这种情况下肯定是这样),但请参阅stackoverflow.com/questions/1836178/… 以获取反例。 :)
-
一个调度表也意味着你可以
use strict,这通常是一件好事。
标签: perl