command line interface mixi (2)

ちょっとだけ進めた。

マイミク一覧の表示をまじめに書いた
format機能を使ったんですが、便利だけどスコープとかの面であまり使いやすい機能ではないので、代替方法をCPANを探した方がいいかもしれない。下のように表示できるようにした。
名前                             状態
--------------------------------+--------------------
xxxxxxさん(16)                   1時間以内
xxxxxxさん(3)
xxxxxxさん(84)                   1日以内
xxxxxxxxxxさん(43)
xxxxxxさん(42)                   1日以内
xxxxxxxxxxxxxxさん(14)           1日以内
メールアドレスとパスワードは、起動引数で受けるようにした
とりあえず、です。間違えてここに張っちゃうのが怖いからというのもあった。
コマンドを定義するsubを配置するパッケージを別にした。
競合しないように。
文字コード変換
Encodeを使った。
エラーメッセージなどの出力先変更
標準出力と標準エラー出力との使い分けをした。
#!c:/Perl/bin/perl
package main;
use strict;
use warnings;
use Term::ReadLine;
use WWW::Mixi;
my $term = new Term::ReadLine 'command line interface mixi';
my $OUT = $term->OUT || \*STDOUT;
my $ERR = \*STDERR;
my ($mail_address, $password) = @ARGV;
if (!$mail_address || !$password) {
print $ERR <<EOD;
Usage: $0 <mail_address> <password>
EOD
exit;
}
#コマンド定義
my %command_of = (
'q' => \&Commands::quit,
'quit' => \&Commands::quit,
'exit' => \&Commands::quit,
'h' => \&Commands::help,
'help' => \&Commands::help,
'friend_list' => \&Commands::friend_list);
my $mixi = new WWW::Mixi(
$mail_address,
$password,
-log => 10,
-logcode => 'sjis');
#環境変数(HTTP_PROXY)からproxy情報を読む
$mixi->env_proxy();
print $ERR "logging in....  ";
my $response = $mixi->login();
print $ERR "$response->{'_rc'} $response->{'_msg'}\n";
if ($response->{'_rc'} ne "200") {
print $ERR "ログインに失敗しました。メールアドレスまたは、パスワードを確認してください。\n";
exit;
}
while ( defined (my $input = $term->readline("mixi> ")) ) {
if ($command_of{$input}) {
&{$command_of{$input}} ;
} else {
print $ERR "ERROR: 不明なコマンドです。 [$input]\n";
&{$command_of{'help'}};
}
}
exit;
#====================
# Commands
#====================
package Commands;
use Encode;
sub quit {
exit;
}
sub help {
print $ERR <<EOD;
q quit exit     終了する。
h help          ヘルプを表示する。
friend_list     マイミク一覧を表示する。
EOD
}
sub friend_list {
my @friend_list = $mixi->get_list_friend();
my ($name, $state);
_convert(@friend_list);
    format STDOUT =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<
$name,                           $state
.
print $OUT "名前                             状態                \n";
print $OUT "--------------------------------+--------------------\n";
for (@friend_list) {
$name = "$_->{'subject'}($_->{'count'})";
$state = $_->{'status'} ? $_->{'status'} : "";
write(STDOUT);
}
}
sub _convert {
foreach my $ref (@_) {
while (my ($key, $value) = each(%$ref)) {
Encode::from_to($value, 'euc-jp', 'shiftjis');
$ref->{$key} = $value;
}
}
}
# vim: ts=4 sw=4 expandtab

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください