use strict;
use vars qw(@Claim_Fields %Claim_Table);
@Claim_Fields = (
[ 'claim_batch_number', 'N', 'A8' ],
[ 'claim_number', 'N', 'A6' ],
[ 'claim_type', 'L', 'A2'],
[ 'payment_direct', 'N', 'A2'],
);
%Claim_Table = get_table();
####
Main:
{
my $data_file = $ARGV[0];
my $sort_by = $ARGV[1];
open(CLAIMS, $data_file) or die "CANNOT OPEN FILE: $!";
my @claim_records = ();
while () {
push(@claim_records, read_record($_));
}
close(CLAIMS);
####
&Sort_File($sort_by, @claim_records);
}
####
sub Sort_File {
my ($sort_by, @claim_records) = @_;
my $sort_sub;
# If the sorting type is numeric
if ( $Claim_Table{$sort_by} eq 'N' ) {
# Create sub for numeric sort
$sort_sub = sub { $a->{$sort_by} <=> $b->{$sort_by} };
} # End if numeric
# Otherwise it's lexical
else {
# Create sub for lexical sort
$sort_sub = sub { $a->{$sort_by} cmp $b->{$sort_by} };
}
foreach my $record ( sort $sort_sub @claim_records ) {
print STDOUT $record->{'claim_number'}, "\n";
}
}
####
sub read_record {
my ($line) = @_;
my %claim_record = ();
@claim_record{ get_fields() } = unpack( get_template(), $line);
return \%claim_record;
}
##
## Returns all of the field names in @Claim_Fields
##
sub get_fields {
my @fields = ();
foreach my $claim_field ( @Claim_Fields ) {
push(@fields, $claim_field->[0]);
}
return @fields;
}
##
## Builds the template from the template fields in @Claim_Fields
##
sub get_template {
my $template = '';
foreach my $claim_field ( @Claim_Fields ) {
$template .= $claim_field->[2];
}
return $template;
}
##
## Builds a hash table for lookup from @Claim_Fields
##
sub get_table {
my %table = ();
foreach my $claim_field ( @Claim_Fields ) {
$table{$claim_field->[0]} = $claim_field->[1];
}
return %table;
}