Поскольку приведенные вами примеры программ на самом деле ничего не делают, трудно дать вам конкретную причину, по которой один тип объявления будет лучше другого. Как отмечали многие другие авторы, объявление переменной в цикле каждый раз создает новую переменную. В ваших примерах создание избыточно, но рассмотрите следующие примеры с использованием замыканий.
my @closures;
my $jimmy;
for (1 .. 10) {
$jimmy = $_** 2;
push @closures, sub {print "$jimmy\n"};
}
и этот:
my @closures;
for (1 .. 10) {
my $jimmy = $_** 2;
push @closures, sub {print "$jimmy\n"};
}
В каждом случае код создает серию ссылок на код, но в первом примере, поскольку все ссылки на код ссылаются на один и тот же $jimmy
, каждый из них при вызове выдает 100 Во втором примере каждый код ref будет печатать различное число (1, 4, 9, 16, 25, ...)
Так что в этом случае разница во времени не имеет большого значения, так как два блока кода делают очень разные вещи.