in reply to Re^3: $. - smarter than you might think
in thread $. - smarter than you might think
Ok, I played with your code and came up with a modification of my own:
local $SIG{__DIE__} = sub { my ($d) = ( $_[0] =~ /line (\d+)\.$/ ); unless ($d) { print STDERR $_[0]; return; } my $context = 3; #number of context lines seek DATA,0,0; while(<DATA>) { next if $. < ($d-$context); #cycle until context starts warn ($. == $d ? '>' : ' ') #mark line if it contains the error .sprintf('%4d ',$.) #use 4-place line numbers (alignment) .$_; #show code on line last if $. > ($d+$context); #move on once we've finished context } };
The actual run-time efficiency on long code will be helped by the last if.. line: there's no reason to keep doing I/O once your context has been exhausted.
The other modifications are largely maintenance-minded:
I also fixed one potential bug in your regex: you would have matched any 'line \d+' in the string -- I could break your code by die('I had a problem reading the data file at line 12'). You'd see the context of your code around line 12, but the relevant code might be around line 60 or something. The new regex takes the match at the end of the message.
Updates:
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: $. - smarter than you might think
by shmem (Chancellor) on Jun 26, 2006 at 16:23 UTC |