我的perl中有最奇怪的行为,我似乎无法弄明白。 我正在解析一个文本文件,在此过程中创建一个二进制sting:
$TDI = $a_stat . "$TDI"; #$a_stat = 0/1
if ( $b_stat ne "X" ) { $TDO = $b_stat . "$TDO" } #$b_stat is 0/1
现在,我想根据尺寸打印格式化:
$inputSize = length($TDI);
$hexSize = sprintf("%.0f", ($inputSize/4)+0.4); # rounding up
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${hexSize}X)\n", bin2dec $TDI, bin2dec $TDO);
这对32位很好,但是当我改变输入大小(特别是输入26,十六进制7)时,它会在十六进制值之前打印出零。我添加了一个小调试行printf "$inputSize, $hexSize, (%0${hexSize}X)\n", oct($TDI)
,得到了以下(非常惊人的)结果:
...
24, 6, (0000AA)
25, 7, (00000000000000000000000000AA) <- 22 unneeded zeros
26, 7, (00000000000000000000000000AA) <- 22 unneeded zeros
27, 7, (00000000000000000000000000AA) <- 22 unneeded zeros
28, 7, (00000000000000000000000000AA) <- 22 unneeded zeros
29, 8, (000000AA)
...
(now handling another string)
25, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros
26, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros
27, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros
28, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros
29, 8, (00000008)
...
在下一个循环中,它会变为121个零,并且还会向5-8范围添加30个零。
我检查了bin2dec结果,他们没事。
任何人都能弄清楚为什么我会出现这种异常现象?如果可能的话,请尽量避免使用基于CPAN的建议,因为我在断开网络的机器上使用perl,只能访问CPAN(在工作中)。
的修改
如果有人可以建议一个更好的方法来找到代表我的TDO \ TDI二进制字符串的六进制数的大小和\或者可以更好地了解如何使用敏捷零填充而不是%0{$hexSize}
我会很高兴听,特别是因为它可以使问题无效。即使我喜欢我的代码,它也不是天主教的婚姻......
感谢所有帮助者和编辑。
答案 0 :(得分:0)
问题解决了。
由printf中的流氓$
引起的问题:
# bug v
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${$hexSize}X)\n", bin2dec $TDI, bin2dec $TDO);
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${hexSize}X)\n", bin2dec $TDI, bin2dec $TDO);
# works ^