3

スカラーの値が 0 かどうかを確認する必要があります。しかし、'0' およびその他の状況は、私の確認では false です。どうすれば確認できますか?

4

3 に答える 3

3

次を使用して、スカラーの値がゼロかどうかを確認できます

$scalar == 0

実際にはそうすべきではありませんが、スカラーに IV (signed int)、UV (unsigned int)、または値がゼロの NV (浮動小数点数) が含まれているかどうかは、次を使用して確認できます。

use Inline C => <<'__END_OF_C__';

   IV contains_numerical_zero(SV* sv) {
      SvGETMAGIC(sv);

      if (SvIOKp(sv))  /* If the SV contains an IV or UV */
         return SvIV(sv) == 0;

      if (SvNOKp(sv))  /* If the SV contains an NV */
         return SvNV(sv) == 0;

      return 0;
   }

__END_OF_C__

say contains_numerical_zero(...) ? "yes" : "no";

contains_numerical_zeroスカラーにゼロに等しい符号付き int と文字ゼロで構成される文字列の両方が含まれている場合、 は true を返すことに注意してください。

于 2013-06-06T06:00:04.653 に答える
1

あなたの質問に対するコメントから、perl がスカラーを数値と見なすか文字列と見なすかを知りたいことは理解できます。これは、 Devel::Peekモジュールを使用して実行できます。

use Devel::Peek 'Dump';

$a = 0;
Dump $a;

これは印刷されます:

SV = IV(0x6750a8) at 0x6750b8
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 0

一方:

$b = '0';
Dump $b;

印刷されます:

SV = PV(0x654c20) at 0x675058
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x66e110 "0"\0
  CUR = 1
  LEN = 16
于 2013-06-06T05:58:38.240 に答える