use B;
@{; eval { B::end_av->object_2svref } || [] } = ();
Я думал, что есть модуль Devel ::, который также позволяет вам это делать, но я не могу сейчас его найти.
Конечно, вы не можете делать это безопасно, если используете произвольные модули, которые могут использовать блоки END для своих собственных целей ...
(редактирование с помощью OP) Вы можете получить контроль над блоками END с помощью B::end_av
. В качестве подтверждения концепции:
END { print "This is the first end block.\n"; }
my $END_block_2_line = __LINE__ + 1;
END { print "This is the second end block.\n"; }
END { print "This is the third end block.\n" }
sub disable_specific_END_block {
use B;
my ($file, $line) = @_;
eval {
my @ENDs = B::end_av->ARRAY;
for (my $i=$#ENDs; $i>=0; $i--) {
my $cv = $ENDs[$i];
if ($cv->START->file eq $file && $cv->START->line == $line) {
splice @{B::end_av->object_2svref}, $i, 1;
}
}
};
}
disable_specific_END_block(__FILE__, $END_block_2_line);
$ perl endblocks.pl
This is the third end block.
This is the first end block.
Обычно что-то вроде этого было бы излишним для того, что мне нужно, но я вижу некоторые случаи, когда это пригодится.