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