#!/usr/bin/perl -w use strict; use Data::Dumper; my@all = qw(bob@foo.com joe@foo.com jane@foo.com); my %dlists = ( 'listA' =>[ qw (bob@foo.com jane@foo.com joe@foo.com) ], 'listB' =>[ qw (bob@foo.com)], 'listC' =>[ qw (bob@foo.com joe@foo.com jane@foo.com billy@foo.com)], ); foreach my $dlist (keys %dlists) { my ($subset, @extra) = is_array_subset(\@all, \@{$dlists{$dlist}}); if ($subset) { print "$dlist contains all users "; if (@extra) { print "and ".@extra." additional addresses\n"; } else { print "\n"; } } } sub is_array_subset #returns (yes|no status, @extra) { my ($ref_all, $ref_dlist) = @_; my %dlist = map{$_ => 0 }@$ref_dlist; foreach (@$ref_all) { return (0, ()) if !exists($dlist{$_}); #give up! not subset $dlist{$_}++; } my @extra = (); #is subset, now see if any "extra's" foreach (keys %dlist) { push @extra, $_ if $dlist{$_} == 0; } return (1, @extra); } __END__ prints: listC contains all users and 1 additional addresses listA contains all users