perl格式化无法处理特定大小的转换

时间:2013-11-10 09:28:29

标签: perl formatting

我的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}我会很高兴听,特别是因为它可以使问题无效。即使我喜欢我的代码,它也不是天主教的婚姻...... 感谢所有帮助者和编辑。

1 个答案:

答案 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                                          ^