Версия # 1
use warnings;
use strict;
my $count = 4;
for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}
if (not defined($count)) {
print "Count not defined\n";
}
else {
print "Count = $count\n";
}
Это печатает:
1
2
3
4
5
6
4
Почему? Потому что цикл for
создает собственную версию $count
в своем блоке с лексической областью.
Версия # 2
use warnings;
use strict;
my $count;
for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}
if (not defined($count)) {
print "Count not defined\n";
}
else {
print "Count = $count\n";
}
1
2
3
4
5
6
Count not defined
Упс! Я хотел получить выходное значение $count
, но цикл for
имел свою собственную версию $count
! Мне просто пришлось потратить два часа, пытаясь отследить эту ошибку.
Версия # 3
use warnings;
use strict;
for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}
print "That's all folks!\n";
Это дает мне ошибку Global symbol "$count" requires explicit package name at line 5.
Но, я думал, $count
автоматически лексически ограничено внутри блока for
. Похоже, что это происходит только тогда, когда я уже объявил лексически ограниченную версию этой переменной в другом месте.
В чем причина такого поведения? Да, я знаю о диктате Конвея, что вы всегда должны использовать my
для переменной цикла for
, но вопрос в том, почему интерпретатор Perl был разработан таким образом.