$ perl -le 'eval q{ print ++$x }; eval q{ print ++$x }' 1 2 #### CHAIN<%=$chain_num%>_EN [<%=$lsb%>:<%=$lsb++%>] = 1'h0; <% use File::Spec::Functions qw/catfile/ %> #### <%$lsb++%> <% for my $x (0..2) { %> Hello, World Nr. <%=$x%> (LSB=<%=$lsb%>) <% } warn "test warning" %> $this is not $Perl <% # note catfile() not available here %> #### #!/usr/bin/env perl use warnings; use strict; use feature qw/say state/; use Data::Dumper; use Capture::Tiny qw/capture_stdout/; my $DEBUG = 0; for my $filename (@ARGV) { open my $fh, '<', $filename or die "$filename: $!"; my $input = do { local $/; <$fh> }; # slurp close $fh; my $code = translate($input); $DEBUG and say ">>>>> Generated Code:\n", $code, "<<<<<"; # execute my ($output, $rv) = capture_stdout { eval $code }; $rv or die "eval failed: ".($@//'unknown error'); say ">>>>> Output:\n", $output, "<<<<<"; } sub translate { my ($input) = @_; state $packcnt = 1; my $pack = "Generated".$packcnt++; my $output = "{ package $pack;\n"; $output.= "no warnings; no strict;\n"; $output.= "#line 1 \"$pack\"\n"; while ($input=~/(.*?)<%/sgc) { $output.= "print ".perlstr($1).";\n" if length($1); $input=~/(.*?)%>\n?/sgc or die "couldn't find %>"; my $code = $1; $code =~ s/^=/print /; $code .= ";" unless $code=~/;\s*$/; $output.= "$code\n"; } my $str = substr $input, pos($input)//0; $output.= "print ".perlstr($str).";\n" if length($str); $output.= "} # end package $pack\n1;\n"; return $output; } sub perlstr { Data::Dumper->new([''.shift]) ->Terse(1)->Indent(0)->Useqq(1)->Dump } #### >>>>> Output: CHAIN_EN [:0] = 1'h0; <<<<< test warning at Generated2 line 8. >>>>> Output: Hello, World Nr. 0 (LSB=1) Hello, World Nr. 1 (LSB=1) Hello, World Nr. 2 (LSB=1) $this is not $Perl <<<<<