in reply to optimal way of comparing 2 arrays

Oh, I don't know about optimization but I would probably do something like
#!/usr/bin/perl -l use strict; use warnings; my @file1=qw/foo bar baz/; my @file2=qw/fred bar barney/; my %saw; $saw{$_}=1 for @file1; $saw{$_}.=2 for @file2; my %comm; push @{ $comm{$saw{$_}} }, $_ for keys %saw; print <<"EOT" \@file1 only: (@{ $comm{1} }) \@file2 only: (@{ $comm{2} }) common: (@{ $comm{12} }) EOT __END__
But you didn't tell us whether order does matter and if your arrays contain duplicates and if you also want them in the output and so on, so YMMV...

Replies are listed 'Best First'.
Re^2: optimal way of comparing 2 arrays
by narashima (Beadle) on Oct 20, 2005 at 13:51 UTC
    Hi Blazar,
    No duplicates in these arrays. All values are unique.
    thanks
    narashima
      Then the solution above may be simplified to:
      #!/usr/bin/perl -l use strict; use warnings; my @file1=qw/foo bar baz/; my @file2=qw/fred bar barney/; my %saw; $saw{$_}++ for @file1, @file2; print <<"EOT" \@file1 only: (@{[ grep $saw{$_}==1, @file1 ]}) \@file2 only: (@{[ grep $saw{$_}==1, @file2 ]}) common: (@{[ grep $saw{$_}==2, @file2 ]}) EOT __END__
      or even, using modulo-2 math, but more obscurely:
      #!/usr/bin/perl -l use strict; use warnings; my @file1=qw/foo bar baz/; my @file2=qw/fred bar barney/; my %saw; $saw{$_} ^= 1 for @file1, @file2; print <<"EOT" \@file1 only: (@{[ grep $saw{$_}, @file1 ]}) \@file2 only: (@{[ grep $saw{$_}, @file2 ]}) common: (@{[ grep !$saw{$_}, @file2 ]}) EOT __END__