my @compounds = qw( C3H8O2 C6H10O5 C36H62O31 C5H16N2 C10H11N5O6P C9H11N3O7P C3H9N2O2 ); print map "$_\n", sort { ( $a =~ /C(\d+)/ )[ 0 ] <=> ( $b =~ /C(\d+)/ )[ 0 ] } grep /P/, @compounds; #### my @compounds = qw( C3H8O2 C6H10O5 C36H62O31 C5H16N2 C10H11N5O6P C9H11N3O7P C3H9N2O2 ); print map "$_->[0]\n", sort { $a->[ 1 ] <=> $b->[ 1 ] } map /P/ ? [ $_, /C(\d+)/ ] : (), @compounds;