URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8809
[ Назад ]

Исходное сообщение
"Сортировка хеша в perl"

Отправлено allexnew , 20-Июл-10 10:24 
Никак не могу сообразить почему следующая конструкция не работает:

%ha = (
    25 => 23,
    27 => 1,
    11 => 4,
    12 => 4,
    34 => 1,
    18 => 2,
    24 => 1,
    29 => 9
);

foreach(sort {$ha{$a} <=> $ha{$b}} keys %ha) {
    ### print $_,' = ',$ha{$_},"\n";
     %qqq=(%qqq, $_, $ha{$_});
     }


while(($key,$value) = each %qqq){
    print "$key = $value \n";
    };
exit;

В цикле foreach распечатка отсортированных значений проходит нормально, далее пытаюсь тут же занести ключи и значения в новый хеш, но что-то идет не так. Где ошибка?


Содержание

Сообщения в этом обсуждении
"Сортировка хеша в perl"
Отправлено gibbon , 20-Июл-10 14:27 
В перле функция keys возвращает ключи хэша вовсе не в том порядке, в котором они заносились.
Она возвращает их в таком порядке, который ей больше нравится.
Так что отсортировать хэш у вас не получится


"Сортировка хеша в perl"
Отправлено allexnew , 20-Июл-10 15:13 
>В перле функция keys возвращает ключи хэша вовсе не в том порядке,
>в котором они заносились.
>Она возвращает их в таком порядке, который ей больше нравится.
>Так что отсортировать хэш у вас не получится

Странно как-то это все. Чем же функция руководствуется? Ведь каждый раз возвращаются значения в определенном порядке, а не в разнобой.


"Сортировка хеша в perl"
Отправлено аноним , 28-Июл-10 21:39 
>Странно как-то это все. Чем же функция руководствуется? Ведь каждый раз возвращаются
>значения в определенном порядке, а не в разнобой.

Читайте что такое хэш и как он устроен.


"Сортировка хеша в perl"
Отправлено cryo , 20-Июл-10 14:48 
Сделайте примерно так:

@sorted_keys = sort {$ha{$a} <=> $ha{$b}} keys %ha);

foreach(@sorted_keys){
    print "$_ = $ha{$_}\n";
};


"Сортировка хеша в perl"
Отправлено allexnew , 20-Июл-10 15:11 
>Сделайте примерно так:
>
>@sorted_keys = sort {$ha{$a} <=> $ha{$b}} keys %ha);
>
>foreach(@sorted_keys){
>    print "$_ = $ha{$_}\n";
>};

Спасибо, вроде как то, что нужно,  почему то сам не допер. Только скобку еще поставить надо:


@sorted_keys = (sort {$ha{$a} <=>  $ha{$b}} keys %ha);

foreach(@sorted_keys){
    print "$_ = $ha{$_}\n";
};



"Сортировка хеша в perl"
Отправлено cirus , 05-Авг-10 13:24 

print "$_ = $ha{$_}\n" for sort keys %ha;