thanks very much, this does what i'd like it to do, and if i compare it to my orginal function it even takes care of the 'numeric 0' vs. 'empty string' inequality.
my @vals = (undef, 0, '0', 'aap', 1, 't','');
my @expl = ('undef','numeric 0','string 0', 'string "aap"', 'nu
+mber 1', 'string t','empty string');
my ($i,$j);
for ($i=0; $i <= scalar(@vals-1); $i++) {
for ($j=0; $j <= scalar(@vals-1); $j++) {
# equals 1
print "equals_org '$expl[$i]'\t'$expl[$j]'\t" . equals_org($va
+ls[$i],$vals[$j]) . "\n";
print "equals_new '$expl[$i]'\t'$expl[$j]'\t" . equals_new($va
+ls[$i],$vals[$j]) . "\n";
print "--\n";
}
}
sub equals_org {
my ($val1, $val2) = @_;
# first test for undef-ness
if ( ! defined $val1 || ! defined $val2 ) {
return 1 if (! defined $val1 && ! defined $val2 );
return undef; #case one is undef, other is def
}
# have to do next line this because strings evaluate to 0 in == co
+ntext ...
if ( ! $val1 && ! $val2 ) {
# then test for ""-ness
return 1 if ( ($val1 eq "") && ($val2 eq "") );
return undef if ( $val1 eq "" || $val1 eq "" );
#case one is "" other is 0
# then test for 0-ness
return 1 if ( ($val1 == 0) && ($val2 == 0) );
}
# then test for equality using 'eq'
return 1 if ( $val1 eq $val2 );
# then test for equality using '=='
if ( int($val1) && int($val2) ) {
# all other number cases are already covered by
# above tests (eg. both 0, or both the same string)
# this merely takes care of cases like:
# 1000.0000 == 1000
return 1 if ( $val1 == $val2 );
}
# couldn't find any, so i guess they are not equal
return undef;
}
sub equals_new {
my ($lhs, $rhs) = @_;
#False if mix of defined and undef
return 0 if defined $lhs != defined $rhs;
# True if both undef
return 1 if ! defined $lhs && ! defined $rhs;
# False if different as numbers
no warnings "numeric";
return 0 if (0 + $lhs) != (0 + $rhs);
# False if different as strings
return 0 if ('' . $lhs) ne ('' . $rhs);
return 1;
}