RakuAPI.pm

なんかいろいろおかしかったので修正。

package RakuAPI;
use strict;
use warnings;

use XML::TreePP;
use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors(qw/tpp base_url/);

sub new {
 my $class = shift;
 my $self = {
  tpp => XML::TreePP->new(force_array => ['Result']),
  base_url => 'http://rakuapi.ddo.jp/api?keyword=',
 };
 return bless $self, $class;
}

sub search {
 my ($self, $keyword, $option) = @_;

 my @params;
 if ( $option ) {
  foreach ( keys %{$option} ) {
   my $param = $_ . '=' . $option->{$_};
   push  @params, $param;
  }
 }

 $keyword =~ s/(\W)/'%' . unpack('H2', $1)/eg;

 my $reqest_url = $self->base_url . $keyword;
 $reqest_url .=  '&' . join('&', @params) if ( $option );

 my $parsed_xml = $self->tpp->parsehttp(GET => $reqest_url);

 my @results;
 foreach my $result( @{$parsed_xml->{ResultSet}->{Result}} ) {
  push @results, RakuAPI::Result->new($result);
 }

 return @results;
}

1;

package RakuAPI::Result;
use strict;
use warnings;

use base qw(Class::Accessor::Fast);

sub new {
 my ($class, $result) = @_;

 my $self = $class->SUPER::new($result);
 $class->mk_accessors(keys %{$result});

 return bless $self, $class;
}

1;

まだいろいろおかしいような気ガス。
一応動く。

use strict;
use warnings;
use RakuAPI;

my $app = RakuAPI->new;

my @results = $app->search('PSP', {sort => 'high'});

foreach my $result ( @results ) {
 print $result->Title, "\n";
 print $result->Url, "\n";
}

上の実行結果。

新品!カルピジャーニ ソフトクリームフリーザー AES403PSP/S
http://item.rakuten.co.jp/recyclemart/cpjheaaa19010n/
新品!カルピジャーニ ソフトクリームフリーザー AES403PSP/S
http://www.rakuten.co.jp/recyclemart/451778/452834/593927/#693600
新品!カルピジャーニ ソフトクリームフリーザー AES261PSP/S
http://item.rakuten.co.jp/recyclemart/cpjheaaa19000n/
新品!カルピジャーニ ソフトクリームフリーザー AES261PSP/S
http://www.rakuten.co.jp/recyclemart/451778/452834/593927/#693494
新品!カルピジャーニ ソフトクリームフリーザー 191BAR/PSP
http://item.rakuten.co.jp/recyclemart/cpjheaaa19040n/
新品!カルピジャーニ ソフトクリームフリーザー 191BAR/PSP
http://www.rakuten.co.jp/recyclemart/451778/452834/593927/#694419
中古:カルピジャーニ ソフトクリームフリーザー(ソフトクリーマー) AES-403PSP
http://item.rakuten.co.jp/recyclemart/cpjhe95a21650u/
SBDB001 【25%OFF!】 スプリングドライブ SEIKO PRPSPEX[プロスペックス]
http://www.rakuten.co.jp/iget/655089/727155/655180/661745/#618078MUSE RESEARCH Receptor XT
http://www.rakuten.co.jp/ikebe/443913/505946/622909/#633263
SBDS001 【25%OFF!】 SEIKO PRPSPEX[プロスペックス]
http://www.rakuten.co.jp/iget/655089/727155/655180/656917/#613772

同一ファイル内にクラス複数作る時の書き方はあれでいいのかな。