在perl模块中调用的引用函数的域是什么?

时间:2013-11-29 09:13:39

标签: perl variables visibility perl-module

我想将函数引用传递给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 ::”?

感谢您的时间。

2 个答案:

答案 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