PERL - статьи




Сортировки


Сортировка хэша:

%hash = (

'шляпа' => 'серая',

'водка' => 'горькая',

'вобла' => 'вкусная');

foreach $key(sort keys %hash){

print "$key => $hash{$key}\n"; #отсортирует в алфавитном порядке по значениям ключа

}

foreach $value(sort values %hash){

print "$value\n"; #сортировка по значению

}

Сортировка ключей по алфавиту ассоциированных значений:

foreach $key(sort {$hash{$a} cmp $hash{$b}} keys %hash){

print $key, " => ", $hash{$key},"\n";

}

Сортировка по длинне ассоциированных значений:

@massive = sort{length($hash{$a}) length($hash{$b})}

keys %hash;

foreach $key(@massive){

print $key, $hash{$key},"\n";

}

Пример из :

>> Есть хеш массив (слово, частота), необходимо вывести в файл пары

>> (слово,частота) отсортированные по частоте. По ключю - просто, а вот

>> по значению затрудняюсь. Подскахите как проще сделать?

my %hash=('for'=>1000,'to'=>1500,'in'=>2000,'do'=>500);

foreach(sort {$hash{$a} $hash{$b}} keys %hash) {

print $_,'=',$hash{$_},"\n";

}

Как можно хеш положить в строку? Например :

tnc> имеются логи http-gw. Плохость их

tnc> заключается в том, что на каждый запрос в логе появляется 4 строки,

tnc> совершенно не обязательно идущие подряд:

Создаешь хэш и держишь в нем те строчки, которые еще, грубо говоря,

не закрыты, а как закроешь - удаляй. Конечно, некий заметный кусок

файла в памяти будет присутствовать, но не полностью же.

Что-нибудь типа

while(<IN>) {

($key, $no, $data) = parse($_); # расковыряли строчку

$buf{$key}-<[$no] = $data; # запихнули в хэш в виде массива

next if $no > 3; # нумеруем, ессно с нуля

analyze($buf{$key}); # обработали

delete $buf{key}; # удалили

}

Слияние хешей выполняется как и слияние массивов:

%hash1 = (

'шляпа' => 'серая',

'водка' => 'горькая',

'вобла' => 'вкусная');

%hash2 = (

'штаны' => 'широкие',

'пиво' => 'темное',

'игрушка' => 'любимая');




Содержание  Назад  Вперед