2015-04-13 5 views
0

я следующие:Perl: Тип первые элементы в отсортированном хэш

. 
. 
. 
foreach my $op(reverse sort {$count{$a} <=> $count{$b}} keys %count) { 
     printf "%-25s %s\n", $op, $count{$op}; 
} 
. 
. 
. 

В основном это типы все элементы в моем списке отсортированы. Я бы хотел, чтобы набирали первые три элемента, а не все из них, эти три элемента являются наиболее повторяющимися, то есть имеют наибольший счет.

Пожалуйста, дайте мне знать, если вы хотите, чтобы я оставил остальную часть своего кода.

спасибо.

+1

Вы уверены, что '$ Количество {$ а} <=> $ окончательный {$ B}' правильно? Не '$ count {$ a} <=> $ count {$ b}'? – tivn

+0

Обычно используйте счетчик, прерывайте цикл (используя 'last'), если этот счетчик достигнет нужного вам числа. – tivn

+0

@tivn извините, что это была ошибка, сделанная мной, когда я скопировал код здесь. Благодарю. –

ответ

5

Вы действительно могли бы нам встретить.

my $limit = 3; 
for my $op (reverse sort { $count{$a} <=> $count{$b} } keys %count) { 
    printf "%-25s %s\n", $op, $count{$op}; 
    last if !--$limit; 
} 

Вы можете использовать кусочек списка, если вам гарантировано не менее трех элементов.

for my $op ((reverse sort { $count{$a} <=> $count{$b} } keys %count)[0..2]) { 
    printf "%-25s %s\n", $op, $count{$op}; 
} 

Это еще немного, если вы не можете гарантировать, что гарантия.

my @ops = reverse sort { $count{$a} <=> $count{$b} } keys %count; 
splice(@ops, 3) if @ops > 3; 
for my $op (@opts) { 
    printf "%-25s %s\n", $op, $count{$op}; 
} 

(if @ops > 3 предотвращает предупреждение в старых версиях Perl.)

+0

О, это правильный способ написать! Пробовал что-то подобное, но получил синтаксическую ошибку. Спасибо! –

+2

Параны необходимы при выполнении списка фрагментов. – ikegami

+0

Добавлен к моему ответу. – ikegami