use_ok
Test::More のコードをスクロールしていたのは、とrequire_ok
がどのように実装されているか (および Ovid がそれらを好まない理由)を確認したかったからです。サブルーチンにたどり着きました。この_eval
サブルーチンには、呼び出し中に変数を保護するための完全には理解できない特別なロジックが含まれていeval
ます。Try::Tinyのドキュメントから、対処の難しさを理解しています$@
。$!
ただし、 andの処理がわかりません$SIG{__DIE__}
(以下、ブロックをそのままコピー):
# Work around oddities surrounding resetting of $@ by immediately
# storing it.
my( $sigdie, $eval_result, $eval_error );
{
local( $@, $!, $SIG{__DIE__} ); # isolate eval
$eval_result = eval $code; ## no critic (BuiltinFunctions::ProhibitStringyEval)
$eval_error = $@;
$sigdie = $SIG{__DIE__} || undef;
}
# make sure that $code got a chance to set $SIG{__DIE__}
$SIG{__DIE__} = $sigdie if defined $sigdie;
の扱いはRT #34065$SIG{__DIE__}
に関連していますが、まだわかりません。変数は常にブロックの最後の行で設定する必要があるため、最後の行で変数を再度設定する必要があるのはなぜですか? これらの行の要点が、呼び出しで変数を設定することである場合、そもそもなぜローカライズする必要があるのでしょうか?eval
また、eval
エラー変数を上書きせずに使用することが と の両方$@
をローカライズすることを意味する場合$!
、 もローカライズする必要はありません$?
か?