【发布时间】:2015-12-08 10:56:21
【问题描述】:
我有一个非常有趣的困境。我正在开发 CVS 存储库的 Perl 脚本接口,并创建了 Perl 对象来表示 Modules、Paths 和 Files。由于Modules、Paths 和Files 都可以对它们发出CVS 命令,因此我设置了AUTOLOAD 例程以采用任何未识别的方法并在对象上发出它们,就好像它们是CVS 命令一样。
所有这些 CVS 命令的执行方式完全相同,但其中一些需要对输出进行特殊处理才能获得我想要的结果。
例如,我想在返回之前获取 diff 命令的输出并重新格式化它。
我用的是Moose,所以一般这种特殊处理可以如下进行:
after 'diff' => sub {
# Reformat output here
}
问题是...我从未明确创建过diff 方法,因为它是由AUTOLOAD 生成的,而Perl 不允许我为它创建方法修饰符,因为它在技术上不存在!
有没有办法让它按我想要的方式工作?
【问题讨论】:
-
如果您的 AUTOLOAD 子程序创建了被自动加载的符号(这样就不会再次为该符号调用 AUTOLOAD),这只是一个调用
after的问题(这只是一个普通的子程序)创建符号。 -
符号创建后如何执行此操作?如果我只是尝试使用
after,它会说在继承层次结构中找不到方法“diff”。 -
那你没有创建符号(
diff),或者你从错误的包中调用了after -
哦,你的意思是定义像
*diff这样的东西?我没怎么弄乱符号。 -
但是你正在编写一个 AUTOLOAD,其目的是“加载”符号......
标签: perl autoload moose method-modifier