perl闭包和regexp变量

Kar*_*lek 4 perl

我在perl的闭包和$1regexp变量中发现了一个可能的错误.简单地说,它们不会混合在一起.

我们来看看这段代码.

use warnings;

while ("1234567890"=~/(.)/sg) {
    push @subs, sub{print $1;};
}

for (@subs) {$_->()}
Run Code Online (Sandbox Code Playgroud)

您可以想象perl现在将打印所有数字 - 相反,我从undefined得到了10个警告$1.

它真的是一个错误,还是我错过了perl文档中的某些内容?是否有某些原因,为什么应该$1是未定义的而不是关闭的一部分?

Eri*_*rom 8

Perl有两个独立但基本兼容的可变系统.符号表中的全局变量,以及范围绑定词法填充的词法变量.

全局变量可以是符号解除引用的目标,并且受动态范围限制local.my可以关闭词汇变量(定义为).

正则表达式匹配变量(以及所有Perl的其他特殊变量)是符号表中的全局变量,因此无法关闭它们.

要解决此问题,只需将值复制到词法中:

use warnings;

while ("1234567890"=~/(.)/sg) {
    my $x = $1;                # creates a new lexical that the sub closes over
    push @subs, sub{print $x;};
}

for (@subs) {$_->()}
Run Code Online (Sandbox Code Playgroud)


Nyl*_*ile 7

我认为答案类似于perl闭包和$ _的答案.$1也是一个全局变量.

你需要做的是:

my $x = $1;
push @subs, sub{print $x;};
Run Code Online (Sandbox Code Playgroud)