in reply to subroutine passing array as named parameter

In this case you could also use shift:

my $args = shift

This method I think makes the subroutines more readable. As well as preventing the problem that you ran into on that line.

Another thing which could be done is:

my $args = {@_};

Then just pass in the hash as an array

@record = validate_record_length(record => \@record, recl => '18');