#!/usr/bin/perl use strict; use warnings; use feature qw/say/; use List::Compare; use List::AllUtils qw/uniq/; sub parse_file($) { my ($filename) = @_; open my $filehandle, "<", $filename or die "Could not open $filename: $!"; my %parsed = (); while(<$filehandle>) { chomp; my ($key, $values) = split "=", $_, 2; my @values = split ",", $values; $parsed{$key} = \@values; } return \%parsed; } my %parsed_file1 = %{ parse_file "File1" }; my %parsed_file2 = %{ parse_file "File2" }; foreach my $key (sort { $a cmp $b } uniq (keys %parsed_file1, keys %parsed_file2)) { my $listcompare = List::Compare->new($parsed_file1{$key} // [], $parsed_file2{$key} // []); my @added_values = $listcompare->get_Ronly; my @removed_values = $listcompare->get_Lonly; my @retained_values = $listcompare->get_intersection; say $key; say "\tValues added : ", join ", ", @added_values; say "\tValues removed : ", join ", ", @removed_values; say "\tValues retained: ", join ", ", @retained_values; }