O problema básico aqui é que um "hash" em Perl é ordenado por "chave" por padrão. Para obter a "ordem de inserção" você precisa usar
Tie::IxHash
do seguinte modo:use Tie::IxHash;
my %sort;
tie ( %sort, 'Tie::IxHash' );
my $sort = \%sort;
$sort = { "is_instock" => -1, "ua" => 1 };
Então, quando você usa isso em sua consulta do MongoDB, as chaves são consideradas na ordem em que você as inseriu, em vez de sua ordem lexcial.
De qualquer forma, deveria ter sido ordenado dessa maneira, já que as chaves estão em ordem lexical, mas sugiro que você tenha feito algo errado e precisa estar ciente da ordem de inserção de qualquer maneira.
A outra razão é que "in_stock" não existe ou não é o verdadeiro nome do caminho para o campo. Você precisa especificar o caminho completo para o campo com "notação de ponto" caso contrário, o caminho é inválido.