laziness, impatience, and hubris PerlMonks

### Re^2: check if 2 values are equal

by eXile (Priest)
 on Jan 24, 2006 at 21:18 UTC ( #525317=note: print w/replies, xml ) Need Help??

in reply to Re: check if 2 values are equal
in thread check if 2 values are equal

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;
}

Create A New User
Node Status?
node history
Node Type: note [id://525317]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2020-05-29 01:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
If programming languages were movie genres, Perl would be:

Results (166 votes). Check out past polls.

Notices?