Ну, я взял на себя смелость очистить ваш код.
Пожалуйста, посмотрите, не найдете ли следующий фрагмент кода легче для чтения / понимания, чем ваш оригинал.
Он выполняет ту же цель / функцию, что и ваш исходный код, за исключением того, что ваш конечный результат выводится после того, как все данные обработаны непосредственно перед выходом из программы.
Примечание: zdim обратил мое внимание на то, что код может быть улучшено с split особый случай, if ... else ...
КПД цикла ЦП (для очищенных входных данных) и в отношении кода пропуска заголовка (заголовок может отсутствовать или иметь другой формат). Хотя изначально я не намеревался улучшить кода, а только код читаемость , я считаю предложение zdim полезным изменением.
Примечание: входные данные очищены с помощью next unless /\d+ +[+-] +\d+ +\d+/;
, что может показаться несколько необычным, поскольку обычно оно записывается как next unless /\d+\s+[+-]\s+\d+\s+\d+/;
- для демонстрации цель одна и та же цель может быть достигнута разными способами. Я предположил потенциальные случаи несогласованности входных данных, когда поля данных могут быть разделены более чем одним пробелом (пользователь может настроить интервал для удобочитаемости). ' '
и \s
весьма различны, так как сначала предполагается только '' (пробел), но '\ s' предполагает [\ f \ n \ r \ t]. perlre
use strict;
use warnings;
use feature 'say';
my $filename = 'coordinates_based'; # I run code in same directory as input file
my($k,$pos,$neg,$final); # only necessary variables for computation
$k = 1;
$pos = $neg = 0; # some variables initialization
open my $fh, '<', $filename
or die "Could not open $filename: $!";
while (<$fh>) { # walk through file
next unless /\d+ +[+-] +\d+ +\d+/; # sanitize input data
chomp;
my ($n, $p, $a, $b) = split; # see split doc for special case
for ($k..$n)
{
if ($p eq '+') {
$pos += $b-$a; # thetika (positive)
} else {
$neg -= $b-$a; # arnitika (negative)
}
$final = $pos + $neg;
$k++;
}
}
close $fh;
say $final; # output result of computation
Выход
-2004