我是perl和脚本编程的新手。我有五个保存数据的变量,我需要将它们打印成五列彼此相邻。这是我现在的代码。
$i = 0;
foreach $line (<inf>){
chomp $line;
@line=split / +/, $line;
$i = $i + 1;
if ($i > $n+1) {
$i = 1;
$numdata = $numdata + 1;
}
if ($i == 1) {
printf "%20s\n", $n, "\n";
} else {
print $i-1, "BEAD", $line[$col], $line[$col+1], $line[$col+2], "\n";
}
# other statistics
}
我从中获得的输出如下:
5
1BEAD0.00000e+000.00000e+000.00000e+00
2BEAD0.00000e+000.00000e+000.00000e+00
3BEAD0.00000e+000.00000e+000.00000e+00
4BEAD0.00000e+000.00000e+000.00000e+00
5BEAD0.00000e+000.00000e+000.00000e+00
5
1BEAD9.40631e-02-3.53254e-022.09369e-01
2BEAD-6.69662e-03-3.13492e-012.62915e-01
3BEAD2.98822e-024.60254e-023.61680e-01
4BEAD-1.45631e-013.45979e-021.50167e-01
5BEAD-5.57204e-02-1.51673e-012.95947e-01
5
1BEAD8.14225e-028.10216e-022.76423e-01
2BEAD2.36992e-02-2.74023e-014.47334e-01
3BEAD1.23492e-011.12571e-012.59486e-01
4BEAD-2.05375e-011.25304e-011.85252e-01
5BEAD5.54441e-02-1.30280e-015.82256e-01
我尝试在print语句中的变量之前使用"%6d %9d %15.6f %28.6f %39.6f\n"
来尝试将数据空出来;然而,这并没有给我我希望的专栏。任何帮助/建议都表示赞赏。
答案 0 :(得分:1)
如果您正在使用Perl并执行更复杂的操作,您可能需要查看专为此类事情设计的perlform或Text::Table之类的模块。
至于使用printf
,您可以使用填充说明符来获得一致的间距。例如,在其上使用Perl docs,确保字段宽度在.
之前:您的printf字符串应该看起来更像这样(查看“精度或最大宽度”部分) :
printf "%6.d %9.d %15.6f %28.6f %39.6f"
另外,如果你的东西在一个数组中,你可以将数组的第二个参数传递给printf并保存自己输入的内容。我还使用unshift
unshift(@line, $i-1, "BEAD");
printf "%6.d %10s %15.6f %28.6f %39.6f\n", $line;
请注意,%s
占位符不具有.
精度说明符,因此请将其保留。如果您想要数字的电子记事本,请使用%e
或%g
代替%f
(%39.6e
)。
此外,对于Perl问题,请务必查看Perl Monks - 大部分答案都来自a question there。
P.S。给出一个示例列,这里是我试图确保一切正常的概念验证脚本:
perl -e '@line = (8.14225e-02,8.10216e-02,2.76423e-01);
unshift(@line, 4, "BEAD");
printf "%6.d %10s %15.6f %28.6f %39.6e\n", @line;'