All Apache Thrift tutorials require that you have:
thrift -r --gen perl tutorial.thrift#
use strict;
use warnings;
use lib '../../lib/perl/lib';
use lib 'gen-perl';
use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::BufferedTransport;
use shared::SharedService;
use tutorial::Calculator;
use shared::Types;
use tutorial::Types;
use Data::Dumper;
my $socket    = Thrift::Socket->new('localhost',9090);
my $transport = Thrift::BufferedTransport->new($socket,1024,1024);
my $protocol  = Thrift::BinaryProtocol->new($transport);
my $client    = tutorial::CalculatorClient->new($protocol);
eval{
    $transport->open();
    $client->ping();
    print "ping()\n";
    my $sum = $client->add(1,1);
    print "1+1=$sum\n";
    my $work = tutorial::Work->new();
    $work->op(tutorial::Operation::DIVIDE);
    $work->num1(1);
    $work->num2(0);
    eval {
        $client->calculate(1, $work);
        print "Whoa! We can divide by zero?\n";
    }; if($@) {
        warn 'InvalidOperation: '.Dumper($@);
    }
    $work->op(tutorial::Operation::SUBTRACT);
    $work->num1(15);
    $work->num2(10);
    my $diff = $client->calculate(1, $work);
    print "15-10=$diff\n";
    my $log = $client->getStruct(1);
    print "Log: $log->{value}\n";
    $transport->close();
#
use strict;
use lib '../../lib/perl/lib';
use lib 'gen-perl';
use Thrift::Socket;
use Thrift::Server;
use Thrift::ServerSocket;
use tutorial::Calculator;
package CalculatorHandler;
use base qw(tutorial::CalculatorIf);
sub new {
    my $classname = shift;
    my $self      = {};
    return bless($self,$classname);
}
sub ping
{
  print "ping()\n";
}
sub add
{
  my($self, $n1, $n2) = @_;
  printf("add(%d,%d)\n", $n1, $n2);
  return $n1 + $n2;
}
sub calculate
{
  my($self, $logid, $work) = @_;
  my $op   = $work->{op};
  my $num1 = $work->{num1};
  my $num2 = $work->{num2};
  printf("calculate(%d, %d %d %d)\n", $logid, $num1, $num2, $op);
  my $val;
  if ($op == tutorial::Operation::ADD) {
    $val = $num1 + $num2;
  } elsif ($op == tutorial::Operation::SUBTRACT) {
    $val = $num1 - $num2;
  } elsif ($op == tutorial::Operation::MULTIPLY) {
    $val = $num1 * $num2;
  } elsif ($op == tutorial::Operation::DIVIDE) {
    if ($num2 == 0)
    {
      my $x = tutorial::InvalidOperation->new();
      $x->whatOp($op);
      $x->why('Cannot divide by 0');
      die $x;
    }
    $val = $num1 / $num2;
  } else {
    my $x = tutorial::InvalidOperation->new();
    $x->whatOp($op);
    $x->why('Invalid operation');
    die $x;
  }
  my $log = shared::SharedStruct->new();