12

通常は文字列である2つの変数を比較しようとしています。これらの変数は、データベース、あるデータベース、$var1および$var2別のデータベースから生成されます。それらをループで比較するときは、ne演算子を使用します。ただし、これらの変数がまたはである場合がありnullます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 // '')) { ... }

たとえば、比較中は未定義の文字列を空の文字列として扱います。

オペランドを出力するときに特定の値を設定する必要があるため(NULL1つの可能性があります)、//=演算子の使用を検討することもできます。

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

$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 に答える