微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl关闭和$_

我尝试用不熟悉的编程语言学习的第一件事是如何处理闭包。他们的语义通常与语言处理范围和各种其他棘手的位相互交织在一起,因此理解它们会显示语言的其他几个方面。此外,关闭一个非常强大的结构,经常减少我必须键入的样板数量。所以我正在围绕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中这被追溯地声明为实验性的,可能会发生变化,所以更好地使用一些其他的变量名)。

这产生您预期的输出

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
  &{$_}();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐