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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...