I can't test this refactored version of your script because, as toolic pointed out earlier, it's not a complete computer program.
use strict;
use warnings;
use autodie qw( open close );
use English qw( -no_match_vars );
my %households;
my $household;
my $first_name;
my $last_name;
my $voter_rating;
my $support_level;
my $phone_number;
format Household =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$household
==================================
.
format Voter =
@<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<< @<< @<<<<<<<<<<<<
$last_name, $first_name, $voter_rating, $phone_number
.
open my $fh, '>encoding(ISO-8859-1)', 'out.txt';
select $fh;
for $household (sort keys %households) {
local $FORMAT_NAME = 'Household';
write;
for my $member (@{ $households{$household} }) {
$first_name = $member->{first_name};
$last_name = $member->{last_name};
$voter_rating = $member->{voter_rating};
$support_level = $member->{support_level};
$phone_number = $member->{mobile_number} // $member->{phone_n
+umber} // '';
local $FORMAT_NAME = 'Voter';
write;
}
}
close $fh;
exit 0;
Jim