让perl以非科学记数法打印

Getting perl to print in non scientific notation

我是运行

./script.pl 69032 text.txt

其中 text.txt 包含

1   29  239 6

我得到

1   29  239 8.69162127708889e-05

作为输出,但我只希望最后一个数字是

1   29  239 .0000869162127708889

这是我的脚本

$percent=$ARGV[0];
shift;
while(<>){
        my $temp = $_;
        my ($num, $start, $stop, $exp) = split("\t", $temp);
        if( defined($exp)){
                print $num,"\t",$start,"\t",$stop,"\t",$exp/$percent,"\n";
        }
}

使用printf for formatted printing. The details of format specifiers are given in sprintf.

printf("%d\t%d\t%d\t%10.8f\n", $num, $start, $stop, $exp/$percent);

"..." 中的字符串是您指定格式的位置。其余部分是在每个 % 说明符的字符串中使用的变量列表,通常按它们出现的顺序排列。 sprintf returns 一个字符串,而 printf 打印到 STDOUT,或者如果作为第一个参数 printf($fh "...", @vars) 给出,则打印到另一个文件句柄。这是最古老、最古老的工具之一。

上面我们有:一个整数%d,然后是一个制表符\t,然后是相同的两倍,然后是总宽度字段中要打印的浮点数10(包括小数点和可能的符号),小数点后有 8 位。整数根据需要在输出中使用尽可能多的 space —— 一个用于 1,三个用于 239。如果你想排列输出你可以指定字段的最小宽度

printf("%3d\t%3d\t%3d\t%10.8f\n", $num, $start, $stop, $exp/$percent);

现在每个整数需要三个 space,右对齐。要在左侧对齐,请使用 %-3d。要有前导零,你会说 %03d,因为 001。字符串也可以打印在固定宽度的字段中,所以

printf("%4s %6s %6s %12s\n", qw(num start stop factor));
printf("%4d %6d %6d %12.8f\n", $num, $start, $stop, $exp/$percent);

打印

 num  start   stop       factor
   1     29    239   0.00008692

上面我选择了字段宽度以获得舒适的布局,并使用文字 spaces 作为它们之间的分隔符。 (如果条目不适合制表位,制表符可能会扰乱视觉对齐。如果这转到数据文件,即使它们也不是解析的糖,但对未来的解析没有影响。)如果你使用逗号代替生成 CSV 文件。

人们可以用它做很多事情。它用于从精确的格式转换到打印数据文件或体面的 (ASCII) 报告的任何事情。 sprintf 页面详细介绍了很多示例。