#!./perl print "1..12\n"; my $test_num = 0; sub ok { print $_[0] ? "" : "not ", "ok ", ++$test_num, "\n"; } { package End; sub DESTROY { $_[0]->() } sub main::end(&) { my($cleanup) = @_; return bless(sub { $cleanup->() }, "End"); } } my($val, $err); $@ = "t0\n"; $val = eval { $@ = "t1\n"; 1; }; $err = $@; ok $val == 1; ok $err eq ""; $@ = "t0\n"; $val = eval { $@ = "t1\n"; do { die "t3\n"; }; 1; }; $err = $@; ok !defined($val); ok $err eq "t3\n"; $@ = "t0\n"; $val = eval { $@ = "t1\n"; local $@ = "t2\n"; 1; }; $err = $@; ok $val == 1; ok $err eq ""; $@ = "t0\n"; $val = eval { $@ = "t1\n"; local $@ = "t2\n"; do { die "t3\n"; }; 1; }; $err = $@; ok !defined($val); ok $err eq "t3\n"; $@ = "t0\n"; $val = eval { $@ = "t1\n"; my $c = end { $@ = "t2\n"; }; 1; }; $err = $@; ok $val == 1; ok $err eq ""; $@ = "t0\n"; $val = eval { $@ = "t1\n"; my $c = end { $@ = "t2\n"; }; do { die "t3\n"; }; 1; }; $err = $@; ok !defined($val); ok $err eq "t3\n"; 1;