Sub :: Name如何将匿名子程序的调用者设置为NOT __ANON__?

时间:2013-07-15 08:32:15

标签: perl

我阅读编程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 __

非常感谢你的帮助:)。

1 个答案:

答案 0 :(得分:2)

内部一个匿名子程序,您可以通过将*__ANON__设置为所需名称来实现此目的:

$sub = sub {
    local *__ANON__ = 'Donkey::sound';
    ...

但Sub :: Name从外部设置它。快速浏览代码会让我觉得它正在戳戳并激发设置*__ANON__所做的相同的事情,而你无法通过perl代码实现这一点。它在XS中是因为它必须是,而不是因为它更快。