如何在perl模块中引用此参数

时间:2012-04-10 03:59:31

标签: perl twitter

我正在尝试使用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错误,提示格式不正确。我猜测引号不正确?

2 个答案:

答案 0 :(得分:1)

AnyEvent::Twitter::Stream模块子类AnyEvent,您根本不需要访问基本模块。所有功能都由new方法和您在此处指定的回调提供,您不应该致电AnyEvent->condvar$done->recv

open的{​​{1}}来电和分配不属于@uid_line的来电。

此外,您用于提供AnyEvent::Twitter::Stream->new参数值的变量为follow而不是@uid_file

必须在程序开始时 @uid_lineuse 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;