in reply to Condensing a grep into a sort

It is not reasonable to have a sort that excludes members of the list entirely. Sort rearranges lists; grep filters them.

What you might want to do is a Schwartzian Transform so that the regex doesn't need to be applied to $a and $b repeatedly.

print map {"$_->[0]\n"} sort {$a->[1] <=> $b->[1]} map { [$_, (/C(\d*)/)[0]] } grep { /P/} @compounds;
Hoping for partial credit, I eliminated the join.

Caution: Contents may have been coded under pressure.