我想測試用戶是否在FreeNode上註冊。 nick_info()似乎沒有返回關於此的信息,所以我想使用$ irc-> yield(whois => $ nick);然後抓取irc_whois事件的回覆。問題是,我想等到這個事件被激發,所以我創建了一個全局變量$ whois_result並寫了這樣子:如何在Perl中使用POE :: Component :: IRC :: State來檢查用戶是否使用NickServ進行身份驗證?
sub whois {
my $nick = $_[0];
$whois_result = 0;
$irc->yield(whois => $nick);
while($whois_result == 0) { }
return $whois_result;
}
與irc_whois處理程序看起來像:
sub on_whois {
$whois_result = $_[ARG0];
print "DEBUG: irc_whois fired.\n";
}
不幸的是,當循環運行時事件不能觸發,所以這個掛起。我相信有更好的方法來做到這一點,但我對這種編程知之甚少。任何幫助將不勝感激。
謝謝,但我的主要問題是不在IRC端,它在POE端。我想詢問用戶是否已註冊,並且在我得到答案之前不做任何其他事情。我遇到的問題是這些東西都是事件驅動的,而請求和響應是單獨的事件。這意味着我必須發送請求,然後讓機器人做一段時間,然後每當出現響應時,我就會處理它。 我上面的解決方案是讓響應處理程序設置一個全局變量並輪詢該變量,但失敗。 – Troy 2009-12-13 22:04:14
好的,我想出了一個解決方案。我所做的是我創建了一個全局隊列。每次我進行whois呼叫時,我都會將一個匿名函數轉移到處理結果信息的隊列中。我的whois響應處理程序看起來像這樣: sub on_whois {$} function = pop(@whois_queue); $ function - >($ _ [ARG0]); } – Troy 2009-12-14 03:02:55