use Text::CSV_XS "csv"; my $hr = csv ( in => "hr.txt", key => "samaccountname", keep_headers => \my @keys, ); my $aoh = csv (in => "ad.txt", bom => 1, on_in => sub { my $sam = $_[1]{samaccountname} or die "No name in AD"; my $ahr = $hr->{$sam}; unless ($ahr) { warn "I got AD data for $sam, not in HR\n"; next; } my @diff = map { [ $_, $ahr->{$_}, $_[1]{$_} ] } grep { $ahr->{$_} ne $_[1]{$_} } @keys; @diff or return; say "Changes for samaccount $sam"; printf " %-22s %-27.27s -> %s\n", @$_ for @diff; });