I have a script that generates code which is evalled later on in the script. I had several reasons for this approach.
First, the generated code has several variable regexes, which may change during the life of the script, but not during one execution of the evalled code. For example:
# code to match the stress regex
$eval .= <<" EOT";
next unless /\$stress[$i]/o;
EOT
Second, I'm using conditionals to generate different code, depending on various options:
if (defined $stress[$i]) {
# code to match the stress regex
$eval .= <<" EOT";
next unless /\$stress[$i]/o;
EOT
}
And third, I'm using loops to generate repeated blocks of code:
for (my $i=0; $i<=$#entry; ++$i) {
# ...
if (defined $stress[$i]) {
# code to match the stress regex
$eval .= <<" EOT";
next unless /\$stress[$i]/o;
EOT
}
}
Generating code and then executing it with eval makes the code more efficient; the various conditionals are executed once overall, rather than once per line of input; and the regexes are only compiled once per execution, rather than once per match.
I also have an option that prints the generated code before it is evalled, to aid in debugging.