# Some example data... my @curr = ( { node => 'Alice', link => 'A to B', load => 20, }, { node => 'Alice', link => 'A to C', load => 24, }, { node => 'Bob', link => 'B to C', load => 12, }, { node => 'Bob', link => 'B to A', load => 3, }, { node => 'Carol', link => 'C to A', load => 14, }, { node => 'Carol', link => 'C to B', load => 7, }, ); my @prev = ( { node => 'Alice', link => 'A to B', load => 20, }, { node => 'Alice', link => 'A to C', load => 24, }, { node => 'Bob', link => 'B to C', load => 15, }, { node => 'Bob', link => 'B to A', load => 3, }, { node => 'Carol', link => 'C to A', load => 12, }, { node => 'Carol', link => 'C to B', load => 3, }, ); # Transform to a hash. This happens in roughly O(n) time. my %hash; $hash{"$_->{node}|$_->{link}"} = +{%$_} for @curr; $hash{"$_->{node}|$_->{link}"}{prev_load} = $_->{load} for @prev; # Again, looping through the hash values is roughly O(n). for (values %hash) { printf "Node '%s', link '%s': previously %d, currently %d.\n", $_->{node}, $_->{link}, $_->{prev_load}, $_->{load}, unless $_->{load} == $_->{prev_load}; }