| [reply] |
| [reply] |
remember that eq does a string compare and not an array compare | [reply] |
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]}))) }
| [reply] [d/l] |
$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. | [reply] [d/l] [select] |