use warnings; use strict; use Set::IntSpan; my %color; while () { push @{$color{$1}}, $. if /\sbgcolor="([^"]+)"/; } for (sort keys %color) { my $span = Set::IntSpan->new(@{$color{$_}}); print "$_: ", $span->run_list, "\n"; } __DATA__ #### green: 6-10,15-16 white: 1-5,11-14,17-19