Pathologically Eclectic Rubbish Lister 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?
 [LanX]: ... the rest is loaded from a node [holli]: the best course of action would be to transfer the data to something well tested. even if it isnt perl based [moritz]: but even if I had all the time in the world, I wouldn't spend much on perlmonks [LanX]: holli: LOL [LanX]: moritz: why ? family? [LanX]: or other language? [moritz]: LanX because of usability issues, and the lack of evolvement [holli]: lol to the robust charme or to the data transfer? [holli]: it works fine with Lynx though :) [LanX]: it's easier to patch then to migrate to a PHP board, there are many semantics like linking , authorisation, templates ,...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (8)
As of 2017-11-20 19:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
In order to be able to say "I know Perl", you must have:

Results (292 votes). Check out past polls.

Notices?