私は完全に混乱しています。ここに私のコードは次のとおりです。なぜ両方のブランチが実行されているようですか?
use strict;
use warnings;
use Test::More;
subtest 'huh?' => sub {
my $i = 0;
eval {
$i++;
} || do {
$i++;
};
is($i, 1, "only execute one branch (i: $i)");
};
&done_testing();
そしてここでは、私のテスト出力は(のActivePerl 5.12、マックOS Xを実行した場合)です。
not ok 1 - only execute one branch (i: 2)
# Failed test 'only execute one branch (i: 2)'
# at test.pl line 14.
# got: '2'
# expected: '1'
1..1
# Looks like you failed 1 test of 1.
not ok 1 - huh?
# Failed test 'huh?'
# at test.pl line 15.
1..1
# Looks like you failed 1 test of 1.
ここで何が起こっていますか?私は何もしていないので、最初のブランチだけを実行することを期待しましたdie
s。しかし、両方のブランチが実行されたように見えます。
ああ、例外をトラップするために 'eval'を使用する場合、' eval'の内部に例外がスローされなかった場合、必ず真の値を返すようにしてください。 –
@MattFenwick、あなたが '||'または 'or'で戻り値をテストしようとしているのなら、うまくいきます。私は私の答えを更新するつもりです。 – Axeman
バグを修正する前にperlのバージョンで実行している場合、 '$ @'が 'DESTROY'ブロックでクリアされてから' if $ @ 'ステートメントが実行される可能性があります。 'eval {...; 1} or croak ... 'はそのバグに苦しまない。 –