Sorting data by any field of the table.
#!/usr/perl/bin/perl -w

use strict;
use CGI;

my $Style =<<STYLE;
<!--
     .header{background:#6BDBF7;}
     .a{background:#D0F2FA;}
     .b{background:#E0F6FB;}
     a{text-decoration:none;color:#000000;}
-->
STYLE

my $cgi = new CGI;
my @employee = qw(ID FNAME LNAME TITLE E-Mail);
my %employee = (
    '1087' => [ qw( Anatoliy Urbanskiy 77 ana@yahoo.com ) ],
    '1032' => [ qw( Frederik Amstrong 12 fred@earthlink.net ) ],
    '1112' => [ qw( Ivan Mazepa 10 ivan@hotmail.com ) ],
);
my %descriptor = (
    FNAME => '0',
    LNAME => '1',
    TITLE => '2',
    EMAIL => '3', );
my %title = (
    1  => 'COO',
    10 => 'COT',
    12 => 'Manager',
    77 => 'Software engineer',
);
my $class = "a";
print $cgi->header(),
	  $cgi->start_html(-title=>'Employee Info',
			           -style=>{-code=>$Style},);
my $sort   = $cgi->param('sort');
my $script = $cgi->script_name();

print qq(<FORM method="POST" action="$script">
	<TABLE border="1" cellpadding="2" cellspacing="1" width=80%>
	<TR class="header">);
for ( @employee ) {
	print qq(<TD align="center"><B>
		<A HREF="$script?sort=$_">$_</A></B></TD>);
}
print qq(</TR>);
for ( sort { my_sort($_) } keys %employee )
{
    print qq(<TR class="$class">
        <TD>$_</TD>
        <TD>$employee{$_}[ $descriptor{'FNAME'} ]</TD>
        <TD>$employee{$_}[$descriptor{'LNAME'}]</TD>
        <TD>$title{$employee{$_}[ $descriptor{'TITLE'} ]}</TD>
        <TD>$employee{$_}[ $descriptor{'EMAIL'} ]</TD>
    </TR>);
	$class = ($class eq "a" ? "b" : "a");
}
print qq(</TABLE></FORM>);
print $cgi->end_html();
exit(0);
#-----------------------------------------------------
sub my_sort
#-----------------------------------------------------
{
    my $field = $cgi->param('sort') || 'LNAME';
    if ( $field eq 'ID' ) {
        return $a <=> $b;
    }
    elsif ( $field eq 'TITLE' ) {
        return lc($title{ $employee{$a}[$descriptor{$field}] })
               cmp
               lc($title{ $employee{$b}[$descriptor{$field}] })
            ||
               lc($employee{$a}[$descriptor{'LNAME'}])
               cmp
               lc($employee{$b}[$descriptor{'LNAME'}]);
    }
    else {
        return lc($employee{$a}[$descriptor{$field}])
               cmp
               lc($employee{$b}[$descriptor{$field}]);
    }
}
SEE OUTPUT