我试图比较两个通常是字符串的变量。这些变量是从数据库生成的,$var1
来自一个数据库,$var2
来自另一个数据库。
当我在循环中比较它时,我使用ne
运算符。但有时我会将这些变量设为null
或undef
。比较如下:
foreach my $var1 (@$varlist)
{
if ($var1 ne $var2)
{
print "vars are not equal";
}
}
问题是,如果$var1
或$var2
为undef
,则会收到错误消息。但是,我需要能够比较那些值为undef b / c我将不得不写它们。我考虑将变量转换为字符串'NULL'然后返回,但这似乎效率低下。
有什么方法可以解决这个问题? 谢谢!
答案 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)
使用定义的函数来确定: