Принимая ваши требования как есть. Вам, вероятно, лучше не встраивать информацию о количестве в строку. Однако я приму это как учебное упражнение.
Обратите внимание, я торгую память для краткости и вероятной скорости, используя хэш для подсчета.
Однако сортировку можно оптимизировать с помощью преобразования Шварца .
РЕДАКТИРОВАТЬ: создать массив результатов, используя только цифры, которые были нарисованы
#!/usr/bin/perl
use strict; use warnings;
my @arr = map {int( rand(49) + 1) } ( 1..100 );
my %counts;
++$counts{$_} for @arr;
my @result = map sprintf('%d times for %d', $counts{$_}, $_),
sort {$counts{$a} <=> $counts{$b}} keys %counts;
print "$_\n" for @result;
Однако я бы, наверное, сделал что-то вроде этого:
#!/usr/bin/perl
use strict; use warnings;
use YAML;
my @arr;
$#arr = 99; #initialize @arr capacity to 100 elements
my %counts;
for my $i (0 .. 99) {
my $n = int(rand(49) + 1); # pick a number
$arr[ $i ] = $n; # store it
++$counts{ $n }; # update count
}
# sort keys according to counts, keys of %counts has only the numbers drawn
# for each number drawn, create an anonymous array ref where the first element
# is the number drawn, and the second element is the number of times it was drawn
# and put it in the @result array
my @result = map [$_, $counts{$_}],
sort {$counts{$a} <=> $counts{$b} }
keys %counts;
print Dump \@result;