1

use_okTest::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エラー変数を上書きせずに使用することが と の両方$@をローカライズすることを意味する場合$!、 もローカライズする必要はありません$?か?

4

1 に答える 1