in reply to Including files
You probably want to fix this:
my $code = join( "\n", qq[#line 1 "$filename"], File::Slurp::read_file($filename) );
You provide list context to read_file, only to then glue all the lines back together anyway. Except that you didn't chomp them, so joining with \n doubles all EOLs which throws off your line numbers. You want a simple concatenation instead.
my $code = qq[#line 1 "$filename"\n] . File::Slurp::read_file($filenam +e);
Very nice work on the node.
Makeshifts last the longest.