Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare two (potentially) undef variables in perl

Tags:

perl

I am trying to compare two variables in which are usually strings. These variables are generated from a database, $var1 from one db and $var2 from another. When I compare them in a loop I use the ne operator. However there are times when I these variables are null or undef. The comparison is done as follows:

foreach my $var1 (@$varlist)
{
  if ($var1 ne $var2)
  {
    print "vars are not equal";
  }
}

The issue is that if $var1 or $var2 are undef then I get an error. However, I need to be able to compare then values as undef b/c I will have to write them. I considered converting the variables to a string 'NULL' and then back but that seemed inefficient.

Any way to fix this? Thanks!

like image 457
Prateek Avatar asked Jun 26 '12 15:06

Prateek


People also ask

How do I check for undef in Perl?

One can compare it with NULL(in Java, PHP etc.) and Nil(in Ruby). So basically when the programmer will declare a scalar variable and don't assign a value to it then variable is supposed to be contain undef value. In Perl, if the initial value of a variable is undef then it will print nothing.

How do I compare two scalars in Perl?

Just like other mathematical operators, instead of performing operations, these operators compare scalars. There are two types of sets of Perl comparison operators. Explanations for above Numeric and String Scalars Comparison Operators: == and eq: This operator is used to check the equality.

How do I check if a variable has a value in Perl?

Perl | defined() Function Defined() in Perl returns true if the provided variable 'VAR' has a value other than the undef value, or it checks the value of $_ if VAR is not specified. This can be used with many functions to detect for the failure of operation since they return undef if there was a problem.

How do I compare characters in Perl?

'eq' operator in Perl is one of the string comparison operators used to check for the equality of the two strings. It is used to check if the string to its left is stringwise equal to the string to its right.


2 Answers

Check if they are defined, too:

foreach my $var1 (@$varlist)
    if ( ! defined $var1 || ! defined $var2 || $var1 ne $var2 )
        print "vars are not equal";

This prints that they're not equal if both are undefined. If you want another behaviour, just change the if expression.

like image 176
Tim Avatar answered Oct 20 '22 01:10

Tim


It's not an error to compare undefined values, it's just a warning. I like using Perl's // operator (requires >=v5.10) in cases like this to ensure the operators are defined:

if (($var1 // '') ne ($var2 // '')) { ... }

will treat an undefined string as the empty string during the comparison, for example.

Since you want the operands to have a specific value when they are printed (NULL was one possibility), you could also consider using the //= operator.

if (($var1 //= 'NULL') ne ($var2 //= 'NULL')) {
   print "$var1 and $var2 are not equal";
}

will use the value of $var1 or $var2, or 'NULL' if they are undefined, in the comparison.

like image 8
mob Avatar answered Oct 19 '22 23:10

mob