use strict; use warnings; my %ordered; for () { chomp; my ($left,$right) = split /_/, $_, 2; push @{ $ordered{$left} }, $right; } my @matches; for my $key (sort keys %ordered) { my $last = 0; for (sort @{ $ordered{$key} } ) { push @matches, "${key}_$last","${key}_$_" if $_ - $last == 1; $last = $_; } } my %seen; for (@matches) { print "$_\n" unless $seen{$_}++; } __DATA__ X_203 2L_33 3L_45 X_202 2L_34 X_204 2L_32 3L_87 3L_88