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

Pra*_*eek 11 perl

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

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

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

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

Tim*_*Tim 12

检查它们是否也被定义:

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

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

  • 使用xor的较短版本:`if((定义$ var1 xor定义$ var2)或$ var1 ne $ var2) (3认同)

mob*_*mob 8

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

if (($var1 // '') ne ($var2 // '')) { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

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

将设置的值$var1$var2'NULL'如果它们是不确定的,和然后执行比较.


Joe*_*ger 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";
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个建议的一个警告是,undef和空字符串的字符串比较将返回true - 这可能是也可能不是所需的. (3认同)