0

我正在尝试使用 AnyEvent::Twitter::Stream 模块,并且我想引用一个列出我想要关注的 Twitter uid 的文件。我可以将 uids 放在代码本身中,它的工作原理如下:

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->condvaror $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,
);
于 2012-04-10T06:15:04.577 回答
0

在我看来,您正在尝试在标量上下文中传递数组,因此您可能将 follow 设置为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;
于 2012-04-10T04:21:51.943 回答