Вы используете только переменные пакета (~ global), что является огромной проблемой, учитывая, что вы используете рекурсивные функции!Начните с добавления
use strict;
Прежде всего, это определит переменные, которые вы не объявили.Используйте my
, чтобы объявить их в соответствующей области.
Вы пытаетесь передать массивы в сабвуферы, но не можете.Единственное, что можно передать в подпрограмму, это список скаляров.Если вы хотите передать массив в подпрограмму, вам нужно передать ссылку (~ указатель) на массив.
sub foo {
my ($expressions, $index) = @_;
print($expressions->[$index], "\n");
}
foo(\@expressions, $index);
По этой причине вы получаете предупреждения.Вы присваиваете один элемент массиву (@expression = $_[0]
), затем пытаетесь проиндексировать второй или более поздний элемент.
Используя прототип ()
, вы говорите Perl, что sub не принимаетаргументы.Затем вы используете &
, чтобы заставить Perl игнорировать прототип, чтобы вы могли передавать аргументы своим подпрограммам.Избавьтесь от ()
после дополнительных имен и &
до дополнительных вызовов.
my $more = 1;
while ($more) {
...
if (cond) {
...
} else {
$more = 0;
}
}
можно уменьшить до
while (1) {
...
last if !cond;
...
}