in reply to Printing and Removing Duplicates in Arrays

Here's one way:
my @ary1 = (1, 2, 3, 4, 5, 6, 7); my @ary2 = (6, 7, 8, 9, 10, 11); my %h1 = map {$_ => 1} @ary1; my %h2 = map {$_ => 1} @ary2; my %dupes; @ary1 = grep {(! (exists $h1{$_} and exists $h2{$_})) or do{$dupes{$_} +=1;0}} @ary1; @ary2 = grep {(! (exists $h1{$_} and exists $h2{$_})) or do{$dupes{$_} +=1;0}} @ary2; print "ary1 is @ary1 \n"; print "ary2 is @ary2 \n"; my @dupes = keys %dupes; print "dupes were @dupes \n";

Hope that helps,
andye.

Edited to make dupes a hash rather than an array, to prevent dupes in the dupes!
Another minor edit to prevent a warning

Replies are listed 'Best First'.
Re: Re: Printing and Removing Duplicates in Arrays
by jmcnamara (Monsignor) on Aug 21, 2002 at 11:04 UTC

    That's nice. ++

    However, you don't need to check if an element exists in the current array:

    my @ary1 = (1, 2, 3, 4, 5, 6, 7); my @ary2 = (6, 7, 8, 9, 10, 11); my %h1; my %h2; @h1{@ary1} = undef; @h2{@ary2} = undef; my @dupes; @ary1 = grep {not exists $h2{$_} or not push @dupes, $_} @ary1; @ary2 = grep {not exists $h1{$_} } @ary2; print "ary1 is @ary1 \n"; print "ary2 is @ary2 \n"; print "dupes were @dupes \n";

    Or even just this:

    @dupes = grep { exists $h2{$_}} @ary1; @ary1 = grep {not exists $h2{$_}} @ary1; @ary2 = grep {not exists $h1{$_}} @ary2;

    --
    John.

      duh! (smacks own head) You're right.
      @ary1 = grep {!exists $h2{$_} or $dupes{$_}=0} @ary1; @ary2 = grep {!exists $h1{$_} } @ary2;

      andye.

      minor edit