use strict; use warnings; use Data::Comparator qw(data_comparator); use Data::Dumper; my $file1 = <) { chomp; if (/ ^ Cell: \s+ (.*) /x) { $cell = $1; } else { my @ports = split; push @{ $lib1{$cell} }, \@ports; } } my %lib2; open $fh, '<', \$file2 or die "Can not open file: $!"; while (<$fh>) { chomp; if (/ ^ Cell: \s+ (.*) /x) { $cell = $1; } else { my @ports = split; push @{ $lib2{$cell} }, \@ports; } } my $diff = data_comparator(\%lib1, \%lib2); print Dumper($diff) unless ($diff->is_empty()); __END__ $VAR1 = bless( { 'AND1' => bless( [ bless( [ bless( do{\(my $o = 'A')}, 'Data::Differences' ), bless( do{\(my $o = 'B')}, 'Data::Differences' ) ], 'Data::Differences' ) ], 'Data::Differences' ), 'INV2' => bless( do{\(my $o = [ [ 'A', 'Z' ] ])}, 'Data::Differences' ) }, 'Data::Differences' );