http://qs321.pair.com?node_id=525282

eXile has asked for the wisdom of the Perl Monks concerning the following question:

esteemed monks, I'm overheating my brain on a function that checks if 2 values are equal, so i don't have to update a certain column in a SQL database. There are some things I think I need to take care of (like 0 vs "" vs undef, which are different in SQL). I don't have the SQL-column definition available at compare time. My 'equals' function currently looks like this:
sub equals { 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; }
This looks very bloated (and a candidate for thedailywtf ), and it feels like there must be bugs lurking in this.

I'm pretty sure this can be done a lot easier/better. Anybody got a better/smarter way to accomplish this type of comparing of 2 variables?

I'm sure somebody can come up with a nicer solution, that'll make me bang my head at my desk for at least an hour.