The compile-time scope ends right after the BODY is closed, hence the lexical is not anymore declared.
But the run-time destruction will only happen if the outer-scope - that's at least the file-scope° - is finished.
Any reason why?
In my book that's a design flow at least.
DEMO:
use strict; use warnings; use Data::Dump qw/pp dd/; $\="\n"; our $PHASE=0; { if ( my $x = bless {name=>"extra block"}, "TEST" ) { $PHASE=1; print $x; } } # DESTRUCTION $PHASE=2; # line 16 if ( my $x = bless {name=>"head if"}, "TEST" ) { $PHASE=3; print $x; } # NO DESTRUCTION # --- uncomment for compile-time error # print $x; print ""; $PHASE=4; print ""; # line 32 package TEST; use Carp; sub DESTROY { my ( $self ) = @_ ; carp "DESTROY <x: $self->{name}> <PHASE: $::PHASE>"; }
will produce this output
C:/Strawberry/perl/bin\perl.exe -w d:/tmp/pm/berny_open.pl DESTROY <x: extra block> <PHASE: 1> at d:/tmp/pm/berny_open.pl line 16 +. DESTROY <x: head if> <PHASE: 4> at d:/tmp/pm/berny_open.pl line 32. TEST=HASH(0x1ca7e8) TEST=HASH(0x1ca8f0)
DISCLAIMER: This was just discussed at German.PM online meeting today and was motivated by this SO-Discussion.
Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |