2014-06-12 3 views
0

Вчера я написал плагин PERL скрипт для Pidgin 2.10.9, работает на Windows 7, а также с помощью Strawberry Perl 5.10.1.5STDOUT из Pidgin плагин сценария

В основном на получении IM, он использует кавычку для вызова консольного приложения (написанного в .NET) и возвращает вывод консоли отправителю как IM.

Мне пришлось перезагрузить это утро, но с тех пор, как я перезагрузился, он прекратил работать.

Итак, я изменил обратные такты, чтобы использовать «захват». Это не сработало, но по крайней мере, дал мне эту ошибку:

(15:00:33) Plugin: Error: Error in IPC::System::Simple plumbing: "Can't dup STDOUT" - "Bad file descriptor" at (eval 12) line 53 

Понятия не имею, что изменилось со вчерашнего дня до сегодняшнего дня, и спрашивает, если кто-нибудь знал, что может быть причиной ошибки?

Благодаря

Edit: Думал добавить свой код

use Purple; 
#use IPC::System::Simple qw(system systemx capture capturex); 
use IPC::System::Simple qw(capture capturex); 

%PLUGIN_INFO = (
    perl_api_version => 2, 
    name => "PlugIn", 
    version => "0.1", 
    summary => "AutoResp", 
    description => "PlugIn", 
    author => "Mark Watkin", 
    url => "http://", 
    load => "plugin_load", 
    unload => "plugin_unload" 
); 

sub plugin_init { 
    return %PLUGIN_INFO; 
} 
sub plugin_load { 
    my $plugin = shift; 
    Purple::Debug::info("PlugIn", "plugin_load()\n"); 

    $data = ""; 
    $conversation_handle = Purple::Conversations::get_handle(); 
    Purple::Signal::connect($conversation_handle, "received-im-msg", $plugin, \&signal_chat_callback, $data); 
} 
sub plugin_unload { 
    my $plugin = shift; 
    Purple::Debug::info("PlugIn", "plugin_unload()\n"); 
} 

sub signal_chat_callback { 
    # The signal data and the user data come in as arguments 
    my ($account, $sender, $message, $conv, $flags) = @_; 

    Purple::Debug::info("PlugIn", "Account Alias \"" . $account->get_alias() . "\"\n"); 
    if($account->get_alias() eq "PlugIn") 
    { 
     Purple::Debug::info("PlugIn", "Request: \"" . $message . "\"\n"); 

     if(!$conv) 
     { 
      Purple::Debug::info("PlugIn", "No conversation\n"); 
      $conv = Purple::Conversation->new(1, $account, $sender); 
     } 
     $im = $conv->get_im_data(); 
     $im->send("One moment please..."); 

     my $query = ""; 
#  eval { 
#   $query = capture("\"D:\\SourceCode\\PlugInNET\\bin\\Debug\\PlugInNET.exe\" \"" . $message . "\""); 
#   #$query = capture("\"D:\\SourceCode\\PlugInNET\\bin\\Debug\\PlugInNET.exe\"", "\"" . $message . "\""); 
#   #my $query = capture("D:\\SourceCode\\PlugInNET\\bin\\Debug\\PlugInNET.exe"); 
#   #my $query = `\"D:\\SourceCode\\PlugInNET\\bin\\Debug\\PlugInNET.exe\" \"$message\"`; 
#   #my $query = `dir /b`; 
#  }; 
#  if([email protected]) 
#  { 
#   Purple::Debug::info("PlugIn", "Error: " . [email protected] . "\n"); 
#  } 

     Purple::Debug::info("PlugIn", "Query: " . $query . "\n"); 
     open (my $fh, "-|", "D:\\SourceCode\\PlugInNET\\bin\\Debug\\PlugInNET.exe \"$message\"") or die "Cannot run free, $ERRNO"; 
     while (<$fh>) 
     { 
      Purple::Debug::info("PlugIn", "Read: Line " . $_ . "\n"); 
      $query = $query . $_ . "\n"; 
     } 
     close $fh; 
     Purple::Debug::info("PlugIn", "Query: " . $query . "\n"); 

     if($query eq "") 
     { 
      $im->send("I'm sorry, my brain doesn't seem to be functioning at the moment"); 
     } else { 
      @msgs = split(/-----------\n/, $query); 
      foreach(@msgs) 
      { 
       Purple::Debug::info("PlugIn", "Result Msg: \"" . $_ . "\"\n"); 
       $im->send("<BODY>" . $_ . "</BODY>"); 
      } 
     } 
    } 
} 

План должны был исправить пути, когда я имел это работает должным образом

+2

Всегда «используйте» строгие правила и предупреждения, чтобы помочь найти ошибки. –

ответ

0

Пожалуйста, рассмотрите возможность использования дескрипторов файлов вместо backticks для захвата stdout из другого источника. Вы сможете собирать ошибки.

#!/usr/bin/perl 

use strict; 
use warnings; 
use English; 

# No taint protection in this example 
open (my $fh, '-|', '/usr/bin/free') or die "Cannot run free, $ERRNO"; 
while (<$fh>) 
{ 
    print; 
} 
close $fh; 
+0

Я изменил свой код (теперь размещен в вопросе), но он по-прежнему не показывает мне никаких данных из Pidgin. Это также не дает мне никаких ошибок –

Смежные вопросы