in reply to Perl variable garbage collection

From B::Deparse:

Optimised away statements are rendered as '???'. This includes statements that have a compile-time side-effect

The crux of this is that, yes, Perl does optimize away the statement $w_w_w unless 1;, but it still puts it on your sub's pad (it does even if you don't say $w_w_w anywhere in your sub's code, but it will be undef when it goes out of scope in the enclosing block). But any mention within that anonymous sub will keep the reference count (because anon subs are created at runtime), and prevent GC. Even though the statement itself does nothing, a reference to your AnyEvent object does exist. The '???' you see isn't the whole story. Try to run the deparse'd code if you need confirmation that there is (was) more going on than an optimized-away statement.

Or, for a little introspection, add the following to the body of your cb sub:

use PadWalker qw/peek_my/; use Data::Dump qw/dump/; state $scope_printed = 0; if (not $scope_printed++) { my $my_vars = peek_my(0); while (my ($var, $ref) = each %{ $my_vars }) { printf "%15s => %s\n", $var, dump $ref; } }