我阅读编程perl,在第12章,对象,有以下文档:
next ::方法有类似的问题,因为它使用的是 它的来电者可以找出要看的课程。如果您定义方法 在另一个包中的Donkey中,next ::方法将会中断:
package main;
*Donkey::sound = sub { (shift)–>next::method(@_) };
匿名子例程在堆栈中显示为_ ANON _,因此next :: method不知道它所在的包。您可以使用Sub :: Name CPAN模块来然而,让它成功:
use Sub::Name qw(subname);
*Donkey::sound = subname 'Donkey::sound' => sub { (shift)–>next::method(@_) };
我非常好奇Sub :: Name模块如何完成这项工作?让匿名子程序的调用者不是__ANON __
非常感谢你的帮助:)。
答案 0 :(得分:2)
从内部一个匿名子程序,您可以通过将*__ANON__
设置为所需名称来实现此目的:
$sub = sub {
local *__ANON__ = 'Donkey::sound';
...
但Sub :: Name从外部设置它。快速浏览代码会让我觉得它正在戳戳并激发设置*__ANON__
所做的相同的事情,而你无法通过perl代码实现这一点。它在XS中是因为它必须是,而不是因为它更快。