我想将函数引用传递给perl模块,如下所示。 这是主要的计划:
#main.pl
use module;
my $ref = sub {
# what if a function is called or an array asked?
# is domain main:: or module::?
print "Log $date ", @_, "\n"
} ;
define_log_function($ref);
这是模块:
# module.pm
package module;
my $log ;
sub define_log_function {
$log = shift;
}
sub other_function {
$log and &$log("Calling other_function");
(...)
}
我的模块内部调用的日志函数的域是什么?如果我尝试在模块中调用函数会发生什么?它的域名是“main ::”还是“module ::”?
感谢您的时间。
答案 0 :(得分:4)
每个子程序都属于某个包,即使它是一个匿名子程序。以下代码将打印Foo Foo
:
use feature 'say';
package Foo;
my $coderef = sub {
say __PACKAGE__;
foo();
};
sub foo { say "Foo" }
package Bar;
sub foo { say "Bar" }
$coderef->();
在$coderef
包中执行Bar
并不重要,因为它是在Foo
包内编译的。在编译代码的包中不仅会查找子例程,还会查找其他全局变量。
请注意,您可以随时切换到另一个包中,对于词法范围的其余部分:
my $coderef = sub {
say __PACKAGE__;
package Bar;
foo();
};
会给Foo Bar
。
答案 1 :(得分:2)
$ref
词法变量(用my
定义)并保留对闭包的引用。词法不属于命名空间,只能访问全局变量,如$module::package_global
。