我试图比较两个通常是字符串的变量.这些变量是从一个数据库,$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还是$var2有undef那么我得到一个错误.但是,我需要能够比较那些值为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表达式即可.
比较未定义的值并不是一个错误,它只是一个警告.我喜欢//在这种情况下使用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'如果它们是不确定的,和然后执行比较.
看来你正在使用安全的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)