![]() |
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| quick sed question | vbm | Shell Programming and Scripting | 2 | 11-09-2006 10:44 PM |
| Ok quick question | Corrail | Shell Programming and Scripting | 1 | 11-11-2005 01:49 PM |
| Quick perl question | jason_v | Shell Programming and Scripting | 7 | 11-26-2003 04:31 AM |
| Quick Question | catbad | UNIX for Dummies Questions & Answers | 7 | 03-25-2003 07:01 PM |
| Quick Question | Tracy Hunt | UNIX for Dummies Questions & Answers | 3 | 02-20-2001 04:20 PM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
[B]Perl sort quick question[/B]
I've done a quick Google about this, but could not find the answer I want.
Say, there is an array like this: @A = qw(cd1 a1 ef a2 hij a12 b2 b4 b22); I want to sort the array in the first order: @sorted = qw(a1 a12 a2 b2 b22 b4 cd1 ef hij); And second order: @sorted = qw(a1 a2 a12 b2 b4 b22 cd1 ef hij); Is there a way to do this in Perl without using modules? Thanks a lot! Last edited by zx1106; 10-09-2008 at 01:44 PM.. |
|
||||
|
Yes, you can sort with a custom rule. But what exactly is the rule for the sort? If you cannot work out a formal specification of the sort, no one will be able to do it "correctly".
The following gives the same ordering as you mentioned, but there is no guarantee that it is going to give you the "correct" ordering (as you might expect) for other input values: Code:
use Data::Dumper;
@A = qw(cd1 a1 ef a2 hij a12 b2 b4 b22);
print Dumper([sort {
my ($_a, $_b);
for ([$a, \$_a], [$b, \$_b]) {
$_->[0] =~ /^(.+?)(\d*)$/;
${$_->[1]} = [$1, $2];
}
($$_a[0] cmp $$_b[0]) || ($$_a[1] <=> $$_b[1]);
} @A]);
|
|
||||
|
Second order which appears to be first sort by alpha then digit:
Code:
my @A = qw(cd1 a1 ef a2 hij a12 b2 b4 b22);
my @sorted = map{$_->[2]}
sort{$a->[0] cmp $b->[0] || $a->[1] <=> $b->[1]}
map{/([a-z]*)(\d*)/;[$1,$2,$_]} @A;
print "$_\n" for @sorted;
|
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|