nltk удобен для многих языков обработки. Он имеет встроенные методы для распределения частот. Что-то вроде:
import nltk
fdist = nltk.FreqDist(your_list) # creates a frequency distribution from a list
most_common = fdist.max() # returns a single element
top_three = fdist.keys()[:3] # returns a list
Проблема в том, что вы повторно объявляете $ channelSelection внутри цикла, но за пределами цикла сохраняется старое значение. Удалите «мое» из внутреннего цикла.
Вы повторно объявили $ channelSelection
локально в пределах цикла до. Таким образом, его значение будет потеряно каждый раз при выполнении цикла. Таким образом, регулярное выражение не будет совпадать, поскольку тогда значение $ channelSelection
снова будет равно ""
.
Удаление my
из цикла решит проблему.
Лучшее решение для получения ввода от пользователя - использовать модуль IO :: Prompt. Он поддерживает повторы, проверки, систему меню и многое другое.
Как насчет того, чтобы не беспокоиться об этом?
#!/usr/bin/perl
use strict;
use warnings;
use Term::Menu;
my @channels = qw( 1 2 3 4 );
my $prompt = Term::Menu->new(
aftertext => 'Please select one of the channels listed above: ',
beforetext => 'Channel selection:',
nooptiontext =>
"\nYou did not select a valid channel. Please try again.\n",
toomanytries =>
"\nYou did not specify a valid channel, going with the default.\n",
tries => 3,
);
my $answer = $prompt->menu(
map { $_ => [ "Channel $_" => $_ ] } @channels
);
$answer //= $channels[0];
print "$answer\n";
__END__
Это скорее проблема стиля (и, поскольку вы не можете устанавливать модули, это вам не поможет), но я просто хотел указать, что при проверке фиксированных значений использование Регулярное выражение, вероятно, не лучшее решение.
Вот что я сделал бы:
use List::MoreUtils;
my @allowed_values = qw( 1 2 3 4 );
# get $answer from prompt.
if(any { $_ == $answer } @allowed_values) {
# All is good.
}
Может пригодиться в другой раз.