読者です 読者をやめる 読者になる 読者になる

マンガ発売日ボットスクリプト手直し

Perl Twitter

id:otsuneさんにブクマコメントで「Text::CSV使おう」とアドバイスいただいたので、早速使ってみた。Text::CSVCSVをお手軽に使うためのモジュールで、カンマが要素内にある場合なんかに対応してくれるらしい。ちょっと調べてみたら、Text::CSV_XSという同じくCSVを扱うためのモジュールの例がたくさん出てきたので、今回はこっちを使ってみた。
下のボットスクリプトとのdiffはこんな感じ。ちょっとリファクタリングをして、出力結果に出版社を加えてみました。同じように変更したら自分のところに投稿する方でも問題ないはず。

一度diffの結果を張ってみたかったんだ。

--- comicALL2Twitter.pl	2007-04-22 20:58:11.316659200 +0900
+++ comicALL2Twitter_CSV.pl	2007-04-22 21:28:21.940208000 +0900
@@ -6,30 +6,35 @@
 use Net::Twitter;
+use Text::CSV_XS;
 use utf8;
 use Encode;
 
 open(IN, "/Path/To/comics.csv") or die $!;
 my $charset = "utf8";
 my $today = Date::Simple->new;
 
 my @messages;
+my $csv = Text::CSV_XS->new({'binary' => 1});
 while (<IN>) {
     chop;
     my $line = decode($charset,$_);
-    my($date, $title, $author, $pub, $price) = split(/"?,["\s]*/, $line);
-    $date =~ s/T00:00:00//;
-    $title =~ s/\s//g;
-    if ($date eq $today->format("%Y-%m-%d")) {
-        $price =~ s/"//;
-        my $day = $today->format("%m/%d");
-        push @messages, "[$day] $title / $author / $price";
-    }
 
+    $line =~ s/\s//g;
+
+    $csv->parse($line);
+    my @columns = $csv->fields();
+    $csv->parse(pop @columns);
+    for ($csv->fields()) {
+        s/^\s//;
+        push @columns, $_;
+    }
+
+    if ((shift @columns) =~ (my $day = $today->format("%m-%d"))) {
+        my $data = join " / ", @columns;
+        push @messages, "[$day] $data";
+    }
 }
 close(IN);
 
 @messages = reverse @messages;
 
 my $twit = Net::Twitter->new(username=>"ユーザ名", password=>"パスワード" );
 my @result;
-push @result, $twit->update(encode_utf8($_)) for(@messages);
+push @result, $twit->update($_) for(@messages);

一度diffの結果を張ってみたかったんだ。
あと、newのところで

$csv = Text::CSV_XS->new({'binary' => 1});

として日本語を使えるようにしてるけど、ここの時点でutf8にエンコードされているみたい。