12

我正在尝试比较两个通常是字符串的变量。这些变量是从一个数据库、$var1一个数据库和$var2另一个数据库生成的。当我在循环中比较它们时,我使用ne运算符。但是有时我这些变量是nullor undef。比较如下:

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

问题是如果$var1或者$var2undef那么我得到一个错误。但是,我需要能够将值作为 undef b/c 进行比较,我将不得不编写它们。我考虑将变量转换为字符串“NULL”,然后再返回,但这似乎效率低下。

有任何解决这个问题的方法吗?谢谢!

4

4 回答 4

13

检查它们是否也被定义:

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

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

于 2012-06-26T16:01:54.330 回答
9

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

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

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

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

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

将使用 or 的值,或者$var1如果它们未定义,则在比较中。$var2'NULL'

于 2012-06-26T16:41:10.947 回答
6

您似乎正在通过使用 Perl 来练习安全,use warnings;但现在您可能已经到了选择性地关闭它们的地步。这些警告是为了保护您自己,但是如果您知道要比较可能的 undef 字符串,只需将它们关闭一点(该no命令是封闭块的本地命令,因此它们会重新打开)。

use strict;
use warnings;

foreach my $var1 (@$varlist)
{
  no warnings 'uninitialized';
  if ($var1 ne $var2)
  {
    print "vars are not equal";
  }
}
于 2012-06-26T19:17:23.997 回答
0

使用定义的函数来确定:

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

于 2012-06-26T16:01:13.773 回答