这是直接从Perl Cookbook摘录的代码:
@colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
no strict 'refs';
*$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
}
它的意图是形成6个不同颜色名称的子例程。在解释部分,书中写道:
这些函数看起来都是独立的,但实际上只编译了一次真正的代码。这种技术节省了编译时间和内存使用。为了创建一个适当的闭包,匿名子例程中的任何变量都必须是词法变量。这就是循环迭代变量上的my的原因。 proper closure指的是正确的闭包,如果省略my,则会出现错误。另外,即使类型全局变量不能为词法变量定义并应该抛出错误,但为什么类型全局变量能与词法变量一起工作?
print &$global_sub()
输出 red,即使$global_sub
持有一个名为red
的sub
的引用,并且这个sub
刚刚在块内被重新定义了吗? - SexyBeast$global_sub
包含一个 CODE 引用。这是对编译代码的引用,而不是对子例程名称的引用。它是通过引用子程序名称创建的,但一旦存储了引用,该引用就不再由该名称定义。使用它的行不通过名称调用它,而是使用对代码本身的引用来调用它。我添加了符号(按名称)和硬(CODE)引用被使用时的澄清。希望这有所帮助。 - benrifkah