Wide character in print at ./twitter_lite_search.pl line 126.それでも気持ちが悪いので、ウェブ上で検索してみることにしました。案の定同じ悩みを持っている人がいました。詳細は「【Perl 文字化け解決】Wide character in print atといふエラーが原因だったー」にありますが、結論は以下のコードを追加すれば、以上の警告はなくなるそうです。
use encoding qw(shiftjis);しかし、試してみたら、やはりだめでした。結局以下のコンビで警告はなくなりました。([perl] 文字列を print すると「Wide character in print at」と出力されて困った)
use Encode;引用もとに変化があると困るので、念のためにいかにそのコードをコピーしておきます。
print T encode('utf-8', $line);
Net::Twitter::Liteの仕様はこちらです。
Net::Twiter::LiteでTwitterを検索するPerlのソースコード
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Net::Twitter::Lite;
use Data::Dumper;
$|=1;
my %CONSUMER_TOKENS = (
consumer_key => 'xxxxxxxxxxxxxxxxxxxxx',
consumer_secret => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
legacy_lists_api => 1,
useragent_args => {'env_proxy' => 1, 'default_headers' => HTTP::Headers->new('Proxy-Address' => 'http://127.0.0.1:8118')}
);
my $ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
my $ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
my $nt = Net::Twitter::Lite->new(%CONSUMER_TOKENS);
$nt->access_token($ACCESS_TOKEN);
$nt->access_token_secret($ACCESS_TOKEN_SECRET);
my $target=$ARGV[0];
my $fn = "$target" . ".txt";
open(T, ">>$fn") or die ("$!");
my $statuses;
my $status;
my $cnt = 0;
my $last_id = '0';
sub getSinceDate() {
my $cur_time = time;
my $time = $cur_time - 2*86400 ;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time) ;
my $since_date = sprintf("%02d",$mday) ;
$year = $year + 1900 ;
$mon = $mon + 1 ;
$mon = sprintf("%02d",$mon) ;
$since_date = $year."-".$mon."-".$since_date ;
return $since_date ;
}
sub cleanup{
my $str = shift ;
if( !$str ) {
print STDERR "empty str passed to cleanup = $str \n";
print $str ;
}
$str =~ s/^\s+// ;
$str =~ s/\s+$// ;
$str =~ s/\r//g ;
$str =~ s/\s+/ /g ;
return $str ;
}
sub cleanup_source{
my $source = shift ;
if( !$source ) {
print STDERR " empty source passed to cleanup_source $source \n";
print $source ;
}
$source =~ s/<(.*?)>//g;
return $source ;
}
my $since_date_param;
my $drug_id = 1;
my $search_term = $target ;
my $page ;
my $total_pages = 0;
my $total_results = 0;
my $r ;
my $tweet_content ;
my $tweet_time ;
my $tweet_url ;
my $tweet_id ;
my $tweet_username ;
my $tweet_source ;
my $result_count ;
my $line ;
for($page=1;$page <= 100 ; $page++){
$since_date_param = &getSinceDate() ;
print STDERR "since_date_param $since_date_param \n";
my %param = (
page => $page ,
rpp => 100 ,
lang => 'ja',
since => $since_date_param
);
$r = eval {$nt->search($search_term,{%param}) } ;
if ($@) {
warn "$@ this is the warning : sleeping for an hour \n";
sleep(4000) ;
$since_date_param = &getSinceDate() ;
my %param = (
page => $page ,
rpp => 100 ,
lang => 'en',
since => $since_date_param
);
$r = eval {$nt->search($search_term,{%param}) } ;
}
if ( scalar(@{$r->{'results'}}) > 0 ){
$result_count = scalar(@{$r->{'results'}}) ;
$total_results += $result_count ;
for(my $i = 0 ; $i < $result_count ; $i++){
$tweet_content = $r->{'results'}[$i]{'text'} ;
chomp($tweet_content) ;
$tweet_time = $r->{'results'}[$i]{'created_at'} ;
$tweet_id = $r->{'results'}[$i]{'id'} ;
$tweet_username = $r->{'results'}[$i]{'from_user'} ;
$tweet_source = $r->{'results'}[$i]{'source'} ;
$tweet_content = cleanup($tweet_content) ;
$tweet_source = cleanup_source($tweet_source) ;
$line = "$tweet_username $tweet_id $tweet_time $tweet_source $tweet_content";
print T $line."\n" ;
}
if ( !(exists($r->{'next_page'}))){
$total_pages = $page ;
print STDERR " no more results: total pages for $search_term for $page \n" ;
last ;
}
#sleep(180) ;
}
else{
$total_pages = $page ;
print STDERR " no more results total pages for $search_term are $total_pages \n" ;
last ;
}
}
if (my $error = $@) {
print STDERR "$error\n";
}
close(T);
exit(0);
# End of FILE.