The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Сортировка ХЕША: кто подскажет?"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Сортировка ХЕША: кто подскажет?"
Сообщение от konst emailИскать по авторуВ закладки on 16-Дек-02, 12:58  (MSK)
Есть программка:
===============
#!/usr/bin/perl

#СОРТИРОВКА ПО ВНУТРЕННИМ ПОЛЯМ ХЭША!
# ДАН ХЭШ. Его value = определ. формат (см.ниже)

$field = $ARGV[0]; # по какому полю сортировать!

## FIELDS:  0 ::: 1 ::: 2 ::: 3 ####
$hash{1} = 'aaa:::ppp:::zzz:::92';
$hash{2} = 'bbb:::ddd:::sss:::3';
$hash{3} = 'ccc:::kkk:::nnn:::77';
# %hash - for example

sub my_sort {
# $field = shift; (НЕ РАБОТАЕТ)
    @a = split('::+',$hash{$a});
    @b = split('::+',$hash{$b});
#$a[$field] cmp $b[$field]; # ИЛИ  если надо круче - то =>
    if ($a[$field] =~ /^\d+$/ && $b[$field] =~ /^\d+$/) {
$a[$field] <=> $b[$field];
    } else {
uc($a[$field])cmp uc($b[$field]);
    }
}

print "SORT BY $field\n";
#foreach $x (sort my_sort($field) keys %hash) {# ERROR
foreach $x (sort my_sort keys %hash) {
    print "$x ($hash{$x})\n";
}
# END
Это  РАБОТАЕТ!!!
Но хотелось бы передавать $field как аргумент функции my_sort(),
(+ передавать ей же $field_separator для split())

Т.е. что-то типа: foreach $x (sort  my_sort($field,$field_separator ) keys %hash) {

Но здесь  ERROR ??? Кто подскажет как это сделать?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Сортировка ХЕША: кто подскажет?"
Сообщение от pth Искать по авторуВ закладки on 17-Дек-02, 02:16  (MSK)
Я жутко извиняюсь, но вам стоило бы прочитать пару умных книжек про perl. Даже если отбросить такие несущественные моменты как бессмысленность вашего пожелания, ваш sort идет с таким оверхедом, что и жабофил покраснеет.

Рекомендую 'Perl Cookbook'.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Сортировка ХЕША: кто подскажет?"
Сообщение от konst emailИскать по авторуВ закладки on 17-Дек-02, 12:38  (MSK)
>Я жутко извиняюсь, но вам стоило бы прочитать пару умных книжек про
>perl.
??? Почему пару ?

>Даже если отбросить такие несущественные моменты как бессмысленность вашего пожелания
Я написал эту програмку в ответ на
http://www.opennet.me/openforum//vsluhforumID8/891.html
Сама идея подобной сортировки Хеша мне понравилась - может быть полезной.
Задача: сделать такой сорт "стандартным" - чтобы использовать эту подпрограмку (& my sort) в разных случаях
Для этого ей надо передавать аргументы - в этом и вопрос! Как?!

>ваш sort идет с таким оверхедом, что и жабофил покраснеет.
причем здесь "покрасневший жабофил"?
Код можно будет подправить (если есть нужда сэкономить 0.17 секунды (шутка))

>Рекомендую 'Perl Cookbook'.
Рекомендую "книгу о вкусной и здоровой пище" (сытые люди более благодушны и разговорчивы (тоже шутка))

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Сортировка ХЕША: кто подскажет?"
Сообщение от pth Искать по авторуВ закладки on 18-Дек-02, 06:48  (MSK)
>>Я жутко извиняюсь, но вам стоило бы прочитать пару умных книжек про
>>perl.
>??? Почему пару ?

Найдете больше - скажите мне плиз

=================================
#!/usr/bin/perl -w

use strict;

#
# Возвращает список отсортированных ключей
# Параметры: ссылка на хэш, сепаратор полей, номер (начиная с 0) поля,
#            по которому производится сортировка.  
sub sort_by_field
{
my ($hh, $sep, $fieldnum) = @_;

map  { $_->[0] }
sort { $a->[1] cmp $b->[1] }
  map  { [ $_, (split($sep, $hh->{$_}))[$fieldnum] ] }
   keys %{$hh};
}


# Док-во, что я не наврал

my %h = (
    key1 => "aaa::bbb::ccc::ddd",
    key2 => "ddd::ccc::bbb::aaa",
    key3 => "ccc::ddd::aaa::bbb"
    );

for my $num (0..3)
{
    print "$num:\n";
    for (sort_by_field(\%h, '::', $num))
    {
print "\t$_: $h{$_}\n";
    }
    print "\n";
}
==================================

>>Рекомендую 'Perl Cookbook'.
>Рекомендую "книгу о вкусной и здоровой пище" (сытые люди более благодушны и
>разговорчивы (тоже шутка))

Где ссылка? ;)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Сортировка ХЕША: кто подскажет?"
Сообщение от konst emailИскать по авторуВ закладки on 19-Дек-02, 14:25  (MSK)
Я тут получил ответ на свой вопрос:
На самом деле
sub my_sort {
     my ($field,$field_separator,$hash_name) = @_;
    @a = split($field_separator,${$hash_name}{$a});
    @b = split($field_separator,${$hash_name}{$b});
    if ($a[$field] =~ /^\d+$/ && $b[$field] =~ /^\d+$/) {
### НАДО УЧЕСТЬ СРАВНЕНИЕ ПО ЧИСЛОВЫМ ПОЛЯМ!!!!
$a[$field] <=> $b[$field];
    } else {
uc($a[$field])cmp uc($b[$field]);
    }
}
#usage: foreach $x (sort {my_sort ($field,$field_separator,$hash_name) } (keys %hash)) {
===
ДЛИНА КОДА приемлема, читабельность нормальная...
Спасибо за "&map" (никогда не использовал)
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру