我如何优雅地调用其名称保存在变量中的Perl子例程?

前端之家收集整理的这篇文章主要介绍了我如何优雅地调用其名称保存在变量中的Perl子例程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我保留我想在运行时调用一个变量$ action的子程序的名称。然后我使用这个在适当的时间调用该sub:
&{\&{$action}}();

工作正常。我唯一不喜欢的是它是丑陋的,每次我做,我觉得添加一个评论为下一个开发人员:

# call the sub by the name of $action

任何人都知道这样做的更漂亮的方式吗?

更新:这里的想法是避免每次我添加一个新的可调用子,因为我是唯一的开发人员维护一个分派表,我不担心其他程序员遵循或不遵循’规则’。牺牲一点安全为了我的方便。相反,我的分派模块将检查$ action,以确保1)它是一个定义的子程序的名称,而不是恶意代码运行eval,和2)它不会运行任何子以开头的下​​划线,这将是通过此命名约定标记为仅内部子代。

关于这种方法的任何想法?将调度表中的子程序列入白名单是我将永远忘记的事情,我的客户宁愿我错过“它的工作”一边比“它是邪恶的安全”。 (开发应用程序的时间非常有限)

最后更新:我想我已决定一个派遣表。虽然我很好奇,如果任何人读过这个问题曾经试图去除一个和他们是如何做到的,我必须屈服于这里的集体智慧。感谢所有,许多伟大的反应。

解决方法

不是将子例程名称存储在变量中并调用它们,更好的方法是使用子例程引用的散列(也称为 dispatch table.)
my %actions = ( foo => \&foo,bar => \&bar,baz => sub { print 'baz!' } 
                ... 
              );

然后你可以轻松调用正确的一个:

$actions{$action}->();

您还可以添加一些检查以确保$ action是哈希中的有效键,等等。

一般来说,你应该避免符号引用(你现在正在做什么),因为它们引起各种问题。此外,使用真正的子程序引用将工作与严格打开。

原文链接:https://www.f2er.com/Perl/173486.html

猜你在找的Perl相关文章