Ok, try this. It's not guaranteed to work, but it should be
better than trying to brave the multi-line problem from
above.
package LineDebug;
$LOADED = 0;
$insert = qq<print "\\tDEBUG: " . __LINE__ . "\\n";\n>;
sub import {
return if $LOADED++;
my $freq = (@_ == 3 && pop) || 1;
my ($file) = (caller)[1];
my $code;
open PROG, $file;
while (<PROG>) {
$code .= $_;
if ($freq == 1) {
next unless /\S/;
$code =~ s/;\s*\n\z/; $insert/;
}
elsif ($. % $freq == 0) {
if (!/\S/) { $code =~ s/\n\z/; $insert/ }
else { $code =~ s/:;\s*\n\z/; $insert/ }
}
}
close PROG;
# print $code;
eval $code;
exit;
}
1;
It's used like so:
use LineDebug;
# code...
or
use LineDebug freq => 10;
# code...
It will print the line number of the file on every line
ending with a semicolon (THIS IS NOT 100% ACCURATE).
Specifically, it will not do this on blank lines. If you
give it a frequency argument, it will print every X lines,
if that line ends in a semicolon
or is blank.
$_="goto+F.print+chop;\n=yhpaj";F1:eval