Причина предупреждения в том, что, хотя это не похоже на perl, блок END
для perl эквивалентен объявлению регулярного (именованного) подпрограммы и поведению именованного подпрограммы, объявленному внутри другая подпрограмма не то, что вам нужно - $self
внутри блока END
будет привязан к $self
в sub new
в первый раз, когда вызывается new
, и будет продолжаться чтобы увидеть то же значение - самый первый созданный экземпляр - до конца жизни вашей программы. У первого экземпляра будет ссылка, хранящаяся в блоке END
, и он не будет уничтожен до конца программы, а во всех последующих экземплярах этот блок END
не будет вызываться вообще.
В отличие от именованных подпрограмм, анонимные подпрограммы не имеют этой проблемы, потому что они воссоздаются каждый раз, когда встречается их определение, поэтому любые переменные, которые они закрывают, связываются как можно позже, а значения, которые вы на самом деле хотите, фиксируются .
Это довольно длинное объяснение, когда другие уже сказали вам, что вместо этого вы хотите DESTROY
, но я подумал, что вам, возможно, стоит узнать, что на самом деле происходит с написанным вами кодом.