in reply to Comparing arrays

Here's a succint but untested solution. If you're comparing lists or hashes of numbers, just replace eq with ==. If you don't like or don't understand Perl prototypes... well, too bad :)
# returns the largest element in a list sub max(@) { (sort @_)[-1] } # returns the union of two lists - i.e., all elements which are in at +least one list sub union(@@) { ++$f{$_} foreach (@{$_[0]}, @{$_[1]}); keys %f } } # compares two list values for equality, by way of scalar(grep) # note that it takes into account the possibility of lists of differen +t sizes sub lst_eq(@@) { scalar (grep { $_[0][$_] eq $_[1][$_] } (0..max ($#{$ +_[0]}, $#{$_[1]})) } # compares two hashes for equality, by way of scalar(grep) # note that it takes into account the possibility of hashes with diffe +rent keys sub hsh_eq(%%) { scalar (grep { $_[0]{$_} eq $_[1]{$_} } union (keys ( +%{$_[0]}), keys (%{$_[0]}))) }

Replies are listed 'Best First'.
RE: Re: Comparing arrays
by btrott (Parson) on Mar 21, 2000 at 05:06 UTC
    You shouldn't use grep in this context, because grep will search through an entire array no matter what--in other words, it'll do a lot of extra work. If you write up your own routine, you can break out of the compare loop as soon as you find two elements that aren't equal. This is good.

    Use the code from the FAQ!

    $are_equal = compare_arrays(\@frogs, \@toads); sub compare_arrays { my ($first, $second) = @_; local $^W = 0; # silence spurious -w undef complaints return 0 unless @$first == @$second; for (my $i = 0; $i < @$first; $i++) { return 0 if $first->[$i] ne $second->[$i]; } return 1; }
    In particular, note this line:
    return 0 unless @$first == @$second;
    So the routine returns automatically if the arrays aren't of equal size. In your algorithm, you compare the elements in the arrays even if they're of different sizes. In fact, you explicitly wrote this in using your max function! Why? If the arrays aren't the same size, how could they possibly be equal?

    Also, look at the FreezeThaw examples in the FAQ.