我保留了我想在运行时在名为$ action的变量中调用的子例程的名称.然后我用它在正确的时间调用该子:
&{\&{$action}}();
Run Code Online (Sandbox Code Playgroud)
工作良好.我唯一不喜欢的是它很丑,每次我这样做,我都感到很高兴为下一个开发者添加评论:
# call the sub by the name of $action
Run Code Online (Sandbox Code Playgroud)
有人知道更漂亮的方式吗?
更新:这里的想法是避免每次添加新的可调用子时都必须维护一个调度表,因为我是唯一的开发人员,我不担心其他程序员遵循或不遵循"规则".为了方便我牺牲了一点安全性.相反,我的调度模块将检查$ action以确保1)它是已定义子例程的名称而不是与eval一起运行的恶意代码,以及2)它不会运行任何以下划线开头的子,这将是通过此命名约定标记为仅限内部的subs.
有关这种方法的任何想法?发送表中的白名单子程序是我一直都会忘记的事情,我的客户宁愿我在"它工作"而不是"它是邪恶的安全"方面犯错误.(开发应用程序的时间非常有限)
最后更新:我想我毕竟已经决定了一个调度表.虽然我很好奇,如果读过这个问题的人曾经试图废除一个以及他们是如何做到的,那么我不得不向这里的集体智慧屈服.感谢所有,许多伟大的回应.
perl ×1