<?xml version="1.0" encoding="windows-1252"?>
<node id="123528" title="Re: Re: Re: How do I create a sort sub on-the-fly?" created="2001-11-06 06:12:13" updated="2005-07-19 14:08:11">
<type id="11">
note</type>
<author id="85412">
CharlesClarkson</author>
<data>
<field name="doctext">
&lt;P&gt;Thanks to [blakem] and [mirod] my code looks like this.&lt;/P&gt;
&lt;CODE&gt;
#!/usr/bin/perl
use strict;
use diagnostics;
use Time::Local;

my (@records, @report);
{
    my $data_file = 'test.dat';
    open my $fh, $data_file or die "Can't open $data_file: $!";
        while (&lt;$fh&gt;) {
            # skip blank and commented lines
            next if /^\s*#/;
            next if /^\s*$/;

            chomp;

            # We'll look for lines that describe a report:
            if (/report:\s+sort\s+(\S*)/ )  {
                @report = split /,/, $1;
            } else {
                push @records, [split /,/];
            }
        }
}
my %field = (   source  =&gt; 0,
                time    =&gt; 1,
                sip     =&gt; 2,
                sport   =&gt; 3,
                dip     =&gt; 4,
                dport   =&gt; 5,
                hits    =&gt; 6,
                acl     =&gt; 7,
                lnum    =&gt; 8
                );

my (@sort_sub, @sort_description);

# Here is where we do the sub building
foreach (@report) {
    my ($name, $order) = split /-/;
    my $cmp = $name =~ /source|time/ ? 'cmp' : '&lt;=&gt;';
    if ($order eq 'd') {
        push @sort_sub,
            qq|\@\$::b[$field{$name}] $cmp \@\$::a[$field{$name}]|;
        push @sort_description, qq|$name:\t\tdescending|;
    } else {
        push @sort_sub,
            qq|\@\$::a[$field{$name}] $cmp \@\$::b[$field{$name}]|;
        push @sort_description, qq|$name:\t\tascending|;
    }
}

# require 'sort.pl'; # created with begin

my $date    = localtime;
$date       =~ s/ /-/g;

### store report data in file
my $report_file_name = 'out.txt';
open my $fh, '&gt;', $report_file_name
        or die "Can't Open $report_file_name: $!";
    print $fh
        qq|\t\tREQUEST FOR SORTING\n\n|,
        sort_description(), "\n\n",
        qq|FILE WAS GENERATED ON:  $date \n\n|;

    my $sort = column_sort(\@sort_sub);
    print $fh (join ',', @$_), "\n" for sort $sort @records;

sub column_sort {
    my $ref = shift;
    my $sort_sub = join " || ", @$ref;
    return eval "sub { $sort_sub }";
}
sub sort_description {
    return join "\n", @sort_description;
}

__END__
&lt;/CODE&gt;
&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;
Thanks for the help,&lt;BR&gt;
Charles K. Clarkson&lt;BR&gt;

</field>
<field name="root_node">
122757</field>
<field name="parent_node">
122781</field>
</data>
</node>
