在一个不熟悉的编程语言中,我尝试学习的第一件事是它如何处理闭包。它们的语义常常与语言处理作用域和其他各种棘手的部分相互交织,因此理解它们可以揭示语言的其他几个方面。此外,闭包是一种非常强大的结构,通常可以减少我需要输入的模板代码量。所以我正在尝试使用Perl闭包时,偶然发现了一个小问题:
my @closures;
foreach (1..3) {
# create some closures
push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
# call the closures to see what they remember
# the result is not obvious
&{$_}();
}
当我编写上面的代码时,我原本期望看到
I will remember 1
I will remember 2
I will remember 3
但是我得到的是I will remember CODE(0x986c1f0)
。
上述实验揭示了$_
非常依赖上下文环境,如果它出现在闭包中,则其值在创建闭包的时候并没有被固定。它更像是一个引用。在perl创建闭包时还应该注意哪些问题?
foreach my $num ...
几乎相同。 - David K.$_
一样使用调用站点可用的值? - David K.&$_() for @closures
或for (@closures) { $_->() }
的方式。:) 另一方面,既然没有参数,那么在这里只使用普通的&$_
就足够了。 - tchrist