chinaxing has asked for the wisdom of the Perl Monks concerning the following question:
I have a little confuse about the variable garbage collection in perl in following example :
#!/bin/env perl use v5.14; package MyTestModule { sub foo { my $fh = shift; for(1..100){ say "PUT"; $fh->autoflush(1); print $fh "Heloo\n"; sleep 1; } } } package main; use AnyEvent; use AnyEvent::Fork::Template; my $cv = AnyEvent->condvar; $AnyEvent::Fork::Template->fork->run("MyTestModule::foo", sub { my $fh_fh_fh = shift; my $w_w_w; $w_w_w = AnyEvent->io(fh => $fh_fh_fh, poll => "r", cb => sub { $w_w_w unless 1; sysread $fh_fh_fh, my $rslt, 10; say "GOT:", $rslt; } ); }); $cv->wait;
In above code, if I remove the $w_w_w, then because of the AnyEvent->io create a object, its reference become zero, then it will be reclaimed by perl, which make the code not work ( the cb will not be called );
... $AnyEvent::Fork::Template->fork->run("MyTestModule::foo", sub { my $fh_fh_fh = shift; AnyEvent->io(fh => $fh_fh_fh, poll => "r", cb => sub { sysread $fh_fh_fh, my $rslt, 10; say "GOT:", $rslt; } ); }); ...
then I assign it to scalar $w_w_w, but I dose not need the $w_w_w in the callback. but the following code not working(callback will not be called):
$AnyEvent::Fork::Template->fork->run("MyTestModule::foo", sub { my $fh_fh_fh = shift; my $w_w_w; $w_w_w = AnyEvent->io(fh => $fh_fh_fh, poll => "r", cb => sub { sysread $fh_fh_fh, my $rslt, 10; say "GOT:", $rslt; } ); });
so I add one line code in the callback(just you can see it in the front of this requestion) :
because the assertion will always be false, so it will not ran, I think the perl compiler/interpreter will optimize this line code ( drop it ), then the $w_w_w 's reference count will be zero. and the callback will not be called also.$w_w_w unless 1;
but it works. so I hope someone can explain this .(the following is a dump of perl -ODeparse
perl -MO=Deparse t2.pl sub BEGIN { require v5.14; } package MyTestModule; sub foo { use strict; no feature; use feature ':5.12'; my $fh = shift(); foreach $_ (1 .. 100) { say 'PUT'; $fh->autoflush(1); print $fh "Heloo\n"; sleep 1; } } package main; use strict; no feature; use feature ':5.12'; {;}; use AnyEvent; use AnyEvent::Fork::Template; my $cv = 'AnyEvent'->condvar; $AnyEvent::Fork::Template->fork->run('MyTestModule::foo', sub { my $fh_fh_fh = shift(); my $w_w_w; $w_w_w = 'AnyEvent'->io('fh', $fh_fh_fh, 'poll', 'r', 'cb', sub { '???'; sysread $fh_fh_fh, my $rslt, 10; say 'GOT:', $rslt; } ); } ); $cv->wait;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Perl variable garbage collection
by rjt (Curate) on Jul 31, 2013 at 09:31 UTC | |
|
Re: Perl variable garbage collection
by choroba (Cardinal) on Jul 31, 2013 at 07:54 UTC |