Как только переменные объявлены и прототип удален из функции, ваш код работает:
use warnings;
use strict;
sub timeEstimate {
my $number = shift;
print "Number: $number\n";
my $stuff = sprintf("%d", $number * $number * $number) * .2045;
print "stuff: $stuff\n";
my $totalDownloads = $stuff + ($number * $number) + $number;
print "totalDownloads: $totalDownloads\n";
my $secondPerFile = .4464;
print "secondPerFile: $secondPerFile\n";
my $totalSeconds = ($totalDownloads * $secondPerFile);
print "totalSeconds: $totalSeconds\n";
my $totalHours = ($totalSeconds / 3600);
print "totalHours: $totalHours\n";
return $totalHours;
}
timeEstimate 10;
Number: 10
stuff: 204.5
totalDownloads: 314.5
secondPerFile: 0.4464
totalSeconds: 140.3928
totalHours: 0.038998
В функциях Perl вам всегда нужно объявлять переменные с помощью ключевого слова my
(которое выделяет переменную с лексической областью), иначе вы столкнетесь с проблемами. Использование use warnings; use strict;
в верхней части каждой программы не даст вам забыть, а также предоставит много полезных диагностических сообщений.
Прототип ()
, установленный в функции timeEstimate
, содержит ошибку. Он указывает, что функция timeEstimate
не принимает никаких аргументов. Не используйте прототипы функций Perl, пока точно не поймете, почему их нужно использовать.
Наконец, ваше использование sprintf
не требуется. Строка может быть переписана как:
my $stuff = 0.2045 * ($number ** 3);