Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Select on child output problem

by topher (Scribe)
on May 03, 2012 at 04:13 UTC ( #968621=note: print w/ replies, xml ) Need Help??


in reply to Select on child output problem

Ok, I think I've solved it. I won't even start on how annoying this is, and how much I wish I'd figured it out sooner. I'm still a little mystified on why it's failing in the original code, though. I have a theory, but I don't know Perl internals well enough to know if it's correct.

Basically, it's the part where I grab the filehandle via shift that is blowing up the program. It seems to be tightly associating my lexical loop variable with the filehandle, and then when the variable (and thus the filehandle) go out of scope at the end of the loop, it's trying to cleanup the filehandle (by closeing and waiting on it.

my $fd = shift @{$_}; my $child = shift @{$_};

When I replace that with the following:

my $fd = $_->[0]; my $child = $_->[1];

It works.

My theory is that because the underlying container where the filehandle is being stored is an array reference, that when I shift on the (dereferenced) array reference, I'm stomping on the original, even though it's in a for loop and using $_.

Does that sound right? Chalk it up to the care needed for references and reference "copies", I suppose.


Comment on Re: Select on child output problem
Select or Download Code
Re^2: Select on child output problem
by chromatic (Archbishop) on May 03, 2012 at 05:19 UTC
    My theory is that because the underlying container where the filehandle is being stored is an array reference, that when I shift on the (dereferenced) array reference, I'm stomping on the original...

    Oh yes, that sounds right. IO::Select probably isn't making a deep copy when you call can_read().

    ... even though it's in a for loop and using $_.

    That's a red herring. Your original code modified the data structure out from under IO::Select and your code. Loop aliasing doesn't apply at all, as it doesn't make deep copies either.

      Thanks for the confirmation.

      Frustrating experience, but at least I learned something. And something tells me I'll not be making this mistake again any time soon.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://968621]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (2)
As of 2014-09-21 00:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (165 votes), past polls