Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > сортировка ХЭША


Автор: konst 17.12.2002, 03:47
Есть программка:
=======
Код

#!/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});
   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(),

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

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

Автор: NightGoblin 17.12.2002, 19:09
Если, насколько я понял, переменная $field глобальная, то зачем передавать ее в функцию в качестве параметра?...

Автор: konst 17.12.2002, 20:08
>Если, насколько я понял, переменная $field глобальная, то зачем передавать ее в функцию в качестве параметра?...
Нет это только example. Просто хочется написать такой модуль с этой подпрограмкой сортировки:
sub my_sort {
$field_number = shift;  #HERE
$field_separator = shift;HERE
 @a = split("$field_separator",$hash{$a});
...
$a[$field_number] <=> $b[$field_number];
...
}
и потом его использовать при необходимости.
Т.е. мне как раз не нужна global $field
А вот как ее передать &my_sort - не понимаю
foreach $x (sort my_sort($field) keys %hash) {  # если так то ERROR

Автор: NightGoblin 19.12.2002, 16:17
Если действительно надо передать значения как параметры функции, можно написать:
Код

foreach $x (sort {my_sort ($field, '::')} keys %hash) {
       ...
}

, то есть использовать промежуточную анонимную функцию для вызова my_sort с аргументами. :)

Автор: konst 19.12.2002, 21:42
Спасибо. Это то что я и искал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)