What version of Perl are you using? When I run your code on my system (WinXP, ActivePerl 5.8.8), I get an incorrect answer. I added a the use warnings pragma to your code and got this result:
Argument "0x2" isn't numeric in addition (+) at C:\test.pl line 9.
Argument "0x28" isn't numeric in addition (+) at C:\test.pl line 9.
You can specify hexadecimals in literal code by appending an '0x' to the value. I suppose, if you really wanted to get to a hexadecimal from a string, you could use string eval.
my $this = sprintf("0x%x", 40);
my $that = sprintf("0x%x", 2);
my $other = eval "$this + $that";
printf "$other %x\n", $other;
I'd be inclined to go with hex, though.