Хотя вчера я и написал, что ключевое слово state в перле похоже на static в C++, документация утверждает, что это не вполне так. Описано, впрочем довольно размыто.
Что еще нужно знать про state, кроме того, что эта инструкция стала доступна только с версии Perl 5.10?
Во-первых, state можно эмулировать и в ранних версиях.
{
my $counter;
sub counter {
return ++$counter;
}
}
print counter(), "\n"; # 1
print counter(), "\n"; # 2
Переменная $counter, оказываясь в замыкании, с одной стороны, недоступна для внешнего кода, а с другой, сохраняет свое значение между вызовами функции counter().
Во-вторых, для переменной, объявленной с ключевым словом state, возможно возвращать обычную ссылку, что дает возможность изменять значение переменной.
use v5.10;
sub counter {
state $counter;
++$counter;
return \$counter;
}
my $c = counter();
say ++$$c; # 2
say ${counter()}; # 3
В-третьих, state-переменную допустимо инициализировать при создании, но это разрешено только для скаляров.
use v5.10;
sub counter {
state $counter = 10;
return ++$counter;
}
say counter(); # 11
say counter(); # 12
Попытка же инициализации списка или хеша приводит к ошибке:
state @a = (1, 2, 3);
Initialization of state variables in list context currently forbidden
state @a //= (1, 2, 3);
Can't modify private array in defined or assignment (//=)
В документации (perlsub) явно указано, что такие присвоения в языке не определены.
Тем не менее, при необходимости обойти это ограничение довольно просто.
state @a;
@a = (1, 2, 3) unless defined @a;