В вашем коде есть:
@word=split(/ /);
foreach $word (@words)
{
Вы назвали массив как @word
во время разделения, но вы используете массив @words
в цикле for.
@word=split(/ /);
должно быть
@words=split(/ /);
Еще одна опечатка в процедуре byDescendingValues
:
$value=$dictionaty{$b} <=> $dictionary{$a};
^^
Как предлагается в другом ответе, вам действительно следует добавить
use strict;
use warnings;
Используя их, вы могли легко поймать эти опечатки.Без них вы будете тратить много времени.