比较perl中的两个(可能的)undef变量

时间:2012-06-26 15:57:18

标签: perl

我试图比较两个通常是字符串的变量。这些变量是从数据库生成的,$var1来自一个数据库,$var2来自另一个数据库。 当我在循环中比较它时,我使用ne运算符。但有时我会将这些变量设为nullundef。比较如下:

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

问题是,如果$var1$var2undef,则会收到错误消息。但是,我需要能够比较那些值为undef b / c我将不得不写它们。我考虑将变量转换为字符串'NULL'然后返回,但这似乎效率低下。

有什么方法可以解决这个问题? 谢谢!

4 个答案:

答案 0 :(得分:11)

检查它们是否也被定义:

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

如果两者都未定义,则打印出它们不相等。如果您想要其他行为,只需更改if表达式。

答案 1 :(得分:8)

比较未定义的值并不是一个错误,它只是一个警告。我喜欢在这种情况下使用Perl的//运算符(需要> = v5.10)来确保定义运算符:

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

会在比较期间将未定义的字符串视为空字符串。

由于您希望操作数在打印时具有特定值(NULL是一种可能性),您还可以考虑使用//=运算符。

if (($var1 //= 'NULL') ne ($var2 //= 'NULL')) {
   print "$var1 and $var2 are not equal";
}
如果未定义,

会将$var1$var2的值设置为'NULL',然后执行比较。

答案 2 :(得分:6)

您似乎正在使用use warnings;练习安全Perl,但现在您可能已经到了选择性关闭它们的位置。这些警告是为了你自己的保护,但是如果你知道你要比较可能的undef字符串,只需将它们关闭一点(no命令是封闭块的本地命令,所以他们回头上)。

use strict;
use warnings;

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

答案 3 :(得分:0)

使用定义的函数来确定:

http://perldoc.perl.org/functions/defined.html