Perl regex не убегающий до цикла как ожидалось

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

7
задан brian d foy 26 May 2009 в 13:45
поделиться

5 ответов

Проблема в том, что вы повторно объявляете $ channelSelection внутри цикла, но за пределами цикла сохраняется старое значение. Удалите «мое» из внутреннего цикла.

18
ответ дан 6 December 2019 в 05:04
поделиться

Вы повторно объявили $ channelSelection локально в пределах цикла до. Таким образом, его значение будет потеряно каждый раз при выполнении цикла. Таким образом, регулярное выражение не будет совпадать, поскольку тогда значение $ channelSelection снова будет равно "" .

Удаление my из цикла решит проблему.

11
ответ дан 6 December 2019 в 05:04
поделиться

Лучшее решение для получения ввода от пользователя - использовать модуль IO :: Prompt. Он поддерживает повторы, проверки, систему меню и многое другое.

3
ответ дан 6 December 2019 в 05:04
поделиться

Как насчет того, чтобы не беспокоиться об этом?

#!/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__
6
ответ дан 6 December 2019 в 05:04
поделиться

Это скорее проблема стиля (и, поскольку вы не можете устанавливать модули, это вам не поможет), но я просто хотел указать, что при проверке фиксированных значений использование Регулярное выражение, вероятно, не лучшее решение.

Вот что я сделал бы:

use List::MoreUtils;

my @allowed_values = qw( 1 2 3 4 );

# get $answer from prompt.

if(any { $_ == $answer } @allowed_values) {
    # All is good.
}

Может пригодиться в другой раз.

2
ответ дан 6 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: