#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use Test::More tests => 3;
eval {my $x = bless [], 'one'}; is $@, "";
eval {my $x = bless [], 'two'}; is $@, "";
eval {my $x = bless [], 'three'; die "foo\n";}; is $@, "foo\n";
__END__
1..3
ok 1
ok 2
ok 3
Now we change the code by adding some DESTROY methods - and note that this is the only change in the code.
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use Test::More tests => 3;
eval {my $x = bless [], 'one'}; is $@, "";
eval {my $x = bless [], 'two'}; is $@, "";
eval {my $x = bless [], 'three'; die "foo\n";}; is $@, "foo\n";
sub one::DESTROY {1;}
sub two::DESTROY {$@ = "foo";}
sub three::DESTROY {$@ = "";}
__END__
1..3
ok 1
not ok 2
# Failed test at /tmp/test line 11.
# got: 'foo'
# expected: ''
not ok 3
# Failed test at /tmp/test line 12.
# got: ''
# expected: 'foo
# '
# Looks like you failed 2 tests of 3.
As you can see, after the second eval $@ is set where you don't expect it to be (the eval succeeded), and while the third eval died, $@ is false.
And note that while I did direct assignment to $@ in the DESTROY methods, I could also have used evals in the DESTROY methods to create false positive or negatives. |