Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Perl/POE)在POE::Component::IRC中,如何从外部子例程中的包状态返回/获取数据?_Perl_Bots_Irc_Poe - Fatal编程技术网

(Perl/POE)在POE::Component::IRC中,如何从外部子例程中的包状态返回/获取数据?

(Perl/POE)在POE::Component::IRC中,如何从外部子例程中的包状态返回/获取数据?,perl,bots,irc,poe,Perl,Bots,Irc,Poe,我试图从IRC bot中的包状态获取输出数据,它使用POE::Component::IRC作为基础。但我似乎做不到 基本上,在POE会话之外的子例程中,我希望从POE从服务器接收数据时触发的事件子例程中获取数据。 我尝试将数据保存在全局数组甚至外部文件中,但外部子例程将在数据更新之前从中读取旧数据 更具体地说,我试图让这个机器人检查某人是否是“ison”,如果是,则返回true(或从irc_303获取所有数据) 大概是这样的: sub check_ison { my $who = "so

我试图从IRC bot中的包状态获取输出数据,它使用POE::Component::IRC作为基础。但我似乎做不到

基本上,在POE会话之外的子例程中,我希望从POE从服务器接收数据时触发的事件子例程中获取数据。 我尝试将数据保存在全局数组甚至外部文件中,但外部子例程将在数据更新之前从中读取旧数据

更具体地说,我试图让这个机器人检查某人是否是“ison”,如果是,则返回true(或从irc_303获取所有数据)

大概是这样的:

sub check_ison {
    my $who = "someguy";
    $irc->yield(ison => $who);
    $data = (somehow retrieve data from irc_303);
    return $data; #or true if $data
}

听起来你想要一个异步问题的同步解决方案。由于IRC(以及POE)的异步特性,您需要发出ISON查询并在收到数字响应时处理它

据我所知,大多数客户端NOTIFY实现都会定期发出ISON(POE::Component::IRC通过POE::Component::Syndicator提供计时器糖),更新它们的状态,并在发生变化时通知用户

你有选择

您可以在计时器上发出ison,在数值响应处理程序中适当地保存状态,并提供查询状态的方法。如果您的应用程序看起来更像一个客户端(即,当某些内容发生更改时需要通知用户/某些内容),那么您的数字响应处理程序可以执行一些基本的列表比较,并为出现/消失的用户发出适当的事件


否则,您可以简单地使用一个“check_-ison”来发出ison并从数字响应处理程序生成某种类型的“response received”事件,让您知道有新的数据可用。

不幸的是,这两个选项都不适用于我调用ison的方式。在使用特定命令时,只调用一次ISON。更具体地说,在调用该命令后,我想检查用户是否实际连接,并通过MemoServ向他们发送消息,而不是备忘录。最简单的是,我想在子例程/函数中截获来自IRC服务器的任何或特定传入消息。在本例中,我想在check_-ison子例程调用$irc->yield(ison=>$who)后截获irc_303消息,其中$who也是动态数据,而不是示例中所示的静态数据。因此,实际情况如下:发出$irc->yield(foo=>$bar),调用POE::Component::Syndicator的yield()方法,最终(当POE就绪时)向POE::Component::IRC会话发出事件,该会话最终将实际的ISON命令发送到服务器。在这两者之间可能会发生许多其他事情——这都是异步的。您没有收到来自服务器的同步响应;没有什么能阻止等待响应,除非你告诉它。