文档证明local
ized 变量是这里的问题在perlvar
5.14.0 中:
除非我们另有说明,否则这些变量是只读的和动态范围的。
正则表达式变量的动态特性意味着它们的值仅限于它们所在的块 [...]
请注意,5.12.4 perldoc 中没有这部分文档。
问题是local
化变量。perldoc -f eval
我的(5.12.4)副本有这样的说法:
The assignment to $@ occurs before restoration of localised
variables, which means a temporary is required if you want to
mask some but not all errors: [...]
联机帮助页并未对所有此类特殊全局变量(如 、 和可能的其他变量)做出明确声明$1
,$&
但此处似乎发生了块本地化和随后的恢复。
变量被分配到内部,一旦离开块eval
,原始值就会恢复。eval
use strict; use warnings;
use Test::More;
use constant V => 'hello';
$_ = V;
note '*** block eval';
eval {
is $_, V, 'input ok';
/(.*)/;
is $&, V, 'in eval'; is $1, V, 'in eval';
};
is $&, V, 'after eval'; is $1, V, 'after eval';
note '*** without eval';
is $_, V, 'input ok';
/(.*)/;
is $&, V; is $1, V;
done_testing;