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:
@list = map { $$_[0] } sort { $$a[1] <=> $$b[1] or $$a[0] cmp $$b[0] } map { /(\d+),/; [$_,$1] } @list;
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 reply to Re: How can I sort my array numerically on part of the string? (updated)
by haukex
in thread How can I sort my array numerically on part of the string?
by misterperl
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |