我想在Perl中写一个包含这些行的文件
YOYO -O -i prod_mdin.150 -o prod_mdout.150
YOYO -O -i prod_mdin.149.75 -o prod_mdout.149.75
...
YOYO -O -i prod_mdin.10 -o prod_mdout.10
print "SrepAring inpCKut filYes\n";
$decr = 0.25;
my $filename = 'report-4.5-3.txt';
open( my $BATCHFILE, '>', "$filename" );
$dihed = 150.0;
while ( $dihed <= 10.0 ) {
$dihed -= $decr;
print $BATCHFILE "
YOYO -O -i min_mdin.${dihed} -o min_mdout.${dihed}
"
}
print "done\n";
close( $BATCHFILE );
答案 0 :(得分:1)
您的代码会执行以下操作:
$dihed=150.0;
while ($dihed <= 10.0) {
$dihed -= $decr;
...
}
在while
循环的第一次迭代中,布尔条件失败(因为150.0不小于或等于10.0)。因此,while
循环内的任何代码都不会执行。
也许您的布尔条件应该是$dihed >= 10.0
。
答案 1 :(得分:1)
您的代码无法正常运行的原因是您的测试有错误的感觉:您从150开始,然后在值小于或等于 10时循环运行,该值永远不会< / p>
重复添加浮点值也是一个坏主意,因为不正确的结果会越来越多,并导致输出错误。在这种情况下,您使用的是0.25,它恰好可以精确地表示为二进制分数,但是如果您想要不同的增量,则应该知道最好使用 integers 进行计数和转换它们一个接一个地浮点
最后,您要求的整数都不要求小数,而对于小数要求两个。这可能不是绝对必要,但最好使用显式格式的字符串,以免引起意外。
这是我如何编写您的代码
use strict;
use warnings 'all';
my $filename = 'report-4.5-3.txt';
open my $out_fh, '>', $filename
or die qq{Unable to open "$filename" for output: $!};
for ( my $d = 150 * 4; $d >= 10 * 4; --$d ) {
my $fmt = $d % 4 ? '%.2f' : '%.0f';
my $dihed = sprintf $fmt, $d / 4;
print $out_fh "\nYOYO -O -i min_mdin.${dihed} -o min_mdout.${dihed}\n";
}
YOYO -O -i min_mdin.150 -o min_mdout.150
YOYO -O -i min_mdin.149.75 -o min_mdout.149.75
YOYO -O -i min_mdin.149.50 -o min_mdout.149.50
YOYO -O -i min_mdin.149.25 -o min_mdout.149.25
YOYO -O -i min_mdin.149 -o min_mdout.149
...
YOYO -O -i min_mdin.11 -o min_mdout.11
YOYO -O -i min_mdin.10.75 -o min_mdout.10.75
YOYO -O -i min_mdin.10.50 -o min_mdout.10.50
YOYO -O -i min_mdin.10.25 -o min_mdout.10.25
YOYO -O -i min_mdin.10 -o min_mdout.10