It's indeed possible to bend the parser in a way that it thinks BEGIN and family are subs
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;
-*- 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_BEG
+IN.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_BEG
+IN.pl line 6.
no_begin(INIT CODE(0x6c8aa0)) called at d:/tmp/pm/KW_simple_regex_BEGI
+N.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?)
But unfortunately does evaling the code not catch parsing errors anymore... (reason here BEGIN{} blocks don't need a trailing semicolon)
so the answer is:
- Yes BEGIN* blocks can be disabled.
- But this is best done in an extra process
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|