my @versions = qw( 100 105 110 115 120 125 );

sub compare{
  my ($a, $b) = @_;
  print "Between $a and $b:\n";
  my $code = '-MPowerbuilder=":all" -e "print Sys->Dump"';
  `pbperl${a} $code > tmp${a}.txt`;
  `pbperl${b} $code > tmp${b}.txt`;
  print join $/, map{s/^[<]/-/; s/^[>]/+/;$_} grep {/^[<>]/ && !/^[<>] CLASS/} split /\n/, `diff tmp${a}.txt tmp${b}.txt`;
  unlink "tmp${a}.txt";
  unlink "tmp${b}.txt";
  print "\n\n";
  return 0;  #don't mind
}

$a = shift @versions;
while($b = shift @versions){
  compare( $a, $b );
  $a = $b;
}

Output :

Between 100 and 105:
+ 	public function byte(any v) return byte
+ 	public function getbyte(blob b,unsignedlong o,ref byte v) return integer
+ 	public function setbyte(ref blob b,unsignedlong o,byte v) return integer

Between 105 and 110:
- 	public function blob(string s) return blob
+ 	public function blob(any stringorbyetarray) return blob
+ 	public function getbytearray(blob input) return any
+ 	public function getremote(string l,ref string t,long c,boolean b) return integer
+ 	public function getremote(string l,ref string t,long c,long w,boolean b) return integer
+ 	public function getremote(string l,ref string t,string a,string p,boolean b) return integer
+ 	public function lefttrim(readonly string s,boolean removealltypespaces) return string
+ 	public function righttrim(readonly string s,boolean removealltypespaces) return string
+ 	public function setremote(string l,string r,long c,boolean b) return integer
+ 	public function setremote(string l,string r,long c,long w,boolean b) return integer
+ 	public function setremote(string l,string r,string a,string t,boolean b) return integer
+ 	public function starthotlink(string l,string a,string t,boolean b) return integer
+ 	public function trim(readonly string s,boolean removealltypespaces) return string

Between 110 and 115:
+ 	public function pbgetmenustring(long h,integer i,ref string t,integer n) return long

Between 115 and 120:
+ 	public function setpointer(string s) return pointer!

Between 120 and 125: