Chris Rogers wrote: > > I am getting a syntax error that I can't seem to resolve. > > The single dimensioned array to be sorted consists of rows that look like > this: > > 105|1156|1|576|VIFAN|1|576|10/24/97|0426|0048|0050|0|0|0|0|01/01/00|12/21/99 > |LCI > > Each record is pipe "|" delimited and the average array holds from 500 to > 2500 records > > Here is a snippet of code that works: > > sub sortarray > { > my $primary = shift; #primary sort field > my $ptype = shift; #0=numeric 1=string > my $secondary = shift; #secondary sort field > my $stype = shift; #0=numeric 1=string > my $terciary = shift; #terciary sort field > my $ttype = shift; #0=numeric 1=string > my @data = @_; > > my @temparray = map {$_->[0] } > sort { > @a_fields = @$a[1..$#$a]; > @b_fields = @$b[1..$#$b]; > > $b_fields[$primary] cmp $a_fields[$primary] > || > $b_fields[$secondary] cmp $a_fields[$secondary] > || > $b_fields[$terciary] cmp $a_fields[$terciary] > } > map { [$_, split /\|/] } @data; > return @temparray; > } > } > > Here's the problem: I'm trying to change the routine so that it can handle > alpha sorting and numeric sorting on the fly. I have tried many different > ways to make this work but I just can't seem to get it right. The following > snippet is the best I've come up with yet but it still produces a syntax > error: > > [snip] > > Any help would be greatly appreciated.
It looks like the numbers in your data are not floating point so this should work although I haven't tested it. It converts integers to strings so that you only have to use the cmp operator. sub sortarray { my $primary = shift; # primary sort field my $ptype = shift; # 0=numeric 1=string my $secondary = shift; # secondary sort field my $stype = shift; # 0=numeric 1=string my $terciary = shift; # terciary sort field my $ttype = shift; # 0=numeric 1=string my @data = @_; return map { $_->[3] } sort { $b->[0] cmp $a->[0] || $b->[1] cmp $a->[1] || $b->[2] cmp $a->[2] } map { my @a = (split/\|/)[$primary,$secondary,$terciary]; $a[0] = pack( 'l', $a[0] ) unless $ptype; $a[1] = pack( 'l', $a[1] ) unless $stype; $a[2] = pack( 'l', $a[2] ) unless $ttype; [ @a, $_ ] } @data; } } John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]