Нет вывода из скрипта Perl - PullRequest
       3

Нет вывода из скрипта Perl

0 голосов
/ 17 сентября 2018

Я хочу написать файл, содержащий эти строки в 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

Perl

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 );

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Причина, по которой ваш код не работает, состоит в том, что ваш тест имеет неправильный смысл: вы начинаете с 150 и затем зацикливаетесь, пока значение меньше или равно 10, что никогда не равно

Также не рекомендуется повторно добавлять значения с плавающей запятой, поскольку неточности будут увеличиваться и приводить к ошибке в выходных данных. В этом случае вы используете 0.25, который просто точно представляется в виде двоичной дроби, но если вам когда-либо понадобится другое приращение, вы должны знать, что лучше всего использовать целые числа для их подсчета и преобразования по одному с плавающей точкой

Наконец, вы запрашиваете вообще не десятичные разряды в целых числах, а два в дробных значениях. Это может быть не обязательно, но лучше использовать явную строку формата, чтобы избежать неожиданностей

Вот как бы я написал ваш код

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
0 голосов
/ 17 сентября 2018

Ваш код делает это:

$dihed=150.0;
while ($dihed <= 10.0) {
  $dihed -= $decr;
  ...
}

На первой итерации цикла while логическое условие не выполняется (так как 150.0 не меньше или равно 10.0).Поэтому никакой код внутри цикла while никогда не будет выполнен.

Возможно, ваше логическое условие должно было быть $dihed >= 10.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...