2013-08-27 2 views
2

Я в тупике от этого и явно отсутствует что-то основное. Кажется, что perl sort не работает с определенным набором значений. Вот часть тестового кода:Тип Perl не работает, как ожидалось, по числовым значениям

use strict; 

    my $i = 7; 
    my $j = 8; 
    my $k = 4; 

    print "before:$i:$j:$k\n"; 
    my @p = ($i, $j, $k); 
    ($i, $j, $k) = sort(@p); 
    print "after:$i:$j:$k\n"; 

    print "######################################\n"; 


    my $i = 23; 
    my $j = 24; 
    my $k = 7; 

    print "before:$i:$j:$k\n"; 
    my @p = ($i, $j, $k); 
    ($i, $j, $k) = sort(@p); 
    print "after:$i:$j:$k\n"; 

print "######################################\n"; 

Как вы можете видеть, оно работает, когда входные значения (7: 8: 4). Кажется, что не работает, когда значения (23: 24: 7)!

before:7:8:4 
after:4:7:8 
###################################### 
before:23:24:7 
after:23:24:7 
###################################### 
+0

Сохранение массива обратно в отдельные переменные кажется немного странным, а не тем, что вы, вероятно, сделали бы в реальной программе. Вы можете просто напечатать массив: 'print 'после: @p \ n" ' –

ответ

12

По умолчанию sort будет сортировать лексически. Итак, 23 и 24 приходят до 7 по той же причине, что bc и bd идут до g в словаре.

sort {$a <=> $b} @p даст числовой вид.

http://perldoc.perl.org/functions/sort.html для получения дополнительной информации.

+0

Спасибо за объяснение и ссылку! Теперь работает. – Mandar

+1

(Словари используют заказы сортировки, специфичные для языка. Это не то же самое, что и «sort» по умолчанию. Для этого вы должны использовать Unicode :: Collate.) – ikegami

Смежные вопросы