2012-04-10 41 views
0

我想使用AnyEvent :: Twitter :: Stream模塊,我想引用一個文件,列出我想跟隨的Twitter uid。我可以把在UID的代碼本身和它的工作原理如下:如何引用perl模塊中的這個參數

my $done = AnyEvent->condvar; 
     my $nt_filter = AnyEvent::Twitter::Stream->new(
      username => $cf{account}, 
      password => $cf{password}, 
      method => 'filter', 
      follow => '15855509,14760150,18598536', 
      on_tweet => sub { 
       #some code..... 
      }, 
      on_error => sub { 
       my $error = shift; 
       debug "ERROR: $error"; 
      }, 
      timeout => 45, 
     ); 
     $done->recv; 

但是當我嘗試使用一個文件這樣做同樣的:

my $done = AnyEvent->condvar; 
     my $nt_filter = AnyEvent::Twitter::Stream->new(
      open UID_FILE, "/tmp/uids" or die $!; 

      my @uid_line = <UID_FILE>; 

      username => $cf{account}, 
      password => $cf{password}, 
      method => 'filter', 
      follow => @uid_file, 
      on_tweet => sub { 
        #some code.... 
      }, 
      on_error => sub { 
       my $error = shift; 
       debug "ERROR: $error"; 
      }, 
      timeout => 45, 
     ); 
     $done->recv; 

失敗。該uids文件具有以下內容:

'15855509,14760150,18598536' 

我收到來自Twitter的406錯誤,提示格式不正確。我猜猜報價不正確?

+0

您是否需要從UID文件中刪除行以刪除可能的借出?我會比較實際的HTTP請求,看看發生了什麼。找到一個工具,如HTTPScoop來記錄這些東西。 – 2012-04-10 04:16:11

回答

1

AnyEvent::Twitter::Stream模塊的子類AnyEvent,你並不需要在所有訪問基本模塊。所有功能都由new方法和您在此指定的回調提供,並且您不應撥打AnyEvent->condvar$done->recv

open呼叫和轉讓@uid_line不屬於撥打AnyEvent::Twitter::Stream->new的呼叫。

此外,您用於提供follow參數值的變量是@uid_file而不是@uid_line

必須use strict;use warnings;在你的程序的啓動,特別是如果你正在尋求與他們的幫助。這會陷入這樣的簡單錯誤,否則你可能會忽略。

通常不能使用數組來提供單個標量值。在這種情況下,只要文件只有一行(因此數組中只有一個元素),但可能會出錯的情況很多。

另外,您在不屬於該值的值中傳遞單引號:它們出現在代碼中僅用於標記Perl字符串的開始和結尾。

我建議你讀你的文件中的所有十進制這樣

open my $uid_fh, '<', '/tmp/uids' or die $!; 
my @uids; 
push @uids, /\d+/g for <$uid_fh>; 

(請注意,這些線路屬於之前調用AnyEvent::Twitter::Stream->new

然後,你可以通過書面形式提供follow參數

follow => join(',', @uids), 

我希望這很清楚。請再詢問一下您是否需要進一步幫助。


編輯

納入你的代碼的這些變化應該是這樣的,但它是不完整的,我不能保證它會正常工作。

use strict; 
use warnings; 

use AnyEvent::Twitter::Stream; 

open my $uid_fh, '<', '/tmp/uids' or die $!; 
my @uids; 
push @uids, /\d+/g for <$uid_fh>; 

my %cf = (
    account => 'myaccount', 
    password => 'password', 
); 

my $nt_filter = AnyEvent::Twitter::Stream->new(
    username => $cf{account}, 
    password => $cf{password}, 
    method => 'filter', 
    follow => join(',', @uids), 
    on_tweet => sub { 
    #some code.... 
    }, 
    on_error => sub { 
    my $error = shift; 
    debug "ERROR: $error"; 
    }, 
    timeout => 45, 
); 
0

在我看來,你正試圖在標量環境中傳遞一個數組,因此你可能要設置1,這是數組中元素的數量(文件中的行數)。

假設有你的文件ID,只有一行,做了以下工作:

open UID_FILE, "/tmp/uids" or die $!; 

    # Load the first line of uids 
    my $uid_line = <UID_FILE>; 

    # Remove apostrophes from input. 
    # This may or may not be necessary 
    $uid_line =~ s/'//g; 

    # Don't forget to close the file 
    close(UID_FILE); 

    my $done = AnyEvent->condvar; 
    my $nt_filter = AnyEvent::Twitter::Stream->new(

     username => $cf{account}, 
     password => $cf{password}, 
     method => 'filter', 
     follow => $uid_line, 
     on_tweet => sub { 
       #some code.... 
     }, 
     on_error => sub { 
      my $error = shift; 
      debug "ERROR: $error"; 
     }, 
     timeout => 45, 
    ); 
    $done->recv; 

你可能會需要從輸入線剝離開頭和結尾的撇號。例如:

$uid_line =~ s/^'//; 
$uid_line =~ s/'$//; 

你也許可以逃脫只是刪除所有撇號,例如:

$uid_line =~ s/'//g; 
+0

我更新了我的代碼,將調用外部的開放移動到AnyEvent :: Twitter :: Stream-> new,@Borodin指出。 – mttrb 2012-04-10 06:40:33