0

我的 perl 中有最奇怪的行为,我似乎没有弄清楚。我正在解析一个文本文件,并在此过程中创建一个二进制字符串:

$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 的建议,因为我在与网络断开连接且对 CPAN 的访问受限(在工作中)的机器上使用 perl。
编辑
如果有人可以建议一种更好的方法来找到代表我的 TDO\TDI 二进制字符串的十六进制数的大小和\或者可以想出一个更好的想法来了解如何使用灵活的零填充而不是%0{$hexSize}我很乐意听到的,特别是因为它可能会使问题无效。尽管我喜欢我的代码,但它不是天主教婚姻......
感谢所有帮助者和编辑。

4

1 回答 1

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                                          ^
于 2013-11-10T10:56:55.150 回答