perl hashes - несанкционированная сортировка.

Ответить
NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

perl hashes - несанкционированная сортировка.

Сообщение NiTr0 »

Столкнулся с тем, что в модуле Dhcphosts при создании хэша для выпадающего списка происходит сабж. Причем - по непонятным критериям.
Вот кусок кода (с дебаг-вставками):

Код: Выделить всё

  my %networks = ();
  foreach my $line (@$list) {
    $networks{$line->[0]}=$line->[1]."(".$line->[2]."/".$line->[3].")";
    print $line->[0]." ".$networks{$line->[0]}."<br>\n";
   }; 


  foreach my $line (%networks) {
    print $line."<br>\n";
   }; 
В 1м цикле - заполняется хэш, во 2м - собссно выводится поэлементно (ключ, значение, ключ, значение...). Сделал так, чтобы исключить возможность сортировки внутри ф-й работы с хэшем.
Итого, для 1-го цикла имеем следующее:

Код: Выделить всё

62 101-m1_216_32(192.168.216.32/255.255.255.224)
64 101-m1_216_64(192.168.216.64/255.255.255.224)
63 101-m1_n_32_0(10.192.32.0/255.255.255.224)
55 Ce-m1_240_128(192.168.240.128/255.255.255.224)
56 Ce-m1_240_160(192.168.240.160/255.255.255.224)
57 Ce-m1_240_192(192.168.240.192/255.255.255.224)
58 Ce-m1_240_224(192.168.240.224/255.255.255.224)
53 Ce-m1_240_64(192.168.240.64/255.255.255.224)
54 Ce-m1_240_96(192.168.240.96/255.255.255.224)
11 Ce-m8_240_0(192.168.240.0/255.255.255.224)
10 Ce-m8_240_32(192.168.240.32/255.255.255.224)
35 Chb-m1_192_0(192.168.192.0/255.255.255.224)
27 Chb-m1_192_128(192.168.192.128/255.255.255.224)
32 Chb-m1_192_160(192.168.192.160/255.255.255.224)
22 Chb-m1_192_96(192.168.192.96/255.255.255.224)
39 Chb-m1_n_18_0(10.192.18.0/255.255.255.224)
33 Chb-m1_n_20_0(10.192.20.0/255.255.255.224)
.............................
Для 2-го цикла - имеем на выходе бред:

Код: Выделить всё

33
Chb-m1_n_20_0(10.192.20.0/255.255.255.224)
32
Chb-m1_192_160(192.168.192.160/255.255.255.224)
21
Vp-m1_3_64(192.168.3.64/255.255.255.224)
63
101-m1_n_32_0(10.192.32.0/255.255.255.224)
71
PP-m11_3_192(192.168.3.192/255.255.255.224)
7
Pp-m7_7_32(192.168.7.32/255.255.255.224)
26
Ord-m1_176_0(192.168.176.0/255.255.255.224)
80
Js-m1_224_192(192.168.224.192/255.255.255.224)
18
Vp-m1_5_224(192.168.5.224/255.255.255.224)
72
PP-m11_n_4_0(10.192.4.0/255.255.255.224)
.................................
Версия перла - 5.8.8

Код: Выделить всё

This is perl, v5.8.8 built for x86_64-linux-thread-multi
Где грабли?

P.S. Ессно, можно посортировать по key... но - неинтересно :)

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

В общем модифицировал модуль Dhchosts, теперь проблем с выводом нет. Патч - ниже:

Код: Выделить всё

--- webinterface.old	2008-09-16 23:45:55.000000000 +0300
+++ webinterface	2008-09-17 13:50:12.000000000 +0300
@@ -658,17 +658,19 @@
    	return 0;
    }
 
-  my %networks = ();
+  my @netarr = ();
   foreach my $line (@$list) {
-    $networks{$line->[0]}=$line->[1]."(".$line->[2]."/".$line->[3].")";
+    push(@netarr, [$line->[0],$line->[1]."(".$line->[2]."/".$line->[3].")"]);
    }; 
 
   return $html->form_select('NETWORK', 	
                                     {
     	                               SELECTED => $FORM{NETWORK},
-                                                SEL_HASH => \%networks
-                                               }
-                                       );
+                                      SEL_MULTI_ARRAY => [@netarr],
+                                       MULTI_ARRAY_KEY   => 0,
+                                       MULTI_ARRAY_VALUE => 1,
+                                   }
+                           );
 }
 
 #**********************************************************

chtito2
Сообщения: 479
Зарегистрирован: Чт апр 17, 2008 5:26 pm

Re: perl hashes - несанкционированная сортировка.

Сообщение chtito2 »

Код: Выделить всё

  while (my ($k, $v) = each %networks) {
    print "$k $v<br>\n";
   }; 

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

chtito2 спасибо за подсказку, тоже работает.

~AsmodeuS~
Site Admin
Сообщения: 5749
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Сообщение ~AsmodeuS~ »

поправил

Ответить