Идеи на укорочение данном случае-elsif операторы цепь со встроенной если-elsif операторы


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

if ($c_verb eq 'on')
    {
    if ($c_enabling) ##if need eq, add || '' at declaration.
        {$category_id = 'xcomp';}
    elsif ($c_subject)
        {$category_id = 'subj';}
    elsif ($c_object)
        {$category_id = 'obj';}
    elsif ($c_prep)
        {$category_id = 'prep';}
    else
        {$category_id = 'allverb';}
    ... 

После этого цикл через различные формы поиска слово (глагол) делается. В цикле существует цепочка если-elsif операторы с этим проверяя, какой из $category_id был выбран, и правильно воздействуя на корпус в результате.

Потом рассмотрел второй "заголовок" (главной кнопки радио), с подзаголовков:

elsif ($c_adj eq 'on')
    {
    if ($c_modnoun)
        {$category_id = 'amod';}
    else
        {$category_id = 'alladj';}
    ...

Опять же структуру, как и до этого elsif операторы, но открыл другой файл, и нет никакой необходимости, чтобы цикл через различные формы слова.

И наконец, чтобы проверить, если кнопка была нажата:

else ##No buttons, like original search.
    {
    $category_id = "all";
      ...

И снова аналогичная структура используется, но нет необходимости в цикле форм и различной печати используется.

Это является общим для всех из них (за исключением открытия разных файлов и некоторые выражения не изменяется для разных вещей):

local $/ = 'Parsing'; ##Instead of breaking at standard newline (avoid join and split)

    open my $parse_corpus, '<', "/Users/jon/Desktop/stanford-postagger-full-2011-04-20/rootparsedLife1.txt" or die $!;

    while (my $sentblock = <$parse_corpus>) 
        {
        chomp $sentblock;

        next unless ($sentblock =~ /\[sent. \d+ len. \d+\]: \[(.+)\]/);
        $sentencenumber++;
        $sentence = $1;
        $sentence =~ s/, / /g;
        if ($sentence =~ /\~\s([\d+F][\.I_][\d\w]+)\s/ ) 
            {
            $chapternumber = $1;
            $sentencenumber = 0; ##Reset sentence number with new chapter
            }

        next unless ($sentblock =~ /\b$search_key/i); ##Ensure the sentence contains the searchkey
        next unless ($sentblock =~ /\(JJ\w*\s+\b$search_key\w*[\)\s]+/i); ##THIS Line is different for each

        my ($arg1, $arg2, $goodmatch);
        my @lines = split ("\n",$sentblock); ##Split by a newline

        for (my $l=0; $l < @lines; $l++)
            {
            $goodmatch = 0;
                    if ($category_id eq "subj")
                    {
                    if (($lines[$l] =~ /subj\w*\(|agent\w*\(/) && ($lines[$l] =~ /\b$verbform\b/i))
                        {

                      #.............. -elsif for each $category_id.......

И из-за всех вышеперечисленных вариантов, есть если(все)-остальное(все остальное) используется для большого, в-глубина секции сортировки и печати.

Вопрос Есть распространенный способ реструктуризации этого, я не хочу, чтобы положить мои 500 строк кода, так что если нет общего метода, я буду просто удалять вопрос. Даже применяя дали/когда? (рекомендовано на Perl::критик)

Ограничения Я нарваться на проблемы с памятью, поэтому он не может быть неэффективным (обычно более эффективным или меньше??)

Спасибо за ваше время! Дайте мне знать, если что-то непонятно.


Редактировать

Вот разбивка проекта:

Я создаю поисковых систем. Пользователь вводит слово для поиска и нажмите варианты, чтобы выбрать из (как радиокнопки на форме):

--Show results where search word is a verb
-------enabling
-------subject
-------object
...
--Show results where search word is adjective
-------a modified noun (amod)
--Else show any instance search word appears

Затем скрипт ищет через файл формата:

Parsing [sent. 2 len. 10]: [Radially, symmetrical, animals, move, slowly, or,
not, at, all, .]
(ROOT(S(NP(ADJP (RB Radially) (JJ symmetrical))(NNS animals))(VP (VBP 
move)(ADVP (RB slowly)(CC or)(RB not))(ADVP (IN at) (DT all)))    (. 
.)))
nsubj(move-4, animals-3)
advmod(move-4, at-8)
pobj(at-8, all-9)

И подает сведения, необходимые в зависимости от выбора входных данных пользователя. Пример:

Поиск: 'двигаться'

Нажмите кнопку: 'глаголы только'-->'темы'

Выход (выдержка выше):

Матч 1(эс), в которой субъект движение животных :

Раздел 1_1: радиально симметричные животные двигаются медленно или вообще не .

Это подводит итог. Структуру данных, которую я использовал, была ССХ, где внутренний массив содержит всю информацию для каждого матча. Память продолжает отключаться. От malloc_errors в одном экземпляре, где браузер разбился. Я не думаю, что скрипт виноват, но мне нужно, чтобы это было как можно быстрее для поиска, и CGI-видимому, "узких" мест есть.



297
2
задан 25 июня 2011 в 03:06 Источник Поделиться
Комментарии
2 ответа

С целью оказания реальной помощи, мне нужно знать больше о вашем приложении и что вы пытаетесь достичь. Вы спрашиваете о том, если..еще, но я подозреваю, вопрос/ответ, что вам нужно, это вдоль линий: "какая структура и подход данных подходит?". Существует целый ряд справочных технологий приводимый в таблице, которая может быть соответствующие - огромные куски этого если код..еще может просто ветер исчезает. Но я не могу дать вам конкретный пример, не зная немного больше.

Мне любопытно, где такие вещи, как $c_subject пришли? Немного подробнее о общий поток ваше приложение будет помочь положить вещи в контексте.

Можете ли вы показать пример того, что вход выглядит? Из другой ваш вопрос, возможно, это разделы вроде этого:

Parsing [sent. 1 len. 31]:
nsubj(85-7, Processes-3)
nn(Transport-6, Membrane-5)
prep_of(Processes-3, Transport-6)
nsubj(examined-10, We-8)
nsubjpass(used-17, it-15)
xsubj(perform-19, it-15)
conj_and(examined-10, used-17)
xcomp(used-17, perform-19)
dobj(perform-19, function-22)
prep_of(binding-25, cell-28)
Parsing [sent.2 len. 50]
more of these tag descriptions here?

Так что ваше приложение с этим делать? Полный текст части этот же файл, другой файл или структуру данных?

> Я нарваться на проблемы с памятью .. код не будет проблемой. Скорее всего, некоторые хранилища данных/проблема структуры или, возможно, даже утечку памяти. Кстати, а почему вы думаете, что у вас проблемы с памятью? Какой симптом вы видите?

О, используя лучший стиль расстановки отступов поможет удобочитаемость кода. Перемещения { и } вернуться на прежний уровень отступов:

if (some condition)
{
statement...
}
else
{
some other statement
}

Я как и выше получше, но это тоже приемлемо:

if (something){
statement1
statement2
}elsif (something else){
statement3
statement4
}

2
ответ дан 5 июля 2011 в 02:07 Источник Поделиться

Вы должны, вероятно, использовать хэш для хранения информации.

my %data = (
xcomp => $c_enabling,
subj => $c_subject,
obj => $c_object,
prep => $c_prep,
);

Если вы сделали это таким образом, это было бы просто установить значение, без огромного если elsif операторы цепь.

my $category_id = 'allverb'; # set default

for my $category ( qw'xcomp subj obj prep' ){
if( $data{$category} ){
$category_id = $category;
}
}

1
ответ дан 16 декабря 2011 в 10:12 Источник Поделиться