Вы правильно разбили входную строку, используя пустую строку //
, что возвращает список символов в этой строке;в этом случае цифры вам нужны.Зачем тогда снова делить первый элемент @Array
на пробел?Это приводит к тому, что %numbers
будет (1 => 1)
.
Поскольку split //
вернул список цифр, просто посчитайте их.
use warnings;
use strict;
use feature 'say';
while (1) {
print "Enter the number: ";
my $num = <STDIN>;
chomp $num;
if ($num =~ /[^0-9]/) {
say "Non-digit(s) in input $num. Please try again.";
next;
}
my @digits = split //, $num; #/
my %freq;
++$freq{$_} for @digits;
for (sort keys %freq) {
say "Num are $freq{$_} with ", (sprintf "%.2f%%", ($freq{$_}/@digits)*100)
}
}
Выйдите с помощью Ctrl-C.При вводе 112219992221474774
вывод
Num 1 are 4 with 22.22%
Num 2 are 5 with 27.78%
Num 4 are 3 with 16.67%
Num 7 are 3 with 16.67%
Num 9 are 3 with 16.67%