Welcome to the Monastery | |
PerlMonks |
Re: How can I sort my array numerically on part of the string? (updated)by haukex (Archbishop) |
on Dec 01, 2020 at 17:10 UTC ( [id://11124463]=note: print w/replies, xml ) | Need Help?? |
How about sort { ($a=~/(\d+),/)[0] <=> ($b=~/(\d+),/)[0] or $a cmp $b } @list? (see also return values of regular expressions) Though a Schwartzian transform would be much more performant:
Note I added the or cmp so that if the numeric parts are equal (e.g. '1,cat' vs. '001,elk'), the list is still reliably sorted. Update: The above doesn't handle cases of the regex not matching. In my second piece of code above you could handle that with an error via e.g. map { /(\d+),/ or die $_; [$_,$1] } or a replacement value via e.g. map { [$_, /(\d+),/ ? $1 : 0] }.
In Section
Seekers of Perl Wisdom
|
|