Я смог добраться до этого короткого кода после серьезной отладки на работе с очень неясной ошибкой в проекте. Звонок, который не умирал.
Проблема возникает только при вызове script.pl
. Если вы вызываете Class_A
напрямую, то вызов die
будет успешным.
Нам нужны три файла:
Файл 1: script.pl
use strict;
use warnings;
use lib '.';
use Class_A;
# This should not execute. Class_A should die at loading time
print "We shouldn't get here. Class_A shoud not load and die.\n";
Файл 2: Class_A.pm
package Class_A;
use strict;
use warnings;
use Class_B;
# This code SHOULD die:
my $p = Class_B->new;
$p->do_something->die_now;
1;
Файл 3: Class_B.pm
package Class_B;
use strict;
use warnings;
sub new {
my $class = shift;
bless {}, $class;
}
sub do_something {
my $self = shift;
}
sub die_now {
die "No soup for you!";
}
sub DESTROY {
eval {
1;
};
}
1;
Обратите внимание на связанный вызов at Class_A.pm line 8
? Ну а если развязать, то код успешно умирает. :-|
# This works. There should be no difference.
$p->do_something;
$p->die_now;
И последним сюрпризом было узнать, что просто удалив вызов eval at Class_B.pm line 19
, все работает, как и ожидалось, и скрипт умирает.
У меня была возможность проверить это в Perl 5.22.2
, Perl 5.26.1
и Perl 5.32.0
. Еще один удивительный сюрприз: эта проблема возникает не только на 5.32.0
.
Серьёзно, ВТ*? Любые мысли о том, что здесь происходит?
.
не является каталогом сценария. Используйтеuse FindBin qw( $RealBin ); use lib $RealBin;
. - person ikegami   schedule 14.08.2020