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; }