Documentation proof that local
ized variables are the issue here is in perlvar
of 5.14.0:
These variables are read-only and dynamically-scoped, unless we note otherwise.
The dynamic nature of the regular expression variables means that their value is limited to the block that they are in [...]
Note that this bit of documentation is absent from the 5.12.4 perldoc.
The problem is local
ized variables. My copy of perldoc -f eval
(5.12.4) has this to say:
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: [...]
The manpage doesn't make an explicit statement for all such special global variables (like $1
, $&
, and probably others), but block localization and subsequent restoration is what appears to happen here.
The variables are assigned to inside the eval
and the original values are restored once the eval
block is left.
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;
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…