in reply to Condensing a grep into a sort

Your code is clever, and perhaps a bit too clever in the sort{}. This $a =~ /C(\d*)/)[0] generates an intermediate var with the result of the slice. That var will be generated even if we don't give it a name. I would argue to give it a name as that has no run time consequence.

To answer your question re: grep line, see below...just one or 2 chars. /P/ or /P$/. The $ gives the regex engine a clue that the last letter must be 'P'. This construct will run very quickly.

I give kudos to your algorithm. Most of the lines don't have things of interest and you filter to get the lines that are of interest (the ones that end in P). There are fancy sort methods, but if you can select only the lines that have meaning, there is less to sort!

I think something straightforward like this will run well.

#!/usr/bin/perl -w use strict; my @compounds=("C3H8O2", "C6H10O5", "C36H62O31", "C5H16N2", "C10H11N5O6P", "C9H11N3O7P", "C3H9N2O2"); print join("\n", sort{ my ($num_A) = ($a =~ /^C(\d+)/); my ($num_B) = ($b =~ /^C(\d+)/); $num_A <=> $num_B } grep { /P$/ } #could be just /P/? @compounds),"\n"; __END__ C9H11N3O7P C10H11N5O6P