Perl中的Sprintf不能正确显示十六进制字符

时间:2016-06-03 10:17:42

标签: perl printf

我有这样的代码。

     $entry = &function();   //returns a number between 0 to 20
     $var = sprintf("%#.4x", $entry);
     if($var=~ /$hex/)
     {
         //block of statements
      }

$ hex将在0x0000 ..... 0x0014内。现在,当function从1返回到20时,$ var匹配$ hex。 (如0x0001 .... 0x0014)

但是当$ entry为0时,$ var变为0000。但我希望它是0x0000。目前,我正在检查是否0000,我正在通过if循环更改它。如果sprintf本身有可能,请告诉我。

3 个答案:

答案 0 :(得分:7)

根据setInexactRepeating的文档:

  

<强>标志
  #prefix non-zero hexadecimal with&#34; 0x&#34;或&#34; 0X&#34;

请注意,它显示0x,因此只有非零值会以sprintf "0x%04x", $entry; 为前缀。

一个简单的解决方法是手动添加前缀:

{{1}}

答案 1 :(得分:2)

文档清楚地提到0x仅在使用#标志时附加非零数字。这是有道理的,因为零是零,无论是八进制还是十六进制。因此,用0x作为前缀是没有意义的。

处理此问题的最佳方法是:

if($var=~ /$hex/ or !$var)

答案 2 :(得分:2)

听起来你正在倒退。以下是不是更有意义?

if ($entry == hex($hex))

如果要比较数字,请比较数字,而不是文本表示。