Perl 闭包和 $_

标签 perl programming-languages closures

我尝试学习一种不熟悉的编程语言的第一件事就是它如何处理闭包。它们的语义通常与语言处理范围和其他各种棘手位的方式交织在一起,因此理解它们可以揭示该语言的其他几个方面。另外,闭包是一种非常强大的构造,并且通常会减少我必须输入的样板文件的数量。所以我在摆弄 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

但我得到了我会记住代码(0x986c1f0)

上述实验表明,$_ 非常依赖于上下文,如果它出现在闭包中,那么它的值在闭包创建时并不是固定的。它的行为更像是一个引用。在 Perl 中创建闭包时我还应该注意哪些其他问题?

最佳答案

闭包仅关闭词法变量; $_ 通常是全局变量。 在 5.10 及更高版本中,您可以说 my $_; 使其在给定范围内成为词法(尽管在 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
  &{$_}();
}

关于Perl 闭包和 $_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665268/

相关文章:

javascript - 如何在 Vim 中启用自动折叠?

php - 在 Linux 上以特权用户身份通过​​ PHP/Perl 脚本运行命令

javascript - 给刚接触 JavaScript 的经验丰富的程序员的建议?

programming-languages - Picasa 是用什么语言编写的?

objective-c - 作为 C 程序员使用闭包(或 block )进行设计的方法

r - 相当于 within(), attach() 等在一个环境中工作?

javascript - FileReader() - 闭包和传递参数的问题

perl - 如何在不使用第三个的情况下交换两个 Perl 变量?

mysql - SQL 插入/更新确实失败,但不调用错误

python - Python语言如何知道标识符的类型?