Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl格式化无法处理某些大小转换_Perl_Formatting - Fatal编程技术网

perl格式化无法处理某些大小转换

perl格式化无法处理某些大小转换,perl,formatting,Perl,Formatting,我的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/

我的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)
...  
。。。
24,6,(0000AA)
25,7,(00000000000000000000 AA)问题已解决

问题是由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                                          ^

因此,归结为一个简单的例子,
printf(“%025X\n”,$somenumber)
不会产生您期望的输出吗?$somenumber是什么,它产生了什么输出,以及您希望得到什么输出?不,
printf(“%07X\n”,$somenumber)
是问题所在。与其输出>1234567,不如输出>000000000000000000 1234567。在这种情况下,它只给出7个十六进制数字。您的
$hexSize
计算看起来非常奇怪,并表明
$TDI
位于基数4中。世界跆拳道联盟?你为什么不把它转换成十六进制后再计算它的大小呢?→ <代码>我的$num=bin2dec。。。;我的$size=长度sprintf“%X”,$num;printf“…%0*X\n”、$size、$num
@user2141046:但在这种情况下,$somenumber是什么?@amon:您的解决方案没有填充零,因此我无法使用它。顺便说一句,我的取整函数基于这里的一个答案,如果这导致了错误,请开始
使用strict;尽快使用警告
!这将在运行时捕获错误。还可以考虑将宽度指定为普通参数而不是内插,使用<代码> */COD>占位符:<代码> Prtuf……%x 0×x,$6xSead,Bi2DEC $TDI >,我知道,但是我从其他脚本(旧脚本)中学习Perl,我只是没有使用“我的”的结构。等等等等都需要严格的警告。您建议的%0*X是可能的,尽管我不太了解语法-相同的语法也可以用于其他printf\sprintf吗?
*
可以用作大多数printf模式的最小宽度参数的占位符。然后从参数列表中获取。它记录在。Re:strict–我不会将strict用于我永远不会使用的快速OneLiner。但除此之外,这是90年代拼凑而成的充满潜在bug的脚本与现代、可靠、可维护的程序之间的区别之一。@MichaelT你是怎么做的反向插入符号(^)符号?它只是ASCII字母
v
(vee,就像非常简单的那样)。