local
化された変数がここで問題であるというドキュメントの証拠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;