note
LanX
It's indeed possible to bend the parser in a way that it thinks BEGIN and family are subs<P>
<c>
use strict;
use warnings;
use Keyword::Simple;
sub no_begin ($&){
warn "no_begin(@_) called";
}
my @code;
BEGIN{
my @compile_blocks = qw(BEGIN UNITCHECK CHECK INIT END);
for my $block (@compile_blocks) {
# bend parser
Keyword::Simple::define $block, sub {
my ($ref) = @_;
substr($$ref, 0, 0) = "no_begin '$block', sub";
};
# test code
push @code , <<__CODE__;
$block { die "owened by $block" }
__CODE__
}
}
BEGIN { die "owened by BEGIN" };
UNITCHECK { die "owened by UNITCHECK" };
CHECK { die "owened by CHECK" };
INIT { die "owened by INIT" };
END { die "owened by END" };
eval join "\n", @code;
</c><P>
<blockquote><i>
<c>
-*- mode: compilation; default-directory: "d:/tmp/pm/" -*-
Compilation started at Wed Oct 6 19:04:01
C:/Strawberry/perl/bin\perl.exe -w d:/tmp/pm/KW_simple_regex_BEGIN.pl
no_begin(BEGIN CODE(0x694268)) called at d:/tmp/pm/KW_simple_regex_BEGIN.pl line 6.
no_begin(UNITCHECK CODE(0x6556d0)) called at d:/tmp/pm/KW_simple_regex_BEGIN.pl line 6.
no_begin(CHECK CODE(0x6942b0)) called at d:/tmp/pm/KW_simple_regex_BEGIN.pl line 6.
no_begin(INIT CODE(0x6c8aa0)) called at d:/tmp/pm/KW_simple_regex_BEGIN.pl line 6.
no_begin(END CODE(0x6c8c38)) called at d:/tmp/pm/KW_simple_regex_BEGIN.pl line 6.
Bareword found where operator expected at (eval 5) line 5, near "}
CHECK"
(Missing operator before CHECK?)
</c>
</i></blockquote><P>
But unfortunately does evaling the code not catch parsing errors anymore... (reason here BEGIN{} blocks don't need a trailing semicolon)<P>
so the answer is:
<UL>
<LI> Yes BEGIN* blocks can be disabled.
<LI> But this is best done in an extra process
</UL>
<div class="pmsig"><div class="pmsig-708738">
<!--nowiki--><p>Cheers Rolf<br>
<sub>(addicted to the Perl Programming Language :)
<br> <i> [id://1153804|Wikisyntax for the Monastery]</i>
</sub>
<!--nowiki-->
</div></div>
<!-- Wiki2Monks {"version":1.161} -->
11137258
11137268