my %endpoints; $endpoints{ $-[0] } = $+[0] while $chromosome =~ m[(CG.*?AT)]g; #### my %endpoints; $endpoints{ $-[0] - 1 } = $+[0] - $-[0] - 1 while $chromosome =~ m[(CG.*?AT)]g; ... while( my( $begin, $end ) = each %exon_endpoints ) { print substr( $chromosome, $begin, $end ), "\n\n"; } #### my @exons; push @exons, eval "\\substr( \$chromosome, $-[0] - 1, $+[0] - $-[0] - 1 )" while $chromosome =~ m[(CG.*?AT)]g; ... for( @exons ) { print $$_, "\n\n"; }