in reply to How can I sort my array numerically on part of the string?
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] }.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: How can I sort my array numerically on part of the string? (updated)
by LanX (Saint) on Dec 02, 2020 at 02:09 UTC | |
by tybalt89 (Monsignor) on Dec 02, 2020 at 03:17 UTC | |
by LanX (Saint) on Dec 02, 2020 at 11:06 UTC | |
by misterperl (Friar) on Dec 02, 2020 at 13:44 UTC | |
by misterperl (Friar) on Dec 02, 2020 at 13:24 UTC | |
by LanX (Saint) on Dec 02, 2020 at 13:41 UTC | |
by Anonymous Monk on Dec 02, 2020 at 13:26 UTC |