Возвращение 2-х массивов из подпрограммы в зависимости от стоп-листа - PullRequest
0 голосов
/ 01 июля 2011

Это было перенесено в тестовый набор здесь .

RE-Совершено:

Я хочу вернуть массивы (должны быть ссылками) из 2 подпрограмм, однако регулярное выражение, используемое как условный оператор, не работает, как я надеялся. Я пытался сделать это с одним, но я думаю, что это будет проще.

Чтобы было ясно, моя цель состоит в том, чтобы отсортировать массив совпадений (@all_matches), а затем добавить другой массив (@all_pronoun_matches), отсортированный таким же образом, но добавленный на end .

Это подпрограмма @pronoun_matches:

my ($line, $verbform, $chapternumber, $sentencenumber, $sentence) = @_;
my @matches;
my @pronoun_matches;
return unless ($line =~ /(\w+)\((\w+)\-\d+\,\s(\w+)\-\d+\)/); #2nd repeat check     
$grammar_relation = $1;
$argument1 = $2;
$argument2 = $3;

return if (($argument1 =~ /^$argument2/i)||($argument2 =~ /^$argument1/i));    

foreach my $pronoun (@stopListNoun)
    {
    if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2)) 
        {
        push (@pronoun_matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument2, $argument1) if ($argument2 =~ /$verbform/i);
        push (@pronoun_matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2) if ($argument1 =~ /$verbform/i);
        }
    else
        {return}
    }

return (\@pronoun_matches);

В @matches есть очень похожая подпрограмма, кроме этой:

foreach my $pronoun (@stopListNoun) #Just a list of words
    {
    return if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2));
    }

    push (@matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument2, $argument1) if ($argument2 =~ /$verbform/i); ##USED TO BE 'eq', but that prevented protective from showing
    push (@matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2) if ($argument1 =~ /$verbform/i);

    return \@matches;

Это называется:

my $matches;
my $pronoun_matches;
$matches = &dependency_checks($lines[$l], $verbform, $chapternumber, $sentencenumber, $sentence);
$pronoun_matches = &pronoun_dependency_checks($lines[$l], $verbform, $chapternumber, $sentencenumber, $sentence);
push @all_matches, $matches if ($matches);
push @all_pronoun_matches, $pronoun_matches if ($pronoun_matches);

Чтобы отправить в секцию печати после сортировки с использованием хэшей, я хотел бы использовать:

@all_matches = (@all_matches, @all_pronoun_matches); Однако @all_pronoun_matches имеет 0 совпадений (или они где-то фильтруются).

Вопрос

Почему в @all_pronoun_matches есть неинициализированные значения ?? После некоторого тестирования я обнаружил, что совпадение никогда не проходит условный оператор, но он такой же, как в подпрограмме @matches!


Изначально я просто хотел удалить местоимения, и они работали нормально, поэтому я знаю, что условие работает:

foreach my $pronoun (@stopListNoun)
        {
        return if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2));
        }

Я пытался использовать if-else в foreach и комбинировать подпрограммы, но затем все совпадения (включая местоимения) перешли в @all_matches, несмотря на то, что он вызывался правильно (этот метод был опубликован здесь ранее).

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

1 Ответ

6 голосов
/ 01 июля 2011
@all_matches = @matches, @all_pronoun_matches;

должно быть

@all_matches = ( @matches, @all_pronoun_matches );

, имеет более низкий приоритет, чем =

Если бы у вас были включены предупреждения, вы бы получили Бесполезное использование переменной в пустом контексте предупреждение о том, что @all_pronoun_matches не стало частью назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...