fai la prova di stampare:

print $cn[$length-$k],"\n";
print substr($xxx,$vn[$length-$k],1),"\n";
if(...)...

in modo da capire i valori prima della modifica. In base al risultato vediamo.