package WWW::Google::Calculator; use strict; use warnings; use base qw/Class::Accessor::Fast/; use WWW::Mechanize; use HTML::TokeParser; use URI; our $VERSION = '0.05'; __PACKAGE__->mk_accessors(qw/mech error/); =head1 NAME WWW::Google::Calculator - Perl interface for Google calculator =head1 SYNOPSIS use WWW::Google::Calculator; my $calc = WWW::Google::Calculator->new; print $calc->calc('1+1'); # => 1 + 1 = 2 print $calc->calc('300kbps in KB/s'); # => 300 kbps = 37.5 kilobytes / second =head1 DESCRIPTION This module provide simple interface for Google calculator. =head1 SEE ALSO http://www.google.com/help/calculator.html =head1 METHODS =head2 new create new instance =cut sub new { my $self = shift->SUPER::new(@_); $self->mech( do { my $mech = WWW::Mechanize->new; $mech->agent_alias('Windows IE 6'); $mech; } ); $self; } =head2 calc( $query ) calculate $query using by Google and return result. return undef when something error occurred. (and use $self->error to get last error message) =cut sub calc { my ( $self, $query ) = @_; my $url = URI->new('http://www.google.com/search'); $url->query_form( q => $query ); $self->mech->get($url); if ($self->mech->success) { return $self->parse_html( $self->mech->content ); } else { $self->error( 'Page fetching failed: ' . $self->mech->res->status_line ); return; } } =head2 parse_html =cut sub parse_html { my ( $self, $html ) = @_; $html =~ s!(.*?)!^$1!g; $html =~ s!×!*!g; my $res; my $p = HTML::TokeParser->new( \$html ); while ( my $token = $p->get_token ) { next unless ( $token->[0] || '' ) eq 'S' && ( $token->[1] || '' ) eq 'img' && ( $token->[2]->{src} || '' ) eq '/images/calc_img.gif'; $p->get_tag('b'); $res = $p->get_trimmed_text('/b'); } $res; } =head2 error return last error =head1 AUTHOR Daisuke Murase =head1 COPYRIGHT This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =cut 1;