我尝试用不熟悉的编程语言学习的第一件事是如何处理闭包。他们的语义通常与语言处理范围和各种其他棘手的位相互交织在一起,因此理解它们会显示语言的其他几个方面。此外,关闭是一个非常强大的结构,经常减少我必须键入的样板数量。所以我正在围绕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
而是我会记得CODE(0x986c1f0)。
上面的实验表明,$ _非常依赖于上下文,如果它出现在一个闭包中,那么它的值在闭包创建的时候不是固定的。它的行为更像一个参考。在perl中创建闭包时,还应该注意什么其他问题?
解决方法
闭包仅靠近词汇变量; $ _通常是一个全局变量。
在5.10以上,你可以说我的$ _;在给定的范围内具有词法(尽管在5.18中这被追溯地声明为实验性的,可能会发生变化,所以更好地使用一些其他的变量名)。
在5.10以上,你可以说我的$ _;在给定的范围内具有词法(尽管在5.18中这被追溯地声明为实验性的,可能会发生变化,所以更好地使用一些其他的变量名)。
这产生您预期的输出:
use strict; use warnings; use 5.010; my @closures; foreach my $_ (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 &{$_}(); }