0

AnyEvent::Twitter::Stream モジュールを使用しようとしていますが、フォローしたい Twitter uid をリストしたファイルを参照したいと考えています。コード自体に uid を入れることができ、次のように機能します。

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 エラーが発生しました。これは、形式が正しくないことを示しています。引用符がどういうわけか正しくないと思いますか?

4

2 に答える 2

1

モジュールはAnyEvent::Twitter::StreamサブクラスAnyEventであり、基本モジュールにアクセスする必要はまったくありません。すべての機能は、newそこで指定するメソッドとコールバックによって提供されるため、AnyEvent->condvarまたはを呼び出さないでください$done->recv

への呼び出し内に属さないopen呼び出しと割り当て。@uid_lineAnyEvent::Twitter::Stream->new

さらに、followパラメーターの値を指定するために使用している変数は、の@uid_file代わりになり@uid_lineます。

あなたは、特にあなたがそれらの助けを求めているならば、あなたはあなたのプログラムの始めにそしてあなたのプログラムの始めにそうしなければなりません use strict;use warnings;これにより、他の方法では見落とす可能性のあるこのような単純な間違いをトラップできます。

一般に、配列を使用して単一のスカラー値を指定することはできません。この場合、ファイルに1行しかない(つまり、配列に要素が1つしかない)限りは問題ありませんが、問題が発生する可能性のあるものがたくさんあります。

さらに、そこに属していない値に一重引用符を渡します。これらは、Perl文字列の開始と終了を示すためにのみコードに表示されます。

このようにファイルからすべての10進文字列を読み取ることをお勧めします

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,
);
于 2012-04-10T06:15:04.577 に答える
0

スカラーコンテキストで配列を渡そうとしているように見えるので、 follow を1配列内の要素数 (ファイル内の行数) に設定している可能性があります。

ファイルに ID が 1 行しかないと仮定すると、次のようになります。

   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;
于 2012-04-10T04:21:51.943 に答える