The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
###########################################
# reviews
# Mike Schilli, 2003 (m@perlmeister.com)
###########################################
use warnings;
use strict;

use Net::Amazon;
use Net::Amazon::Attribute::Review;
use Text::Wrap;

#use Log::Log4perl qw(:easy);
#Log::Log4perl->easy_init({level => $DEBUG, layout => '%F{1}-%L: %m%n'});

my $ua = Net::Amazon->new(
    token => "MY_AMZN_TOKEN",
);

my $resp = $ua->search(
    asin  => ($ARGV[0] || "0471237124"),
);

die "Request failed" unless $resp->is_success();

for my $property ($resp->properties()) {

    my $count = 0;
    print "Reviews for '", $property->title(), "'\n\n";

    my $reviewset = $property->review_set();

    print "Average Rating:    ", $reviewset->average_customer_rating(), "\n";
    print "Total Reviews:     ", $reviewset->total_reviews(), "\n\n";

    for my $review ($reviewset->reviews()) {
      print "=== Review #", ++$count, " ===\n";
      print shape("Rating:            ", $review->rating()), "\n";
      print shape("Summary:           ", $review->summary()), "\n";
      print shape("Comment:           ", $review->comment()), "\n";
      print "\n";
    }
}

#######################################
sub shape {
#######################################
    my($header, $text) = @_;

    my $result = join '', 
               fill($header, " " x length($header), split /\n/, $text);

    return $result;
}