我正在尝试使用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错误,提示格式不正确。我猜测引号不正确?
答案 0 :(得分:1)
AnyEvent::Twitter::Stream
模块子类AnyEvent
,您根本不需要访问基本模块。所有功能都由new
方法和您在此处指定的回调提供,您不应该致电AnyEvent->condvar
或$done->recv
。
对open
的{{1}}来电和分配不属于@uid_line
的来电。
此外,您用于提供AnyEvent::Twitter::Stream->new
参数值的变量为follow
而不是@uid_file
。
您必须在程序开始时 @uid_line
和use strict;
,尤其是在您向他们寻求帮助时。这将捕获这样的简单错误,否则你可能会忽略它。
通常不能使用数组来提供单个标量值。在这种情况下,只要文件只有一行(因此数组中只有一个元素)就可以了,但是有很多可能出错。
此外,您在值中传递的单引号不属于那里:它们仅出现在代码中以标记Perl字符串的开头和结尾。
我建议您从文件中读取所有十进制字符串,如此
use warnings;
(请注意,这些行在调用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),
答案 1 :(得分: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;