#!/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; } #### B23168=AOL,ABC permitted_mac_attempts=1,DEF B23167=Carphone Warehouse TalkTalk,23 B23163=Orange,Red,Blue,Green,White,Black B23970=O2 APPLE=FRITTER #### B23168=AOL,ABC,DEF,EFG permitted_mac_attempts=1,DEF,34,4 B23167=Carphone Warehouse TalkTalk,23,5,6 B23163=Orange,Red,Blue,Green,Yellow B23970=O2,56 PONY=EARTH #### $ perl 1119397.pl APPLE Values added : Values removed : FRITTER Values retained: B23163 Values added : Yellow Values removed : Black, White Values retained: Blue, Green, Orange, Red B23167 Values added : 5, 6 Values removed : Values retained: 23, Carphone Warehouse TalkTalk B23168 Values added : DEF, EFG Values removed : Values retained: ABC, AOL B23970 Values added : 56 Values removed : Values retained: O2 PONY Values added : EARTH Values removed : Values retained: permitted_mac_attempts Values added : 34, 4 Values removed : Values retained: 1, DEF $