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

Re: AnyEvent weirdness w/ open() and/or ``'s

by james2vegas (Chaplain)
on Nov 02, 2013 at 17:06 UTC ( #1060961=note: print w/ replies, xml ) Need Help??


in reply to AnyEvent weirdness w/ open() and/or ``'s

Why do you need to read your data synchronously? Why not read lines from your command asynchronously, and create the messages in a callback? There are many AnyEvent modules to make running and getting output back from external commands easy, but there is also AnyEvent::Util::fork_call (which serialises the whole output of your command before calling the callback).

Alternatively, you could probably use an IO watcher like this:

open my $fh, '-|', 'some command'; my $w; $w = AnyEvent->io( fh => $fh, poll => 'r', cb => sub { chomp(my $user = $fh->getline); AnyEvent::XMPP::IM::Message->new( body => construct_body( $msg->body, $from ), to => "$user\@" . HOST, type => "chat", )->send($conn); undef $w if eof($fh); } );


Comment on Re: AnyEvent weirdness w/ open() and/or ``'s
Download Code
Re^2: AnyEvent weirdness w/ open() and/or ``'s
by pprocacci (Initiate) on Nov 03, 2013 at 07:30 UTC
    James,

    I appreciate your response. My familiarity w/ AnyEvent isn't too great and your response has helped greatly. What I ended up doing which I believe to look extremely ugly follows my comments. (again heavily modified)

    To provide further details to hopefully paint a full picture .... I have two sources. One is from a command, and another is from a file. Both sources are pulled into an array and what I believe the below achieves is sending messages to the intersection of the arrays.

    The below works with my limited testing and I appreciate the guidance thus far you've provided. I don't need further help unless of coarse you see something glaringly wrong, but until then, thanks James.

    $muc->reg_cb( message => sub { my ( undef, undef, $msg ) = @_; my @connected_users = (); open my $fh, '-|', 'command_that_outputs_users' or die $!; my $w; $w = AnyEvent->io( fh => $fh, poll => 'r', cb => sub { my $user = $fh->getline; return if !defined($user); chomp($user); push(@connected_users, $user); if(eof($fh)){ close($fh); undef $w; open($fh, "< $file") or die $!; my $w2; $w2 = AnyEvent->io( fh => $fh, poll => 'r', cb => sub { my $user = $fh->getline; return if !defined($user); chomp($user); if($user ~~ @connected_users){ AnyEvent::XMPP::IM::Message->new( body => construct_body( $msg->body, $from ), to => "$user\@" . HOST, type => "chat", )->send($conn); close($fh); undef $w2; } } ); } } ); }, );

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2014-07-28 07:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (192 votes), past polls