in reply to Padding search results with context

From your original code, you can scan for duplicates and print at the same time.

my $prev = -1 - $pad; for(@padded_overlap) { if ( $_ > $prev ) { $prev = $_; # print stuff here } }
That eliminates one scan.

Replies are listed 'Best First'.
Re^2: Padding search results with context
by moritz (Cardinal) on Aug 14, 2007 at 06:53 UTC
    Thanks - it's obvious (of course you use the list elements where you construct them), but sometimes I need somebody to point me to the obvious ;-)
      This "one pass" solution is obviously inspired by people like Grandfather, but this is a solution I can understand *^^*:

      #!/usr/bin/perl use warnings; use strict; use List::Util; package main; my $max = 21; my @nums = (1, 5, 6, 8, 15, 20); my $pad = 1; # lines of context on each side my $last = -1 - $pad; foreach ( @nums ) { my $start = List::Util::max 1, $_ - $pad, $last + 1; my $end = List::Util::min $max - 1 , $_ + $pad; next if ( $start > $end ); for ( my $i = $start; $i <= $end; $i++ ) { if ( $i == $_ ) { print "Highlighted $i\n"; } else { print "Line $i\n"; } } $last = $end; }
      The output is:

      C:\Code>perl mintest.pl Highlighted 1 Line 2 Line 4 Highlighted 5 Line 6 Line 7 Highlighted 8 Line 9 Line 14 Highlighted 15 Line 16 Line 19 Highlighted 20