取りあえず、原典の動作に戻してみた。これだと売ってくれるので、問題の原因がさっぱり。

sub removeInventory {
my $r_inventorys = shift;
my $arrayIndex = shift;
my $itemIndex = $$r_inventorys[$arrayIndex]->{'index'};
my $limit;

# splice(@$r_inventorys, $arrayIndex, 1);
undef($$r_inventorys[$arrayIndex]);
$limit = scalar(@$r_inventorys);
# for (my $i = 0; $i < $limit; $i++) {
# if ($itemIndex < $$r_inventorys[$i]->{'index'}) {
# $$r_inventorys[$i]->{'index'}--;
# }
# }

}